
本文独家改进:Inner-IoU引入尺度因子 ratio 控制辅助边框的尺度大小用于计算损失,新型边界框相似度度量(MPDIoU)MPDIoU损失进行有效结合

论文:https://arxiv.org/pdf/2311.02877.pdf
摘要:随着检测器的迅速发展, 边框回归取得了巨大的进步。然而,现有的基于 IoU 的边框回归仍聚焦在通过加入新的损失项来加速收敛,忽视 IoU 损失项其自身的限制。尽管理论上 IoU 损失能够有效描述边框回归状态,在实际应用中,它无法根据不同检测器与检测任务进行自我调整,不具有很强的泛化性。基于以上,我们首先分析了 BBR 模式,得出结论在回归过程区分不同回归样本并且使用不同尺度的辅助边框计算损失能够有效加速边框回归过程。对于高 IoU 样本,使用较小的辅助边框计算损失能够加速收敛,而较大辅助边框适用于低 IoU 样本。接着,我们提出了 Inner-IoU Loss, 其通过辅助边框计算 IoU 损失。针对不同的数据集与检测器,我们引入尺度因子 ratio 控制辅助边框的尺度大小用于计算损失。最后,将 Inner-IoU 集成至现有的基于 IoU 损失函数中进行仿真实验与对比实验。实验结果表明在使用本文所提出方法后检测效果得到进一步提升,验证了本文方法的有效性以及泛化能力。
IoU损失函数在计算机视觉任务中有广泛的应用。在边界框回归过程中,不仅可以评估回归状态,还可以通过计算回归损失来加速收敛。在这里,作者讨论IoU变化与边界框大小之间的关系,分析边界框回归问题的本质特征,并解释本文提出方法的可行性。

为弥补现有IoU损失函数在不同的检测任务中的泛化能力较弱且收敛速度较慢的不足,作者提出使用辅助边界框计算损失以加速边界框回归过程。在Inner-IoU中,作者引入了尺度因子比,可以控制辅助边界框的尺度大小。通过为不同数据集和检测器使用不同尺度的辅助边界框,可以克服现有方法在泛化能力方面的局限。


原理可参考作者博客:
作者导读:Inner-IoU:基于辅助边框的IoU损失-CSDN博客

摘要:边界框回归(BBR)已广泛应用于对象检测和实例分割,是对象定位的重要步骤。 然而,当预测框与真实框具有相同的长宽比,但宽度和高度值完全不同时,大多数现有的边界框回归损失函数无法优化。 为了解决上述问题,我们充分挖掘水平矩形的几何特征,提出了一种基于最小点距离的新型边界框相似度比较度量MPDIoU,它包含了现有损失函数中考虑的所有相关因素,即重叠 或非重叠区域、中心点距离、宽高偏差,同时简化计算过程。 在此基础上,我们提出了一种基于 MPDIoU 的边界框回归损失函数,称为 LMPDIoU 。 实验结果表明,MPDIoU 损失函数适用于在 PASCAL VOC、MS COCO 和 IIIT5k 上训练的最先进的实例分割(例如 YOLACT)和对象检测(例如 YOLOv7)模型优于现有的损失函数。
具有不同边界框回归结果的两种情况。绿色框表示真实边界框,红色框表示预测边界框。 这两种情况之间的 LGIoU 、 LDIoU 、LCIoU 、 LEIoU 的值完全相同,但LMPDIoU不同

核心代码:
def bbox_inner_mpdiou(box1, box2, xywh=True, mpdiou=1, ratio=0.7, eps=1e-7):
"""
Calculate Intersection over Union (IoU) of box1(1, 4) to box2(n, 4).
"""
# Get the coordinates of bounding boxes
if xywh: # transform from xywh to xyxy
(x1, y1, w1, h1), (x2, y2, w2, h2) = box1.chunk(4, -1), box2.chunk(4, -1)
w1_, h1_, w2_, h2_ = w1 / 2, h1 / 2, w2 / 2, h2 / 2
b1_x1, b1_x2, b1_y1, b1_y2 = x1 - w1_, x1 + w1_, y1 - h1_, y1 + h1_
b2_x1, b2_x2, b2_y1, b2_y2 = x2 - w2_, x2 + w2_, y2 - h2_, y2 + h2_
else: # x1, y1, x2, y2 = box1
b1_x1, b1_y1, b1_x2, b1_y2 = box1.chunk(4, -1)
b2_x1, b2_y1, b2_x2, b2_y2 = box2.chunk(4, -1)
w1, h1 = b1_x2 - b1_x1, b1_y2 - b1_y1 + eps
w2, h2 = b2_x2 - b2_x1, b2_y2 - b2_y1 + eps
# Inner-IoU
innner_iou = get_inner_iou(box1, box2, xywh=xywh, ratio=ratio)
# Intersection area
inter = (b1_x2.minimum(b2_x2) - b1_x1.maximum(b2_x1)).clamp_(0) * \
(b1_y2.minimum(b2_y2) - b1_y1.maximum(b2_y1)).clamp_(0)
# Union Area
union = w1 * h1 + w2 * h2 - inter + eps
# IoU
iou = inter / union
d1 = (b2_x1 - b1_x1) ** 2 + (b2_y1 - b1_y1) ** 2
d2 = (b2_x2 - b1_x2) ** 2 + (b2_y2 - b1_y2) ** 2
return innner_iou - d1 / mpdiou_hw - d2 / mpdiou # MPDIoU详见:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。