目标检测2--yolov1中相关基础知识(边框回归、交并比、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本人工智能书籍),实时更新深度学习相关知识!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xp_fangfei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值