DeepLearing—CV系列(十)——多类多目标物体的侦测——YOLO系列之YOLOv2、YOLO9000算法详解

文章目录

  • 前言
  • 一、YOLOv2的优化改进Better(预测更准确)
    • 1.1 Batch Normalization(批归一化)
    • 1.2 High Resolution Classifier(大尺度预训练分类)
    • 1.3 Convolutional With Anchor Boxes(使用锚框卷积)
    • 1.4 Dimension Clusters(维度聚类)
    • 1.5 Direct location prediction(直接定位预测)
    • 1.6 Fine-Grained Features(细粒度特征)
    • 1.7 Multi-Scale Training(多尺度训练)
  • 二、YOLOv2的优化改进Faster(速度更快)
    • 2.1 Darknet-19
    • 2.2 Training for classification
    • 2.3 Training for detection
  • 三、YOLO9000-Stronger(识别对象更多)
  • 四、总结
    • 4.1 YOLO的anchor与SSD的有什么不同?
    • 4.2 总结

前言

YOLOV2论文地址:https://arxiv.org/abs/1612.08242
YOLOV1有两个缺点:一个缺点在于定位不准确,另一个缺点在于和基于region proposal的方法相比召回率较低。因此YOLOv2主要是要在这两方面做提升。另外YOLOv2并不是通过加深或加宽网络达到效果提升,反而是简化了网络。

一、YOLOv2的优化改进Better(预测更准确)

1.1 Batch Normalization(批归一化)

这个就像卷积网络中的神器,加上之后又能防止过拟合又能加速收敛。原理上,对每一批训练数据统计通道上的均值和方差,再做归一化处理。原来的YOLOV1(采用的是GoogleNet网络提取特征)是没有BN层的,因此在YOLOv2中作者为每个卷积层都添加了BN层。另外由于BN可以规范模型,所以本文加入BN后就把dropout去掉了。实验证明添加了BN层可以提高2%的mAP。
BN层的优点:
1)神经网络每层输入的分布总是发生变化,通过标准化上层输出,均衡输入数据分布,加快训练速度;可以设置较大的学习率和衰减,而不用去care初始参数,BN总能快速收敛。
2)通过规范化输入,降低激活函数在特定输入区间达到饱和状态的概率,避免梯度消失问题;
3)输入规范化对应样本正则化,在一定程度上可以替代 Drop Out; Drop Out的比例也可以被无视了,全自动的节奏。
BN的做法:
在卷积池化之后,激活函数之前,对每个数据输出进行规范化(均值为 0,方差为 1)。

DeepLearing—CV系列(十)——多类多目标物体的侦测——YOLO系列之YOLOv2、YOLO9000算法详解_第1张图片
公式很简单,第一部分是 Batch内数据归一化(其中 E为Batch均值,Var为方差),Batch数据近似代表了整体训练数据。
第二部分是亮点,即引入 附加参数 γ 和 β(Scale & Shift),Why? 因为简单的归一化 相当于只使用了激活函数中近似线性的部分(如下图红色虚线),破坏了原始数据的特征分布,这会降低模型表达能力。
DeepLearing—CV系列(十)——多类多目标物体的侦测——YOLO系列之YOLOv2、YOLO9000算法详解_第2张图片

1.2 High Resolution Classifier(大尺度预训练分类)

原来的YOLO网络在预训练的时候采用的是224x224的输入(这是因为一般预训练的分类模型都是在ImageNet数据集上进行的),然后在detection的时候采用448x448的输入,这会导致从分类模型切换到检测模型的时候,模型还要适应图像分辨率的改变。

而YOLOv2则将预训练分成两步:先用224x224的输入从头开始训练网络,大概160个epoch,然后再将输入调整到448x448,再训练10个epoch。注意这两步都是在ImageNet数据集上操作。最后再在检测的数据集上微调(fine-tuning),也就是detection的时候用448x448的图像作为输入就可以顺利过渡了。作者的实验表明这样可以提高几乎4%的MAP。

1.3 Convolutional With Anchor Boxes(使用锚框卷积)

