论文链接:https://arxiv.org/abs/1612.08242
摘要:
论文在YOLO的基础上,引入BN,更高分辨率的分类器,anchor机制提高了精度,对应题目的Better。通过使用自家提出的DarkNet19提高了速度,对应题目的Faster。通过WordTree将目标检测数据集和图像分类数据集组合起来,将检测器和分类器解耦,可以实现弱监督学习,可以检测9000个类别,对应题目的Stronger。Better和Faster的改进模型叫YOLOv2,在YOLOv2基础上Stronger的改进叫YOLO9000。
Better:
YOLO相比于Fast R-CNN,定位误差大,召回率低。作者的改进主要就是这两个方面,同时要保持高的分类准确率。
- Batch Normalization:使用BN操作来对各层进行规则化,降低了过拟合的风险,将其它的规则化操作都去掉(droupout),并且提高了YOLO 2%的mAP。
- High Resolution Classifier:通常的神经网络分类器输入图像的尺寸大小不超过256
256,YOLO分类器的输入尺寸是224
224,如果将输入提高到448
448,网络需要重新适应新的分辨率。作者在ImageNet数据集上用224
224分辨图像预训练,然后用448
448分辨率的图像微调10个epoch,让网络更好的适应高分辨率分类任务,这个操作提高了4%的mAP。
- Convolutional With Anchor Boxes:YOLO是直接通过全连接层预测出边框坐标的。相比于Faster R-CNN,使用手动挑选的先验框(anchor)和RPN网络预测出的候选区域来计算偏移量,更难学习。作者就去掉了全连接层并且使用anchor来检测边界框。作者去掉了一个池化层,增加了网络输出层卷积输出特征图的大小。并且将网络的输入大小设置为416
416,这样做是因为,经过32倍下采样后,输出特征图的分辨率为13
13,特征图的宽高是奇数,这样就可以找到唯一一个特征图的中点,这对于那些很大的目标,几乎占据整幅图中心区域有很好的检测效果,因为可以由那个中心点负责,如果没有这个中心点,可能会出现好几个点来负责这个图像,导致错误检测或漏检。
- Dimension Clusters:因为anchor是手动选择的,这可能会导致anchor和数据集中真是目标框的形状相差太大,所以anchor框的选择应该和数据集的分布一致,作者采用了k-means聚类方法,1-IOU作为度量距离来聚类,来选取anchor,作者选取了5个。
- Direct location prediction:Fast R-CNN的位置预测是直接采用预测值和真实值相减的,这导致了前期训练不稳定,因为预测目标中心点的位置可以在真实值的左边,也可以在真实值的右边,并且数值大小也没约束,会导致左右震荡,不稳定。作者采用的方式是限值了预测值得方向,以图像左上角为参考点,左上角横坐标加上向左的偏移量为x,左上角纵坐标加上向下的偏移量为y,并且将真实标注数值大小约束在了0到1之间,这样减小了数值震荡幅度,使训练更稳定。
- Fine-Grained Features:网络层数越高,提取到的语义特征更高维,对网络的性能更好,但是有利有弊,会丢失很多细粒度信息,这对于小目标是非常不利的,为了弥补这个,作者采用了类似ResNet的思想,将更底层的特征直接拼接到高层的特征图上。因为特征图的分辨率不同,不能直接拼接,所以设计了一个转换层,将输出层的前一层特征图26x26x512 reshape到13x13x2048这样信息没有丢失,而且又满足了分辨率要求。这个操作提高了1%的性能。
- Multi-Scale Training:YOLO输入的分辨率是448x448,YOLOv2采用了anchor,将输入分辨率改为了416x416,并且由于YOLOv2去掉了全连接层,对输入图像的分辨率没有特定的要求,所以很容做到多尺度训练,作者是每10 batchs随机从{320,352,...,608}中选取一个分辨率用于训练。因为使用不同分辨率的图像进行了训练,所以可以检测不同分辨率图像,所以可以做到速度和准确率的折中。分辨率越小,速度越快,性能相对较差。
Faster:
作者没有采用VGG16作为特征提取网络,因为需要太多的浮点操作,导致计算太慢,作者自己提出了DarkNet19,
每一个卷积层都加了BN,而且主要是用3x3的卷积,总共12个3x3卷积层用于特征提取,7个1x1的卷积层用来降维,降低计算量。DarkNet19在ImageNet分类数据集上的性能比VGG-16略差,但是浮点计算量仅为VGG-16的27%。
分类器和检测器的训练:
- 分类器:先在ImageNet-1000上预训练160 epochs,使用随机梯度下降优化器,momentum为0.9,初始学习率为0.1,采用多项式衰减策略,衰减指数为4,权重衰减为0.0005,数据增强有随机剪切,旋转,色调,饱和度和曝光度随机改变。然后再用448x448的图像进行微调10 epochs,学习率为0.001,其它参数不变。
- 检测器:修改预训练好的分类网络,用三个3x3的卷积层替代最后一个卷积层,每个3x3的卷积层输出1024个特征图,每个3x3卷积层后面都加1x1卷积层来控制输出的通道数,不同的数据集要求不一样,主要是因为类别数不同。VOC有20个类别所以输出为5x(20+5)=125。网络训练160 epochs,初始学习率为0.001,在第60 和90 epoch时除以10。权重衰减为0.0005,momentum为0.9。数据增强的策略和YOLO,SSD一样,随机剪切,颜色变换等。COCO和VOC数据集上的训练策略是一样的。
Stronger:
作者提出了一个联合训练检测器和分类器的策略,同时训练来自不同数据集的数据。训练时,当训练数据是来自目标检测数据集时,反向传播的信息是整个YOLOv2的loss,即定位loss和类别loss,如果训练数据集来自分类数据集时,反向传播的loss仅仅包含类别loss。这个想法是好,但是存在一个问题,不同数据的标签是不一样的,有些标签比较细,有些比较宽泛。比如一条藏獒,在COCO数据集中标记为狗,在ImageNet中标记为藏獒,这样没法训练,重新标记的话,工作量巨大。作者采用多标签学习来处理这个问题。那么还有另一个问题,就是对于一些没见过的目标的预测,比如一条哈士奇,没有出现在训练集,那么网络预测时,该给什么标记呢,按理说网络应该预测它是狗。作者采用的是WordTree来解决这个问题,即建立WordTree,增加类别来完善标记
通过这种方式,作者的YOLOv2可以检测9000类别,叫做YOLO9000。但是实验结果表明,其泛化能力,和目标检测数据的类别数有很大影响,在目标检测数据集中出现过的类别,泛化性能就好,没出现过的泛化性能就很差,原因还是出在检测器和分类器没有完全解耦,即检测器检测时还是用到了类别信息。一旦碰到没见过的类别就检测不出,泛化性能就差。
实验结果: