共计 2072 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点
目标检测任务中,边界框回归的精度直接影响检测性能。传统的 IoU(Intersection over Union)损失函数存在两个主要问题:

- 当预测框与真实框没有重叠时,IoU 值为 0,导致梯度消失,无法优化模型
- IoU 对边界框的尺度变化不敏感,特别是对长宽比极端的目标
GIoU(Generalized IoU)虽然解决了无重叠时的梯度问题,但在以下情况仍表现不佳:
- 当预测框完全包含在真实框内时,GIoU 退化为 IoU
- 对边界框的长宽比变化仍不够敏感
技术解析
CIoU(Complete IoU)损失函数通过引入两个关键改进项来解决上述问题:
$L_{CIoU} = 1 – IoU + \frac{\rho^2(b,b^{gt})}{c^2} + \alpha v$
其中:
- $\frac{\rho^2(b,b^{gt})}{c^2}$ 是中心点距离惩罚项
- $\rho$ 表示预测框与真实框中心点的欧式距离
- c 是最小外接矩形的对角线长度
-
该项使模型更关注中心点的对齐
-
$\alpha v$ 是宽高比一致性项
- $v = \frac{4}{\pi^2}(\arctan\frac{w^{gt}}{h^{gt}} – \arctan\frac{w}{h})^2$
- $\alpha = \frac{v}{(1-IoU)+v}$
- 该项确保预测框与真实框的长宽比一致
代码实现
以下是 PyTorch 实现的 CIoU 损失函数:
import torch
import math
def bbox_ciou(box1, box2, eps=1e-7):
"""
计算 CIoU 损失
:param box1: 预测框 [x1,y1,x2,y2]
:param box2: 真实框 [x1,y1,x2,y2]
:param eps: 数值稳定性小量
:return: CIoU 损失值
"""
# 转换为中心点 + 宽高表示
b1_x1, b1_y1, b1_x2, b1_y2 = box1
b2_x1, b2_y1, b2_x2, b2_y2 = box2
# 计算交集面积
inter = (torch.min(b1_x2, b2_x2) - torch.max(b1_x1, b2_x1)).clamp(0) * \
(torch.min(b1_y2, b2_y2) - torch.max(b1_y1, b2_y1)).clamp(0)
# 计算并集面积
w1, h1 = b1_x2 - b1_x1, b1_y2 - b1_y1
w2, h2 = b2_x2 - b2_x1, b2_y2 - b2_y1
union = w1 * h1 + w2 * h2 - inter + eps
# 计算 IoU
iou = inter / union
# 计算中心点距离
c_x1 = torch.min(b1_x1, b2_x1)
c_y1 = torch.min(b1_y1, b2_y1)
c_x2 = torch.max(b1_x2, b2_x2)
c_y2 = torch.max(b1_y2, b2_y2)
c_diag = ((c_x2 - c_x1) ** 2 + (c_y2 - c_y1) ** 2) ** 0.5 + eps
# 中心点欧式距离
rho = ((b2_x1 + b2_x2 - b1_x1 - b1_x2) ** 2 / 4 +
(b2_y1 + b2_y2 - b1_y1 - b1_y2) ** 2 / 4) ** 0.5
# 计算长宽比一致性
atan1 = torch.atan(w2 / (h2 + eps))
atan2 = torch.atan(w1 / (h1 + eps))
v = (4 / (math.pi ** 2)) * torch.pow(atan1 - atan2, 2)
alpha = v / (1 - iou + v + eps)
# 组合 CIoU 损失
ciou = 1 - iou + (rho ** 2) / (c_diag ** 2) + alpha * v
return ciou
实验对比
在 COCO 数据集上的对比实验显示:
| 损失函数 | AP@0.5 | AP@0.75 | AP@[0.5:0.95] |
|---|---|---|---|
| IoU | 58.9 | 39.2 | 42.1 |
| GIoU | 60.1 | 41.3 | 43.2 |
| DIoU | 61.2 | 42.5 | 44.3 |
| CIoU | 62.4 | 43.8 | 45.6 |
训练曲线显示,CIoU 具有更快的收敛速度和更高的最终精度。
避坑指南
- 学习率调整
- CIoU 中的 $\alpha$ 参数会动态变化,建议使用较小的初始学习率
-
推荐使用学习率 warmup 策略
-
小目标检测
- 对小目标可以适当增加中心点距离项的权重
-
在数据增强时注意保持小目标的宽高比
-
多尺度训练
- 不同尺度的目标需要统一的归一化方式
- 建议使用 CIoU 作为主要损失,配合 Focal Loss 解决类别不平衡
延伸思考
- CIoU 与 KLD 损失结合
- 最新研究 (Zheng et al., 2021) 提出将 CIoU 与 Kullback-Leibler 散度结合
-
可以更好地建模边界框的不确定性
-
旋转目标检测
- 在遥感图像等场景,可以考虑加入角度惩罚项
- 已有工作将 CIoU 扩展为 RCIoU(Rotated CIoU)
参考文献:
– Zheng et al. “Distance-IoU Loss: Faster and Better Learning for Bounding Box Regression” AAAI 2020
– Yang et al. “Rethinking Rotated Object Detection with Gaussian Wasserstein Distance Loss” ICML 2021
正文完
