共计 1898 个字符,预计需要花费 5 分钟才能阅读完成。
背景介绍
在目标检测任务中,损失函数是衡量预测框与真实框差异的关键指标。早期的 IoU(Intersection over Union)虽然直观,但无法处理非重叠情况。DIoU(Distance-IoU)和 CIoU(Complete-IoU)在此基础上引入了中心点距离和长宽比约束,其中 CIoU 因其全面性成为主流选择。但随着应用深入,CIoU 的缺陷也逐渐暴露。

数学原理
CIoU 损失函数定义为:
$$
L_{CIoU} = 1 – IoU + \frac{\rho^2(b,b^{gt})}{c^2} + \alpha v
$$
其中:
- $IoU$ 是交并比
- $\rho$ 是预测框与真实框中心点的欧氏距离
- $c$ 是最小外接矩形的对角线长度
- $v$ 是长宽比一致性系数:
$$
v = \frac{4}{\pi^2}(\arctan\frac{w^{gt}}{h^{gt}} – \arctan\frac{w}{h})^2
$$ - $\alpha$ 是权重系数:
$$
\alpha = \frac{v}{(1-IoU)+v}
$$
缺点分析
1. 梯度消失问题
当预测框与真实框完全重合时,长宽比项的梯度会突然归零,导致训练后期优化停滞。
2. 长宽比项的不稳定性
$v$ 的计算涉及 arctan 函数,当宽高比接近时会出现梯度震荡。实验表明,该项可能干扰主要优化方向。
3. 中心点距离与尺寸优化的冲突
$\alpha$ 的动态调整可能使模型在中心点对齐和尺寸匹配之间反复振荡。
改进方案
EIoU(Enhanced-IoU)
将长宽比项拆分为宽度和高度两个独立惩罚项:
$$
L_{EIoU} = L_{DIoU} + \frac{\rho^2(w,w^{gt})}{C_w^2} + \frac{\rho^2(h,h^{gt})}{C_h^2}
$$
优点:梯度更平滑,收敛更稳定。
SIoU(Shape-IoU)
引入角度惩罚项,优先对齐最接近的轴:
$$
\Lambda = 1 – 2\cdot\sin^2(\arcsin(\frac{|x_c|}{\sqrt{d^2 + 1}})-\frac{\pi}{4})
$$
优点:对旋转框检测更友好。
实验对比
| 损失函数 | AP@0.5 | AP@0.75 | AP@[0.5:0.95] |
|---|---|---|---|
| CIoU | 58.2 | 37.5 | 40.1 |
| EIoU | 59.1 | 38.3 | 41.2 |
| SIoU | 59.4 | 38.7 | 41.5 |
(数据基于 YOLOv5 在 COCO val2017 的测试结果)
代码实现
import torch
import math
def bbox_ciou(box1, box2):
"""
CIoU 实现(PyTorch 版本)输入格式:[x1,y1,x2,y2]
"""
# 计算交集面积
inter = (torch.min(box1[:,2:], box2[:,2:]) - torch.max(box1[:,:2], box2[:,:2])).clamp(0).prod(1)
# 计算并集面积
union = (box1[:,2]-box1[:,0])*(box1[:,3]-box1[:,1]) + \
(box2[:,2]-box2[:,0])*(box2[:,3]-box2[:,1]) - inter
# IoU 计算
iou = inter / union
# 中心点距离
ctr_dist = torch.pow(box1[:,:2]+box1[:,2:]-box2[:,:2]-box2[:,2:], 2).sum(1)/4
# 最小外接矩形对角线
enclose = torch.pow(torch.max(box1[:,2:],box2[:,2:])-torch.min(box1[:,:2],box2[:,:2]), 2).sum(1)
# 长宽比惩罚项
arctan = torch.atan((box1[:,2]-box1[:,0])/(box1[:,3]-box1[:,1]+1e-7)) - \
torch.atan((box2[:,2]-box2[:,0])/(box2[:,3]-box2[:,1]+1e-7))
v = 4*torch.pow(arctan/math.pi, 2)
alpha = v / (1 - iou + v + 1e-7)
return 1 - iou + (ctr_dist / enclose) + alpha*v
最佳实践
- 常规目标检测 :优先选择 EIoU,平衡精度与稳定性
- 小目标密集场景 :SIoU 的角度惩罚效果更佳
- 训练初期 :可先用 DIoU 快速收敛,后期切换 CIoU
- 长宽比变化大 :建议禁用长宽比惩罚项(alpha=0)
总结展望
当前改进方向主要集中在:
– 解耦不同优化目标(位置 / 尺寸 / 角度)
– 动态调整各项权重
– 结合注意力机制
未来可能涌现更多基于任务特性的自适应损失函数设计。建议开发者根据实际数据分布选择合适的变体,必要时可自定义加权策略。
