机器人小学期(2):YOLOv2

原文链接:YOLO9000: Better, Faster,Stronger

YOLO9000是YOLO系列的第二版,在后面都是用YOLOv2表示。在YOLO的基础上,YOLOv2提出了诸多改进,核心就是让YOLO更快、更准确。YOLOv2中的模型YOLO9000号称可以检测9000个类别,并且可以支持一些类别没有detection label的情况下,来进行detection的工作,当然这部分的准确率还不算太高。

在这篇博客里,我将按照论文里的逻辑,分成Better、Faster和Stronger三个部分来描述论文里提出的改进。

Better

YOLOv2和YOLOv1相比,准确率得到了一些提升。在YOLOv1中比较显著的localization error较高以及recall低的问题,在YOLOv2中都得到了一些改善。为了使模型准确率更高,YOLOv2做出了以下改变:

  • Batch Normalization:YOLOv2在所有卷积层后面加了batch normalization,并删除了原来的dropout层,这使得mAP有2%的提升。

  • High Resolution Classifier:在YOLOv2中,使用了448*448的分辨率。训练时,首先在ImageNet上对分类网络finetune 10个epoch,然后再finetune detection部分。这个操作使得mAP上涨4个点。

  • Anchor Boxes and Prediction:YOLOv1中使用全连接层来直接预测bounding box,但在YOLOv2中,我们改用anchor boxes来预测bounding box。

    如果我们打开yolo的代码仓库,找到里面的.cfg文件,可以看到在网络配置里有这么一行(以yolov2-tiny.cfg为例)。

    1
    anchors =  0.57273, 0.677385, 1.87446, 2.06253, 3.33843, 5.47434, 7.88282, 3.52778, 9.77052, 9.16828

    这就是yolov2-tiny网络中使用的anchor,这其中每两个为一对,分别对应于x方向和y方向,上面这行显示的就是5个anchor。

    那么这些anchor是怎么生成的呢?首先我们拿到训练数据里所有bounding box的宽度和高度\((w,h)\),并假设这些bounding box的中心都在同一个点上,这样我们就得到了一组以同一个点为中心的长方形,对这些\((w,h)\)做k-means clustering,就可以得到\(k\)个聚类中心,也就是我们要的\(k\)个anchor,在实验中,我们发现\(k=5\)时的效果最好。为了更符合我们的任务,做k-means clustering时不使用欧几里得距离作为距离的衡量,而是使用IOU的大小作为距离的衡量,也即:
    $$d(\text{box},\text{centroid})=1-\text{IOU}(\text{box},\text{centroid})$$

    现在,我们获得了所有的anchor,接下来,我们需要调整网络的输出。


    Bounding Box

    和YOLOv1一样,如果输入图像分辨率为416*416,我们可以将输入图像划分为13*13个格子,其中每个格子大小为32*32,这样我们就会输出一个13*13的feature map,其中feature map的每一维也是一个向量,对应于中心点落在这个格子里的那些bounding box。在YOLOv2中,我们在每个格子里预测出5个bounding box,也就是五组中心坐标\((b_x,b_y)\),宽度\(b_w\),高度\(b_h\)以及置信值\(Pr(\text{Object})*\text{IOU}(b, \text{Object}))\)。值得注意的是,YOLOv2中不在直接输出这5个数,而是输出变化前的5个值\(t_x,t_y,t_w,t_h,t_o\),然后经过变换

    $$\begin{align}
    b_x&=\sigma(t_x)+c_x \\
    b_y&=\sigma(t_y)+c_y \\
    b_w&=p_we^{t_w} \\
    b_h&=p_he^{t_h} \\
    Pr(\text{Object})*\text{IOU}(b, \text{Object}))&=\sigma(t_o)
    \end{align}$$

    就可以得到\(b_x,b_y,b_w,b_h,Pr(\text{Object})*\text{IOU}(b, \text{Object}))\)。其中\(\sigma(x)\)表示Sigmoid函数,\((c_x,c_y)\)是这个格子左上角的坐标,\(p_w,p_h\)就是我们直接求出的anchor,5个bounding box正好对应于5个不同的anchor。

  • Fine-Grained Features:修改后的YOLOv2在13*13的特征图上进行预测,但是这样的分辨率可能和对于小尺度不利。Faster R-CNN和SSD在不同的特征图上跑proposal network来获得不同的分辨率,但在YOLOv2里,我们直接使用一个passthrough layer将前面层里的26*26分辨率的特征图和低分辨率的特征图用类似于ResNet中连Identity Mapping的方法连起来(我们把26*26*512特征图转换成13*13*2048,然后就可以和13*13的特征图连起来)。然后我们把这个特征图上做检测。这可以使performance提高1%。

  • Multi-Scale Training:YOLOv2把416*416作为输入的分辨率,但是由于网络里只有卷积核和max pooling,因此希望YOLOv2在应对不同分辨率的输入时有鲁棒性。我们可以在训练里不固定输入的大小,而是每10个epoch就随机选取另一个大小的图像,由于我们在网络里降采样的倍数是32,所以我们让所有的分辨率都是32的倍数({320; 352; …; 608}),这样网络就需要不停的学习预测不同分辨率的图像。

    在低分辨率的图像中,YOLOv2可以达到90FPS的速度,mAP和Fast R-CNN差不多。在高分辨率的图像中,YOLOv2仍可以达到实时的速度,78.6mAP。

Faster

YOLOv2没有使用VGG-16作为baseline,而是构建了一个新网络Darknet-19,这个网络包含19和卷积层和5个maxpooling,结构如下:


Darknet-19

Stronger

YOLOv2使用一种机制,可以同时训练classification和detection两部分的数据。细节还没有研究清楚。

机器人小学期(3):YOLOv3 机器人小学期(1):YOLOv1

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×