| by YoungTimes | No comments

Object Detection-理解YOLO v2

论文链接

《YOLO9000: Better, Faster, Stronger》

https://arxiv.org/abs/1612.08242

YOLO V2

Accuracy and speed on VOC 2007

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

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。

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的上升意味着我们的模型还有更多改善的空间。

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)}$$

Clustering box dimensions on VOC and COCO

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

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

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的先验宽度和高度。

Bounding boxes with dimension priors and location prediction.

由于我们约束了位置预测的范围,参数就更容易学习,模型就更稳定。使用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大小的特征图,然后在此特征图基础上卷积做预测。

passthrough层实例

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。

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

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

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

Detection frameworks on PASCAL VOC 2007

参考材料

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

发表评论