1. 为什么需要改进IoU损失函数?
在目标检测中,损失函数是模型训练的“指挥棒”,直接决定了模型如何学习预测边界框。传统的IoU(交并比)损失虽然简单,但存在致命缺陷:
梯度消失: 当预测框与真实框完全不重叠时,IoU=0,梯度为0,模型无法学习
方向不明确: 完全不重叠时无法判断预测框应该往哪个方向调整
收敛缓慢: 对小目标、密集目标场景优化效率低
2. 各种IoU损失函数
2.1 IoU(Intersection over Union)
IoU是目标检测中最核心的评价指标,也是边界框回归损失函数的基础。它衡量的是预测框(Prediction Box)与真实框(Ground Truth Box)之间的重叠程度。IoU = 两个框的交集面积 / 两个框的并集面积。

2.1.1 IoU的基础公式
IoU 的计算公式很简单:
IoU=∣A∪B∣∣A∩B∣IoU= \frac{∣A∪B∣}{∣A∩B∣} IoU=∣A∩B∣∣A∪B∣
假设:预测框 A = (x1, y1, x2, y2),其中(x1,y1)为左上角,(x2,y2)为右下角;真实框 B = (x1’, y1’, x2’, y2’)。
# 交集区域
inter_x1 = max(x1, x1')
inter_y1 = max(y1, y1')
inter_x2 = min(x2, x2')
inter_y2 = min(y2, y2')
# 交集面积(如果无交集,面积为0)
inter_area = max(0, inter_x2 - inter_x1) * max(0, inter_y2 - inter_y1)
# 各自面积
area_A = (x2 - x1) * (y2 - y1)
area_B = (x2' - x1') * (y2' - y1')
# 并集面积
union_area = area_A + area_B - inter_area
# IoU
IoU = inter_area / union_area
2.1.2 IoU的核心作用
(1)评价指标(评价模型好坏)
在目标检测中,判断检测结果是否正确:
# COCO数据集标准
if IoU >= 0.5:
检测正确 (True Positive)
else:
检测错误 (False Positive)
实验结果中mAP50、mAP75、mAP50-95的含义:
mAP50: IoU阈值0.5 (当预测框与真实框的IoU≥0.5时,才算检测正确。)
mAP75: IoU阈值0.75
mAP50-95: IoU阈值从0.5到0.95取平均
(2)损失函数(训练模型)
训练时让模型学会预测更准确的框:IoU Loss = 1 - IoU
当IoU=0.9时,Loss=0.1(小损失,已经很好);当IoU=0.3时,Loss=0.7(大损失,需要改进)
问题就出现了:当两个框完全不重叠时,IoU=0,Loss=1,梯度为0 → 模型不知道怎么调整!
(3)NMS非极大值抑制(筛选检测结果)
检测时会产生大量重叠的候选框,用IoU筛选:
step1. 按置信度排序所有候选框
step2. 保留最高分框,剔除与它IoU > 0.5的其他框
step3. 重复直到处理完所有框
2.1.3 IoU的致命缺陷
(1) 梯度消失问题
IoU = 0,IoU Loss = 1, 梯度 = 0。模型无法学习,参数停止更新。


上面两张图片的两种情况的IoU都是0,损失都是1,但需要调整的方向和距离完全不同!IoU无法告诉模型应该向左/右/上/下移动。

IoU无法区分两个对象之间不同的对齐方式。更确切的讲,不同方向上有相同较差级别的两个重叠对象的IoU会完全相等。比如上面图片这种情况,IoU相当,但是无法区别。
2.2 GIoU (Generalized IoU)
进化动机:解决IoU“完全不重叠时梯度消失”的问题。
核心改进:引入最小包围框(能同时包裹预测框和真实框的最小矩形)
GIoU 在 IoU 基础上引入了一个惩罚项,这个惩罚项依赖于 C:C=能同时包围 A 和 B 的最小矩形(凸包)
GIoU 公式:
GIoU=IoU−C/(A∪B)∣C∣GIoU= IoU-\frac{C/(A∪B)}{∣C∣} GIoU=IoU−∣C∣C/(A∪B)
其中:C∖(A∪B):包围框中 既不属于 A 也不属于 B 的区域(灰色区域);除以 ∣C∣ 是为了归一化到 [0,1]
2.2.1 改进效果
(1) 两框有重叠的情况(IoU > 0)
当预测框和真实框已经有了部分重叠时,它们的最小包围框 C 会刚好“紧贴”在两个框的最外侧边缘。此时,包围框内部除了两个框本身占用的地方,剩下的灰色区域C∖(A∪B)通常很小。因为两个框靠得比较近,包围框不会比它们大太多。这个很小的灰色区域面积除以 C 的面积,是一个比较小的正数。GIoU=IoU−小正数。这时候 GIoU 的值略小于 IoU,但整体行为与 IoU 非常相似。优化器主要还是在努力让重叠面积(IoU 部分)变大。
(2)两个框完全没有重叠(IoU = 0)
这是 GIoU 真正发挥作用的地方。此时预测框和真实框是分离的。灰色区域变得很大,因为两个框不重叠,包围框 C 内部就分成了三个独立的部分:框 A、框 B、以及剩下的所有空白(灰色区域)。灰色区域面积=∣C∣−(∣A∣+∣B∣)(这里 ∣A∪B∣=∣A∣+∣B∣ 成立,正是因为 A 和 B 没有重叠。)
计算 GIoU 的惩罚项: 惩罚项,也就是要减掉的那部分,是灰色区域占整个包围框 C 的比例:
减去的值=∣C∣−(∣A∣+∣B∣)∣C∣=1−∣A∣+∣B∣∣C∣减去的值= \frac{∣C∣−(∣A∣+∣B∣)}{∣C∣}=1-\frac{∣A∣+∣B∣ }{∣C∣} 减去的值=∣C∣∣C∣−(∣A∣+∣B∣)=1−∣C∣∣A∣+∣B∣
最终得出 GIoU 的值: 由于 IoU = 0,代入 GIoU 公式:
GIoU=IoU−减去的值=0−[1−∣A∣+∣B∣∣C∣]=∣A∣+∣B∣∣C∣−1GIoU=IoU-减去的值 \\
=0-[1-\frac{∣A∣+∣B∣ }{∣C∣}] \\
=\frac{∣A∣+∣B∣ }{∣C∣}-1GIoU=IoU−减去的值=0−[1−∣C∣∣A∣+∣B∣]=∣C∣∣A∣+∣B∣−1
这个公式揭示了一个非常重要的性质:当两个框完全不重叠时,GIoU 的值直接反映了它们之间的相对距离。
当两个框逐渐远离时: 最小包围框 C 必须变得更大才能同时包住它们。分母 ∣C∣ 增大 → 分数(∣A∣+∣B∣) /∣C∣变小→ GIoU 的值变得更小(向-1方向移动)。梯度信息:损失函数会告诉模型“你们离得太远了,GIoU 已经很负了,这是个很糟糕的状态”。
当两个框逐渐靠近时: 最小包围框 C 会相应缩小。分母 ∣C∣ 减小 → 分数(∣A∣+∣B∣) /∣C∣变大→ GIoU 的值变得更大(向0方向移动)。梯度信息:损失函数会明确指示“你们的方向是正确的,继续靠近,GIoU 正在提升”。
GIoU = 1:完全重合
GIoU = 0:面积相等且刚好相切(或特定比例)
GIoU = -1:两个框相距无穷远
2.2.2 GIoU损失函数
实际训练中通常使用:LGIoU=1−GIoU L_{GIoU}=1-GIoU LGIoU=1−GIoU
范围:[0,2]
完全重合:1−1=0
相距无穷远:1−(−1)=2
2.2.3 GIoU 的局限性
GIoU 虽然解决了梯度消失,但仍有缺陷:
(1) 水平/垂直方向优化困难:当预测框完全被真实框包含时,GIoU 退化为 IoU,无法区分“中心对齐”和“偏移到角落”的情况。
(2 )收敛慢:需要先扩大包围框来产生梯度,而不是直接拉近中心距离。这导致需要更多的迭代次数才能收敛。
这促使了后续的 DIoU(引入中心点距离)和 CIoU(再引入宽高比一致性)。
2.3 DIoU (Distance-IoU)
DIoU 在 IoU 的基础上,直接惩罚两个框中心点之间的欧氏距离,同时引入最小包围框的对角线长度作为归一化因子。DIoU = IoU - (中心点距离 / 包围框对角线长度)²
公式:
DIoU=IoU−ρ2(b,bgt)c2DIoU= IoU- \frac{\rho ^{2}(b,b^{gt})}{c^{2}} DIoU=IoU−c2ρ2(b,bgt)
其中,ρ2(b,bgt)\rho ^{2}(b,b^{gt})ρ2(b,bgt) = 预测框中心b与真实框中心bgtb^{gt}bgt的欧氏距离的平方;c = 最小包围框C的对角线长度。
损失函数:
LDIoU=1−DIoU L_{DIoU}=1-DIoU LDIoU=1−DIoU
2.3.1 改进效果
当预测框完全在真实框内部时:

中心对齐的情况,IoU相同,GIoU相同,DIoU更大(好);角落的情况,IoU相同,GIoU相同,DIoU更小(差)。DIoU 会惩罚中心偏移,引导预测框向中心移动。
2.3.2 DIoU 的局限性
DIoU 虽然解决了中心距离的问题,但还有一个缺陷:无法区分宽高比的差异。
考虑两个场景:
- 预测框和真实框有相同的中心点和 IoU,但宽高比不同(一个瘦高,一个矮胖)
- DIoU 会给出相同的值,但显然宽高比不一致不是最优的
这促使了 CIoU (Complete IoU) 的诞生,它在 DIoU 的基础上增加了宽高比一致性惩罚项。
2.4 CIoU (Complete IoU)
CIoU 在 DIoU 的基础上,增加了一个宽高比惩罚项,形成完整的损失函数。
公式:
CIoU=IoU−ρ2(b,bgt)c2−α⋅vCIoU= IoU- \frac{\rho ^{2}(b,b^{gt})}{c^{2}}-\alpha \cdot v CIoU=IoU−c2ρ2(b,bgt)−α⋅v
其中,vvv表示宽高比一致性度量,α\alphaα表示权重系数(动态调整)
宽高比一致性度量 vvv:
v=4π2(arctanwgthgt−arctanwh)2v= \frac{4}{\pi ^{2}}(arctan\frac{w ^{gt}}{h^{gt}}-arctan\frac{w}{h})^{2}v=π24(arctanhgtwgt−arctanhw)2
arctan(w/h)arctan(w/h)arctan(w/h) 实际上是宽高比的角度表示;两个arctanarctanarctan相减 表示的是预测框与真实框在宽高比上的差异;平方消除符号影响,放大差异;4/π24/\pi ^{2}4/π2是归一化因子,使得v∈[0,1]v\in [0,1]v∈[0,1]
另外:之所以要用到arctanarctanarctan而不是直接(w/h−wgt/hgt)2(w/h-w^{gt}/h^{gt})^{2}(w/h−wgt/hgt)2,因为直接使用宽高比会导致梯度不稳定,当 w 和 ℎ很小时,宽高比的微小变化会导致巨大波动,arctan 将宽高比映射到(−π/2,π/2),使变化更平滑。
动态权重系数 α\alphaα:
α=v(1−IoU)+v\alpha =\frac{v}{(1-IoU)+v}α=(1−IoU)+vv
当 IoU 很小时(预测框远离真实框):(1−IoU) 很大 → α 很小 → 宽高比惩罚权重小。当框还没重叠时,先让它们靠近更重要(优化中心点)。
当 IoU 很大时(预测框已接近真实框):(1−IoU) 很小 → α 接近 1 → 宽高比惩罚权重大。已经基本对齐了,需要精细调整形状。
CIoU损失函数:
LCIoU=1−CIoU L_{CIoU}=1-CIoU LCIoU=1−CIoU
3. 四种IoU对比


4. 其他IoU
EIoU:将宽高比惩罚拆分为独立的宽惩罚和高惩罚
SIoU:加入角度惩罚(考虑预测框与真实框的夹角)
Wise-IoU:针对低质量样本的加权策略
5. 本文中出现公式的Latex
这里提供所有公式的Letax,可以直接复制粘贴使用,非常方便。
IoU 公式:IoU= \frac{∣A∪B∣}{∣A∩B∣}
GIoU 公式:GIoU= IoU-\frac{C/(A∪B)}{∣C∣}
计算 GIoU 的惩罚项:
减去的值= \frac{∣C∣−(∣A∣+∣B∣)}{∣C∣}=1-\frac{∣A∣+∣B∣ }{∣C∣}
最终得出 GIoU 的值:
GIoU=IoU-减去的值 =0-[1-\frac{∣A∣+∣B∣ }{∣C∣}] =\frac{∣A∣+∣B∣ }{∣C∣}-1
DIoU公式:DIoU= IoU- \frac{\rho {2}(b,b{gt})}{c^{2}}
CIoU公式:CIoU= IoU- \frac{\rho {2}(b,b{gt})}{c^{2}}-\alpha \cdot v
宽高比一致性度量 vvv:v= \frac{4}{\pi ^{2}}(arctan\frac{w {gt}}{h{gt}}-arctan\frac{w}{h})^{2}
动态权重系数 α\alphaα:\alpha =\frac{v}{(1-IoU)+v}
8067

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



