yolov8 WIoU损失函数
时间: 2025-01-21 14:19:34 浏览: 80
### YOLOv8 Weighted IoU (WIoU) 损失函数实现与解释
#### 定义与作用
Weighted Intersection over Union (WIoU) 是一种改进版的边界框回归损失函数,旨在提高目标检测模型预测边界框的准确性。相比于传统的 IoU 和 GIoU,WIoU 考虑了不同大小物体的重要性差异,在处理多尺度目标时表现更优[^1]。
#### 数学表达式
对于给定的真实边界框 \( \text{bbox}_{gt}=(x_{gt}, y_{gt}, w_{gt}, h_{gt}) \) 和预测边界框 \( \text{bbox}_p=(x_p, y_p, w_p, h_p) \),WIoU 的定义如下:
\[ L_{\text{wIOU}}(\text{bbox}_{gt}, \text{bbox}_p)= -\log{\left( \frac{|B_1 \cap B_2|}{|B_1 \cup B_2|+\epsilon}\right)}-\alpha\cdot\min{(r,\beta)}, \]
其中,
- \( |B_1 \cap B_2| \) 表示两个矩形区域交集面积;
- \( |B_1 \cup B_2| \) 表示并集面积;
- \( r=\sqrt{{l^2+w^2}/{c^2}} \), \( l=|x_c-x_g| \),\( w=|y_c-y_g|\);
- \( c \) 代表最小封闭凸包对角线长度;
- 参数 \( \alpha \in [0,4], \beta>0 \).
此公式不仅考虑了重叠程度还加入了中心点距离惩罚项来提升定位精度.
#### 实现细节
为了防止数值不稳定情况的发生以及加速训练过程,建议采用混合精度策略:即在网络计算过程中保持大部分运算为 FP16 格式,而仅在涉及梯度更新和损失累积的地方切换回 FP32 格式[^2]. 这样可以有效减少内存占用的同时维持较高的计算效率.
```python
import torch.nn as nn
from torchvision.ops import box_iou
class WIoULoss(nn.Module):
def __init__(self, alpha=1., beta=9.):
super(WIoULoss, self).__init__()
self.alpha = alpha
self.beta = beta
def forward(self, pred_boxes, target_boxes):
ious = box_iou(pred_boxes, target_boxes).diag()
# 计算中心坐标偏差
center_diffs = ((pred_boxes[:, :2]-target_boxes[:, :2])**2).sum(dim=-1)**0.5
# 获取最小外接矩形尺寸
enclose_wh = (torch.max(pred_boxes[:, 2:], target_boxes[:, 2:]) -
torch.min(pred_boxes[:, :2], target_boxes[:, :2]))
diagonal_len = (enclose_wh ** 2).sum(dim=-1) ** .5
# 加入额外惩罚因子
penalty_term = -(self.alpha * torch.clamp(center_diffs / diagonal_len, max=self.beta))
return (-torch.log((ious + 1e-7)) - penalty_term).mean()
```
阅读全文
相关推荐


















