目标检测2--yolov1中相关基础知识(边框回归、交并比、nms)介绍

文章目录

    • 前言
    • 回归介绍
      • 基本概念
      • 线性回归
      • 非线性回归
      • 边框回归
    • 交并比介绍
        • 定义
        • 程序实现
    • NMS介绍
      • 定义与原理
      • 工作原理
      • 代码实现

前言

在上篇博客目标检测1–Pytorch目标检测之yolov1中介绍了yolov1的原理,里面提到几个知识点现在详细介绍一下。

回归介绍

在上篇博客中提到yolov1将目标检测转换为回归问题,那什么是回归呢?

基本概念

回归:是一种预测数值型数据的监督学习算法。在深度学习中,回归模型通过训练数据学习自变量(特征)与因变量(目标)之间的映射关系,进而对新数据进行预测。

线性回归

线性回归:是回归问题中最基础也是最常见的一种形式。它假设自变量与因变量之间存在线性关系,即可以通过一条直线(在多维空间中为超平面)来拟合数据点。线性回归模型的一般形式为:
y = w x + b y=wx+b y=wx+b
其中,y 是因变量,x 是自变量,w 是权重, b 是偏置项。在深度学习中,线性回归通常作为更复杂模型的基础组件。

非线性回归

  当自变量与因变量之间的关系不是线性的,而是曲线或其他复杂形式时,就需要使用非线性回归模型。非线性回归模型可以通过引入多项式、指数函数、对数函数等非线性项来拟合数据。

边框回归

在YOLO当中用到了边框回归的概念,什么是边框回归呢?
如下图所示:

  • 对于窗口一般使用四维向量(x,y,w,h) 来表示,分别表示窗口的中心点坐标和宽高。
  • 红色的框P代表原始的Proposal,;
  • 绿色的框G代表目标的Ground Truth;
    我们的目标是寻找一种关系使得输入原始的窗口P 经过映射得到一个跟真实窗口G 更接近的回归窗口G^。
    在这里插入图片描述
    所以,边框回归的目的即是:
    给定(Px,Py,Pw,Ph)寻找一种映射 f 使得:
    f ( P x , P y , P w , P h ) = ( G ^ x , G ^ y , G ^ w , G ^ h ) f (Px,Py,Pw,Ph)=(\hat G x,\hat Gy,\hat Gw,\hat Gh) f(Px,Py,Pw,Ph)=(G^x,G^y,G^w,G^h)
    并且 ( G ^ x , G ^ y , G ^ w , G ^ h ) ≈ ( G x , G y , G w , G h ) (\hat Gx,\hat Gy,\hat Gw,\hat Gh)≈(Gx,Gy,Gw,Gh) (G^x,G^y,G^w,G^h)(Gx,Gy,Gw,Gh)

边框回归实现比较简单的思路就是: 平移+尺度缩放

交并比介绍

  交并比(Intersection over Union,简称IoU)是目标检测和语义分割任务中一个重要的衡量标准。

定义

  交并比(IoU)是指两个边界框(或分割掩模)的交集区域的面积与这两个边界框(或分割掩模)的并集区域的面积之比。它用于衡量预测框(或预测分割区域)与实际框(或实际分割区域)之间的重叠程度。
在这里插入图片描述

程序实现
def compute_iou(box1, box2):  
    """  
    计算两个矩形框的IoU  
      
    参数:  
    box1 -- 第一个矩形框,格式为(x1, y1, x2, y2)  
    box2 -- 第二个矩形框,格式为(x1, y1, x2, y2)  
      
    返回:  
    iou -- 两个矩形框的IoU值  
    """  
    # 计算交集区域 左上角坐标(xi1,yi1) 右下角坐标(xi2,yi2)
    xi1 = max(box1[0], box2[0])  
    yi1 = max(box1[1], box2[1])  
    xi2 = min(box1[2], box2[2])  
    yi2 = min(box1[3], box2[3])  
      
    inter_area = max(xi2 - xi1, 0) * max(yi2 - yi1, 0)  
      
    # 计算并集区域  
    box1_area = (box1[2] - box1[0]) * (box1[3] - box1[1])  
    box2_area = (box2[2] - box2[0]) * (box2[3] - box2[1])  
      
    union_area = box1_area + box2_area - inter_area  
      
    # 计算IoU  
    iou = inter_area / union_area  
      
    return iou  
  

NMS介绍

定义与原理

  NMS(即非极大值抑制),其原理是通过筛选出局部极大值来得到最优解。在目标检测等场景中,算法通常会生成大量的候选框,其中许多框可能会高度重叠,表示相同的对象。NMS通过抑制(删除或忽略)非极大值的候选框(即置信度较低或重叠度较高的框),保留最有可能的候选框,从而优化检测结果。

工作原理

NMS的工作原理可以概括为以下几个步骤:

  1. 选择最高置信度的边界框:从所有候选框中选择具有最高置信度(或检测概率)的边界框。
  2. 计算交并比(IoU):计算该边界框与其他所有边界框的IoU。IoU是两个边界框重叠程度的度量,计算公式为重叠区域的面积除以联合区域的面积。
  3. 抑制重叠框:如果IoU超过某个阈值(如0.5),则认为这两个边界框检测到的是同一个目标,因此抑制(删除或忽略)置信度较低的边界框。
  4. 迭代处理:重复上述过程,直到所有边界框都被处理。

代码实现

def non_max_suppression(bboxes, scores, iou_threshold=0.5):
    """  
    非极大值抑制算法实现  
  
    Args:  
        bboxes (np.array): 检测框的坐标,形状为(N, 4),其中N是检测框的数量,4代表[x1, y1, x2, y2]。  
        scores (np.array): 每个检测框的置信度,形状为(N,)。  
        iou_threshold (float): 交并比阈值。  
  
    Returns:  
        np.array: 保留的检测框索引。  
    """  
    # 根据置信度对检测框进行排序  
    order = scores.argsort()[::-1]  

    # 初始化保留的检测框索引列表  
    keep = [] 

    
    while order.size > 0:  
        # 选择当前置信度最高的检测框  
        i = order[0]  
        keep.append(i)  
          
      
        xx1 = np.maximum(bboxes[i, 0], bboxes[order[1:], 0])  
        yy1 = np.maximum(bboxes[i, 1], bboxes[order[1:], 1])  
        xx2 = np.minimum(bboxes[i, 2], bboxes[order[1:], 2])  
        yy2 = np.minimum(bboxes[i, 3], bboxes[order[1:], 3])  
          
        w = np.maximum(0.0, xx2 - xx1 + 1)  
        h = np.maximum(0.0, yy2 - yy1 + 1)  
        inter = w * h  
          
        # 计算当前检测框的面积  
        area_i = (bboxes[i, 2] - bboxes[i, 0] + 1) * (bboxes[i, 3] - bboxes[i, 1] + 1)  
          
        # 计算其余检测框的面积  
        area_other = (bboxes[order[1:], 2] - bboxes[order[1:], 0] + 1) * (bboxes[order[1:], 3] - bboxes[order[1:], 1] + 1)  
          
        # 计算交并比  
        iou = inter / (area_i + area_other - inter)  
          
        # 保留IOU小于阈值的检测框  
        inds = np.where(iou <= iou_threshold)[0]  
        order = order[inds + 1]  # 因为inds是基于order[1:]的索引,所以需要+1  
      
    return keep

如有错误欢迎指正,如果帮到您请点赞加收藏哦!
关注我的微信公众号:回复"深度学习资料"领取深度学习相关资料(100本人工智能书籍),实时更新深度学习相关知识!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/781606.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

51单片机STC89C52RC——16.1 五项四线步进电机

