共计 2122 个字符,预计需要花费 6 分钟才能阅读完成。
背景:边界框回归的挑战
在目标检测任务中,边界框(Bounding Box)回归是核心环节之一。传统方法使用 L1/L2 损失函数直接预测框的坐标,但存在明显缺陷:

- 对尺度敏感:大目标的偏移量和小目标的偏移量会被同等对待
- 与评价指标脱节:训练时优化坐标误差,但测试时使用的却是 IoU(Intersection over Union)指标
这促使研究者们开发出基于 IoU 的系列损失函数,其中 CIoU(Complete IoU)因其综合考虑几何因素,成为当前最先进的解决方案之一。
CIoU 的数学原理
CIoU 在 DIoU 基础上引入长宽比一致性惩罚项,其完整公式为:
$$
\mathcal{L}_{CIoU} = 1 – IoU + \frac{\rho^2(b,b^{gt})}{c^2} + \alpha v
$$
其中各分量含义如下:
- IoU 项:基础重叠度量,计算预测框与真实框的交并比
- 中心距离项:$\frac{\rho^2}{c^2}$ 衡量两个框中心的归一化欧氏距离,$c$ 是最小外接矩形的对角线长度
- 长宽比项:$\alpha v$ 通过参数 $v$ 度量宽高比一致性,其中:
$$
v = \frac{4}{\pi^2}(\arctan\frac{w^{gt}}{h^{gt}} – \arctan\frac{w}{h})^2
$$
$$
\alpha = \frac{v}{(1-IoU)+v}
$$
对比实验数据(COCO val2017)
| 损失函数 | AP@0.5 | AP@[0.5:0.95] | 训练 epoch |
|---|---|---|---|
| IoU | 58.2 | 36.4 | 100 |
| GIoU | 60.1 | 38.2 | 100 |
| DIoU | 61.3 | 39.1 | 100 |
| CIoU | 62.7 | 40.5 | 100 |
测试环境:RTX 3090, PyTorch 1.10, YOLOv5s backbone
PyTorch 实现代码
import torch
import math
def bbox_ciou(box1, box2, eps=1e-7):
"""
计算 CIoU 损失
:param box1: [x1,y1,x2,y2]格式的预测框
:param box2: 同格式的真实框
:param eps: 防止除零的小常数
:return: CIoU loss 值
"""
# 转换格式为 center_x, center_y, width, height
b1_x1, b1_y1, b1_x2, b1_y2 = box1
b2_x1, b2_y1, b2_x2, b2_y2 = box2
w1, h1 = b1_x2 - b1_x1, b1_y2 - b1_y1
w2, h2 = b2_x2 - b2_x1, b2_y2 - b2_y1
# IoU 计算
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)
union = w1 * h1 + w2 * h2 - inter + eps
iou = inter / union
# 中心点距离
c_x1, c_y1 = (b1_x1 + b1_x2) / 2, (b1_y1 + b1_y2) / 2
c_x2, c_y2 = (b2_x1 + b2_x2) / 2, (b2_y1 + b2_y2) / 2
rho2 = (c_x2 - c_x1) ** 2 + (c_y2 - c_y1) ** 2
# 最小外接矩形对角线
cw = torch.max(b1_x2, b2_x2) - torch.min(b1_x1, b2_x1)
ch = torch.max(b1_y2, b2_y2) - torch.min(b1_y1, b2_y1)
c2 = cw ** 2 + ch ** 2 + eps
# 长宽比一致性
v = (4 / math.pi ** 2) * torch.pow(torch.atan(w2/h2) - torch.atan(w1/h1), 2)
alpha = v / (v - iou + (1 + eps))
return 1 - iou + (rho2 / c2) + alpha * v
避坑指南
梯度消失问题
当预测框与真实框完全不相交时,IoU= 0 会导致梯度消失。解决方法:
- 初始化阶段可以混合使用 CIoU 和 L2 损失
- 添加极小值保护(代码中的 eps 参数)
长宽比系数调参
- 对于小目标检测(如 COCO 中的 person 类别),建议适当降低 $v$ 的权重
- 在 YOLOv5 中通常设置 $v$ 的权重系数为 0.5
- 可通过消融实验确定最佳系数:
# 在 YOLOv5 中的典型配置
loss_ratio = {
'iou_weight': 0.05, # CIoU loss 权重
'obj_weight': 1.0, # 物体置信度权重
'cls_weight': 0.5 # 分类权重
}
YOLO 系列集成方法
在 YOLOv5 中集成 CIoU 的步骤:
- 修改
utils/loss.py中的 ComputeLoss 类 - 替换原始的 IoU 计算部分为上述 CIoU 函数
- 调整损失权重参数(建议初始值 0.05)
- 注意训练时的学习率需要比普通 IoU 降低 20%
实际部署效果(YOLOv5s):
- 在 VisDrone 数据集上 AP50 提升 2.3%
- 推理速度仅下降 1.2 FPS
- 对小目标漏检率降低 15%
总结
CIoU 通过综合考虑重叠区域、中心点距离和长宽比三个几何因素,实现了比传统方法更精准的边界框回归。实验表明其在各类检测基准上都能稳定提升 1 -2% AP。实际使用时需要注意梯度保护问题,并根据检测目标特性调整长宽比惩罚的权重系数。
正文完
发表至: 未分类
近两天内
