Press "Enter" to skip to content

专栏 | 目标检测算法之YOLOv2

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

前言

 

昨天介绍了 YOLO 系列的第一个算法 YOLOv1,并详细分析了 YOLOv1 的网络结构以及损失函数等。今天我们将来分析一下 YOLO 目标检测算法系列的 和 YOLO9000。

 

YOLOv2

 

原理

 

YOLOv1 作为 One-Stage 目标检测算法的开山之作,速度快是它最大的优势。但我们知道,YOLOv1 的定位不够准,并且召回率低。为了提升定位准确度,提高召回率,YOLOv2 在 YOLOv1 的基础上进行了改进。具体的改进方法如图 Fig1 所示:

 

 

Fig 1

 

可以看到 YOLOv2 通过增加一些 Trick 使得 v1 的 map 值从 63.4 提高到了 78.6,说明了 YOLOv2 改进方法的有效性。接下来我们就分析一下这些改进方法。

 

批量归一化

 

这个应该不用多说了,YOLOv2 在每个卷积层后面增加了 VB 层,去掉全连接的 dropout。使用 BN 策略将 map 值提高了 2%。

 

高分辨率

 

当前大多数目标检测网络都喜欢使用主流分类网络如 VGG,ResNet 来做 Backbone,而这些网络大多是在 ImageNet 上训练的,而分辨率的大小必然会影响到模型在测试集上的表现。所以,YOLOv2 将输入的分辨率提升到 ,同时,为了使网络适应高分辨率,YOLOv2 先在 ImageNet 上以 的分辨率对网络进行 10 个 epoch 的微调,让网络适应高分辨率的输入。通过使用高分辨率的输入,YOLOv2 将 map 值提高了约 4%。

 

基于卷积的 Anchor 机制

 

YOLOv1 利用全连接层直接对边界框进行预测,导致丢失较多空间信息,定位不准。YOLOv2 去掉了 YOLOv1 中的全连接层,使用 Anchor Boxes 预测边界框,同时为了得到更高分辨率的特征图,YOLOv2 还去掉了一个池化层。由于图片中的物体都倾向于出现在图片的中心位置,若特征图恰好有一个中心位置,利用这个中心位置预测中心点落入该位置的物体,对这些物体的检测会更容易。所以总希望得到的特征图的宽高都为奇数。YOLOv2 通过缩减网络,使用 416×416 的输入,模型下采样的总步长为 32,最后得到 13×13 的特征图,然后对 13×13 的特征图的每个 cell 5 个 anchor boxes,对每个 anchor box 预测边界框的位置信息、置信度和一套分类概率值。使用 anchor boxes 之后,YOLOv2 可以预测 13x13x5=845 个边界框,模型的召回率由原来的 81% 提升到 88%,mAP 由原来的 69.5% 降低到 69.2%.召回率提升了 7%,准确率下降了 0.3%。这里我们和 SSD 以及 Faster-RCNN 做个对比,Faster RCNN 输入大小为 1000*600 时的 boxes 数量大概是 6000,在 SSD300 中 boxes 数量是 8732。显然增加 box 数量是为了提高 object 的定位准确率。

 

维度聚类

 

在 Faster-RCNN 中,Anchor 都是手动设定的,YOLOv2 使用 k-means 聚类算法对训练集中的边界框做了聚类分析,尝试找到合适尺寸的 Anchor。另外作者发现如果采用标准的 k-means 聚类,在 box 的尺寸比较大的时候其误差也更大,而我们希望的是误差和 box 的尺寸没有太大关系。所以通过 IOU 定义了如下的距离函数,使得误差和 box 的大小无关:

 

下图 Fig2 展示了聚类的簇的个数和 IOU 之间的关系,两条曲线分别代表了 VOC 和 COCO 数据集的测试结果。最后结合不同的 K 值对召回率的影响,论文选择了 K=5,Figure2 中右边的示意图是选出来的 5 个 box 的大小,这里紫色和黑色也是分别表示两个不同的数据集,可以看出其基本形状是类似的。而且发现聚类的结果和手动设置的 anchor box 大小差别显着。聚类的结果中多是高瘦的 box,而矮胖的 box 数量较少,这也比较符合数据集中目标的视觉效果。

 

 

