YOLOv2、YOLO9000论文阅读记录

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shiheyingzhe/article/details/83989570

YOLO9000:Better, Faster, Stronger
论文的链接:https://arxiv.org/abs/1612.08242
YOLO9000是基于YOLOv2架构的,文中先介绍YOLOv2,然后再介绍的YOLO9000

YOLO9000是实时的检测系统,能检测约9000类物体。YOLOv2是基于YOLO改进的模型,使用多尺度方式训练,能检测不同尺寸的图片,在速度和准确率之间取得平衡。在VOC2007数据集中,67FPS,YOLOv2有76.8mAP的表现;40FPS,有78.6mAP的表现,不仅比使用ResNet的Faster R-CNN和SSD表现更好,而且速度也很快。最后文中提出联合训练分类和目标检测,使用这种方法,YOLO9000可以同时在COCO检测数据集和ImageNet分类数据集上训练。联合训练方式允许YOLO9000检测之前训练数据集(检测数据集)中没有的物体类。YOLO9000在ImageNet(分类数据集)验证集上的mAP为19.7,其中只有200类中的44类物体在检测训练数据集中,其余156类物体都不在COCO的检测数据集中。YOLO9000能实时的检测约9000类物体。

介绍

目标检测的目标是快速、准确并且能够识别多种类的物体。但目前大多数的检测方法仍然限制于很少的物体种类。检测数据集和其他数据集相比较(分类、标签数据集)数量是很有限的。因为检测用的标记图片比分类或标记图片(标记图片是用户提供的所以免费)更贵。因此不太可能达到和分类数据集同等的规模。
本文提出利用现有的分类数据集来扩大目前检测系统的范围。使用物体类的层级结构,允许将不同的数据集组合到一起。
同样也提出一个联合训练算法,允许使用检测数据和分类数据训练目标检测器。本方法在使用分类图像提高可检测类数量和健壮性的同时,使用标注好的检测图片学如何精准的定位物体。
首先基于YOLO检测系统生成YOLOv2,然后使用数据集组合的方法,并使用联合训练的算法,在多于9000类物体的ImageNet数据集和COCO检测数据集上训练一个模型。

Better:改进生成YOLOv2版本

YOLO和先进的检测系统相比较有很多问题。最显著的问题是定位不准确,召回率相对也有点低。改进主要聚焦于提高召回率和定位精度。
计算视觉通常倾向于更大、更深的网络。更好的检测表现通常与训练网络或组合多个模型绑定在一起。然而,YOLOv2需要一个又准确又快的检测器。
1、Batch Normalization 批归一化
批归一化处理在收敛时有明显的提升。在YOLO中加入BN,mAP提高2%,BN同样有助于规范化模型。有了BN就去掉Dropout不会过拟合。

2、High Resolution Classifier 高分辨率分类器
YOLO是用224 * 224的图片预训练的,检测输入的图片是448,。这意味着网络必须同时学习目标检测和适应新的分辨率输入。YOLOv2首先在448 * 448的ImageNet数据集上微调分类网络。使得网络有时间调整参数以更好地工作在高分辨率的输入。然后在检测数据集中微调。高分辨率的分类网络提高4%的mAP。

3、Convolutional With Anchor Boxes 带anchor boxes的卷积
YOLO在卷积特征提取层的顶层全连接层预测包围盒的坐标。但Faster R-CNN不直接预测坐标。而是使用事先确定好的anchor来预测包围盒。RPN网络仅仅使用卷积层预测偏移量(t_x,t_y,t_w,t_h)和anchor boxes的置信度。预测偏差而不是坐标简化了这个问题使得网络学习起来更容易。
从YOLO移除全连接层,并使用anchor boxes去预测包围盒。首先去掉输出的池化层使得输出有更高的分辨率。同样也压缩网络让输入变为416 * 416而不是448 * 448。这么做的原因是希望生成的特征图有奇数个像素,所以中心只有一个像素。物体特别是大的物体倾向于在图片的中心位置。所以特征图中心只有一个像素是很好的。而不是4个相邻的像素。YOLO的卷积层下采样倍数是32,所以如果输入是416 * 416那么输出的特征图是13 * 13。
在使用anchor boxes时,将预测物体类的机制和空间位置分离(YOLO预测类是假设7 * 7中的每个网格最多只有一个类,预测的是网格的类概率分布,一个网格只有一个类概率分布),YOLOv2和RPN类似,是每个anchor boxes分别预测一个类概率分布,有几个anchor boxes就预测几个类概率分布。遵循YOLO,objectness的预测仍然是预测IOU_{pred}^{truth}。类的预测使用条件概率,anchor box中存在物体,则有类概率,不存在物体,类概率应该为0。
使用anchor boxes以后,mAP下降0.3,但召回率提高了很多,可见模型有更多的改进空间。

