1. IOU和GIOU损失
边界框回归(Bounding Box Regression)是物体检测中重要的一项任务,之前大部分的物体检测模型是直接对边界框的位置(中心点)和大小(宽和高)进行回归,采用的损失函数往往是L1 norm和L2 norm,比如YOLOv1采用平方差损失,Faster RCNN采用smooth L1损失。不过近来的工作发现,直接采用IoU损失往往能得到更好的效果,因为IoU也是物体检测模型mAP的评测标准。GIoU损失更近一步地对IoU损失进行了优化,解决了预测框和目标框无任何重叠时的场景(此时IoU loss无梯度)。DIoU损失是GIoU损失的近一步优化,它不仅比GIoU损失的收敛速度更快,也能够实现更好的性能,目前也被广泛应用在物体检测模型中,如YOLOv5.
2. DIOU损失
虽然GIoU损失解决了IoU损失在预测框和目标框不重叠时梯度为0的问题,但DIoU这篇工作发现GIoU损失依然存在收敛速度慢和回归不准确的问题。首先,当预测框和目标框不重叠时,GIoU损失先倾向于增加预测框的大小以使得预测框和目标框重叠,之后IoU损失将起主要作用来最大化两者的IoU,如下图所示,这个优化过程并不是最优的,所以收敛速度较慢。
torchvision 库已经实现了DIOU损失
def _diou_iou_loss(
boxes1: torch.Tensor,
boxes2: torch.Tensor,
eps: float = 1e-7,
) -> Tuple[torch.Tensor, torch.Tensor]:
# 计算IoU
intsct, union = _loss_inter_union(boxes1, boxes2)
iou = intsct / (union + eps)
# 计算最小包络矩形
x1, y1, x2, y2 = boxes1.unbind(dim=-1)
x1g, y1g, x2g, y2g = boxes2.unbind(dim=-1)
xc1 = torch.min(x1, x1g)
yc1 = torch.min(y1, y1g)
xc2 = torch.max(x2, x2g)
yc2 = torch.max(y2, y2g)
# 计算对角线平方
diagonal_distance_squared = ((xc2 - xc1) ** 2) + ((yc2 - yc1) ** 2) + eps
# 中心点
x_p = (x2 + x1) / 2
y_p = (y2 + y1) / 2
x_g = (x1g + x2g) / 2
y_g = (y1g + y2g) / 2
# 中心点的欧式距离
centers_distance_squared = ((x_p - x_g) ** 2) + ((y_p - y_g) ** 2)
loss = 1 - iou + (centers_distance_squared / diagonal_distance_squared)
return loss, iou
3. CIOU损失
def complete_box_iou_loss(
boxes1: torch.Tensor,
boxes2: torch.Tensor,
eps: float = 1e-7,
):
# 计算DIoU和IoU
diou_loss, iou = _diou_iou_loss(boxes1, boxes2)
x1, y1, x2, y2 = boxes1.unbind(dim=-1)
x1g, y1g, x2g, y2g = boxes2.unbind(dim=-1)
# 计算预测框和目标框的width和height
w_pred = x2 - x1
h_pred = y2 - y1
w_gt = x2g - x1g
h_gt = y2g - y1g
v = (4 / (torch.pi**2)) * torch.pow((torch.atan(w_gt / h_gt) - torch.atan(w_pred / h_pred)), 2)
# 参数不参与梯度
with torch.no_grad():
alpha = v / (1 - iou + v + eps)
loss = diou_loss + alpha * v
return loss
4. 总结
当涉及目标检测任务时,IOU、GIOU、DIOU和CIOU都是用于衡量预测框和真实框之间重叠程度的度量指标和损失函数。它们都在不同程度上考虑了位置、尺度以及框之间的关系,以提供更准确的损失信号,从而帮助模型更好地学习目标检测。
下面是它们的主要区别和联系:
-
IOU(Intersection over Union):
- IOU是
最基本的重叠度量指标,计算预测框和真实框的交集面积与并集面积的比值。 - IOU在目标检测中常用于
衡量框之间的重叠程度,并且可以作为简单的损失函数来优化模型。
- IOU是
-
GIOU(Generalized Intersection over Union):
- GIOU是IOU的扩展,不仅考虑了
交集和并集面积,还考虑了外接矩形(最小包围框)之间的重叠程度。 - GIOU考虑了
位置、尺度以及框的匹配关系,使得在不完美匹配的情况下,损失信号更准确,帮助模型学习更好的框位置。
- GIOU是IOU的扩展,不仅考虑了
-
DIOU(Distance Intersection over Union):
- DIOU在GIOU的基础上引入了
中心点之间的距离,以及对角线距离的平方,用于更准确地衡量框的位置偏移。 - DIOU考虑了更多的几何信息,能够处理更复杂的框匹配情况。
- DIOU在GIOU的基础上引入了
-
CIOU(Complete Intersection over Union):
- CIOU在DIOU的基础上引入了
外接框调整因子,用于更好地捕捉位置和尺度信息。 - CIOU考虑了更全面的
几何信息,包括交集、并集、对角线距离以及外接框,能够提供更准确的损失信号。
- CIOU在DIOU的基础上引入了
总之,IOU、GIOU、DIOU和CIOU都是衡量预测框和真实框之间重叠程度的指标,随着逐步引入更多几何信息,它们在不同程度上提供了更准确的损失信号,以指导目标检测模型训练。选择使用哪种度量指标和损失函数应根据任务需求和数据特点进行权衡。