IOU系列: IOU, GIOU, DIOU, CIOU

408 阅读4分钟

1. IOU和GIOU损失

边界框回归(Bounding Box Regression)是物体检测中重要的一项任务,之前大部分的物体检测模型是直接对边界框的位置(中心点)大小(宽和高)进行回归,采用的损失函数往往是L1 normL2 norm,比如YOLOv1采用平方差损失Faster RCNN采用smooth L1损失。不过近来的工作发现,直接采用IoU损失往往能得到更好的效果,因为IoU也是物体检测模型mAP的评测标准。GIoU损失更近一步地对IoU损失进行了优化,解决了预测框目标框无任何重叠时的场景(此时IoU loss无梯度)DIoU损失是GIoU损失的近一步优化,它不仅比GIoU损失的收敛速度更快,也能够实现更好的性能,目前也被广泛应用在物体检测模型中,如YOLOv5.

Screen Shot 2023-08-22 at 2.39.39 PM.png Screen Shot 2023-08-21 at 9.10.59 PM.png Screen Shot 2023-08-21 at 9.15.51 PM.png

2. DIOU损失

虽然GIoU损失解决了IoU损失在预测框目标框不重叠梯度为0的问题,但DIoU这篇工作发现GIoU损失依然存在收敛速度慢回归不准确的问题。首先,当预测框和目标框不重叠时,GIoU损失先倾向于增加预测框的大小以使得预测框目标框重叠,之后IoU损失将起主要作用最大化两者的IoU,如下图所示,这个优化过程并不是最优的,所以收敛速度较慢Screen Shot 2023-08-21 at 9.11.58 PM.png Screen Shot 2023-08-21 at 9.22.07 PM.png

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损失

Screen Shot 2023-08-21 at 9.23.00 PM.png

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都是用于衡量预测框真实框之间重叠程度的度量指标和损失函数。它们都在不同程度上考虑了位置、尺度以及框之间的关系,以提供更准确的损失信号,从而帮助模型更好地学习目标检测。

下面是它们的主要区别和联系:

  1. IOU(Intersection over Union)

    • IOU是最基本的重叠度量指标,计算预测框和真实框的交集面积并集面积比值
    • IOU在目标检测中常用于衡量框之间的重叠程度,并且可以作为简单的损失函数来优化模型
  2. GIOU(Generalized Intersection over Union)

    • GIOU是IOU的扩展,不仅考虑了交集和并集面积,还考虑了外接矩形(最小包围框)之间的重叠程度
    • GIOU考虑了位置尺度以及框的匹配关系,使得在不完美匹配的情况下,损失信号更准确,帮助模型学习更好的框位置。
  3. DIOU(Distance Intersection over Union)

    • DIOU在GIOU的基础上引入了中心点之间的距离,以及对角线距离平方,用于更准确地衡量框的位置偏移
    • DIOU考虑了更多的几何信息,能够处理更复杂的框匹配情况。
  4. CIOU(Complete Intersection over Union)

    • CIOU在DIOU的基础上引入了外接框调整因子,用于更好地捕捉位置尺度信息
    • CIOU考虑了更全面的几何信息,包括交集并集对角线距离以及外接框,能够提供更准确的损失信号。

总之,IOU、GIOU、DIOU和CIOU都是衡量预测框和真实框之间重叠程度的指标,随着逐步引入更多几何信息,它们在不同程度上提供了更准确的损失信号,以指导目标检测模型训练。选择使用哪种度量指标和损失函数应根据任务需求和数据特点进行权衡。

Reference:

zhuanlan.zhihu.com/p/545306802