37

Object Detection-理解YOLO v2

 3 years ago
source link: http://www.banbeichadexiaojiubei.com/index.php/2020/11/08/object-detection-理解yolo-v2/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

论文链接

《YOLO9000: Better, Faster, Stronger》

https://arxiv.org/abs/1612.08242

YOLO V2

MvAfYrY.png!mobile

YOLOv1的Detection速度很快,但是精度却不如R-CNN系列方法。

vQnMryE.png!mobile

YOLOv2中提出了如上表所示的几种改进策略在保持检测速度的前提下提升YOLO模型的准确度和召回率,从而提高mAP。在67FPS时,YOLO V2在VOC 2007数据集上获得了76.8mAP;在40FPS时,YOLO V2在VOC 2007数据集上获得了78.6 mAP,超越了当时state-of-art的Faster RCNN with ResNet和SSD方法。

改进策略

1.Batch Normalization

Batch Normalization可以明显提升模型的收敛速度,同时可以起到正则化的效果。在为每个卷积层后面都添加了Batch Normalization层之后,YOLO V2提升了2.4%的mAP。由于Batch Normalization可以起到正则化的作用,因此YOLO V2移除了用于防止过拟合(overfitting)的Dropout层。

2.High Resolution Classifier

YOLOv1使用大小为224×224的图像训练分类网络(classifier network),然后在图像大小为448×448数据集上进行目标检测。直接切换分辨率,YOLO模型难以直接适应。

在YOLOv2中,作者首先将分类网络(classification network)在大小为448×448的ImageNet图像中进行fine tune,使得Network可以调整自己的filter使其可以在高分辨率图像上work better;然后fine tune Detection Network。

高分辨率分类网络(High Resolution Classification Network)提升了将近4%的mAP。

FrQrQv6.png!mobile

3.Convolutional With Anchor Boxes

YOLO V1使用基于卷积特征提取器提取的Feature Map之上的全连接层来预测Bounding Box的坐标。

YOLOv2尝试借鉴Faster R-CNN中RPN网络的先验框(Anchor Boxes,Prior Boxes,SSD也采用了先验框)策略。相对于直接预测坐标,预测相对于Anchor Boxes的offset使得模型更容易学习。

为此我们首先移除YOLOv1中的全连接层而采用了卷积和Anchor Boxes来预测边界框。

为了使Detection所用的特征图(Feature Map)分辨率更高,我们移除其中的一个Pooling层。

在检测模型中,YOLOv2没有采用大小为418×418的图片作为输入,而是采用大小为416×416的图片作为输入,对输入图片进行步长为32的下采样,最终得到大小为13×13的Feature Map。之所以这么做,是因为Feature Map中的物体,尤其是比较大的物体,它们的中心点往往都落在图片的中心位置,使用中心点预测这些问题的Bounding Box相对容易。

使用Anchors Box降低了模型预测的mAP;YOLO V1只能预测98个Bounding Box(7 x 7 x 2),但YOLO V2使用Anchor Box可以预测上千个Bounding Box(13 x 13 x num_anchors),所以使用anchor boxes之后,YOLOv2的召回率大大提升,由原来的81%升至88%。Recall的上升意味着我们的模型还有更多改善的空间。

B3mEz2E.png!mobile

4.Dimension Clusters

在Faster R-CNN以及前面的YOLO + Anchor Box中,Anchor Box的长宽都是事先手动设定,如果我们能够事先提供给网络更好的先验框,那么模型就更容易做出更好的预测。

YOLOv2使用k-means聚类方法对训练集中的边界框做聚类分析。

因为设置先验框的主要目的是为了使得预测框与ground truth的IOU更好,所以聚类分析时选用box与聚类中心box之间的IOU值作为距离指标。

$$\text{d(box, centroid) = 1 − IOU(box, centroid)}$$

buABbeE.png!mobile

上图为VOC和COCO数据集上的聚类分析结果。左图显示随着聚类中心数目的增加,平均IOU值(各个边界框与聚类中心的IOU的平均值)是增加的,但是综合考虑模型复杂度和召回率,作者最终选取5个聚类中心作为先验框;右图显示,VOC和COCO数据集都偏向于细、宽的先验框,COCO相比VOC有更大的Variation。

Fj2yae.png!mobile

对比不同的先验框的生成方法,可以看到, 5个聚类先验框已经与9个Anchor Boxes的效果基本持平,9个聚类先验框得到了更好的Average IOU,说明使用k-means生成的先验框确实有用。

bUvM3yJ.png!mobile

5. Direct location prediction

使用Anchor Boxes的另一个问题是模型不稳定性,尤其是在早期迭代的时候。大部分的不稳定性都是预测Box的中心点坐标导致的。

在Faster R-CNN中的RPN网络预测Anchor Boxes的坐标就是预测$t_x$,$t_y$,对应中心点(x, y)的计算方式如下:

$$ x = (t_x ∗ w_a) − x_a$$

$$ y = (t_y ∗ h_a) − y_a$$

其中,$w_a, h_a, x_a, y_a$分别是先验框的宽度、高度和中心点坐标。