1)原来的YOLO是利用全连接层直接预测bounding box的坐标,而YOLOv2借鉴了Faster R-CNN的思想,引入anchor。

2)使用416x416代替448x448的原因:

首先将原网络的全连接层和最后一个pooling层去掉,使得最后的卷积层可以有更高分辨率的特征;然后缩减网络,用416x416大小的输入代替原来448x448。这样做的原因在于希望得到的特征图都有奇数大小的宽和高,奇数大小的宽和高会使得每个特征图在划分cell的时候就只有一个center cell(比如可以划分成7x7或9x9个cell,center cell只有一个,如果划分成8x8或10x10的,center cell就有4个)。为什么希望只有一个center cell呢?因为大的object一般会占据图像的中心,所以希望用一个center cell去预测,而不是4个center cell去预测。网络最终将416*416的输入变成13x13大小的feature map输出,也就是缩小比例为32。

3)作者的实验证明:虽然加入anchor使得MAP值下降了一点(69.5降到69.2),但是提高了recall(81%提高到88%)。

我们知道原来的YOLOV1将输入图像分成7x7的网格,每个网格预测两个bounding box,因此一共只有98个box,但是在YOLOv2通过引入anchor boxes,预测的box数量超过了1千(以输出feature map大小为13x13为例,每个grid cell有9个anchor box的话,一共就是13x13x9=1521个,当然由后面第4点可知,最终每个grid cell选择5个anchor box)。顺便提一下在Faster RCNN在输入大小为1000x600时的boxes数量大概是6000,在SSD300中boxes数量是8732。显然增加box数量是为了提高object的定位准确率。

1.4 Dimension Clusters(维度聚类)

我们知道在Faster R-CNN中anchor box的大小和比例是按经验设定的,然后网络会在训练过程中调整anchor box的尺寸。但是如果一开始就能选择到合适尺寸的anchor box,那肯定可以帮助网络越好地预测detection。所以作者采用k-means的方式对训练集的bounding boxes做聚类,试图找到合适的anchor box

另外作者发现如果采用标准的k-means(即用欧式距离来衡量差异),在box的尺寸比较大的时候其误差也更大,而我们希望的是误差和box的尺寸没有太大关系。所以通过IOU定义了如下的距离函数,使得误差和box的大小无关:
d(box,centroid) = 1 - IOU(box,centroid)

如下图,左边是聚类的簇个数和IOU的关系,两条曲线分别代表两个不同的数据集。在分析了聚类的结果并平衡了模型复杂度与recall值,作者选择了K=5,这也就是下图中右边的示意图是选出来的5个box的大小,这里紫色和黑色也是分别表示两个不同的数据集,可以看出其基本形状是类似的。而且发现聚类的结果和手动设置的anchor box大小差别显著。聚类的结果中多是高瘦的box,而矮胖的box数量较少。
DeepLearing—CV系列(十)——多类多目标物体的侦测——YOLO系列之YOLOv2、YOLO9000算法详解_第3张图片
下表中作者采用的5种anchor(Cluster IOU)的Avg IOU是61,而采用9种Anchor Boxes的Faster RCNN的Avg IOU是60.9,也就是说本文仅选取5种box就能达到Faster RCNN的9中box的效果。聚类结果比使用人工挑选的先验值要好得多。
DeepLearing—CV系列(十)——多类多目标物体的侦测——YOLO系列之YOLOv2、YOLO9000算法详解_第4张图片

1.5 Direct location prediction(直接定位预测)

直接Anchor Box回归导致模型不稳定,对应公式也可以参考 Faster-RCNN论文,该公式没有任何约束,中心点可能会出现在图像任何位置,这就有可能导致回归过程震荡,甚至无法收敛:

tx=(x-xa)/wa
ty=(y-ya)/ha
tw=log(w/wa)
th=log(h/ha)

在这里作者并没有采用直接预测offset的方法,还是沿用了YOLO算法中直接预测相对于网格单元的坐标位置的方式。

  • 1)对应 Cell 距离左上角的边距为(Cx,Cy),σ定义为sigmoid激活函数,将函数值约束到[0,1],用来预测相对于该Cell 中心的偏移(不会偏离当前网格);
  • 2)预定Anchor(文中描述为bounding box prior)对应的宽高为(Pw,Ph),预测 Location 是相对于Anchor的宽高乘以系数得到;
    DeepLearing—CV系列(十)——多类多目标物体的侦测——YOLO系列之YOLOv2、YOLO9000算法详解_第5张图片

