目标定位与检测系列(9):YOLOv2 (YOLO9000)

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/sinat_34474705/article/details/86626553

本文主要介绍YOLOv2部分,最后一部分的YOLO9000看的不是太明白,有兴趣的可以直接看论文原文

摘要

我们在本文介绍YOLO9000,它是目前最好的实时的目标检测系统,可以检测超过9000种目标。首先我们提出一些对YOLO检测方法的改进措施,这些方法都很新颖,是基于前人的工作总结出来的。改进的YOLOv2模型在PASCAL VOC和COCO等标准的检测任务中取得了最好的结果。采用新颖的多尺度训练方法,YOLOv2可以方便地权衡检测速度和准确率。在VOC 2007数据集上,VOLOv2在检测精度为76.8mAP时的检测速度是67FPS,在检测精度为78.6mAP时的检测速度是40FPS。在超过当前最好的方法(Faster R-CNN + ResNet, SSD)的同时检测速度依然非常快。最终我们提出了一个方法联合训练目标检测和分类,利用这个方法我们可以同时在COCO检测数据集和ImageNet分类数据集上训练YOLO9000。我们的联合训练方法可以让YOLO9000对没有检测标签的目标预测检测的结果。我们在ImageNet检测任务上验证了YOLO9000。YOLO900在验证集上取得了19.7的mAP,尽管只有200个类别中的44中检测类别数据。在COCO中没有的156中类别中,YOLO9000取得了16.0mAP的结果。相比之下,YOLO可以检测超过200个类别的目标,而YOLO9000可以实时预测超过9000种不同的目标。

Better

相比于Fast R-CNN,YOLO有更高的定位误差;相比于基于候选区域的检测算法,YOLO有更低的召回率。YOLOv2希望在保持分类准确性的前提下提高召回率、减少定位误差。

Batch Normalization

在YOLO模型所有的卷积层后加BN层,即对每一层的数据都做归一化。这样的好处是模型不用每层都重新学习数据的分布(因为每层的分布都基本一致了)加入BN层让mAP提高了2%。另外,BN有正则化作用,因此可以移除dropout。

高分辨率分类

YOLO模型首先在224*224的图像上预训练分类模型,再提高到448*448的图像训练检测模型。YOLOv2中,在微调检测模型之前先用448*448的图像训练10个epoch,从而让模型更好地适应分辨率的变化。这种方式提高了4%的mAP。

Anchor机制

YOLO直接利用全连接层输出位置信息。YOLOv2借鉴Faster R-CNN的anchor机制。对于每一个anchor,预测是否为目标以及具体的目标类别(如果是目标)。其中预测是否为目标通过预测ground truth和候选区域的IOU来实现。通过引入anchor机制,YOLOv2模型的mAP降低了0.3,而召回率却提高了7%。

维度聚类

Faster R-CNN中的anchors的大小和比例都是手动设定的(典型的3中大小和3中比例,k=9),然后在训练过程中根据ground truth调整。但是如果在训练之前就设置更合适的anchors,会使训练更简单。因此,在YOLOv3中,在训练集的ground truth上用k均值聚类找到比较合适的anchors(即合适的宽和高)。

我们都知道,K均值聚类需要定义距离函数。标准的欧拉距离会让大的bbx产生更多的偏差。而对ground truth聚类的目的是为了让找出的anchors与ground truth有尽可能大的IOU(IOU的大小和bbx的大小无关)。基于以上分析,显然下面的距离公式更符合我们的需要:

d ( b o x , c e n t r o i d ) = 1 I O U ( b o x , c e n t r o i d ) d(box, centroid) = 1 - IOU(box, centroid)

距离公式选好后,还有一个问题就是k的选择。作者通过选取不同的k值,然后执行k均值聚类得到anchors,然后计算当前k值下所有的ground truth与之最近的一个anchor的平均IOU来绘制曲线,最终权衡召回率和模型复杂度,确定k=5。

yolov3_kmeans

从图中也可以看出,不论是在VOC还是COCO数据集上,得到的anchors都和人工设置的的典型比例(1:1,1:2,2:1)有明显的差距。而从下面的表格中可以进一步发现用k均值聚类,仅用5个anchors就可以和Faster R-CNN的9个anchors效果相当。

ave_iou

直接预测位置

作者在YOLO中使用anchor后发现模型训练出现不稳定现象(尤其在训练早期)。而主要的不稳定因素来源于预测box的位置。

在基于候选区域网络(Faster R-CNN)中,网络预测实际box相对于anchor的偏移量 t x t_x t y t_y 来得到box的中心坐标:

x = ( t x w a ) + x a y = ( t y h a ) + y a x = (t_x*w_a) + x_a \\ y = (t_y*h_a) + y_a