4、Dimension Clusters 尺寸簇
在使用anchor boxes的时候遇到两个问题,第一个是盒子的尺寸是手工挑选的。尽管网络会学习适当地调整盒子尺寸,但如果能事先为网络挑选更好的尺寸,网络学习检测的过程会更容易。
这里不手工挑选盒子的尺寸,而是使用k-means对训练集中的包围盒坐标聚类,自动找到好的盒子尺寸。k-means需要有数据,中心点个数是需要人为指定的,位置可以随机初始化,但是还需要度量到聚类中心的距离。这里怎么度量这个距离是很关键的。
距离度量如果使用标准的欧氏距离,大盒子会比小盒子产生更多的错误。例(100-95)^2=25, (5-2.5)^2=6.25。因此这里使用其他的距离度量公式。聚类的目的是anchor boxes和临近的ground truth有更大的IOU值,这和anchor box的尺寸没有直接关系。自定义的距离度量公式:
d(box,centroid)=1-IOU(box,centroid)
到聚类中心的距离越小越好,但IOU值是越大越好,所以使用 1 - IOU,这样就保证距离越小,IOU值越大

\Large{\textcircled{\small{1}}} 使用的聚类原始数据是只有标注框的检测数据集,YOLOv2会生成一个TXT文件,其中每行都包含(x_j,y_j,w_j,h_j),j\in\{1,2,...,N\},即ground truth boxes相对于原图的坐标,(x_j,y_j)是框的中心点,(w_j,h_j)是框的宽和高,N是所有标注框的个数;
\Large{\textcircled{\small{2}}}首先给定k个聚类中心点(W_i,H_i),i\in\{1,2,...,k\},这里的W_i,H_i是anchor boxes的宽和高尺寸,由于anchor boxes位置不固定,所以没有(x,y)的坐标,只有宽和高;
\Large{\textcircled{\small{3}}}计算每个标注框和每个聚类中心点的距离 d=1-IOU(标注框,聚类中心),计算时每个标注框的中心点都与聚类中心重合,这样才能计算IOU值,即d=1-IOU\left [ (x_j,y_j,w_j,h_j),(x_j,y_j,W_i,H_i) \right ],j\in\{1,2,...,N\},i\in\{1,2,...,k\}。将标注框分配给“距离”最近的聚类中心;
\Large{\textcircled{\small{4}}}所有标注框分配完毕以后,对每个簇重新计算聚类中心点,计算方式为W_i^{'}=\frac{1}{N_i}\sum w_{i},H_i^{'}=\frac{1}{N_i}\sum h_{i}N_i是第i个簇的标注框个数,就是求该簇中所有标注框的宽和高的平均值。
重复第3、4步,直到聚类中心改变量很小。

本文对k的取值进行了实验,发现k=5时能达到模型复杂度和高召回率之间的平衡。聚类中心和手工挑选的anchor boxes有很大的区别,有更少短、宽的盒子,有更多高、瘦的盒子。

第2行与第3行比较,可以看出k-means生成的包围盒,它们很好的启动模型,并使得网络更容易学习检测任务。

5、Direct location prediction 直接预测位置.
YOLO使用anchor boxes遇到的第二个问题,模型不稳定。特别是在早期迭代过程中,大多数不稳定来源于预测包围盒的中心点(x,y)坐标。在RPN网络中,预测的是偏移量t_x,t_y,中心点的坐标(x,y)是这样计算的:
x=(t_x*w_a)+x_a \par y=(t_y*h_a)+y_a(x_a,y_a,w_a,h_a)是anchor boxes的坐标
由于RPN网络对t_x,t_y没有范围限制,预测的中心点(x,y)坐标可以出现在原图的任何位置,所以预测的范围过大,随机初始化模型要花费很长时间来稳定的预测合理的偏移。
本文不预测偏移,而是遵循YOLO预测相对于网格位置的位置坐标。网络对每个网格预测5个包围盒(k=5),每个包围盒有5个坐标预测值t_x,t_y,t_w,t_h和置信度t_o。对输出使用sigmod函数。和使用anchor boxes的版本相比较,使用维度聚类和直接预测包围盒的中心坐标提高YOLO 约5%。
b_x=\sigma(t_x)+c_x \par b_y=\sigma(t_y)+c_y \par b_w=p_we^{t_w} \par b_h=p_he^{t_h} \par Pr(object)\ * \ IOU(b,object)=\sigma(t_o)

