前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >专栏 | 目标检测算法之YOLOv2

专栏 | 目标检测算法之YOLOv2

作者头像
AI研习社
发布2019-12-02 16:04:01
4660
发布2019-12-02 16:04:01
举报
文章被收录于专栏:AI研习社
本文来自 @BBuf 的社区专栏 GianPandaCV

前言


昨天介绍了 YOLO 系列的第一个算法 YOLOv1,并详细分析了 YOLOv1 的网络结构以及损失函数等。今天我们将来分析一下 YOLO 目标检测算法系列的 YOLOv2 和 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 通过缩减网络,使用 416x416 的输入,模型下采样的总步长为 32,最后得到 13x13 的特征图,然后对 13x13 的特征图的每个 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)。

经过 sigmoid 函数处理后范围在 0 到 1 之间,这样的归一化处理使得模型训练更加稳定。

表示一个 cell 和图像左上角的横纵距离。

和表示 bounding box 的宽高,这样 bx 和 by 就是 cx 和 cy 这个 cell 附近的 anchor 来预测 tx 和 ty 得到的结果。如 Fig3 所示:

其中,

表示 grid cell 与图像左上角的横纵坐标距离,黑色虚线框是 bounding box,蓝色矩形框就是最终预测的结果。注意,上图右边里面的

可以理解为

可以理解为

每一个输出的 bounding box 是针对于一个特定的 anchor,anchor 其实是 bounding box 的 width 及 height 的一个参考。

是某个 anchor box 的宽和高,一个格子的 Cx 和 Cy 单位都是 1,

是相对于某个格子左上角的偏移量。

  • 细粒度特征

YOLOv2 提取 Darknet-19 最后一个 max pool 层的输入,得到 26x26x512 的特征图。经过 1x1x64 的卷积以降低特征图的维度,得到 26x26x64 的特征图,然后经过 pass through 层的处理变成 13x13x256 的特征图(抽取原特征图每个 2x2 的局部区域组成新的 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 更使得同一个模型适应不同大小的输入,从而可以在速度和精度上进行自由权衡。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI研习社 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
相关产品与服务
图像识别
腾讯云图像识别基于深度学习等人工智能技术,提供车辆,物体及场景等检测和识别服务, 已上线产品子功能包含车辆识别,商品识别,宠物识别,文件封识别等,更多功能接口敬请期待。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档