cx和cy,表示grid cell与图像左上角的横纵坐标距离(起始点为左上角),黑色虚线框是bounding box,蓝色矩形框就是预测的结果。

特征图反算原图坐标:格子通过特征图的索引得到,图像坐标除以32,整数部分做索引,小数部分做对当前格子左上角的偏移量。神经网络的输出宽高可能会有正有负,
用log激活bw/pw,bh/ph,log激活的好处有:①压缩到1附近,梯度较大②输入是0到正无穷,输出是负无穷到正无穷,符合神经网络的输出③反算时,以e为底,偏移量为正④压缩数据。

1.6 Fine-Grained Features(细粒度特征)

SSD通过不同Scale的Feature Map来预测Box来实现多尺度,而YOLO v2则采用了另一种思路:添加一个passthrough layer,来获取上一层26x26的特征,并将该特征同最后输出特征(13*13)相结合,以此来提高对小目标的检测能力。通过Passthrough 把26x26x512的特征图叠加成13x13x2048的特征图,与原生的深层特征图相连接。YOLO v2 使用扩展后的的特征图(add passthrough),将mAP提高了了1%。

1.7 Multi-Scale Training(多尺度训练)

为了让YOLOv2模型更加robust,作者引入了Muinti-Scale Training,简单讲就是在训练时输入图像的size是动态变化的,注意这一步是在检测数据集上fine tune时候采用的,不要跟前面在Imagenet数据集上的两步预训练分类模型混淆,本文细节确实很多。具体来讲,在训练网络时,每训练10个batch(个人认为应该是10个epochs),网络就会随机选择另一种size的输入。前面我们知道本文网络本来的输入是416416,最后会输出1313的feature map,也就是说下采样的比例是32,因此作者采用32的倍数作为输入的size,具体来讲文中作者采用从{320,352,…,608}的输入尺寸。

二、YOLOv2的优化改进Faster(速度更快)

2.1 Darknet-19

在YOLO v2中,作者采用了新的分类模型作为基础网络,那就是Darknet-19。这个网络包含19个卷积层和5个max pooling层,而在YOLO v1中采用的GooleNet,包含24个卷积层和2个全连接层,因此Darknet-19整体上卷积卷积操作比YOLO v1中用的GoogleNet要少,这是计算量减少的关键。最后用average pooling层代替全连接层进行预测。
DeepLearing—CV系列(十)——多类多目标物体的侦测——YOLO系列之YOLOv2、YOLO9000算法详解_第6张图片

2.2 Training for classification

① 采用随机梯度下降法SGD,输入图像的大小是224x224,在 ImageNet-1000分类数据集上训练了160个epochs,另外在训练的时候采用了标准的数据增加方式比如随机裁剪,旋转以及色度,亮度的调整等;

参数设定:

  • 初始学习率 - starting learning rate:0.1
  • 多项式速率衰减 - polynomial rate decay:4的幂次
  • 权值衰减 - weight decay:0.0005
  • 动量 - momentum:0.9

② 多分辨率训练,再fine-tuning 网络,这时候采用448x448的输入,这里learning rate改为0.001,并训练10个epoch。
前两步分别从网络结构和训练方式两方面入手提高了主网络的分类准确率。

2.3 Training for detection

在前面第2步之后,就开始把网络移植到detection,并开始基于检测的数据再进行fine-tuning。首先把最后一个卷积层去掉,然后添加3个3x3的卷积层,每个卷积层有1024个filter,而且每个后面都连接一个1x1的卷积层,1x1卷积的filter个数根据需要检测的类来定。
另外作者还提到将最后一个3x3x512的卷积层和倒数第二个卷积层相连。最后作者在检测数据集上fine tune这个预训练模型160个epoch,学习率采用0.001,并且在第60和90epoch的时候将学习率除以10,weight decay采用0.0005。
DeepLearing—CV系列(十)——多类多目标物体的侦测——YOLO系列之YOLOv2、YOLO9000算法详解_第7张图片