其中t_x,t_y,t_w,t_h,t_o是预测值
\sigmasigmoid函数的简写,将输入缩放到(0,1)之间。
c_x,c_y是anchor的左上角(相对于特征图),p_w,p_h是anchor的宽和高,这里说的都是在最后一层特征图上的,不是原图,所以c_x,c_y,p_w,p_h的值都小于13(特征图为13 * 13)
b_x,b_y,b_w,b_h是通过预测值求得的包围盒,由于特征图很小,特征图的每个网格值小于1,所以b_x\in\left [ c_x, c_x+1\right ],b_y\in\left[c_y,c_y+1 \right ],其中1代表网格的范围。所以预测的中心点(b_x,b_y)在网格内,不会跑到网格外面去。
图中蓝色框是预测的框,蓝色点是预测框的中心点。虚线框是anchor。图中的网格指的是13 * 13的特征图,不是原图。YOLOv3中使用的才是原图。

查看Darknet中YOLOv2的配置文件yolov2.cfg
[region] anchors =  0.57273, 0.677385, 1.87446, 2.06253, 3.33843, 5.47434, 7.88282, 3.52778, 9.77052, 9.16828
这里的anchor都是小于13的,而原图输入是416 * 416,远比416小,可见这里的anchor是13 * 13的特征图上的,而不是原图上的。YOLOv3中的anchor才是指原图。文中没有写具体,如果将这张图和代码中的配置联系起来,图中是指特征图。代码中指的也是特征图,不然不好理解。

6、Fine-Grained Features 细粒度特征
修改以后的YOLO在13 * 13的特征图上预测检测的结果,对于大物体来说是足够的,但细粒度特征可能更有益于检测小物体。Faster R-CNN和SSD都在大量的特征图(多通道)上运行它们的RPN网络。本文采用不同的方法,简单的增加一个passthrough层,从之前26 * 26的层提取特征。
passthrough层拼接更高分辨率的特征和低分辨率的特征,通过叠加相邻特征到不同的通道而不是空间位置。和ResNet网络中的identity mappings相似。将26 * 26 * 512的特征图变为13 * 13 *1024的特征图。这个特征图能和最初的特征图拼接起来。检测器运行在这之上,所以能接触到细粒度的特征。这么做模型表现有1%的提升。

7、Multi-Scale Training 多尺度训练
网络有卷积层和池化层,没有全连接层,所以输入的大小可变不是固定的。每10次迭代网络会随机选择图片的尺寸来resize,由于下采样的总倍数为32,所以可选择的图片尺寸为{320,352,...,608},都是32的倍数。这种办法迫使网络学习预测多尺度的输入。因此网络才能预测不同分辨率的输入。

图中是在VOC2007数据集的测试结果


对每个改进的测试可以看到基本每个改进都对mAP有提高的作用

Faster

期望检测时又快又准确,大多数检测任务,像机器人、自动驾驶都依赖于低延迟的预测。大多数检测的架构使用VGG-16,VGG-16是一个准确、高效的分类网络但有点复杂。一张224 * 224的图片过VGG-16的卷积层需要30.69 billion次的浮点数运算。
之前YOLO使用基于GoogleNet的架构,这个网络比VGG-16快,前向传播仅仅需要8.52 billion次的运算。然而,它的准确率没有VGG-16高。
Darknet-19:本文提出一个新的分类模型作为YOLOv2的基础网络。该模型建立在已有的网络设计基础以及这个领域的常识上。和VGG模型类似使用3*3的卷积核。还使用1*1的卷积。使用batch normalization来稳定训练过程,加速收敛和规范化模型。Darknet-19有19个卷积层和5个最大池化层。处理一张图片仅仅需要5.58 billion次的运算。


训练分类
在标准的ImageNet的1000个分类数据集上训练160个epochs,训练时使用随机裁剪,旋转,色调,饱和度等操作。
在224 * 224的ImageNet数据集上预训练完成以后,使用更大尺寸的图片448 * 448微调网络。
训练检测
对VOC数据集的每个网格,预测5个包围盒,每个包围盒5个坐标,每个包围盒还要预测20类分类概率,输出是(5*5+20*5)=125维。

Stronger  YOLO9000

联合训练分类数据和检测数据集,使用标注好的检测数据集学习检测信息像包围盒坐标预测和objectness,以及如何分类普通的物体。本方法使用只有类标签的图片扩大能检测的类的数量。训练时混合检测和分类数据集中的图片。当看到图片来自检测数据集时,基于YOLOv2的损失函数反向传播梯度。当看到图片来自分类数据集时,仅仅反传网络中和分类有关参数的梯度。
本方法面临几种挑战
检测数据集只有普通的对象和通用的标签,像狗和船。而分类数据集有很多细化的标签。ImageNet数据集中就有100多种狗的图片,如果区分检测数据集中的狗这个大类。如果要联合训练,需要条理分明的融合这些标签。
大多数分类的方法使用softmax层计算所有类的概率形成概率分布,使用softmax是假设类之间是互相独立的。合并数据集的问题是不能简单的合并ImageNet和COCO数据集,例如猎狐梗和狗不是相互独立的,这两者是包含关系。

