GIoU损失函数
论文链接:https://arxiv.org/pdf/1902.09630
GIoU(Generalized Intersection over Union)损失函数是一种用于改善目标检测模型中边界框回归的方法。它是基于传统的IoU(交并比)损失的一个改进版本,解决了IoU在某些情况下无法提供有效梯度的问题,特别是当两个边界框不重叠时。
IoU损失的局限性
IoU是评估两个边界框重叠程度的一种标准度量方法,定义为两个边界框交集与并集的比例。然而,IoU损失有一个明显的缺点:当两个边界框没有任何重叠时,IoU为0,此时无法提供有关如何调整边界框以改善预测的梯度信息。
GIoU损失的定义
GIoU损失通过引入一个额外的度量来解决这个问题,即最小封闭框(minimum enclosing box)的概念。GIoU的计算不仅考虑了交集和并集,还包括了两个框之间的空间关系。
计算步骤如下:
- 计算IoU:首先,计算两个边界框A和B的交集与并集的比例,即IoU。
- 确定最小封闭框:找到能同时包含A和B的最小边界框C。
- 计算正则项:计算最小封闭框C与并集U之间的区域差异,并用这个差异来调整IoU值。
公式表示为:
替换GIoU损失函数(基于MMYOLO)
由于MMYOLO中已经实现了GIoU Loss的计算,所以我们想使用GIoU损失函数替换CIoU损失函数只需要修改配置文件即可:
# 修改此处实现IoU损失函数的替换
loss_bbox=dict(
type='IoULoss',
iou_mode='giou',
bbox_format='xywh',
eps=1e-7,
reduction='mean',
loss_weight=loss_bbox_weight * (3 / num_det_layers),
return_iou=True),
修改后的配置文件(以configs/yolov5/yolov5_s-v61_syncbn_8xb16-300e_coco.py为例)
_base_ = ['../_base_/default_runtime.py', '../_base_/det_p5_tta.py']
# ========================Frequently modified parameters======================
# -----data related-----
data_root = 'data/coco/' # Root path of data
# Path of train annotation file
train_ann_fil