目的/效果 让步进电机 正向转90度&#xff0c;逆向转90度 一&#xff0c;STC单片机模块 二&#xff0c;步进电机 2.2 什么是步进电机&#xff1f; 步进电机可以理解为&#xff1a;是一个按照固定步幅运动的“小型机器”。它与普通电机不同点在于&#xff0c;普通电机可以持…

【面向就业的Linux基础】从入门到熟练,探索Linux的秘密(十二)-管道、环境变量、常用命令

大致介绍了一下管道、环境变量、一些常用的基本命令&#xff0c;可以当作学习笔记收藏学习一下&#xff01;&#xff01;&#xff01; 文章目录 前言 一、管道 二、环境变量 1.概念 2.查看 3.修改 4.常用环境变量 三、系统状况 总结 前言 大致介绍了一下管道、环境变量、一些常…

基于Java的水果商品销售网站

1 水果商品销售网站概述 1.1 课题简介 随着电子商务在当今社会的迅猛发展&#xff0c;水果在线销售已逐渐演变为一种极为便捷的购物方式&#xff0c;日益受到人们的青睐。本系统的设计初衷便是构建一个功能完备、用户体验友好的水果销售平台&#xff0c;致力于为用户提供优质、…

昇思25天学习打卡营第14天|基于MindNLP的文本解码原理

基于MindNLP的文本解码原理 文本解码 文本解码是自然语言处理中的一个关键步骤,特别是在任务如机器翻译、文本摘要、自动回复生成等领域。解码过程涉及将编码器(如语言模型、翻译模型等)的输出转换为可读的文本序列。以下是一些常见的文本解码方法和原理: 1. 自回归解码:…

常用的MRI分析软件

MRI&#xff08;磁共振成像&#xff09;分析软件种类繁多&#xff0c;涵盖了从基础图像处理到高级数据分析的各个方面。这些软件广泛应用于临床诊断、研究和教育等领域。以下是一些常用的MRI分析软件&#xff1a; 开源软件 商用软件 特殊用途软件 在线工具和云平台 这些软件各…

孟德尔随机化与痛风3

写在前面 检索检索&#xff0c;刚好发现一篇分区还挺高&#xff0c;但结果内容看上去还挺熟悉的文章&#xff0c;特记录一下。 文章 Exploring the mechanism underlying hyperuricemia using comprehensive research on multi-omics Sci Rep IF:3.8中科院分区:2区 综合性期…

# [0705] Task06 DDPG 算法、PPO 算法、SAC 算法【理论 only】

easy-rl PDF版本 笔记整理 P5、P10 - P12 joyrl 比对 补充 P11 - P13 OpenAI 文档整理 ⭐ https://spinningup.openai.com/en/latest/index.html 最新版PDF下载 地址&#xff1a;https://github.com/datawhalechina/easy-rl/releases 国内地址(推荐国内读者使用)&#xff1a; 链…

渐开线花键测量学习笔记分享

大家好&#xff0c;继续渐开线花键的相关内容&#xff0c;本期是渐开线花键测量相关的学习笔记分享&#xff1a; 花键检测项目有花键大径和小径检验&#xff1b;内花键齿槽宽和外花键齿厚&#xff0c;以及渐开线终止圆 和起始圆直径检测&#xff1b;齿距累计误差 、齿形误差 、…

Python网络爬虫:Scrapy框架的全面解析

Python网络爬虫&#xff1a;Scrapy框架的全面解析 一、引言 在当今互联网的时代&#xff0c;数据是最重要的资源之一。为了获取这些数据&#xff0c;我们经常需要编写网络爬虫来从各种网站上抓取信息。Python作为一种强大的编程语言&#xff0c;拥有许多用于网络爬虫的工具和库…

护网在即,知攻善防助力每一位安服仔~