Fig 2

 

在结果测试时,YOLOv2 采用的 5 种 Anchor 可以达到的 Avg IOU 是 61,而 Faster-RCNN 采用 9 种 Anchor 达到的平均 IOU 是 60.9,也即是说本文仅仅选取 5 种 Anchor 就可以达到 Faster-RCNN 中 9 种 Anchor 的效果。如 Table1 所示:

 

 

新 Backbone:Darknet-19

 

YOLOv2 采用 Darknet-19,其网络结构如下图所示,包括 19 个卷积层和 5 个 max pooling 层,主要采用 卷积和 ,这里 卷积 可以压缩特征图通道数以降低模型计算量和参数,每个卷积层后使用 BN 层以加快模型收敛同时防止过拟合。 最终采用 global avg pool 做预测。 采用 YOLOv2,模型的 mAP 值没有显着提升,但计算量减少了。

 

 

直接位置预测

 

YOLOv2 在引入 Anchor 的时候碰到第 2 个问题:模型不稳定,尤其是训练刚开始阶段。论文任务这种不稳定主要来自 box 的(x,y)预测值。我们知道在 Faster-RCNN 中,是通过预测下图中的 tx 和 ty 来得到(x,y)值,也就是预测的是 offset。另外关于文中的这个公式,这个地方应该把后面的减号改成加号,这样才能符合公式下面的 example。这里xa和ya是 anchor 的坐标,wa和ha是 anchor 的 size,x和y是坐标的预测值,tx和ty是偏移量。

 

 

例子翻译过来是:当预测 时,就会把 box 向右边移动一定距离(具体为 anchor box 的宽度),预测 时,就会把 box 向左边移动相同的距离。 这个公式没有任何限制,使得无论在什幺位置进行预测,任何 anchor boxes 可以在图像中任意一点结束,模型随机初始化后,需要花很长一段时间才能稳定预测敏感的物体位置。

 

注意,高能来了!!!

 

分析了原因之后,YOLOv2 没有采用直接预测 offset 的方法,还是沿用了 YOLO 算法中直接预测相对于 grid cell 的坐标位置的方式。前面提到网络在最后一个卷积层输出 13*13 大小的特征图,然后每个 cell 预测 5 个 bounding box,然后每个 bounding box 预测 5 个值: 和 (这里的类似 YOLOv1 中的 confidence)。 和 经过 sigmoi d 函数处理后范围在 0 到 1 之间,这样的归一化处理使得模型训练更加稳定。 和 表示一个 cell 和图像左上角的横纵距离。 和 表示 bounding box 的宽高,这样 bx 和 by 就是 cx 和 cy 这个 cell 附近的 anchor 来预测 tx 和 ty 得到的结果。 如 Fig3 所示:

 

 

其中,和表示 grid cell 与图像左上角的横纵坐标距离,黑色虚线框是 bounding box,蓝色矩形框就是最终预测的结果。注意,上图右边里面的 可以理解为 可以理解为 每一个输出的 boun ding box 是针对于一个特定的 anchor,anchor 其实是 bounding box 的 width 及 height 的一个参考。 和是某个 anchor box 的宽和高,一个格子的 Cx 和 Cy 单位都是 1, 是相对于某个格子左上角的偏移量。

 

细粒度特征

 

YOLOv2 提取 Darknet-19 最后一个 max pool 层的输入,得到 26x26x512 的特征图。经过 1x1x64 的卷积以降低特征图的维度,得到 26x26x64 的特征图,然后经过 pass through 层的处理变成 13x13x256 的特征图(抽取原特征图每个 2×2 的局部区域组成新的 channel,即原特征图大小降低 4 倍,channel 增加 4 倍),再与 13x13x1024 大小的特征图连接,变成 13x13x1280 的特征图,最后在这些特征图上做预测。使用 Fine-Grained Features,YOLOv2 的性能提升了 1%。这个过程可以在下面的 YOLOv2 的结构图中看得很清楚:

 

 

