文章目录
前言
目标检测一直是计算机视觉中最基本的问题之一,它包括目标分类和目标定位两个子任务。 当前最先进的二阶段目标检测器(例如,Cascade R-CNN,MASk R-CNN和Dynamic R-CNN)依赖于边bbox回归(BBR)模块来定位对象;对于单阶段目标检测器(例如,YOLO,SSD)则依靠BBR来定位。
所以说,一个设计良好的损失函数对BBR的成功至关重要。到目前为止,BBR的损失函数主要分为两类:
范数损失函数
通过边框点来计算,比较多得是L1范数,例如:
- SmoothL1 loss
- Dynamic SmoothL1 Loss
- BalanceL1 loss
假定Bbox(x, y, w, h)四个变量是独立的,实际不是,故引入IOU损失
IOU损失函数
通过交并面积计算,例如:
- IOU loss
- GIOU loss(Generalized IOU )
- CIOU loss (Complete IOU)
- DIOU loss(Distance IOU )
- Pixels IOU
- EIOU loss
损失函数怎么来的,由我们需要的性质反推而来,比如我们需要:
-
当回归误差趋近于零时,梯度的大小应该有一个零的极限。
-
在回归误差较小的区域,梯度幅度应迅速增大,在回归误差较大的区域,梯度幅度应逐渐减小。
-
为了灵活地控制低质量实例的抑制程度,需要设置超参数。
-
对于不同的超参数值,梯度函数族应该有一个归一化尺度,例如(0,1),这有助于在高质量和低质量示例之间进行平衡。
IOU loss (2016)
论文:Unitbox: An advanced object detection network
- 优点:
该方法具有非负性、对称性、三角形不等式和尺度不敏感性等优点
- 缺点:
-
如果两个方框没有任何交集,则IOU损失将始终为零,不能正确反映两个方框之间的紧密程度。
-
损失的收敛速度较慢
实现代码:
import numpy as np
def Iou(box1, box2, wh=False):
if wh == False:
xmin1, ymin1, xmax1, ymax1 = box1
xmin2, ymin2, xmax2, ymax2 = box2
else:
xmin1, ymin1 = int(box1[0]-box1[2]/2.0), int(box1[1]-box1[3]/2.0)
xmax1, ymax1 = int(box1[0]+box1[2]/2.0), int(box1[1]+box1[3]/2.0)
xmin2, ymin2 = int(box2[0]-box2[2]/2.0), int(box2[1]-box2[3]/2.0)
xmax2, ymax2 = int(box2[0]+box2[2]/2.0), int(box2[1]+box2[3]/2.0)
# 获取矩形框交集对应的左上角和右下角的坐标(intersection)
xx1 = np.max([xmin1, xmin2])
yy1 = np.max([ymin1, ymin2])
xx2 = np.min([xmax1, xmax2])
yy2 = np.min([ymax1, ymax2])
# 计算两个矩形框面积
area1 = (xmax1-xmin1) * (ymax1-ymin1)
area2 = (xmax2-xmin2) * (ymax2-ymin2)
inter_area = (np.max([0, xx2-xx1])) * (np.max([0, yy2-yy1])) #计算交集面积
iou = inter_area / (area1+area2-inter_area+1e-6)

本文探讨了目标检测中的关键组件——边框回归损失函数,从范数损失如SmoothL1到IOU家族(IOU、GIOU、DIoU、CIoU、EIOU及Focal-EIOU),详细介绍了每个损失函数的优缺点和实现细节。这些改进旨在解决收敛速度、精度和异常值抑制等问题,为优化目标检测性能提供深入理解。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



