出处:(23条消息) YOLOv5代码阅读笔记 - 损失函数_weixin_51917840的博客-CSDN博客_yolov5的损失函数
YOLOv5代码阅读笔记 - 损失函数
yolov5 中包含了以下三种损失函数:
classification loss: 分类损失
localization loss: 定位损失
confidence loss: 置信度损失
总体的损失即为以上三者的加权相加,通过改变权值可以调整对三者损失的关注度。
通常对于分类任务,输出的标签是互斥的。如将某一个生物可能为人、狗或是猫,且该生物只可能是三种类别中的一种。此时将会用到 softmax 函数将三者的预测值转换为总和为 1 的概率值,并分类为概率最高的那一类。
yolov3 之后考虑到一个目标可能同时属于多个类别,如同时识别一个人的性别和姿态,则会输出如“男性”、“行走”两个结果。此时概率之和可能将大于 1。故在 yolov3 之后则对每一个类别预测的结果使用二元交叉熵损失:
边界框预测是目标检测中最主要的任务之一,目标检测中想要框出检测到的目标,就需要通过对边界框所在位置数据的预测。
在之前的版本中,使用的是平方损失,即:
其中 x , y , w , h x, y, w, hx,y,w,h 分别代表预测框的左上角坐标与框的长宽。
但该方法存在一定问题,由于边界框预测需要着重于该框与真实框的重叠区域面积,且重叠区域的面积与两者并集区域的面积之比越大越好,但光使用平方损失无法很好地衡量这一点。为了解决这一问题,之后衍生出多个基于 IoU 的损失计算方式。
MSE
IoU loss
GIoU loss
DIoU loss
CIoU loss
但该方式还存在两个问题:
为了解决 IoU 的第一个问题,GIoU 出现了。GIoU 在 IoU 的基础上还增加了一个框,即为能够同时框住真实框与预测框的最小的框,如下图所示:
橙色部分 (包括蓝色和绿色) 即为最小方框 C。C 的面积减去预测框与真实框的面积,再比上 C 的面积,即可反映出真实框与预测框距离。损失计算公式如下:
橙色部分 (包括蓝色和绿色) 即为最小方框 C。C 的面积减去预测框与真实框的面积,再比上 C 的面积,即可反映出真实框与预测框距离。损失计算公式如下:
GIoU 中,真实框与预测框距离越远时, C 的值也越大,C 减去预测框与真实框面积的值也越大,最后趋近于 1。那么真实框与预测框当越远时,损失也越接近 2。但是 GIoU 虽然解决了真实框与预测框完全分离时 IoU 无法衡量两者距离的问题,但是依旧无法解决问题二。
为了解决上述问题,2020年又衍生出了 DIoU。与 GIoU 不同,DIoU 中使用真实框和预测框中心点距离的平方与两者最小框 C 对角线长度平方的比值作为衡量标准的一部分。
黄色和绿色的方块分别为真实框和预测框,其中红色的点为两者的重点,中间的黑色线段为真实框和预测框中点的连线。蓝色的框为最小框 C,红色虚线为 C 的对角线。DIoU 的计算方法以及损失如下:
DIoU 的好处即为解决了最初的第二个问题,使得预测框的中心点能够向真实框的中心点靠近。同时 DIoU 相比 GIoU 能够更快地收敛。
CIoU 为 DIoU 的再次升级版,其中考虑到了预测框与真实框的长宽比例问题,再其中新添加了两个参数,即:
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 也越大。