多尺度训练

 

OLOv2 中使用的 Darknet-19 网络结构中只有卷积层和池化层,所以其对输入图片的大小没有限制。YOLOv2 采用多尺度输入的方式训练,在训练过程中每隔 10 个 batches,重新随机选择输入图片的尺寸,由于 Darknet-19 下采样总步长为 32,输入图片的尺寸一般选择 32 的倍数{320,352,…,608}。采用 Multi-Scale Training, 可以适应不同大小的图片输入,当采用低分辨率的图片输入时,mAP 值略有下降,但速度更快,当采用高分辨率的图片输入时,能得到较高 mAP 值,但速度有所下降。

 

这种机制使得网络可以更好地预测不同尺寸的图片,意味着同一个网络可以进行不同分辨率的检测任务,在小尺寸图片上 YOLOv2 运行更快,在速度和精度上达到了平衡。 在小尺寸图片检测中,YOLOv2 成绩很好,输入为 228 * 228 的时候,帧率达到 90FPS,mAP 几乎和 Faster R-CNN 的水准相同。使得其在低性能 GPU、高帧率视频、多路视频场景中更加适用。在大尺寸图片检测中,YOLOv2 达到了 SOAT 结果,VOC2007 上 mAP 为 78.6%,仍然高于平均水准,下图是 YOLOv2 和其他网络的精度对比:

 

 

速度对比:

 

YOLOv2 的训练主要包括三个阶段。

 

第一阶段:作者使用 Darknet-19 在标准 1000 类的 ImageNet 上训练了 160 次,用的随机梯度下降法,starting learning rate 为 0.1,polynomial rate decay 为 4,weight decay 为 0.0005 ,momentum 为 0.9。训练的时候仍然使用了很多常见的数据扩充方法(data augmentation),包括 random crops, rotations, and hue, saturation, and exposure shifts。(这些训练参数是基于 darknet 框架,和 caffe 不尽相同)初始的 224 * 224 训练后,作者把分辨率上调到了 448 * 448,然后又训练了 10 次,学习率调整到了 0.001。高分辨率下训练的分类网络在 top-1 准确率 76.5%,top-5 准确率 93.3%。

 

第二个阶段: 分类网络训练完后,就该训练检测网络了,作者去掉了原网络最后一个卷积层,转而增加了三个 3 * 3 * 1024 的卷积层(可参考 darknet 中 cfg 文件),并且在每一个上述卷积层后面跟一个 1 * 1 的卷积层,输出维度是检测所需的数量。 对于 VOC 数据集,预测 5 种 boxes 大小,每个 box 包含 5 个坐标值和 20 个类别,所以总共是 5 * (5+20)= 125 个输出维度。 同时也添加了转移层(passthrough layer ),从最后那个 3 * 3 * 512 的卷积层连到倒数第二层,使模型有了细粒度特征。 作者的检测模型以 0.001 的初始学习率训练了 160 次,在 60 次和 90 次的时候,学习率减为原来的十分之一。 其他的方面,weight decay 为 0.0005,momentum 为 0.9,依然使用了类似于 Faster-RCNN 和 SSD 的数据扩充(data augmentation)策略。

 

总结

 

YOLOv2 借鉴了很多其它目标检测方法的一些技巧,如 Faster R-CNN 的 anchor boxes, SSD 中的多尺度检测。除此之外,YOLOv2 在网络设计上做了很多 tricks,使它能在保证速度的同时提高检测准确率,Multi-Scale Training 更使得同一个模型适应不同大小的输入,从而可以在速度和精度上进行自由权衡。

Be First to Comment

发表评论

邮箱地址不会被公开。 必填项已用*标注