YOLOv5代码阅读笔记 - 损失函数

YOLOv5代码阅读笔记 - 损失函数

yolov5 中包含了以下三种损失函数:

  • classification loss: 分类损失
  • localization loss: 定位损失
  • confidence loss: 置信度损失

总体的损失即为以上三者的加权相加,通过改变权值可以调整对三者损失的关注度。

分类预测

通常对于分类任务,输出的标签是互斥的。如将某一个生物可能为人、狗或是猫,且该生物只可能是三种类别中的一种。此时将会用到 softmax 函数将三者的预测值转换为总和为 1 的概率值,并分类为概率最高的那一类。

y i = Softmax ⁡ ( x i ) = e x i ∑ n = 1 N e x n L c l a s s = − ∑ n = 1 N y n ∗ log ⁡ ( y n ) y_i =\operatorname{Softmax}(x_i) = \frac{e^{x_i}}{\sum_{n=1}^N e^{x_n}} \\ L_{class} = -\sum_{n=1}^N y^*_n\log(y_n) yi=Softmax(xi)=n=1NexnexiLclass=n=1Nynlog(yn)

yolov3 之后考虑到一个目标可能同时属于多个类别,如同时识别一个人的性别和姿态,则会输出如“男性”、“行走”两个结果。此时概率之和可能将大于 1。故在 yolov3 之后则对每一个类别预测的结果使用二元交叉熵损失:

y i = Sigmoid ⁡ ( x i ) = 1 1 + e − x i L c l a s s = − ∑ n = 1 N y i ∗ log ⁡ ( y i ) + ( 1 − y i ∗ ) log ⁡ ( 1 − y i ) y_i = \operatorname{Sigmoid}(x_i) = \frac{1}{1+e^{-x_i}} \\ L_{class} = -\sum_{n=1}^Ny_i^*\log(y_i)+(1-y^*_i)\log(1-y_i) yi=Sigmoid(xi)=1+exi1Lclass=n=1Nyilog(yi)+(1yi)log(1yi)
以上公式中 N N N 表示类别总个数, x i x_i xi 为当前类别预测值, y i y_i yi 为经过激活函数后得到的当前类别的概率, y i ∗ y_i^* yi 则为当前类别的真实值 (0 或 1), L c l a s s L_{class} Lclass 为分类损失。

边界框预测

边界框预测是目标检测中最主要的任务之一,目标检测中想要框出检测到的目标,就需要通过对边界框所在位置数据的预测。

在之前的版本中,使用的是平方损失,即:

L l o c a l = ( x − x ∗ ) 2 + ( y − y ∗ ) 2 + ( w − w ∗ ) 2 + ( h − h ∗ ) 2 L_{local} =(x−x^*)^2+(y−y^*) ^2+(w−w^*)^2+(h−h^*)^2 Llocal=(xx)2+(yy)2+(ww)2+(hh)2

其中 x , y , w , h x, y, w, h x,y,w,h 分别代表预测框的左上角坐标与框的长宽。

但该方法存在一定问题,由于边界框预测需要着重于该框与真实框的重叠区域面积,且重叠区域的面积与两者并集区域的面积之比越大越好,但光使用平方损失无法很好地衡量这一点。为了解决这一问题,之后衍生出多个基于 IoU 的损失计算方式。

  • MSE
  • IoU loss
  • GIoU loss
  • DIoU loss
  • CIoU loss

IoU

image-20210802122057247
交并比 (IoU) 是目标检测中的一个重要概念,即为目标框与真实框交集与并集的比值,如上图中图上红色部分为蓝绿两个方块的交集,该部分与蓝绿两个方块的并集面积的比值就是交并比。

IoU ⁡ ( B 1 , B 2 ) = ∣ B 1 ∩ B 2 ∣ ∣ B 1 ∪ B 2 ∣ \operatorname{IoU}(B_1, B_2) = \frac{|B_1\cap B_2|}{|B_1\cup B_2|} IoU(B1,B2)=B1B2B1B2

可见当两个框完全重叠时,其交并比为 1,完全不重叠时为 0。那么损失即可定义为

L I o U = 1 − IoU ⁡ ( B , B g t ) L_{IoU} = 1 - \operatorname{IoU}(B, B_{gt}) LIoU=1IoU(B,Bgt)

但该方式还存在两个问题:

  1. 当真实框和预测框完全不重叠时,因为其损失都为 1,则无法反映预测框离真实框的远近
  2. 当真实框包含预测框,且真实框与预测框的大小固定时,其 IoU 很定为预测框与真实框面积的比值,则无论预测框在真实框中的哪个位置,损失都不变。
image-20210802122142638

GIoU

为了解决 IoU 的第一个问题,GIoU 出现了。GIoU 在 IoU 的基础上还增加了一个框,即为能够同时框住真实框与预测框的最小的框,如下图所示:

image-20210802122219678 橙色部分 (包括蓝色和绿色) 即为最小方框 C。C 的面积减去预测框与真实框的面积,再比上 C 的面积,即可反映出真实框与预测框距离。损失计算公式如下:

x 1 c = min ⁡ ( x 1 B , x 1 B g t ) , x 2 c = max ⁡ ( x 2 B , x 2 B g t ) y 1 c = min ⁡ ( y 1 B , y 1 B g t ) , y 2 c = max ⁡ ( y 2 B , y 2 B g t ) C = ( x 2 c − x 1 c ) × ( y 2 c − y 1 c ) x^c_1 = \min(x^B_1, x^{B_{gt}}_1),\quad x^c_2 = \max(x^B_2, x^{B_{gt}}_2)\\ y^c_1 = \min(y^B_1, y^{B_{gt}}_1), \quad y^c_2 = \max(y^B_2, y^{B_{gt}}_2)\\[0.5em] C = (x^c_2 - x^c_1) \times (y^c_2 - y^c_1) x1c=min(x1B,x1Bgt),x2c=max(x2B,x2Bgt)y1c=min(y1B,y1Bgt),y2c=max(y2B,y2Bgt)C=(x2cx1c)×(y2cy1c)

GIoU ⁡ ( B , B g t ) = IoU ⁡ ( B , B g t ) − ∣ C − ( B ∪ B g t ) ∣ ∣ C ∣ L G I o U ( B , B g t ) = 1 − GIoU ⁡ ( B , B g t ) = 1 − IoU ⁡ ( B , B g t ) + ∣ C − ( B ∪ B g t ) ∣ ∣ C ∣ \operatorname{GIoU}(B, B_{gt}) = \operatorname{IoU}(B, B_{gt}) - \frac{|C - (B \cup B_{gt})| }{|C|}\\ L_{GIoU}(B, B_{gt}) = 1-\operatorname{GIoU}(B, B_{gt}) = 1 - \operatorname{IoU}(B, B_{gt}) + \frac{|C - (B \cup B_{gt})| }{|C|} GIoU(B,Bgt)=IoU(B,Bgt)CC(BBgt)LGIoU(B,Bgt)=1GIoU(B,Bgt)=1IoU(B,Bgt)+CC(BBgt)

GIoU 中,真实框与预测框距离越远时, C 的值也越大,C 减去预测框与真实框面积的值也越大,最后趋近于 1。那么真实框与预测框当越远时,损失也越接近 2。但是 GIoU 虽然解决了真实框与预测框完全分离时 IoU 无法衡量两者距离的问题,但是依旧无法解决问题二。

DIoU

为了解决上述问题,2020年又衍生出了 DIoU。与 GIoU 不同,DIoU 中使用真实框和预测框中心点距离的平方与两者最小框 C 对角线长度平方的比值作为衡量标准的一部分。 image-20210802122302785

黄色和绿色的方块分别为真实框和预测框,其中红色的点为两者的重点,中间的黑色线段为真实框和预测框中点的连线。蓝色的框为最小框 C,红色虚线为 C 的对角线。DIoU 的计算方法以及损失如下:

x 1 p = x 2 B − x 1 B , y 1 p = y 2 B − y 1 B x 2 p = x 2 B g t − x 1 B g t , y 2 p = y B g t − y 1 B g t ρ 2 ( B , B g t ) = ( x 1 p − x 2 p ) 2 + ( y 1 p − y 2 p ) 2 x^p_1 = x^B_2-x^B_1,\quad y^p_1 = y^B_2- y^B_1\\ x^p_2 = x^{B_{gt}}_2-x^{B_{gt}}_1,\quad y^p_2 = y^{B_{gt}}- y^{B_{gt}}_1\\ \rho^2(B, B_{gt}) = (x^p_1 - x^p_2)^2 + (y^p_1 - y^p_2)^2\\ x1p=x2Bx1B,y1p=y2By1Bx2p=x2Bgtx1Bgt,y2p=yBgty1Bgtρ2(B,Bgt)=(x1px2p)2+(y1py2p)2

x 1 c = min ⁡ ( x 1 B , x 1 B g t ) , x 2 c = max ⁡ ( x 2 B , x 2 B g t ) y 1 c = min ⁡ ( y 1 B , y 1 B g t ) , y 2 c = max ⁡ ( y 2 B , y 2 B g t ) c 2 = ( x 2 c − x 1 c ) 2 + ( y 2 c − y 1 c ) 2 DIoU ⁡ ( B , B g t ) = IoU ⁡ ( B , B g t ) − ρ 2 ( B , B g t ) c 2 L D I o U ( B , B g t ) = 1 − DIoU ⁡ ( B , B g t ) = 1 − IoU ⁡ ( B , B g t ) + ρ 2 ( B , B g t ) c 2 x^c_1 = \min(x^B_1, x^{B_{gt}}_1),\quad x^c_2 = \max(x^B_2, x^{B_{gt}}_2)\\ y^c_1 = \min(y^B_1, y^{B_{gt}}_1), \quad y^c_2 = \max(y^B_2, y^{B_{gt}}_2)\\[0.5em] c^2 = (x^c_2 - x^c_1)^2 +(y^c_2 - y^c_1)^2\\[2em] \operatorname{DIoU}(B, B_{gt}) = \operatorname{IoU}(B, B_{gt}) - \frac{\rho^2(B, B_{gt})}{c^2} \\ L_{DIoU}(B, B_{gt}) = 1 - \operatorname{DIoU}(B, B_{gt}) = 1 - \operatorname{IoU}(B, B_{gt}) + \frac{\rho^2(B, B_{gt})}{c^2} x1c=min(x1B,x1Bgt),x2c=max(x2B,x2Bgt)y1c=min(y1B,y1Bgt),y2c=max(y2B,y2Bgt)c2=(x2cx1c)2+(y2cy1c)2DIoU(B,Bgt)=IoU(B,Bgt)c2ρ2(B,Bgt)LDIoU(B,Bgt)=1DIoU(B,Bgt)=1IoU(B,Bgt)+c2ρ2(B,Bgt)