分层次分类
从WordNet中取出ImageNet的标签,WordNet是一个自然语言数据库包含结构概念以及相互联系的方式。在WordNet中,诺福克梗和约克夏梗都属于梗(狗分类中的大类)这个类,还属于猎犬这个类,同时属于狗这个大类等。大多数分类的方法都是建立在类标签是扁平结构这个假设之上的。然而对于合并数据集,有结构的类标签正是我们需要的。
因为语言的复杂,WordNet被结构化为有向图,而不是一棵树。例:狗既是犬科动物也是哺乳动物。本方法不使用图结构,而是简单的使用ImageNet数据集中的类标签建立一颗层级树。
为了建立这棵树,对所有ImageNet中的类标签,寻找它们在WordNet图中到根节点“物体”的路径。如果仅有一条路径,那么优先将其加入到树中。剩余的有多条路径的类标签,将其在图中最短的路径加入到树中。
最终结果是WordTree,类标签的层级模型,根节点是“物体”。为了使用WordTree进行分类,对树中的每个节点预测条件概率。每个节点负责对应的子节点。
例:Pr(诺福克梗|梗),Pr(约克夏梗|梗),Pr(贝灵顿梗|梗) ...
如果想计算某个节点的绝对概率,需要将路径上的节点的条件概率相乘起来,例:计算图片是诺福克梗的概率。
Pr(诺福克梗)=Pr(诺福克梗|梗) * Pr(梗|猎犬) * ... * Pr(哺乳动物|动物) * Pr(动物|物体)。
由于“物体”是根节点,分类时假设Pr(物体)=1,即假设一定存在“物体”。

为了验证这个方法,本文在由1000类ImageNet类标签生成的WordTree上训练Darknet-19模型。建立WordTree的时候增加了很多中间节点,所以类标签数量从1000增加到1369个,网络的输出也变为1369维。训练的标签是只要在WordTree的路径上,都标记为1,例:一张图片被标记为诺福克梗,则同样被标记为狗和哺乳动物等。这里和之前分类softmax的区别在于,之前onehot类标签只有一个1,其余都是0;这里的onehot类标签有多个1,只要在路径上的都是1。为了计算条件概率网络使用softmax预测1369维的向量。
层次Darknet-19取得71.9%的top-1准确率和90.4%的top-5准确率。
这里不是假设每张图片都有物体,而是使用YOLOv2的objectness预测器给出Pr(物体)。检测器预测包围盒以及树存在的概率即根节点的概率Pr(物体)。分类预测时将从根节点开始,遇到分叉就选择概率最大的路径直到达到某些设定好的阈值,这样就可以预测物体的类标签。

数据集与标签树的组合
使用WordTree组合多个数据集,简单的将数据集中的类标签加入到WordTree中

联合分类和检测
现在能使用WordTree组合数据集,所以能在分类和检测上训练联合模型。YOLO9000组合COCO 检测数据集和拥有9000类的完整ImageNet分类数据集。其中还加入一些不包括在ImageNet中分类数据。最终生成的WordTree有9418类。数据平衡对COCO过采样。
使用这个数据集训练YOLO9000,YOLO9000使用YOLOv2的架构,使用仅仅3个设定框而不是5个(k=3)。当网络看到检测图片时,正常的反向传播梯度。对于分类损失,路径上的标签都要传播损失,此时onehot的类标签只有路径上的才是1,其余是0。
当看到分类图片时,仅仅传播分类损失。先找到所有包围盒中最大概率对应的类标签和树,对这颗树计算损失。假设这个包围盒和ground truth的IOU值大于0.3,基于此反向传播objectness的损失。
这样训练YOLO9000,学到如何检测,同样也学到区分大量种类的物体。在ImageNet检测任务上评估YOLO9000,ImageNet的测试数据集仅仅有44类在COCO检测数据集中,这意味着测试数据集中有很多类不在COCO中,没有检测标签仅有分类标签。YOLO9000整体有19.7mAP,在这些没训练过检测仅有分类标签的156类中有16.0mAP。YOLO9000在不同的数据集训练其中仅有部分检测数据。YOLO9000能实时检测多于9000类的物体。
YOLO9000很好的学习到动物的“新品种”(不在检测数据集中动物类),但在学习衣服、装备上有困难。新动物容易学习是因为COCO检测数据集中有很多动物类。网络学到很多这方面的知识,但其中没有任何关于衣服的检测数据,只有人,所以预测“太阳镜”、“泳衣”等有困难。

结论

本文介绍YOLOv2和YOLO9000,都是实时的系统。YOLOv2的输入可以是多尺寸的图片,在速度和准确率的表现都很好。YOLO9000能实时检测多于9000类的物体,通过联合检测和分类。使用WordTree组合来自多个数据源的数据。YOLO9000使用联合优化技术在ImageNet和COCO上同时训练。

猜你喜欢

转载自blog.csdn.net/shiheyingzhe/article/details/83989570