前言
在上篇博客目标检测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本人工智能书籍),实时更新深度学习相关知识!