在这篇论文中提出了YOLO9000网络模型,该模型可以实时建册多达9000种目标。首先对原始的YOLO进行改进,提升之后的模型是YOLO-V2。使用新的多尺度训练方法,相同的YOLO-V2模型可以接受不同的输入图像尺寸,这为速度与精度之间提供了多种选择。使用在COCO与ImageNet训练集上联合训练,得到YOLO9000,并可以使得YOLO9000检测出没有被标注的目标。YOLO9000可以预测超过9000的目标类别,而且还是实时运行的。
论文中提出了一种新的方法来利用现有的大量分类数据,并利用它来扩大现有检测系统的范围。论文的方法使用对象分类的分层视图,允许将不同的数据集组合在一起。
论文中还提出了一种联合训练算法,允许在检测和分类数据上训练目标检测器。论文的方法利用标记检测图像来学习精确定位对象,同时使用分类图像来增加词汇量和鲁棒性。
YOLO在定位的错误率是高于Fast R-NN的并且其召回率是低于使用RPN网络的方法的。因而改论文在保持分类准确率的同时提升召回率与定位准确性。
在YOLO-v2模型中想要获得更高的检测精度并保持网络运行的快速性。这里并没有增加网络的规模,而是简化网络之后是的表达更容易去学习。使用之前的成果来提升YOLO模型,可以归结为以下几点,对于结果的总结可以在表2中查看
(1)Batch Normalization。加入BN之后可以去除掉其它形式的正则化。加入正则化之后获得了2%mAP的提升。加入BN之后可以去掉Dropout层,也不会有过拟合的产生。
(2)高分辨率的分类器。在ImageNet进行的预训练是小于 256 ∗ 256 256*256 256∗256的 。之前的YOLO-v1版本中将分类网络的输入分辨率为 224 ∗ 224 224*224 224∗224,目标检测的分辨率却提升到了 448 ∗ 448 448*448 448∗448。因此在改进的YOLO-v2版本中一开始就使用 448 ∗ 448 448*448 448∗448的分类网络在ImageNet进行10个epoch的训练,之后fine tune网络进行目标检测,从而使得最后网络的检测结果增加了4%的mAP。
(3)带有锚点框(anchor boxes)的卷积。在YOLO-v1中使用卷积层加全连接层的设计,全连接层直接输出目标的边框坐标。但是在Faster R-CNN中并没有直接预测坐标,而是使用手工标注的先验预测边界框。只使用RPN网络去预测锚点框的偏移与置信度。由于预测层是卷积层,RPN在feature map中的每个位置预测这些偏移量。预测偏移量而不是坐标简化了问题,使网络更容易学习。
论文中从YOLO-v1中移除全连接层,并使用锚框来预测边界框。首先,我们去掉了一个池化层,使网络卷积层的输出具有更高的分辨率。还缩小了输入分辨率,网络以 416 ∗ 416 416*416 416∗416分辨率的图像作为输入图像,而不是 448 ∗ 448 448*448 448∗448。之所以这样做是因为想要特征图中的奇数个位置所以有一个中心单元格。对于目标物体,尤其是大的目标,其倾向于占据图像的中心,所以最好在中心有一个单独的位置来预测这些物体,而不是四个都在附近的位置。YOLO-v1的卷积层将图像缩小了32倍,所以使用416分辨率的输入图像我们得到的输出feature map是 13 ∗ 13 13*13 13∗13。
使用了锚点框之后也将类别预测机制从空间定位中解耦出来,使用每个锚点框预测类别与对象。同之前的YOLO类似,目标预测也是要计算与GT的IOU以及候选框中包含的目标被分类的条件概率。
使用锚点框只带来了一小点儿的精确率损失。YOLO-v1中对一张图像只预测98个边界框,但是假如锚点框之后便可以预测超过一千个了。没加锚点框之前:69.5mAP,81%召回率;加入之后:69.2mAP,88%召回率。
(4)聚类的维度。在YOLO网络中加入锚点框之后遇到两个问题。首先,框的维度需要手工设置,之后网络可以通过哦学习来适当调整这些框,但是能不能替换成更好的先验值呢?
因而,论文中提出使用K-means聚类算法在训练数据集上聚类来实现先验参数的选择。在进行聚类的时候选用欧几里得距离在大框上产生的错误多于小框,因而论文中定义了一个距离度量
d ( b o x , c e n t r o i d ) = 1 − I O U ( b o x , c e n t r o i d ) d(box, centroid)=1-IOU(box, centroid) d(box,centroid)=1−IOU(box,centroid)
对于K-means算法参数k的选择,经过权衡得出 k = 5 k=5 k=5时效果最好。经过聚类分析发现聚类的中心与手工标注的锚点框并不相同,实质上更少短、宽的框,但更多高、瘦的框。以下是k值与IOU之间的关系图
从下表中可以看出聚类之后得到的凭据IOU在同等数量情况下是好于手工设置的。
(5)直接预测位置。在YOLO使用锚点框之后带来的第二个问题便是网络的不稳定,特别是训练的前期。大多数的不稳定源自于预测定位框的 ( x , y ) (x,y) (x,y)坐标。在RPN网络中预测 t x t_x tx与 t y t_y ty的值,因而 ( x , y ) (x,y) (x,y)的坐标可以被写为
x = ( t x ∗ w a ) − x a x=(t_x*w_a)-x_a x=(tx∗wa)−xa
y = ( t y ∗ h a ) − y a y=(t_y*h_a)-y_a y=(ty∗ha)−ya
这个公式是不受约束的,所以任何锚箱都可以在图像的任何一点结束,不管在什么位置预测盒子。在随机初始化的情况下,模型需要很长时间才能稳定预测合理的偏移量。
论文中没有预测偏移量,而是采用YOLO的方法,并根据网格单元的位置预测位置坐标。这将ground truth限制在0和1之间。使用逻辑激活来约束网络的预测落在这个范围内。
网络在输出特征图中对每个单元格输出5个边界框。网络为每个边界框预测 ( t x , t y , t w , t h , t o ) (t_x, t_y, t_w, t_h, t_o) (tx,ty,tw,th,to) 5个边界框。如果边界框相对于图像坐上角的偏移为 ( c x , c y ) (c_x, c_y) (cx,cy),先验边界框拥有宽高为 p w , p h p_w,p_h pw,ph。则预测可以被描述为:
b x = δ ( t x ) + c x b_x=\delta (t_x)+c_x bx=δ(tx)+cx
b y = δ ( t y ) + c y b_y=\delta (t_y)+c_y by=δ(ty)+cy
b w = p w e t w b_w = p_we^{t_w} bw=pwetw
b h = p h e t w b_h = p_he^{t_w} bh=phetw
P r ( o b j e c t ) ∗ I O U ( b , o b j e c t ) = δ ( t o ) Pr(object)*IOU(b,object)=\delta(t_o) Pr(object)∗IOU(b,object)=δ(to)
由于对定位预测进行了限制使得网络容易学习且稳定。使用维度聚类以及直接预测边框中心位置使得YOLO在加入anchor boxes的基础上提升了5%。
(6)细粒度特性。YOLO在最后分辨率为 13 ∗ 13 13*13 13∗13的特征图上进行预测,这获取对于大目标物体足够了,但是对于小物体定位来说更加细粒度等级的特征更加具有优势。对于像Faster R-CNN与SDD网络它们在不同分辨率的特征图上使用RPN网络。在YOLO采用了不同的方法,直接采用passthough layer使用上一层卷积分辨率为 26 ∗ 26 26*26 26∗26的特征图。
passthough layer通过在不同通道上堆叠高分辨率与低分辨率特征图,而不是在空间位置上,这与ResNet的标识网络是相似的。将原本 512 ∗ 26 ∗ 26 512*26*26 512∗26∗26的特征图转换为了 1024 ∗ 13 ∗ 13 1024*13*13 1024∗13∗13,然后再与对应的特征图连接在一起。这样使得网络的性能提升了1%。
(7)多尺度训练。在YOLO-v1中使用固定输入 448 ∗ 448 448*448 448∗448,后来加入anchor boxes将分辨调整到 416 ∗ 416 416*416 416∗416。但是为了能够使得YOLO-v2在不同尺寸图像上运行更加鲁棒,论文不再使用固定的图像尺寸作为输入,而是在选练过程中改变网络。每隔10个batch size就随机选择一个尺寸,但是都是32的倍数,例如: 320 , 352 , … , 608 {320, 352,\ldots, 608} 320,352,…,608。这样的机制便强制网络去学习不同维度的输入,并预测不同分辨率输入下的结果。这也就是的了YOLO-v2可以在速度与精确度之前做选择了。自然是低分辨输入的YOLO-v2网络跑得更快了,-_-||。最快可以达到90FPS,并且mAP与Fast R-CNN一样。高分辨率的自然更好了。
(8)实验比较。这里将各种分辨率的YOLO-v2模型与当前最新的检测模型进行对比,器结果如下:
不仅仅目标检测的精度重要,其实时性也同样重要。在大多数的检测应用场景中,想机器人和自动驾驶汽车,期望是比较低的预测延迟。YOLO-v2的速度也是很快的。
在多数的目标检测框架中都是依赖Vgg-16作为特征抽取层,但是它却比较复杂。整个网络在分辨率为 224 ∗ 224 224*224 224∗224情况下进行前单次运算就包含了30.69玩意的浮点运算。在YOLO中使用了基于GoogleNet结构的自定义网络。该网络结构式快于Vgg-16的,相同情况下浮点运算次数为8.52万亿次。且它的结果只是稍稍差于Vgg-16。
(1)Darknet-19。这里将其作为YOLO-v2的基础。它的构建与VGG相似都是使用大小为 3 ∗ 3 3*3 3∗3的滤波器、双数通道。使用均值卷积进行预测,并使用 1 ∗ 1 1*1 1∗1的卷积来对 3 ∗ 3 3*3 3∗3的卷积进行因式分解。同时也加入了牛逼哄哄的BN层,加快训练的稳定性与训练过程。最后得到的模型也就是Darknet-19了。包含了19个卷积层,5个最大池化。该网络只需要5.58万亿次运算获得了72.9%的top-1准确率,91.2%的top-5准确率。其结构见下表
(2)训练分类。我们在标准ImageNet 1000类分类数据集上训练了160个epoch的网络,使用随机梯度下降,初始学习率为0.1,多项式衰减率为4,权重衰减为0.0005,动量为0.9,使用Darknet神经网络框架。在训练中,我们使用标准的数据增强技巧,包括随机作物、旋转、色调、饱和度和曝光偏移。如上所述,在我们对 224 ∗ 224 224*224 224∗224帧图像进行初始训练后,我们将网络调优到更大的448帧。对于这个微调,我们使用上述参数进行训练,但只针对10个不同时期,并且以 1 0 − 3 10^{-3} 10−3的学习速率开始。在这个更高的分辨率下,我们的网络达到了前1名的精度76.5%和前5名的精度93.3%。
(3) 训练检测。修改这个网络检测通过移除最后一个卷积层,并增加三个3×3卷积层1024过滤器之后,最后一个1×1卷积层与输出的数量我们需要检测。对于VOC我们预测有5个盒子,每个盒子有5个坐标,每个盒子有20个分类,所以有125个过滤器。也在最后的 512 ∗ 3 ∗ 3 512*3*3 512∗3∗3层出加入上文中提到的passthrough layer来增加对细小类别的检测能力。