上面的公式是无任何约束的,预测的边界框很容易向任何方向偏移,如当$t_x=1$时边界框将向右偏移$w_a$,而当$t_x=-1$时边界框将向左偏移$w_a$。因此任何Anchor Boxes可以在图像中任意位置,这导致模型的不稳定性。模型随机初始化之后将需要很长一段时间才能预测出稳定的offsets。

为了解决这个问题,YOLOv2沿用YOLOv1的方法,预测边界框中心点相对于对应cell左上角位置的偏移值,使得Ground Truth约束在[0, 1]之间。

同时在网络中使用Logistic激活函数使得网络的预测值也落在[0, 1]范围内。

YOLOv2在Feature Map的每个Cell预测5个Bounding Boxes,每个Bounding Box预测5个坐标值:$t_x$, $t_y$,$t_w$,$t_h$,$t_o$,根据预测值得到最终预测框的计算方法如下:

$$b_x = \sigma(t_x) + c_x$$

$$b_y = \sigma(t_y) + c_y$$

$$b_w = p_w e^{t_w}$$

$$b_h = p_h e^{t_h}$$

$$Pr(object) * IOU(b, object) = \sigma(t_o)$$

其中$c_x, c_y$是cell相对于图像左上角的offset,$p_w, p_h$是Bounding Box的先验宽度和高度。

ueUFvqE.png!mobile

由于我们约束了位置预测的范围,参数就更容易学习,模型就更稳定。 使用Dimension Clusters和Direct Location Prediction这两项改进,使得相对于直接使用Anchor Boxes,YOLOv2的mAP提升了将近5%。

6.Fine-Grained Features

YOLOv2的输入图片大小为416×416,经过5次maxpooling之后得到13×13大小的特征图,并以此特征图采用卷积做预测。13×13大小的特征图对检测大物体是足够了,但是对于小物体还需要更精细的特征图(Fine-Grained Features)。

YOLOv2提出了一种passthrough层来利用更精细的特征图。YOLOv2所利用的Fine-Grained Features是26×26大小的特征图(最后一个maxpooling层的输入)。

passthrough层与ResNet网络的shortcut类似,以前面更高分辨率的特征图为输入,然后将其连接到后面的低分辨率特征图上。前面的特征图维度是后面的特征图的2倍。

passthrough层抽取前面层的每个2×2的局部区域,然后将其转化为channel维度,对于26x26x512的特征图,经passthrough层处理之后就变成了 13x13x2048的新特征图(特征图大小降低4倍,而channles增加4倍,下图为一个实例),这样就可以与后面的13x13x1024特征图连接在一起形成13x13x3072大小的特征图,然后在此特征图基础上卷积做预测。

7Vne6fN.jpg!mobile

passthrough的本质其实就是特征重排,26x26x512的feature map分别按行和列隔点采样,可以得到4幅13x13x512的特征,把这4张特征按channel串联起来,就是最后的13x13x2048的feature map。passthrough layer本身是不学习参数的,直接用前面的层的特征重排后拼接到后面的层,越在网络前面的层,感受野越小,有利于小目标的检测。

在TensorFlow中,可以使用tf.extract_image_patches或者tf.space_to_depth来实现passthrough层:

out = tf.extract_image_patches(in, [1, stride, stride, 1], [1, stride, stride, 1], [1,1,1,1], padding="VALID")
// or use tf.space_to_depth
out = tf.space_to_depth(in, 2)

另外,作者在后期的实现中借鉴了ResNet网络,不是直接对高分辨特征图处理,而是增加了一个中间卷积层,先采用64个1×1卷积核进行卷积,然后再进行passthrough处理,这样26x26x512的特征图得到13x13x256的特征图。这算是实现上的一个小细节。 使用Fine-Grained Features之后YOLOv2的性能有1%的提升。

7.Multi-Scale Training

为了使模型可以适应不同大小的图片,YOLOv2采用了多尺度输入训练的策略,具体来说就是在训练过程中每间隔10个iterations随机改变模型的输入图片大小。

由于YOLOv2的下采样步长为32,所以输入图片大小选择一系列为32倍数的值:{320, 352, …, 608}。最小的图片大小为320×320,对应的特征图大小为10×10;最大的图片大小为608×608,对应的特征图大小为19×19。

Fz2uEfa.png!mobile

采用Multi-Scale Training策略,YOLOv2可以适应不同大小的图片,并且预测出很好的结果。

如下图所示, 输入图片大小为288×288,FPS达到了91,YOLOv2的mAP已经几乎和Fast R-CNN一样好了,这对于低GPU配置、高帧频的视频或者多视频流实时检测的场景非常友好。

当输入为高分辨率的输入(544×544)时,FPS降低到了40,但是mAP提升到了78.6%。

E7zmeiU.png!mobile

参考材料

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

2、https://docs.google.com/presentation/d/14qBAiyhMOFl_wZW4dA1CkixgXwf0zKGbpw_0oHK8yEM/edit#slide=id.g23eff386b7_0_24

3、https://www.zhihu.com/question/58903330/answer/247359224


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK