YOLO9000: Better, Faster, Stronger论文阅读

本文仅是对论文的解读,供个人学习使用,如果有侵权的地方,还请联系我删除博文

一、概述

之前的Yolov1模型,与Fast R-CNN相比,Yolov1有着大量的定位误差。与基于region proposal的方法相比,Yolov1的查全率(recall)较低。新的模型侧重于提高recall和增加定位准确性,同时保证分类的准确性。

通读整篇论文,其实Yolov2相当于加入了多种优化算法与一些新的设计理念,不过感觉这些对日后的学习工作都有很大的启发性。

二、更好

1.Batch Normalization

使用BN可以有效的提升模型的收敛性同时也剔除了对其他正则化方法的需要。在Yolo中的所有卷积层都添加了BN,最终在mAP上获得了2%的改进,使用BN可以移除之前模型使用的dropout

2.高分辨率分类器

Yolov1是在输入图像分辨率为224\times224上进行训练,测试的时候将分辨率提高到了448\times448,这意味着网络必须同时切换学习目标检测和调整新的输入分辨率。为了不使整个图像分辨率变化得过于突然,因此在训练Yolov2中,先以224\times224的分辨率图像训练网络,在ImageNet上测试的时候,再通过448\times448的分辨率对分类网络进行10个epochs的微调,以适应这种变化。

3.Anchor Boxes

借鉴了Faster R-CNN的 Anchor boxes 的思想。首先移除了全连接层,使用了Anchor boxes预测 bbox。消除了一个池化层,使网络卷积层输出更高的分辨率,同时缩小分辨率,用448\times448的输入图像代替416\times416。这样可以在feature map时有奇数个位置,因此只有一个中心单元。对于大目标来说,往往会出现在图片的中央,如果是不是奇数个,那么就是4个中心单元,这显然不适合用4个去预测一个大物体。网络最后输出13\times13的feature map。

在Yolov1中,图像被分成了7\times7个网格单元,每个网格单元预测2个bbox,因此总共可以预测98个bbox。但加入了Anchor boxes后,模型预测超过一千。同时在没有Anchor boxes情况下,mAP为69.5%,recall为81%,使用Anchor boxes情况下,mAP为69.2%,recall为88%,可以见的mAP的少量下降带来recall更大的提升空间

4.维度聚类

由于Anchor boxes的尺寸是手工设定的,在网络学习过程中,会自动调整Anchor boxes,但如果能在训练之前就能选择一个比较好的Anchor boxes的尺寸,这会使网络更容易学习并预测更好的结果。

本文使用了K-Means聚类方法,在训练集上对bbox进行聚类,寻找好的Anchor boxes,如果使用欧式距离,对于较大的边界框要比较小的边界框产生更大的误差,因此根据IOU建立如下距离函数:

d(box,centroid)=1-IOU(box,centroid)

上式表示聚类中心处的bbox与其他bbox的距离与两个bbox的IOU值相关。

作者在COCO和VOC2007数据集上运行了各种k值的K-means,同时画出了如下图左半部分的坐标图。选择了k=5作为模型复杂度和高recall的这种。图的右半部分显示了在两个数据集上的聚类中心处的bbox。在这两种数据集上运行K-means的结果都选择更薄更高的bbox

Figure 2

5.直接位置预测

因为在Yolo中直接使用了Anchor Boxes,这会导致训练过程中,模型不稳定,在训练的初期体现得更明显。得自于Faster R-CNN论文中的推导。有:

x=(t_x * w_a)+x_a

y=(t_y * h_a)+y_a

上式中的x_a,y_a分别代表Anchor Boxes的坐标,w_a,h_a分别表示Anchor Boxes的宽和高

论文中给出了样例,当t_x=1的时候,bbox将会向右移动一个Anchor Boxes的宽,当t_x=-1的时候,bbox将会向左移动一个Anchor Boxes的宽。直观上,这样会导致某个网格单元内的某个Anchor预测bbox结果不固定,因为它可能偏离它本该有的位置而去检测较远的bbox,尽管后期会逐步调整到正确位置,但这会给学习算法带来一定的负担,而正确的想法应该是检测它周围的bbox。

为了解决上述问题,作者还是按照预测相对于网格单元位置的位置坐标,使用sigmoid函数将上面的t_x,t_y约束到0~1区间,直观上来说就是限制Anchor box只能预测周围的bbox。

Figure 3

b_x=sigmoid(t_x)+c_x

b_y=sigmoid(t_y)+c_y

b_w=p_we^{t_w}

b_h=p_he^{t_h}

这四个式子规定了预测出的bbox的位置坐标。

Pr(object) * IOU(b,object)=sigmoid(t_o)

这个式子与Yolov1中的confidence score一样

6.Fine-Grained Features

为了能弥补之前Yolov1在小目标上的检测性能,作者参照ResNet网络的思想,添加了一个passthrough layer,是将浅层的特征直接连到深层的特征(毕竟对于小的特征,随着池化等操作可能会被忽略掉)。论文中给出的案例是从26\times26\times512特征按照第一第二个维度分成4个13\times13\times512,然后按照通道这个维度叠加成13\times13\times2048

7.Multi-Scale Training

