编程语言
首页 > 编程语言> > 目标检测算法——YOLOV2——better&faster

目标检测算法——YOLOV2——better&faster

作者:互联网

由于YOLO V2的贡献除了正常的模型精度召回和推理性能方面,还给出了一种高效低成本扩充检测类别的方式YOLO900,为保证简练和逻辑的清晰,分两篇介绍。

1、主要贡献

    相对v1版本,在继续保持处理速度的基础上,从预测更准确(Better),速度更快(Faster),识别对象更多(Stronger)这三个方面进行了改进。其中识别更多对象也就是扩展到能够检测9000种不同对象,称之为YOLO9000。

    其中对比V1改进点主要如下:

2、主要思路

    继承V1(顾欲真正理解V2,务必先看懂V1),主要增加的anchor 的概念,并使用聚类来提升anchor 的效率,期间重新设计的骨干网络,增加了BN,使用了passthrough操作混合低层次特征,以及更好的预训练和多尺度的训练。

3、具体细节

1)input

    预训练阶段,即使用image net阶段,输入为 224 * 224 ,共训练 160 个 epochs,再使用448*448,10个epoch。原因:检测数据较少,故使用ImageNet预训练,后面使用448*448fine tune 是由于检测为448* 448 ,可以减少分辨率突然切换造成的影响。得到4%mAP提升。

    训练检测阶段,每隔10个batch,网络随机选择一个新的图像尺寸{320,352, ...,608}(由于网络降采样的因子是32,因此image size为32的倍数),后文以416*416作为典型值讲解(下采样后为13*13)。这里需要注意虽然原文说希望最后的预测特征图为奇数,因为很多物体的中心在图像的中心,然而应用多尺度训练后,很多尺度对应的特征图并不是奇数。采用Multi-Scale Training策略,YOLOv2可以适应不同大小的图片,并且预测出很好的结果。注意,这只是测试时输入图片大小不同,而实际上用的是同一个模型(采用Multi-Scale Training训练)。

2)backbone

    增加BN,替换了全连接的dropout,mAP提升2.4%。命名为darknet19,网络具体如下。

    Darknet-19的top-1准确度为72.9%,top-5准确度为91.2%,但是模型参数相对小一些。使用Darknet-19之后,YOLOv2的mAP值没有显著提升,但是计算量却可以减少约33%。

    

    

3)neck & head

    整体结构如下,但是改进的细节比较多。

    a.引入anchor 机制

    

    对比YOLOV1主要区别有两个:

    *YOLOV1的每个网格,虽然也有两个bounding box,但是这两个bounding box是网络直接输出的,并没有任何先验的设置。而YOLOV2的anchor(借鉴faster RCNN、SSD也有采用)是可以理解为预先设置的具有不同长宽比和大小的bounding box,但是这里命名为anchor box。

    *YOLOV1的一个网格的两个bounding box是共享分类信息的,每个bounding box仅仅独立拥有(Center_x,Center_y,width,heigh, confidence),而YOLOV2的anchor box是独立用于分类信息的。

    YOLOv1只能预测98个边界框( 7*7*2 ),而YOLOv2使用anchor boxes之后可以预测上千个边界框(13*13*num_anchors )。所以使用anchor boxes之后,YOLOv2的召回率大大提升,由原来的81%升至88%。

    b.维度聚类

    这个主要用于解决上面的anchor如何设置的问题。在Faster R-CNN和SSD中,先验框的维度(长和宽)都是手动设定的,带有一定的主观性。如果选取的先验框维度比较合适,那么模型更容易学习,从而做出更好的预测。因此,YOLOv2采用k-means聚类方法对训练集中的边界框做了聚类分析。因为设置先验框的主要目的是为了使得预测框与ground truth的IOU更好,所以聚类分析时选用box与聚类中心box之间的IOU值作为距离指标。

    d(box, centroid) = 1 - IOU(box, cnetroid)

    下图在VOC和COCO数据集上的聚类分析结果,随着聚类中心数目的增加,平均IOU值(各个边界框与聚类中心的IOU的平均值)是增加的,但是综合考虑模型复杂度和召回率,作者最终选取5个聚类中心作为先验框,

    

    c.预测位置的处理

    目的是为了约束回归的范围(一般会归一化处理),这样能有助于模型的收敛。主要是沿用了YOLOV1的方式。

    回顾YOLOV1 的方式:坐标回归四个值(Center_x,Center_y,width,heigh, confidence)。Center_x,Center_y 回归的是距离7*7网格中物体中心点对应的一个网格的坐上角的坐标,为归一化值。width,height,也是整图的归一化值。

    V2主要是因为有了anchor的先验,利用了anchor本身的长宽。预测边界框中心点相对于对应cell左上角位置的相对偏移值,为了将边界框中心点约束在当前cell中,使用sigmoid函数处理偏移值,这样预测的偏移值在(0,1)范围内(每个cell的尺度看做1)。总结来看,根据边界框预测的4个offsets (tx, ty, tw, th) ,可以按左一公式计算出边界框实际位置和大小:

    

    推理阶段,通过上面右一的公式,换算为相对整图的输出,其中W和H为特征图的大小,V2中为13*13.

    

    d.passthrough 层,融合底层次特征

    13 * 13 大小的特征图对检测大物体是足够了,但是对于小物体还需要更精细的特征图。YOLOv2提出了一种passthrough层来利用更精细的特征图。见上面的整体结构图,主要是将前面的每个26*26的特征图,通过如下操作变为4个13*13的特征图:

    

    使用Fine-Grained Features之后YOLOv2的性能有1%的提升。

    具体网络如下:

