【目标检测(六)】YOLOv2——引入anchor, Better, Faster, Stronger

【目标检测(六)】YOLOv2——引入anchor, Better, Faster, StrongerYOLOv2是YOLO系列的第二代算法,作者在YOLOv1的基础上进行了大量改进,并引入了anchor机制,准确率大幅提升的同时降低了计算量,本文章重点介绍YOLOV2的原理和改进策略。

【目标检测(一)】RCNN详解——深度学习目标检测的开山之作
【目标检测(二)】SPP Net——让卷积计算共享
【目标检测(三)】Fast RCNN——让RCNN模型能端到端训练
【目标检测(四)】Faster RCNN——RPN网络替代selective search
【目标检测(五)】YOLOv1——开启one-stage目标检测的篇章
【目标检测(六)】YOLOv2——引入anchor, Better, Faster, Stronger
【目标检测(七)】YOLOv3——准确率的全面提升
【目标检测(八)】一文吃透目标检测回归框损失函数——IoU、GIoU、DIoU、CIoU原理及Python代码
【目标检测(九)】FPN详解——通过特征金字塔网络进行多尺度特征融合
【目标检测(十)】RetinaNet详解——Focal Loss将one-stage算法推向巅峰
【目标检测(十一)】CenterNet——Anchor Free, NMS Free
【目标检测(十二)】FCOS——用实例分割的思想做Anchor Free的目标检测

1. Introduction

YOLOv2是YOLO系列的第二代算法,原论文名称是《YOLO9000: Better, Faster, Stronger》,作者在YOLOv1的基础上进行了大量改进,引入了Faster RCNN提出的anchor机制,它斩获了CVPR 2017 Best Paper Honorable Mention。YOLOv2相比YOLOv1做了很多方面的改进,这也使得YOLOv2的mAP有显著的提升,并且YOLOv2的速度依然很快,保持着自己作为one-stage方法的优势,YOLOv2和Faster R-CNN, SSD等模型的对比如下图所示。

image.png

2. YOLOv2的原理和改进策略

本文是基于YOLOv1基础上来讲解YOLOv2的改进策略的,如果对YOLOv1算法不太熟悉,可以看上一篇YOLOv1的技术博客。作者从YOLO优化到YOLOv2做了大量的改进优化工作,优化效果也非常显著,在VOC2007上mAP准确率直接从63.4优化到了78.6%。

image.png

2.1 Batch Normalization

在2017年BN已经被证明其作用和有效性了,作者也是在第二代YOLO中的卷积层后使用了BN层,BN层使网络训练变得更加容易,并且有正则化的效果,防止过拟合使用了BN层后mAP提高了2个百分点。另外作者还提到,使用了BN层之后可以不再使用dropout层来防止过拟合。

2.2 High Resolution Classifier

  • 在YOLOv1中使用的224*224的图片作为网络输入在ImageNet上进行backbone的预训练,网络在进行正式训练的时候既需要学习检测过程也需要适应更大的分辨率。在YOLOv2中作者使用更大的分辨率448*448继续fine-tune十个epoch,让网络来习惯大的分辨率。
  • 同时作者在网络中去掉了一个pooling层,使得网络输出feature map更加稠密(7*7–>13*13)。
  • High Resolution Classifier能给mAP带来接近4个百分点的提升。

2.3 Anchor

2.3.1 引入anchor机制介绍

在YOLOv1中,输入图片最终被划分为 [公式] 网格,每个单元格预测2个边界框。YOLOv1最后采用的是全连接层直接对边界框进行预测,其中边界框的宽与高是相对整张图片大小的,而由于各个图片中存在不同尺度和长宽比(scales and ratios)的物体,YOLOv1在训练过程中学习适应不同物体的形状是比较困难的,这也导致YOLOv1在精确定位方面表现较差。作者借鉴了Faster RCNN的anchor机制,让网络输出的每个feature map点都生成若干anchor:

  • anchor是虚拟边界框。
  • 真实的bbox预测是由anchor生成出来的。

image.png

在YOLOv1中,最终的边界框是直接拟合的预测值和GT值,而Faster RCNN则是进行的offset regression,即拟合预测值和先验框的偏差值,采用先验框使得模型更容易学习。所以YOLOv2移除了YOLOv1中的全连接层而采用了卷积和anchor boxes来预测边界框。为了使检测所用的特征图分辨率更高,移除其中的一个pool层。在检测模型中,YOLOv2不是采用 [公式] 图片作为输入,而是采用 [公式] 大小。因为YOLOv2模型下采样的总步长为 [公式] ,对于 [公式] 大小的图片,最终得到的特征图大小为 [公式] ,维度是奇数,这样特征图恰好只有一个中心位置。

