ciou损伤函数公式
时间: 2025-05-10 19:26:12 浏览: 19
### CIoU Loss Function Formula
CIoU (Complete Intersection over Union) 是一种改进版的 IoU 损失函数,在计算机视觉和目标检测领域广泛应用。相比于传统的 IoU 和 GIoU,CIoU 不仅考虑了预测框与真实框之间的重叠面积比例,还加入了中心点距离以及宽高比的因素。
具体来说,CIoU 的定义如下:
\[ \text{CIoU} = 1 - \left(\frac{\text{IOU}}{1+\alpha\cdot v}\right)-\alpha\cdot v \]
其中,
- \( IOU \) 表示交并比;
- \( d(c_{box},c_{gt})=\rho^{2}(c_{box}-c_{gt})/\rho^{2}_{diag}(bbox_{img}) \),\( c_{box} \) 和 \( c_{gt} \) 分别代表预测框和真实框的中心坐标,而 \( bbox_{img} \) 则指代整个图片的最大外接矩形对角线长度平方;
- \( v=(\frac{\pi}{4})(arctan(w_{gt}/h_{gt})-arctan(w_{pred}/h_{pred}))^2 \),这里 \( w,h \) 对应宽度高度参数;
- \( \alpha \) 定义为 \( \alpha=v/(1-\text{IOU}+v)\epsilon \),用于调整权重因子使得当两个框形状相似时减少惩罚力度[^1]。
```python
import torch
def ciou_loss(preds, targets):
eps = 1e-7
# 获取边框的左上角和右下角坐标
preds_left_top = preds[:, :2]
preds_right_bottom = preds[:, 2:]
targets_left_top = targets[:, :2]
targets_right_bottom = targets[:, 2:]
# 计算交集部分
intersect_left_top = torch.max(preds_left_top, targets_left_top)
intersect_right_bottom = torch.min(preds_right_bottom, targets_right_bottom)
intersection_wh = (intersect_right_bottom - intersect_left_top).clamp(min=0.)
intersection_area = intersection_wh[..., 0] * intersection_wh[..., 1]
# 计算各自的面积
preds_area = ((preds_right_bottom - preds_left_top)[..., 0]) * \
((preds_right_bottom - preds_left_top)[..., 1])
target_area = ((targets_right_bottom - targets_left_top)[..., 0]) * \
((targets_right_bottom - targets_left_top)[..., 1])
union_area = preds_area + target_area - intersection_area + eps
ious = intersection_area / union_area
# 中心点距离
center_distance_squared = (
(preds_left_top + preds_right_bottom - targets_left_top - targets_right_bottom)**2).sum(dim=-1)/4.
# 图片最大外接矩形对角线距离
enclosing_box_diag_squared = (
(torch.max(preds_right_bottom, targets_right_bottom) -
torch.min(preds_left_top, targets_left_top))**2).sum(dim=-1)+eps
u = center_distance_squared / enclosing_box_diag_squared
# 宽高比一致性项
wh_ratio_clipped = torch.clamp(
(preds_right_bottom - preds_left_top)/(targets_right_bottom-targets_left_top), min=0., max=1.)
v = (4./math.pi ** 2)*(torch.atan(wh_ratio_clipped[:, 0])-torch.atan(wh_ratio_clipped[:, 1]))**2
alpha = v / (1.-ious+v+eps)
ciou_term = u + alpha*v
return 1. - ious + ciou_term
```
阅读全文
相关推荐


















