• YOLOv4 tricks解读(三)B-Box回归损失篇


    论文题目:YOLOv4: Optimal Speed and Accuracy of Object Detection

    文献地址:https://arxiv.org/pdf/2004.10934.pdf

    源码地址:https://github.com/AlexeyAB/darknet

      YOLOv4中谈及了一些B-Box回归损失的方法,诸如MSE(L2 loss),Smooth L1 loss,IoU loss, GIoU loss,DIoU loss,CIoU loss。本篇主要介绍目标检测任务中近几年这些损失函数的具体操作。

    MAE(L1 loss),MSE(L2 loss)与Smooth L1 loss

      MAE和MSE在回归任务中做损失函数早已屡见不鲜,

    • MAE(L1 loss):

    其图像是与y轴对称的折线:

    • MSE(L2 loss):

    其图像为一条与y轴对称且过原点的抛物线:

      对于上述两种损失函数中,L1损失函数的导数为常数,在训练后期,当损失数值变小后,如果学习率不变,损失函数会在稳定值附近波动,很难收敛到跟高的精度。L2损失函数的导数与损失有关,在训练初期,当损失较大时,其导数也很大,会造成训练的不稳定。

      Smooth L1 loss便是针对MSE和MAE的这些不足。Smooth L1 loss 的提出是在Fast RCNN中:

    其中,vi表示ground-true 框的坐标,ti表示预测的框的坐标(其中包含x,y,w,h)。

      上述的三种loss方法在计算B-Box损失时,会存在一些问题:

    • 将框的坐标以相对独立的方式进行损失的计算,这种做法的假设是这四个坐标相对独立,但实际上是有一定关联的。
    • 不同的检测框可能有相同大小的Smooth L1 loss,不能很好的衡量检测框。

    IoU loss

      Smooth L1 loss不能很好的衡量预测框与ground true 之间的关系,相对独立的处理坐标之间的关系。可能出现Smooth L1 loss相同,但实际IoU不同的情况。

      因此,提出IoU loss,将四个点构成的box看成一个整体进行损失的衡量。通过计算两个框的交并比,再求-ln(IoU),当然,很多时候可以直接定义IoU loss = 1-IoU。

      算法流程如下:

      YOLOv3中使用的便是IoU loss。

    GIoU loss

      文献地址:https://arxiv.org/pdf/1902.09630.pdf

      源码地址:https://github.com/generalized-iou/g-darknet

      

      IoU loss 其实并不完美,也会存在一些问题:

    • IoU loss仅能衡量两个框相交的情况,而不能反应预测框与目标框不相交的情况。即当IoU(a, b) = 0时,是不能反应a, b的远近。
    • 即使具有相同大小的交并比,IoU loss也不能很好的衡量两个框是如何相交的。如下图所示,具有相同的IoU=0.33,相交的情况却大不相同。

      GIoU loss的提出便是针对上述问题,GIoU中对于上述三幅图,GIoU分别=0.33, 0.24, -0.1。感觉当框的对齐方向更好一些时,GIoU的值会更高一些。下图可以对比一下MSE、IOU与GIoU的区别:

      GIoU的算法流程:

      通过上述算法流程可以看出,GIoU≤IoU; 并且,LGIoU = 1-GIoU。

      C表示可以将A,B包含在内的最小的封闭形状,这样就可以衡量预测框与真实框不相交的情况。添加了C中非A、B区域部分占C的比例,从而添加不想交和相交情况的约束。

      具体的计算方式:

    DIoU loss

      文献地址:https://arxiv.org/pdf/1911.08287.pdf

      DIoU可以使YOLOv3涨近3个百分点。https://github.com/Zzh-tju/DIoU-darknet

        

      GIoU同样也不是完美的,DIoU loss的作者发现当预测框被目标框完全包裹的时候,IoU和GIoU是一样的,并不能区分此时的位置关系,此时GIoU退化为IoU。

      因此,作者提出的DIoU引入了中心点归一化距离的操作。如下图所示,绿色框表示目标框,红色框表示预测框。从下图可以略微感觉到,DIoU loss的计算会包含中心点的指引。

      在上述完全包裹的情况下,C的计算是一样的,导致在优化时,对于不同的情况,并不能给予合适的惩罚项,导致放慢了收敛速度。

      作者也给出了在不同代数下,DIoU和GIoU收敛情况的可视化。如下图所示,第一行为GIoU的各代收敛情况;第二行为DIoU的各代收敛情况。绿色框为真实框,黑色框为anchor box,蓝色框为GIoU loss 产生的预测框,红色框为DIoU loss产生的预测框。可以看出,在DIoU loss 的指引下,仅需要120代,预测框便可以很好的满足真实框。【损失函数其实就是你想让它按照怎样的方式去学习,指引的越好,收敛速度越快】

      DIoU loss 的求取:

      这个损失函数中,b和b(gt)表示anchor框和目标框的中心点,ρ表示两个中心点的欧式距离如下图标记d)。c代表的是可以同时覆盖Anchor框和目标框的最小矩形的对角线距离如下图标记c)。因此DIoU中对Anchor框和目标框之间的归一化距离进行了建模。

      使用中心点间距离d和覆盖矩形对角线距离c的比值衡量彼此之间的关系,即可以对不相交有约束,也可以对包含有约束。这样的指引,可以提供移动方向,加快收敛速度。

    CIoU loss

      DIoU loss 文章中还提出了一种CIoU loss(Complete IoU loss),作者归纳了一个好的目标框回归损失应该考虑三个重要的几何因素:重叠面积、中心点距离和长宽比

    • GIoU loss 解决了IoU为0时,无法优化的问题;
    • DIoU loss 在GIoU Loss的基础上考虑了边界框的重叠面积和中心点距离。

      所以,还没有考虑长宽比一致性的约束,即CIoU loss 在DIoU loss的基础上添加了长宽比的约束αv

    其中,α作为一个trade-off参数:

      参数v用于衡量长宽比一致性:

      下图展示了DIoU和CIoU在YOLOv3性能上的提升。

      

      YOLOv4中使用的便是DIoU loss!

      AlexyAB大神在源码的维护中添加了CIoU loss,使用CIoU loss可以进一步提升模型的精度!

      yolov3/-tiny同样可以修改原先的IoU loss为CIoU loss,也可以为yolov3/-tiny提升精度!

      

      

  • 相关阅读:
    selenium python 中浏览器操作
    wireshark基础学习—第三部分wireshark的过滤器语法
    wireshark基础学习—第二部分wireshark的基础操作
    wireshark基础学习—第一部分wireshark的基础知识
    Python 之 tuple
    Python 之 list
    python socketpool:通用连接池
    APScheduler 3.0.1浅析
    检查SDE版本健康情况的常用SQL语句
    免重启下刷新新添加的磁盘信息
  • 原文地址:https://www.cnblogs.com/monologuesmw/p/13035294.html
Copyright © 2020-2023  润新知