yolo9000

作者: 欠我的都给我吐出来 | 来源:发表于2020-05-11 21:00 被阅读0次

    这篇文章发表晚于ssd,因此文章涉及到和ssd的比较。

    一、概述

    通用目标检测存在的问题

    1. 小物体检测存在问题
    2. 物品检测的类别局限在一份小的集合中。
    3. 训练样本的缺失,物品检测(打框)的样本数量远少于分类

    Yolo9000是在ssd之后发表的,因此也参考了ssd中的部分思路。抛弃了全连接层,可以支持各种输入尺寸。速度可以比ssd要快,支持用户在准确率和速度之间自由选择。在yolov1的基础上,现在支持多种图像类型的识别,支持小图形的识别。

    yolov1比较大的问题是定位误差相较于fast rcnn很大,以及召回率比较低。

    Yolov2的优化

    1. batch normalization.

    在所有的卷积之后添加BN,可以得到2% mAP (对m个类别的AP平均Precision取平均值),还可以抛弃dropout等泛化方法

    2. 扩大输入的尺寸

    从224244到448448这样可以学到更多的东西。得到4%的mAP提升。首先在224224的数据上训练160轮,然后在448448的模型上训练10轮

    3. 使用卷积的方法处理anchor box

    yolov1使用全连接层来得到最后的77(5*5+20)的输出结果。yolov2使用卷积的方法抽取这些信息,这和RPN的方式一致。
    处理的细节包括:

    • 输出从418变为416,这是为了保证最终的输出为416/32=13为奇数,奇数意味着中心点只有一个grid cell,而往往需要预测的物品就在中心位置。(虽然我觉得没啥用,因为其他的尺寸下,这个还是偶数)
    • 对于每个bounding box,分别预测confidence和类别。在yolo v1中,对于每个网格预测两个bounding box,这两个bounding box分别预测confidence,但是共享20种类别的预测,因此为77(52+20),这也意味着,一个grid cell中只会有一种类别,对于小物品显然不友好。在yolo v2中,每个bounding box单独有类别的预测,因此如果输出还是77,bounding box还是2,那么输出为77(2*(5+20))
      实际使用的时候,对于一张图往往预测超千个box。anchor box的使用会稍微降低mAP,但是将召回率提高到88%。

    4. K-means得到anchor box的尺寸

    anchor box的尺寸是事先规定好的,而yolov2通过k-means的方式得到box的初始形状和大小。得到5个box priors,此时的效果和使用9个anchor box的效果相当。
    下面介绍一下如何通过聚类的方式得到5个anchor box:
    K-means是聚类的方法,最后得到K个聚类中心以及每个样本属于哪个中心,其中K是聚类的个数,需要人为指定,其中使用“距离”来衡量每个样本与聚类中心的关系,通常使用欧式距离,但是对YOLO V2来说,需要选取框的尺寸,衡量的标准应该是“覆盖率”,所以YOLO V2利用IOU来计算,所以距离公式如下:

    d(box, centroid) = 1 – IOU(box, centroid)。
    因为我们聚类目标仅仅是W和H,并没有X,Y的概念,也就是说我们需要在IOU的计算中去掉X,Y,所以能想到的方法就是将两个框的“中心点对齐”,然后再计算IOU,计算的过程如下:


    1.jpeg

    有了IOU的计算方式后,我们再来看看如何通过K-means的思想得到5个候选框尺寸。首先这里向大家抛出一个小问题,最后得到的5个尺寸一定会是样本集合中的某个值么?


    2.jpeg

    上图就是K-means计算5个候选框尺寸的过程,因为是相加取平均的结果,所以往往不会是已知的样本尺寸。

    5. 预测偏移而不是直接预测坐标

    在yoloV1中,对于每个网格中的物品,预测期中心点的位置(x,y)以及相对于整张图的w和h值, 在v1中,在最终的卷积特征抽取器之前有一个全连接网。fastRCNN中的region proposal network,使用卷积网络预测偏移和置信度,显然预测偏移而不是直接预测坐标要更加简单。
    在region proposal networks使用anchorbox通过预测(tx,ty)预测模型的中心坐标:tx=1表示右移整个anchor box的宽度。

    3.png
    这种预测偏移的方式在前期很不稳定。yolov2通过下面的预测方式使得定位提升5%: 4.png
    yolov2并没有“预测偏移量”,而是遵循了YOLO的方法:直接预测对于网格单元的相对位置。 对每个anchor box预测得到(tx,ty,tw,th,to),其中sigmoid函数返回0-1之间的值。可以想想,cx,cy是整数,如果一个feature map是7*7的,那么cx、cy是[0,6]之间的整数,bx,by表示预测结果的物体中心。pw,ph是anchor box的默认尺寸,bwbh表示预测的长宽信息。
    5.png
    直接预测(x, y),就像yolo_v1的做法,不过v2是预测一个相对位置,相对单元格的左上角的坐标(如上图所示)。当(x, y)被直接预测出来,那整个bounding box还差w和h需要确定。yolo_v2的做法是既有保守又有激进,x和y直接暴力预测,而w和h通过bounding box prior的调整来确定。yolo为每个bounding box预测出5个坐标(tx,ty,tw,th,to)

    yolov1d的网络结构参考的是GoogleNet,使用了24个卷积层,后面接了两个全连接层,最后加了一个7730的预测层。

    yolo9000 使用darknet19作为检测的基础,其中使用batchnormolization来稳定训练,加速收敛和正则化模型;使用11卷积来压缩特征表示;可以看到这个网络参考了VGG的使用池化层缩小高宽,使用卷积层改变通道数的;参考了googlenet,使用11卷积减小参数量。

    8.png

    在V2中移除了全连接层,并且使用anchor box预测框。将输入从448压缩到416,这样通过32被下采样得到的是13*13的奇数的特征map。

    将类别预测机制和位置预测解耦,对每个anchor box预测类别和位置。在yolov1的输出是这样的

    12.png

    其中S是网格大小,B是box的数量,固定为2,C为C类物品的概率。也就是说对于一个网格只预测一次分类物品的概率,不管这个网格的B值。而在V2中,每个anchor box预测类别和位置。这样的方式可以虽然对精确率有影响,但是召回率上升了。

    6. 使用细粒度的特征

    在13 x13的特征图上预测目标 ,虽然这对大物体检测来说用不着这么细粒度的特征图,但这对小物体检测十分有帮助。Fast R-CNN和SSD都是在各种特征图上做推荐网络以得到一个范围内的分辨率。我们采用不同的方法,只添加了一个passthrough层,从26x26x512的分辨率得到特征,重新组合成13 x 13x2048,通过将相邻的特征叠加到不同的通道上,增加了特征的细粒度。然后与后面的13131024特征图连接在一起形成13133072的特征图,最后在该特征图上卷积做预测。这个方式得到了1%左右的性能提升。

    实际上使用细粒度的特征还有第二种方式:
    改进版在原版的基础上增加了一次卷积操作,先将26x26x512的特征图变为26x26x64的特征图,然后再执行后续的操作。原版和改进版的对比图如下:


    7.png

    损失函数

    YOLO V2的整篇文章并没有给出损失函数的公式。YOLO V2的损失函数依然以“回归”为主,里面没有Cross Entropy Loss,全部都是L2-Loss,整体的感觉和YOLO V1很像,我这里自行把Loss分解成三个部分:
    Loss = confidence_loss + classification_loss + coordinates_loss
    其中confidence_loss = no_obj_loss + obj_loss
    下面我们一一分解:

    confidence_loss

    首先我们先来看看confidence_loss它代表是不是物体的概率,那么如何判断“是不是”物体呢?跟YOLO V1相似,首先判断哪个Grid Cell负责哪个物体,比如A Grid Cell负责B物体,然后每个Grid Cell中有5个预测框(根据网络的更新,候选框的位置会实时改变),然后计算预测框(5个框)与B的IOU(5个IOU),最大的IOU的Anchor框Label=1(或者=计算出的IOU),其余的IOU如果小于阈值(实际我们用的是0.6),则该Anchor的Label=0;
    具体的公式如下:


    9.png

    其中W,H是特征图的大小,比如13,A是Anchor框的数量,比如5,然后bijk是预测的confidence,根据策略bijk会被当做背景与0做回归误差或者当作正例与IOU做回归。

    classification_loss

    然后分析classification_loss,这个Loss需要建立在bijk被当作正例的基础上,具体的公式如下: 10.png

    其中我们需要注意,c是从1开始的,因为没有背景类,比如Pascal VOC有20类,那么C=20.

    coordinates_loss

    这个Loss也是建立在bijk被当作正例的基础上的,具体的公式如下:


    11.png

    这里需要注意,YOLO V1对W和H进行了开根号的操作,因为在yolov1中预测的是实际w/整图的W的比值,而YOLO V2并没有这个操作,因为在yolov2中预测的是log(实际w/整图的W的比值)

    下面这个感觉更加具体一点:如何理解yolov2的损失函数:
    https://blog.csdn.net/qq_42422981/article/details/90105149
    YOLO V2中的3个比较重要的元素,1)如何通过K-means选取Anchor候选框尺寸;2)YOLO V2中如何利用Anchor思想;3)如何实现细粒度特征的;选择这三个元素,主要是因为本人在读论文时,深感这三点的美妙,其他诸如BN,大分辨率,多尺度训练等技巧在其他物体检测论文里也很常见。

    参考文献
    https://blog.csdn.net/lanran2/article/details/82826045

    https://www.cnblogs.com/demian/p/9252038.html

    https://blog.csdn.net/qq_42422981/article/details/90105149

    https://blog.csdn.net/lanran2/article/details/82826045

    https://blog.csdn.net/lanran2/article/details/82826045

    https://blog.csdn.net/leviopku/article/details/82588959

    相关文章

      网友评论

          本文标题:yolo9000

          本文链接:https://www.haomeiwen.com/subject/mrvpnhtx.html