深入理解 YOLOv4 中的 CIOU 损失函数计算方法

目录

一、CIoU 损失函数简介

二、CIoU 损失函数的计算步骤

1、IoU 的推导

2、CIoU的计算公式

3、CIoU Loss最终定义为:

三、CIoU的优缺点

优点:

缺点:


YOLOv4(You Only Look One-level v4)作为目标检测领域的先进模型,采用了一种创新的损失函数,即 CIOU(Complete Intersection over Union)。CIOU 损失函数在目标检测任务中的应用,不仅能够更准确地评估目标框的质量,还能够提高模型在复杂场景下的性能。

一、CIoU 损失函数简介

CIOU 损失函数是 YOLOv4 在原有 IOU(Intersection over Union)损失函数基础上的改进版本。它考虑了目标框之间的完整交叉,并引入了修正因子,以更精准地度量目标框之间的相似性。CIOU 损失函数的计算方法相比于传统 IOU 更为复杂,但这也使得模型在训练过程中能够更好地理解目标框的准确位置和形状。

二、CIoU 损失函数的计算步骤

1、IoU 的推导

首先,我们回顾一下 IOU 的定义:

其中,"Area of Overlap"表示两个边界框的交集区域的面积,"Area of Union"表示两个边界框的并集区域的面积。IOU的值在0和1之间,0表示没有重叠,1表示完全重叠。

2、CIoU的计算公式

CIOU=IOU-\frac{d^{2}}{c^{2}}-\alpha v

其中:

(1). d 为预测框和真实框中心点的距离,c 为最小外接矩形的对角线距离。

(2). \alpha =\frac{v}{(1-IoU)+v}

是修正因子,用于进一步调整损失函数,考虑目标框的形状和方向。具体计算方式为:

v = \frac{4 \cdot (\arctan\frac{w_{\text{G}}}{h_{\text{G}}} - \arctan\frac{w_{\text{P}}}{h_{\text{P}}})^2}{\pi^2}(w_{\text{G}}, h_{\text{G}}) 和  (w_{\text{P}}, h_{\text{P}})分别为目标框和预测框的宽高。

3、CIoU Loss最终定义为:

Loss CIoU=1-IOU+\frac{d^{2}}{c^{2}}+\alpha v

三、CIoU的优缺点

优点:

  1. 形状不变性: CIOU 损失函数在设计上考虑了目标框的形状信息,通过引入修正因子,使得损失对于不同形状的目标框更具鲁棒性。这使得模型更容易捕捉目标的准确形状。

  2. 对定位精度的敏感性: CIOU 损失函数对目标框的位置预测更为敏感,因为它考虑了目标框的对角线距离。这有助于提高目标检测模型在定位目标时的精度。

  3. 全面性: CIOU 损失函数综合考虑了位置、形状和方向等多个因素,使得模型更全面地学习目标框的特征。这有助于提高模型在复杂场景中的性能。

缺点:

  1. 计算复杂性: 相较于传统的 IOU 损失函数,CIOU 涉及了更多的计算步骤,包括完整交叉面积的计算和修正因子的引入。这导致 CIOU 的计算复杂性较高,可能增加模型训练的计算负担。

  2. 参数敏感性: CIOU 中的一些参数,如修正因子的权重参数 (\alpha),可能对损失函数的性能产生较大影响。在实际应用中,需要仔细调节这些参数以获得最佳的模型性能。

  3. 训练难度: 由于 CIOU 考虑了更多的信息,模型可能需要更多的数据和更长的训练时间来充分学习这些信息。这可能使得模型对于小规模数据集的训练更为困难。

总体而言,CIOU 损失函数在提高目标检测性能方面有一定优势,但在计算复杂性和参数调节方面也存在一些挑战。在实际应用中,根据任务需求和数据集特点,需要权衡这些因素来选择最适合的损失函数。

  • 5
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
需要学习Windows系统YOLOv4的同学请前往《Windows版YOLOv4目标检测实战:原理与源码解析》,课程链接 https://edu.csdn.net/course/detail/29865【为什么要学习这门课】 Linux创始人Linus Torvalds有一句名言:Talk is cheap. Show me the code. 冗谈不够,放码过来!  代码阅读是从基础到提高的必由之路。尤其对深度学习,许多框架隐藏了神经网络底层的实现,只能在上层调包使用,对其内部原理很难认识清晰,不利于进一步优化和创新。YOLOv4是最近推出的基于深度学习的端到端实时目标检测方法。YOLOv4的实现darknet是使用C语言开发的轻型开源深度学习框架,依赖少,可移植性好,可以作为很好的代码阅读案例,让我们深入探究其实现原理。【课程内容与收获】 本课程将解析YOLOv4的实现原理和源码,具体内容包括:- YOLOv4目标检测原理- 神经网络及darknet的C语言实现,尤其是反向传播的梯度求解和误差计算- 代码阅读工具及方法- 深度学习计算的利器:BLAS和GEMM- GPU的CUDA编程方法及在darknet的应用- YOLOv4的程序流程- YOLOv4各层及关键技术的源码解析本课程将提供注释后的darknet的源码程序文件。【相关课程】 除本课程《YOLOv4目标检测:原理与源码解析》外,本人推出了有关YOLOv4目标检测的系列课程,包括:《YOLOv4目标检测实战:训练自己的数据集》《YOLOv4-tiny目标检测实战:训练自己的数据集》《YOLOv4目标检测实战:人脸口罩佩戴检测》《YOLOv4目标检测实战:国交通标志识别》建议先学习一门YOLOv4实战课程,对YOLOv4的使用方法了解以后再学习本课程。【YOLOv4网络模型架构图】 下图由白勇老师绘制  
YOLOv5对CIOU损失函数进行了一些优化,主要包括以下两个方面: 1. 采用GIoU、DIoU、CIOU三种距离度量方法来计算边界框之间的距离。 2. 采用类似Focal Loss的方式来降低对易分类样本的惩罚。 下面是YOLOv5CIOU损失函数的优化代码,供您参考: ```python import torch.nn.functional as F from utils.general import box_iou def compute_ciou_loss(pred, gt, eps=1e-7, alpha=0.5, gamma=2.0): """ Args: pred: 预测的边界框,shape为[N, 4], [x, y, w, h] gt: 真实的边界框,shape为[N, 4], [x, y, w, h] """ # 将边界框的坐标转换为左上角和右下角的点的坐标 pred_xy = pred[:, :2] pred_wh = pred[:, 2:] pred_mins = pred_xy - pred_wh / 2.0 pred_maxs = pred_xy + pred_wh / 2.0 gt_xy = gt[:, :2] gt_wh = gt[:, 2:] gt_mins = gt_xy - gt_wh / 2.0 gt_maxs = gt_xy + gt_wh / 2.0 # 计算真实边界框和预测边界框的交集 intersect_mins = torch.max(pred_mins, gt_mins) intersect_maxs = torch.min(pred_maxs, gt_maxs) intersect_wh = torch.clamp(intersect_maxs - intersect_mins, min=0) intersect_area = intersect_wh[:, 0] * intersect_wh[:, 1] # 计算真实边界框和预测边界框的并集 pred_area = pred_wh[:, 0] * pred_wh[:, 1] gt_area = gt_wh[:, 0] * gt_wh[:, 1] union_area = pred_area + gt_area - intersect_area # 计算IoU iou = intersect_area / (union_area + eps) # 计算心点的距离 center_distance = torch.sum(torch.pow((pred_xy - gt_xy), 2), axis=1) # 计算最小外接矩形的对角线长度 enclose_mins = torch.min(pred_mins, gt_mins) enclose_maxs = torch.max(pred_maxs, gt_maxs) enclose_wh = torch.clamp(enclose_maxs - enclose_mins, min=0) enclose_diagonal = torch.sum(torch.pow(enclose_wh, 2), axis=1) # 计算CIOU iou = torch.clamp(iou, min=-1.0, max=1.0) ciou = iou - center_distance / enclose_diagonal # 采用GIoU、DIoU、CIOU三种距离度量方法来计算边界框之间的距离 v = (4 / (math.pi ** 2)) * torch.pow((torch.atan(pred_wh[:, 0] / pred_wh[:, 1]) - torch.atan(gt_wh[:, 0] / gt_wh[:, 1])), 2) with torch.no_grad(): alpha = v / (1 - iou + v) giou = iou - alpha * v diou = iou - center_distance / (enclose_diagonal + eps) ciou = iou - (center_distance / (enclose_diagonal + eps) + alpha * v) # 采用类似Focal Loss的方式来降低对易分类样本的惩罚 weight = (1 - iou).pow(gamma) # 计算损失 ciou_loss = weight * (1 - ciou) return ciou_loss.mean() ``` 在这里,我们添加了一个可调节的超参数gamma,用来控制易分类样本的惩罚。同时,我们还计算了GIoU、DIoU、CIOU三种距离度量方法来计算边界框之间的距离,并根据距离计算了相应的损失。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值