141、IoU 损失函数从零推导:IoU 到 GIoU 到 DIoU 到 CIoU 的公式演进与代码

📅 2026/7/8 6:37:56
141、IoU 损失函数从零推导:IoU 到 GIoU 到 DIoU 到 CIoU 的公式演进与代码
141、IoU 损失函数从零推导:IoU 到 GIoU 到 DIoU 到 CIoU 的公式演进与代码去年年底调一个无人机检测模型,边界框回归死活不收敛,mAP卡在0.72上不去。换了各种学习率调度器、数据增强,甚至把backbone从CSPDarknet换成RepVGG,都没用。最后排查到损失函数——用的还是最原始的Smooth L1。换成CIoU之后,同样的训练配置,mAP直接跳到0.81。这个教训让我意识到,边界框回归的损失函数设计,远比想象中重要。从Smooth L1到IoU:为什么需要改变Smooth L1损失函数的问题在于它把边界框的四个坐标(x, y, w, h)当作独立变量处理。但实际检测任务中,我们关心的是预测框和真实框之间的重叠程度,而不是坐标值的绝对差异。举个例子,一个预测框的x坐标偏差5个像素,如果框本身很大(比如200x200),这个偏差对IoU的影响微乎其微;但如果框很小(比如20x20),同样的偏差会导致IoU急剧下降。Smooth L1完全无法捕捉这种尺度敏感性。IoU损失函数直接优化交并比,公式很简单:IoU = |A ∩ B| / |A ∪ B| LIoU = 1 - IoU这里有个坑:当预测框和真实框完全不重叠时,IoU = 0,梯度也为0,模型直接停止学习。这就是为什么纯IoU损失在实际训练中很少单独使用。GIoU:解决零梯度问题GIoU(Generalized