对于YOLOv1,每个cell都预测2个boxes,每个boxes包含5个值: [公式] ,前4个值是边界框位置与大小,最后一个值是置信度(confidence scores,包含两部分:含有物体的概率以及预测框与ground truth的IOU)。但是每个cell只预测一套分类概率值(class predictions,其实是置信度下的条件概率值),供2个boxes共享。YOLOv2使用了anchor boxes之后,每个位置的各个anchor box都单独预测一套分类概率值。

使用anchor boxes之后,YOLOv2的mAP有稍微下降(这里下降的原因,我猜想是YOLOv2虽然使用了anchor boxes,但是依然采用YOLOv1的训练方法)。YOLOv1只能预测98个边界框( [公式] ),而YOLOv2使用anchor boxes之后可以预测上千个边界框( [公式] )。所以使用anchor boxes之后,YOLOv2的召回率大大提升,由原来的81%升至88%。

2.3.2 Anchor聚类

在Faster RCNN中,feature map每个点产生9个anchor,这里产生的anchor的数量和种类是基于工程经验得来的,那么作者试图去解决拿到一个新的网络怎样能获得更好的anchor?这里提出了使用k-means算法来对GT Boxes进行聚类,获得更好的anchor超参数。如下图,是作者实验聚类分析k值选取对最终结果的影响情况(平衡准确率和计算速度,论文选取了k=5):

image.png

作者定义k-means聚类的距离为:

image.png

2.3.3 Anchor, True BBoxes & Predicted BBoxes

在这一部分主要讲解Anchor机制具体是如何和GT Box以及预测框相结合的。

第一部分先解释Anchor的含义,首先看一组anchor聚类的输出,例如是这样的:

image.png

输出5个anchor,每一组anchor都包含两个数,都在[0, 13]范围内(输出feature map维度为13*13),这里是将真实anchor对应图像区域的宽高都映射到feature map的区间上,即每个宽高先除以原始图像宽高再乘以13。