与YOLOv1不同,在YOLOv1中每个网格单元有30个特征图,而且在YOLOv1中,类别概率是由网格单元来预测的,也就是说一个网格单元对应的两个box的类别概率是一样的,但是在YOLOv2中,类别概率是属于box的,每个box对应一个类别概率,而不是由网格单元决定,因此这边每个box对应25个预测值(5个坐标加20个类别值),而在YOLOv1中一个网格单元的两个box的20个类别值是一样的)

三、YOLO9000-Stronger(识别对象更多)

VOC数据集可以检测20种对象,但实际上对象的种类非常多,只是缺少相应的用于对象检测的训练样本。YOLO2尝试利用ImageNet非常大量的分类样本,联合COCO的对象检测数据集一起训练,使得YOLO2即使没有学过很多对象的检测样本,也能检测出这些对象。

基本的思路是,如果是检测样本,训练时其Loss包括分类误差和定位误差,如果是分类样本,则Loss只包括分类误差。
DeepLearing—CV系列(十)——多类多目标物体的侦测——YOLO系列之YOLOv2、YOLO9000算法详解_第8张图片
1)构建WordTree
DeepLearing—CV系列(十)——多类多目标物体的侦测——YOLO系列之YOLOv2、YOLO9000算法详解_第9张图片

要检测更多对象,比如从原来的VOC的20种对象,扩展到ImageNet的9000种对象。简单来想的话,好像把原来输出20维的softmax改成9000维的softmax就可以了,但是,ImageNet的对象类别与COCO的对象类别不是互斥的。比如COCO对象类别有“狗”,而ImageNet细分成100多个品种的狗,狗与100多个狗的品种是包含关系,而不是互斥关系。一个Norfolk terrier同时也是dog,这样就不适合用单个softmax来做对象分类,而是要采用一种多标签分类模型。

YOLO2于是根据WordNet,将ImageNet和COCO中的名词对象一起构建了一个WordTree,以physical object为根节点,各名词依据相互间的关系构建树枝、树叶,节点间的连接表达了对象概念之间的蕴含关系(上位/下位关系)。

整个WordTree中的对象之间不是互斥的关系,但对于单个节点,属于它的所有子节点之间是互斥关系。比如terrier节点之下的Norfolk terrier、Yorkshire terrier、Bedlington terrier等,各品种的terrier之间是互斥的,所以计算上可以进行softmax操作。上面图10只画出了3个softmax作为示意,实际中每个节点下的所有子节点都会进行softmax。

2)WordTree的构建方法。

构建好的WordTree有9418个节点(对象类型),包括ImageNet的Top 9000个对象,COCO对象,以及ImageNet对象检测挑战数据集中的对象,以及为了添加这些对象,从WordNet路径中提取出的中间对象。

构建WordTree的步骤是:①检查每一个将用于训练和测试的ImageNet和COCO对象,在WordNet中找到对应的节点,如果该节点到WordTree根节点(physical object)的路径只有一条(大部分对象都只有一条路径),就将该路径添加到WrodTree。②经过上面操作后,剩下的是存在多条路径的对象。对每个对象,检查其额外路径长度(将其添加到已有的WordTree中所需的路径长度),选择最短的路径添加到WordTree。这样就构造好了整个WordTree。

3)WordTree如何表达对象的类别

之前对象互斥的情况下,用一个n维向量(n是预测对象的类别数)就可以表达一个对象(预测对象的那一维数值接近1,其它维数值接近0)。现在变成WordTree,如何表达一个对象呢?如果也是n维向量(这里WordTree有9418个节点(对象),即9418维向量),使预测的对象那一位为1,其它维都为0,这样的形式依然是互斥关系,这样是不合理的。合理的向量应该能够体现对象之间的蕴含关系。