4)loss function

    和YOLOv1一样,对于训练图片中的ground truth,若其中心点落在某个cell内,那么该cell内的5个先验框所对应的边界框负责预测它,具体是哪个边界框预测它(两种方式:1、像YOLOV1一样,需要在训练中确定,计算预测框和ground truth 的iou;第二种,计算这个cell的5个先验框与ground truth的IOU值,此时不考虑坐标,只考虑形状,所以先将先验框与ground truth的中心点都偏移到同一位置(原点),然后计算出对应的IOU值。iOU值最大的那个先验框与ground truth匹配,对应的预测框用来预测这个ground truth,第二种是大多数人的实现方式。)而剩余的4个边界框不与该ground truth匹配。YOLOv2同样需要假定每个cell至多含有一个grounth truth,而在实际上基本不会出现多于1个的情况。与ground truth匹配的先验框计算坐标误差、置信度误差以及分类误差,而其它的边界框只计算置信度误差(此时target为0)。YOLOv2和YOLOv1的损失函数一样,为均方差函数。

    如下loss并非官方,论文并没有提及核心的损失函数和上段文字的匹配机制,均参考自https://zhuanlan.zhihu.com/p/35325884

     

    

    *第一项loss是计算background的置信度误差。计算各个预测框和所有ground truth的IOU值,如果最大值仍小于一定的阈值(YOLOv2使用的是0.6),那么这个预测框就标记为background。

    *第二项是计算先验框与预测框的坐标误差,但是只在前12800个iterations间计算,在训练前期使预测框快速学习到先验框的形状。

    *第三大项计算与某个ground truth匹配的预测框各部分loss值,包括坐标误差、置信度误差以及分类误差。在计算obj置信度时,target=1,但与YOLOv1一样而增加了一个控制参数rescore,当其为1时,target取预测框与ground truth的真实IOU值(cfg文件中默认采用这种方式)。

    *对于那些没有与ground truth匹配的先验框(与预测框对应),除去那些Max_IOU低于阈值的,其它的就全部忽略,不计算任何误差。

    *都是采用均方差来计算loss。另外需要注意的一点是,在计算boxes的 w 和 h误差时,YOLOv1中采用的是平方根以降低boxes的大小对误差的影响,而YOLOv2是直接计算,但是根据ground truth的大小对权重系数进行修正:l.coord_scale * (2 - truth.w*truth.h)(这里w和h都归一化到(0,1)),这样对于尺度较小的boxes其权重系数会更大一些,可以放大误差,起到和YOLOv1计算平方根相似的效果。

5)trics

    *增加BN,替换了全连接的dropout,mAP提升2.4%。

    *先在 ImageNet 分类数据集上预训练 Darknet-19,此时模型输入为 224 * 224 ,共训练 160 个 epochs,再使用448*448,10个epoch,然后fine-tune的得到的网络,在detection上得到4%mAP提升。(主要区别就是增加了再使用imagenet 448*448 fine tube的过程,原因是,检测为448*448 缓解了分辨率突然切换造成的影响。)

    *使用了先验框,召回率大幅提升到88%,同时mAP轻微下降了0.2。

    *先验框聚类,且使用iou作为距离度量。

    *使用多尺度训练检测器

    *使用passthrough 层结合底层特征

4、结果

     YOLOv2算法在VOC 2007数据集上的表现为67 FPS时,MAP为76.8,在40FPS时,MAP为78.6.

    提点主要是靠多分辨率+anchor机制,提速主要是靠改进的自研darknet19.

   

参考链接

1、https://zhuanlan.zhihu.com/p/334961642

2、关于聚类 https://blog.csdn.net/xiaomifanhxx/article/details/81215051

3、详细解释 https://blog.csdn.net/u014380165/article/details/77961414

4、https://www.cnblogs.com/sddai/p/14760055.html

5、最详细:https://zhuanlan.zhihu.com/p/35325884

6、https://www.yuejianzun.xyz/2018/07/03/YOLOv2%E4%B8%8EYOLOv3%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/

7、个人的代码实现及细节解读:https://zhuanlan.zhihu.com/p/101891196

8、https://www.zybuluo.com/huanghaian/note/1752758

标签:448,faster,truth,better,YOLOv2,YOLOV2,先验,anchor,ground
来源: https://blog.csdn.net/u012863603/article/details/118395105