前言 是不是已经有师傅进场了呢~ 是不是有安服&#x1f412;在值守呢~ 您是不是被网上眼花缭乱的常用应急响应工具而烦恼呢&#xff1f; 何以解忧&#xff1f;唯有知攻善防&#xff01; 创作起源&#xff1a; 驻场、护网等&#xff0c;有的客户现场只允许用客户机器&…

一.7.(2)基本运算电路,包括比例运算电路、加减运算电路、积分运算电路、微分电路等常见电路的分析、计算及应用;(未完待续)

what id the 虚短虚断虚地? 虚短&#xff1a;运放的正相输入端和反相输入端貌似连在一起了&#xff0c;所以两端的电压相等&#xff0c;即UU- 虚断&#xff1a;输入端输入阻抗无穷大 虚地&#xff1a;运放正相输入端接地&#xff0c;导致U&#xff1d;U-&#xff1d;0。 虚…

采用Java语言+开发工具 Idea+ scode数字化产科管理平台源码,产科管理新模式

采用Java语言开发工具 Idea scode数字化产科管理平台源码&#xff0c;产科管理新模式 数字化产科管理系统是现代医疗信息化建设的重要组成部分&#xff0c;它利用现代信息技术手段&#xff0c;对孕产妇的孕期管理、分娩过程及产后康复等各个环节进行数字化、智能化管理&#xf…

lua中判断2个表是否相等

当我们获取 table 长度的时候无论是使用 # 还是 table.getn 其都会在索引中断的地方停止计数&#xff0c;而导致无法正确取得 table 的长度&#xff0c;而且还会出现奇怪的现象。例如&#xff1a;t里面有3个元素&#xff0c;但是因为最后一个下表是5和4&#xff0c;却表现出不一…

SpringBoot3+Vue3开发园区管理系统

介绍 在当今快速发展的城市化进程中&#xff0c;高效、智能的园区管理成为了提升居民生活品质、优化企业运营环境的关键。为此&#xff0c;我们精心打造了全方位、一体化的园区综合管理系统&#xff0c;该系统深度融合了园区管理、楼栋管理、楼层管理、房间管理以及车位管理等…

微信小程序消息通知(一次订阅)

在微信公众平台配置通知模版 通过wx.login获取code发送给后端 let that this // 登陆codewx.login({success: function (res) {if (res.code) {// 发送code到后端换取openid和session_keythat.setData({openCode: res.code})console.log(that.data.openCode, openCode);// 调…

【SpringBoot】SpringBoot内置Servlet容器源码分析-Tomcat

自动装配加载 ServletWebServerFactoryAutoConfiguration 在自动装配的时候&#xff0c;会加载spring.factories&#xff0c;并且添加到IOC容器中。这里包含web自动配置类ServletWebServerFactoryAutoConfiguration &#xff0c;其中本类中注入三个bean&#xff0c;分别是Embed…

【数据结构与算法】插入排序

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注 ​

Ollama报错:Error: llama runner process has terminated: exit status 0xc0000409

0&#xff0c;背景 今天听说谷歌家的Gemma2性能很好&#xff0c;于是在Ollama上下载到本地测试一下 ollama run gemma2 结果终端里报错 Error: llama runner process has terminated: exit status 0xc0000409 1&#xff0c;原因 原因很简单&#xff0c;新的模型&#xff…

vue项目实现堆叠卡片拖动切换效果

实际效果 实现流程 1. 实现卡片位置堆叠 将父元素的 position 设置成relative &#xff0c;卡片的position 设置成 absolute 即可。 2. 消除图片的移动 如果卡片上有图片&#xff0c;默认拖动的时候就会导致像上图一样变成了选中图片移动&#xff0c;从而没法触发拖动事件。消…

Canal架构以及使用规范

Canal架构以及使用规范 一、Canal的作用 相关文档&#xff1a;GitHub - alibaba/canal: 阿里巴巴 MySQL binlog 增量订阅&消费组件 MySQL主备复制原理 MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events&#xff0c;可…