因为取消了全连接层的缘故,所以可以任意调整输入图像的尺寸,这样可以增加Yolov2的鲁棒性。论文中,选择每隔10个epochs随机选择一个新的图像尺寸来训练网络,输入图像的分辨率是412\times412,输出13\times13,使模型得以缩小32倍,从{320,352,…,608}选择输入尺寸。这样做带来的好处是可以使网络预测不同分辨率下的检测结果。同时也提升了在更小尺寸网络上运行的速度。

三、更快

Yolov1是基于GoogleNet的架构自定义的网络,这个网络比VGG-16更快,但是在准确率方面要低于VGG-16。参照VGG模型,设计出了新的网络结构Darknet-19。网络的具体结构如下图所示:

Table 6

分类训练的过程: We train the network on the standard ImageNet 1000 class classification dataset for 160 epochs using stochastic gradient descent with a starting learning rate of 0.1, polynomial rate decay with a power of 4, weight decay of 0.0005 and momentum of 0.9 using the Darknet neural network framework [13]. During training we use standard data augmentation tricks including random crops, rotations, and hue, saturation, and exposure shifts.

检测训练过程:修改网络进行检测,删除了最后一个卷积层,加上三个有1024个滤波器的3\times3卷积层,然后是一个1\times1的卷积层,1\times1卷积层过滤器的数目是需要检测的类别数。在VOC数据集上,预测5个bbox,每个bbox有5个坐标和20个类别,这样总共需要125个滤波器,同时添加了在最后的3\times3\times512层到倒数第二层卷积层的passthrough layer,参照之前介绍的Fine-Grained Features。之后训练网络160个epochs,初始学习率10e-3,在60个和90个迭代周期时将学习率除以10,使用0.0005的权重衰减和0.9的动量。对YOLO和SSD进行类似的数据增强,随机裁剪,色彩偏移等。对COCO和VOC使用相同的训练策略。

四、更强

由于检测数据集相对分类数据集更难获取,同时数据量也相对较少。因此作者提出了一个联合训练分类和检测数据的机制。它使用仅具有类别标签的图像来扩展可检测类别的数量。

训练期间,混合来自检测和分类数据集的图像,当网络看到是标记为检测的图像时,将会运行完整的损失函数,如之前Yolov1中论文中所示的损失函数。当看到的是分类图像的时候,就从分类特定部分进行反向传播(个人理解相当于只执行下面损失函数中的后三个式子)

然而这带来的问题是,由于分类数据集有着更广泛的标签,例如在ImageNet数据集上,狗的品种有很多种。如果想在两个数据集上进行训练,就需要一个一致的方式来合并这些标签。

Hierarchical classification:ImageNet的标签来自WordNet,这是一种构建概念和关联的语言数据库,由于语言的复杂性,其结构是有向图而不是树。论文中并不是使用的完整的图结构,而是通过从Image中构建分层树。

首先是如何构建这棵树,作者首先检查了ImageNet中的一些种类名称,并查看它们通过WordNet图到根节点的路径。由于同义词通过图只有一条路径。举个例子就是,假如有一个节点,其类别标记为动物,那么不管是柴犬还是雪獒,二者都是狗,狗又属于哺乳动物,哺乳动物也是动物。所以将这共同的路径添加到树中,然后反复检查,选择更短的路径。再举个例子就是雪獒另外也属于藏獒系,藏獒也属于狗,从这条路径走的话会较之前的长。这样就构建出了一个分层树。

如果要预测某个类别的概率,比如说要预测是柴犬的概率,只要沿着树到达根节点的路径,同时乘以条件概率。

例如:Pr(柴犬)=Pr(柴犬|狗)\timesPr(狗|哺乳动物)\timesPr(哺乳动物|动物)\timesPr(动物|根节点)

这里Pr(根节点)=1

下面是在1000个类ImageNet构建的WordTree结果:

Figure 5

本来标签空间有1000个类别,然后作者扩展到了1369个。如果有个图像被标记成了哈士奇,那么它也会被标记成狗,哺乳动物,动物。

这样做的结果虽然导致了最后的准确率有略微的下降,但是当识别新的或者某个未知的狗时,会很帅气并且自信地预测"狗"。

在检测过程中,YoloV2目标检测器给出了Pr值,首先给定一个阈值,这个阈值控制向树的更深处走,然后每次在同一个层上选择置信度最高的节点,这样进行下去就能找到预测目标类

Dataset combination with WordTree

下图是作者将COCO和ImageNet结合得到新的数据集。

Joint classification and detection:论文中,作者使用COCO训练集与有9000个类别的完整的ImageNet联合。新结合产生的数据集的相应WordTree有9418个类别。

有了上面的数据集,作者训练了Yolo9000,使用了基础的Yolov2架构,但每个网格单元只有3个bbox来限制输出。

对于检测图像,预测分类损失的时候仅在高于或等于当前标签对应的层次。比如类别信息是"狗",则像藏獒,哈士奇这些就按照分类错误处理。

对于分类图像,只反向传播分类损失。即找到预测类别概率最高的bbox,然后计算在预测树上的损失。同时还假设bbox与真实标签重叠至少0.3的IOU,并且基于这个假设反向传播目标损失。

猜你喜欢

转载自blog.csdn.net/adorkable_thief/article/details/84995304