DIoU 的好处即为解决了最初的第二个问题,使得预测框的中心点能够向真实框的中心点靠近。同时 DIoU 相比 GIoU 能够更快地收敛。

CIoU

CIoU 为 DIoU 的再次升级版,其中考虑到了预测框与真实框的长宽比例问题,再其中新添加了两个参数,即:

CIoU ⁡ ( B , B g t ) = IoU ⁡ ( B , B g t ) − ρ 2 ( B , B g t ) c 2 − α v v = 4 π ( arctan ⁡ w g t h g t − arctan ⁡ w h ) 2 α = v 1 − IoU ⁡ ( B , B g t ) + v \operatorname{CIoU}(B, B_{gt}) = \operatorname{IoU}(B, B_{gt}) - \frac{\rho^2(B, B_{gt})}{c^2} - \alpha v \\ v = \frac{4}{\pi} \left( \arctan\frac{w^{gt}}{h^{gt}} - \arctan\frac{w}{h} \right)^2\\[1em] \alpha= \frac{v}{1-\operatorname{IoU}(B, B_{gt})+v} CIoU(B,Bgt)=IoU(B,Bgt)c2ρ2(B,Bgt)αvv=π4(arctanhgtwgtarctanhw)2α=1IoU(B,Bgt)+vv

其中 v v v 为预测框和真实框长宽比例差值的归一化, ( arctan ⁡ w g t h g t − arctan ⁡ w h ) 2 \left( \arctan\frac{w^{gt}}{h^{gt}} - \arctan\frac{w}{h} \right)^2 (arctanhgtwgtarctanhw)2 部分的值在 0 到 π/4 之间,乘以 4/π 后就可以转化为到 0 到 1 之间。而 α \alpha α 为权衡长宽比例造成的损失和 IoU 部分造成的损失的平衡因子。

CIoU 通过更多的维度来考虑预测框与真实框的差异,效果更好,所以一般使用 CIoU。

置信度预测

tobj[b, a, gj, gi] = (1.0 - self.gr) + self.gr * score_iou

就一行代码,前半部分作为有无检测目标的损失部分,后半部分为当检测结果为有目标的情况下,检测框准确度的损失。

1.0 - self.gr 计算了置信度的损失,让 gt 中有目标的区域在优化中置信度更高。self.gr * score_iou 则包含 iou 的损失,检测框与真实框差距越大,score_iou 越大,后半部分的 loss 也越大。

  • 50
    点赞
  • 431
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
引用\[1\]: CIoU损失函数是一种用于目标检测中的损失函数,它结合了中心点距离、重叠面积和高宽比等几何因素,可以帮助算法更好地匹配两个框。相比于传统的IoU损失函数,在非重叠情况下和水平垂直情况下有更小的误差。CIoU Loss的定义为1.5 - IoU + (d^2/c^2 + αv),其中d是中心点距离,c是对角线长度,α是一个平衡参数,v是一个修正项。\[1\] 引用\[2\]: CIoU损失函数与置信度损失类似,都是通过预测框的类别分数和目标框类别的one-hot表现来计算损失。目标置信度损失和类别损失使用的是带sigmoid的二进制交叉熵函数BCEWithLogitsLoss。\[2\] 引用\[3\]: YOLOv5中的CIoU损失函数是用于多标签分类的。与传统的分类器不同,YOLOv5使用多个独立的逻辑分类器来计算输入属于特定标签的可能性,而不是使用softmax函数。在计算分类损失时,YOLOv5使用二元交叉熵损失。这种方法避免了使用softmax函数,降低了计算复杂度。\[3\] 综上所述,YOLOv5中的CIoU损失函数是一种结合了几何因素的目标检测损失函数,它在计算目标框的位置和分类损失时使用了CIoU损失和二元交叉熵损失。这种损失函数可以帮助提高目标检测算法的准确性和收敛速度。 #### 引用[.reference_title] - *1* *3* [【目标检测算法】IOU、GIOU、DIOU、CIOU与YOLOv5损失函数](https://blog.csdn.net/weixin_45751396/article/details/127150065)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [YOLOV5学习笔记(九)——损失函数](https://blog.csdn.net/HUASHUDEYANJING/article/details/127455934)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值