比如一个样本图像,其标签是是"dog",那么显然dog节点的概率应该是1,然后,dog属于mammal,自然mammal的概率也是1,…一直沿路径向上到根节点physical object,所有经过的节点其概率都是1。参考上面图10,红色框内的节点概率都是1,其它节点概率为0。另一个样本假如标签是"Norfolk terrier",则从"Norfolk terrier"直到根节点的所有节点概率为1(图10中黄色框内的节点),其它节点概率为0。

所以,一个WordTree对应且仅对应一个对象,不过该对象节点到根节点的所有节点概率都是1,体现出对象之间的蕴含关系,而其它节点概率是0。

4)预测时如何确定一个WordTree所对应的对象

上面讲到训练时,有标签的样本对应的WordTree中,该对象节点到根节点的所有节点概率都是1,其它节点概率是0。那么用于预测时,如何根据WordTree各节点的概率值来确定其对应的对象呢?

根据训练标签的设置,其实模型学习的是各节点的条件概率。比如我们看WordTree(图10)中的一小段。假设一个样本标签是dog,那么dog=1,父节点mammal=1,同级节点cat=0,即P(dog|mammal)=1,P(cat|mammal)=0。

既然各节点预测的是条件概率,那么一个节点的绝对概率就是它到根节点路径上所有条件概率的乘积。比如P(Norfolk terrier) = P(Norfolk terrier|terrier) * P(terrier|hunting dog) * P(hunting dog|dog) P(animal|physical object) * P(physical object)。对于分类的计算,P(physical object) = 1。

不过,为了计算简便,实际中并不计算出所有节点的绝对概率。而是采用一种比较贪婪的算法。从根节点开始向下遍历,对每一个节点,在它的所有子节点中,选择概率最大的那个(一个节点下面的所有子节点是互斥的),一直向下遍历直到某个节点的子节点概率低于设定的阈值(意味着很难确定它的下一层对象到底是哪个),或达到叶子节点,那么该节点就是该WordTree对应的对象。

5)分类和检测联合训练

由于ImageNet样本比COCO多得多,所以对COCO样本会多做一些采样(oversampling),适当平衡一下样本数量,使两者样本数量比为4:1。

YOLO9000依然采用YOLO2的网络结构,不过5个先验框减少到3个先验框,以减少计算量。YOLO2的输出是13135*(4+1+20),现在YOLO9000的输出是13133*(4+1+9418)。假设输入是4164163。

由于对象分类改成WordTree的形式,相应的误差计算也需要一些调整。对一个检测样本,其分类误差只包含该标签节点以及到根节点的所有节点的误差。比如一个样本的标签是dog,那么dog往上标签都是1,但dog往下就不好设置了。因为这个dog其实必然也是某种具体的dog,假设它是一个Norfolk terrier,那么最符合实际的设置是从Norfolk terrier到根节点的标签都是1。但是因为样本没有告诉我们这是一个Norfolk terrier,只是说一个dog,那么从dog以下的标签就没法确定了。

对于分类样本,则只计算分类误差。YOLO9000总共会输出13133=507个预测框(预测对象),计算它们对样本标签的预测概率,选择概率最大的那个框负责预测该样本的对象,即计算其WrodTree的误差。

YOLO9000这部分转载自https://www.jianshu.com/p/517a1b344a88,有兴趣的同学可以查看。

四、总结

4.1 YOLO的anchor与SSD的有什么不同?

1.YOLO固定了anchor box的中心点范围;
2.匹配机制不同,YOLO根据目标中心点确定网格,再从网格中选择合适的box,貌似不存在匹配不到的情况,SSD根据IOU大小匹配,有些位置出现的某些大小的目标IOU都小于阈值,只能匹配一个IOU最大的;
3.anchor box的宽高设置上,YOLO对数据集作聚类分析,其实SSD也可以借鉴了,这种聚类分析受到数据集的影响,对新数据集可能要重做一遍才比较好,泛化性不强。

4.2 总结

总的来说,YOLO2通过一些改进明显提升了预测准确性,同时继续保持其运行速度快的优势。YOLO9000则开创性的提出联合使用分类样本和检测样本的训练方法,使对象检测能够扩展到缺乏检测样本的对象。

你可能感兴趣的:(深度学习,AI,yolo)