文章目录
- 前言
- 回归介绍
- 基本概念
- 线性回归
- 非线性回归
- 边框回归
- 交并比介绍
- 定义
- 程序实现
- 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的工作原理可以概括为以下几个步骤:
- 选择最高置信度的边界框:从所有候选框中选择具有最高置信度(或检测概率)的边界框。
- 计算交并比(IoU):计算该边界框与其他所有边界框的IoU。IoU是两个边界框重叠程度的度量,计算公式为重叠区域的面积除以联合区域的面积。
- 抑制重叠框:如果IoU超过某个阈值(如0.5),则认为这两个边界框检测到的是同一个目标,因此抑制(删除或忽略)置信度较低的边界框。
- 迭代处理:重复上述过程,直到所有边界框都被处理。
代码实现
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本人工智能书籍),实时更新深度学习相关知识!