其中, x a x_a 和&y_a&表示anchor的中心点坐标, w a w_a y a y_a 为对应的宽和高, x x y y 为最后得到的box中心点坐标, t x t_x t y t_y 就是网络预测的偏移量。特别的,当 t x t_x t y t_y 分别都取1或-1时,表示预测的box的中心将由anchor向右下/左上平移 w a w_a / h a h_a 个单位得到。

然而,YOLOv2文中指出,这种方式对预测的 t x t_x t y t_y 是没有限制的,预测的值可能很大。换句话说,不管是基于特征图上的哪个位置预测,得到的box可能会出现在图像的任意位置,这可能导致模型在训练初期出现极大的不稳定性。

基于上述分析,作者依旧遵循YOLOv1直接预测box位置的思路,但做出如下改进:在预测的bbx的中心相对于grid cell的偏移量 t x t_x t y t_y 上接一个logistic激活函数,从而将偏移量限制在0到1之间,而bbx的宽和高和Faster R-CNN一致。如下:

b x = σ ( t x ) + c x b y = σ ( t y ) + c y b w = p w e t w b h = p h e t h b_x = \sigma(t_x)+c_x \\ b_y = \sigma(t_y)+c_y \\ b_w = p_we^{t_w } \\ b_h = p_he^{t_h}

文中还提供了一个更直观的示意图来解释上面的公式:

locate_pred

YOLOv2网络最终得到的特征图大小是13*13,然后在每个cell预测5个bbx,包括bbx的中心相对于cell的偏移量 t x t_x t y t_y 、宽高对应的参数 t w t_w t h t_h 。由于 σ ( ) \sigma() t x t_x t y t_y 限制在了0到1之间,因此预测的bbx的中心只会落在当前cell区域,让模型的训练更容易。根据文中介绍,YOLOv2的维度聚类+直接预测bbx中心的机制相比于使用anchors提高了5%的mAP。

细粒特征

13*13的特征图对于检测一般的目标问题不大,但对于小目标的检测,可能还不够。因此常规的思路的提高特征图的分辨率(如Faster R-CNN和SSD)。作者另辟蹊径,将前一层的26*26*512的特征图隔点采样得到13*13*2048的特征图。这有点像池化的过程,不同的是,池化是取每一块最大或者平均值,而passthrough层是按位置下采样,最终得到分辨率为原来的1/4、通道为原来4倍的特征图,最后再和最后的13*13的特征图连接在一起。(该过程即为文中提出的passthrough层)。这样一来,就相当于结合了不同层的特征图信息进行预测。文中指出采用细粒特征获得了1%的性能提升。

多尺度训练

在YOLOv2中移除全连接层让多尺度训练成为了可能。作者在模型训练过程中不断随机设定图片的大小来提高模型的鲁棒性。考虑到32倍下采样,作者在416*416的图片大小基础上以32为步长设定图片大小,如320、352、… 、480、544等。当然,在不同大小的图片上训练的速度和精度也会有明显的差异,也正是这样,YOLOv2可以方便地在速度和精度上权衡。(如在硬件能力比较弱的机器上图像大小可以设定地小一点,硬件能力强的机器上图像大小可以设置大一点。)

文中也做了多组实验来比较了不同图像大小下的速度和精度差异。从结果上看,即便是在544*544的图片上训练,YOLOv2仍然可以在保证78.6的mAP时有着4FPS的速度。

detection_trade_off

Faster

很多场合应用对检测的实时性要求很高(如自动驾驶)。这就要求检测模型在保证检测精度的前提下尽可能地减少模型的计算量,从而提高检测效率。一个比较流行的预训练分类模型是VGG-16,它在ImageNet数据集上有这90.0%的分类准确率,不足的单张224*224的图片执行一次测试过程需要30.69亿次的浮点计算。相比之下,YOLO的预训练模型是Googlenet,它的准确率和浮点计算量分别为88.0%和8.52亿次。而作者在YOLOv2中提出一种新的预训练模型,即Darknet-19,它在ImageNet上的准确率为91.2%,浮点计算量为5.58亿次。具体的模型如下:

darknet-19

对于模型的预训练,作者如第一部分提到的那样,先在224*224的图片上训练,然后再提高分辨率至448*448继续训练。之后微调模型用于训练检测网络的时候,移除最后一个卷积层、添加3个3*3的卷积层(每个卷积层1024个卷积核并后接一个1*1的卷积层)。同时,从3*3*512的那层(特征图大小为14*14)引入passthrough层到倒数第2层。

Stronger (YOLO9000)

这部分主要讲YOLO9000,作者把目标检测数据集和目标分类数据集联合在一起训练,让模型可以检测更多的目标类型。主要内容有两块:(1)针对分类数据集和检测数据集的标签存在较大差别的问题,作者提出WordTree来统一训练;(2)目标检测和目标分类联合训练方法。

猜你喜欢

转载自blog.csdn.net/sinat_34474705/article/details/86626553