第二部分然后来看GT Boxes是如何处理的:

  • Original bbox: [xo, yo, wo, ho] ∈ [0, W | TH]
  • Normalize in 0~1: [xr, yr, wr, hr] = [xo / W, yo / H, wo / W, ho / H] ∈ [0, 1]
  • Transfer to feature map size: [x, y, w, h] = [xr, yr, wr, hr] * (13 | 13)
  • Transfer to 0~1 corresponding to each grid cell:
    { x f = x i y f = y i w f = l o g ( w / a n c h o r s [ 0 ] ) h f = l o g ( h / a n c h o r s [ 1 ] ) \begin{cases} x_f = x – i\\ y_f = y – i\\ w_f = log(w/anchors[0])\\ h_f = log(h/anchors[1]) \end{cases}

上面公式中i,j对应的是grid cell的ID,即i=floor(x), j=floor(y),表bbox中心坐标相对所属grid cell的相对偏移量,因为GT bbox中心一定在这个grid cell之内,所以i, j ∈ [0, 1]

最后一部分综合来看anchor, GT Boxes和Predicted BBoxes是怎么用起来的: 先回忆下,Faster RCNN中是如何对offset进行回归的:


{ t x p = x p x a w a , t y p = y p y a h a t w p = l o g ( w p w a ) , t h p = l o g ( h p h a ) t x g = x g x a w a , t y g = y g y a h a t w g = l o g ( w g w a ) , t h g = l o g ( h g h a ) \begin{cases} t_x^p = \frac{x_p – x_a}{w_a}, t_y^p = \frac{y_p – y_a}{h_a}\\ t_w^p = log(\frac{w_p}{w_a}), t_h^p = log(\frac{h_p}{h_a})\\ t_x^g = \frac{x_g – x_a}{w_a}, t_y^g = \frac{y_g – y_a}{h_a}\\ t_w^g = log(\frac{w_g}{w_a}), t_h^g = log(\frac{h_g}{h_a}) \end{cases}

思考下,这里没有对
t x p t_x^p
进行任何限制,假如说这里
t x p = 3 t_x^p=3
,那么中心点坐标将直接偏移3个
w a w_a
,很可能预测的bbox中心早已并不在这个grid cell之内了。为了纠正这种情况,需要对偏移量进行限制,YOLOv2对原始的anchor的offset regression进行了改进,拟合bbox中心点相对于grid cell的相对偏移量并且将中心点偏移量限定在了[0, 1]范围内,如下公式所示:


{ σ ( t x p ) = b x C x , σ ( t y p ) = b y C y t w p = l o g ( w p w a ) , t h p = l o g ( h p h a ) t x g = g x f l o o r ( g x ) , t y g = g y f l o o r ( g y ) t w g = l o g ( w g w a ) , t h g = l o g ( h g h a ) \begin{cases} σ(t_x^p) = b_x – C_x, σ(t_y^p) = b_y – C_y\\ t_w^p = log(\frac{w_p}{w_a’}), t_h^p = log(\frac{h_p}{h_a’})\\ t_x^g = g_x – floor(g_x), t_y^g = g_y – floor(g_y)\\ t_w^g = log(\frac{w_g}{w_a’}), t_h^g = log(\frac{h_g}{h_a’}) \end{cases}

上面公式中σ表示sigmoid函数;
b x , b y [ 0 , 13 ] b_x, b_y ∈ [0, 13]
是映射到0-13维度上的框中心坐标;
( C x , C y ) (C_x, C_y)
,是
b x , b y b_x, b_y
最近的离散整数点,
w a , h a [ 0 , 13 ] w_a’, h_a’ ∈ [0, 13]
,是映射到0-13维度上的anchor宽度和高度,
g x , g y [ 0 , 13 ] g_x, g_y ∈ [0, 13]
,是GT Box的中心点坐标映射到0-13维度上;
g w , g h [ 0 , 13 ] g_w, g_h ∈ [0, 13]
同理。

image.png

2.4 网络结构

作者不再使用VGG作为backbone,虽然当时ResNet已被证明非常好用,但是作者也没有使用ResNet这种结构,而是自己设计了网络结构,命名为DarkNet-19。如下图所示,DarkNet-19是分类网络的结构,使用在目标检测任务中,作者将输入图像大小改成了416*416,同时为了提高分辨率去掉了最后一个pooling层,也去掉了红框中的全连接层,最后网络输出是一个维度为13*13*1024的feature map。

image.png

2.5 Fine-Grained Features (细粒度特征融合)

在YOLOv1中,小目标的检测效果非常不好,一方面是与损失函数设计有关,模型loss将偏向大目标,会影响小目标的学习;另一方面与模型的coarse feature有关,网络一直在进行下采样,损失了非常多的细节信息。深度学习模型的学习到的浅层特征是物体的角点和边之类的细节信息,而学习到的深层特征是偏向抽象语义的,那么对于目标检测任务来说浅层特征和深层特征都是很重要的,定位任务需要细节信息才能框的准。因此,YOLOv2借鉴了RestNet的思想,融合了更精细化的特征。作者将26*26*512的特征通过passthrough层转化为了13*13*256维度的tensor,与原始粗粒度特征13*13*1024进行融合,网络结构如下图所示:

image.png

其中的passthrough层就是特征矩阵隔一个拆出来一个的方式,这样能实现特征图大小减半,但是channel变成原来的4倍,如下图所示:

image.png

这样的特征融合设计,使最后mAP提升了1个点。

2.6 Multi-Scale Training

多尺度训练是为了让网络能适应不同大小的图像,提升模型的泛化能力,通过多尺度训练,能让mAP提升1个百分点。

  • 移除全连接层:这样网络就可以接收任意大小的图像,提升模型的鲁棒性。
  • 多尺度:设置尺度[320, 352, 384, …, 608],训练每隔10个epoch变换一次。

2.7 Loss方程

作者在原论文中并没有给出loss计算和正负样本划分等细节(可能是想让读者膜拜下作者的代码),可以参考这篇技术博客,对作者loss计算部分的代码进行了解读。

也可参考技术博客的loss部分:zhuanlan.zhihu.com/p/82099160 本文将核心公式抄录下来,供参考:

image.png

image.png

3. YOLOv2的效果和优劣势分析

3.1 YOLOv2效果

如下图所示,YOLOv2优势总结起来就是涨点提速。在同尺度情况下,在VOC2007数据集下YOLOv2提升mAP准确率13.4%,同时推理速度提升50%。

image.png

3.2 YOLOv2优劣势

优点:

  • 无全连接层,速度快:采用仅包含卷积和池化的Darknet19网络结构,层数比YOLO更少,且没有全连接层,计算量更少;模型运行更快。
  • 使用卷积代替全连接层:解除了输入大小的限制。
  • 速度更快,准确率更高,用了非常多的优化技巧。

缺点:

  • 精度还有提升空间。
  • 小目标的检测性能还不是太好,也需要提高。
  • 稠密物体难检:虽然分辨率提高了,已经大幅度改善YOLOv1的重叠难检问题,但是还是每一个grid cell最多只能预测一个物体,如果遇到俄罗斯套娃情况还是不行。

Reference

  1. arxiv.org/pdf/1612.08…
  2. zhuanlan.zhihu.com/p/35325884
  3. zhangxu.blog.csdn.net/article/det…
  4. www.cnblogs.com/YiXiaoZhou/…
  5. zhuanlan.zhihu.com/p/82099160

今天的文章【目标检测(六)】YOLOv2——引入anchor, Better, Faster, Stronger分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/20847.html

(0)
编程小号编程小号

相关推荐

发表回复

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