前篇介绍了基于回归方法的深度学习目标检测方法(YOLO,SSD),本篇将介绍YOLO的升级版YOLOv2,其主要有两个大方面的改进:(1) 使用一系列的方法对YOLO进行了改进,在保持原有速度的同时提升精度得到YOLOv2;(2) 提出了一种目标分类与检测的联合训练方法,通过WordTree来混合检测数据集与识别数据集之中的数据,同时在COCO和ImageNet数据集中进行训练得到YOLO9000,实现9000多种物体的实时检测。
YOLOv2在YOLOv1的基础上,使用新的网络结构(darknet19)和技巧(Batch Normalization、High Resolution Classifier、Convolutional With Anchor Boxes等),提高了检测速度和检测精度。
作者提出了一种联合训练方法,可以同时使用检测数据集和分类数据集来训练检测模型,用分层的观点对物体分类,用检测数据集学习准确预测物体的位置,用分类数据集来增加可识别的类别量,提升鲁棒性。
我参考论文和代码进行了实验,YOLOv2相对于YOLOv1有很明显的提升,但是YOLO9000使用感受并不好。YOLO9000的主要问题在于很难调整合适的分层阈值,同时很多物体的检测精度过低。
Batch Normalization
神经网络学习过程本质就是为了学习数据分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低;另外一方面,一旦每批训练数据的分布各不相同(Batch 梯度下降),那么网络就要在每次迭代都去学习适应不同的分布,这样将会大大降低网络的训练速度。
解决办法之一是对数据都要做一个归一化预处理。YOLOv2网络通过在每一个卷积层后添加batch normalization,极大的改善了收敛速度同时减少了对其它Regularization方法的依赖(舍弃了Dropout优化后依然没有过拟合),使得mAP获得了2%的提升。
High Resolution Classifier
所有State-Of-The-Art的检测方法都在ImageNet上对分类器进行了预训练。
从AlexNet开始,多数分类器都把输入图像Resize到256*256以下,这会容易丢失一些小物体的信息。
YOLOv1先使用224*224的分辨率来训练分类网络,在训练检测网络的时候再切换到448*448的分辨率,这意味着YOLOv1的卷积层要重新适应新的分辨率同时YOLOv1的网络还要学习检测网络。
对于YOLOv2,作者首先对分类网络(自定义的darknet)进行了fine tune,分辨率改成448 * 448,在ImageNet数据集上训练10轮(10 epochs),训练后的网络就可以适应高分辨率的输入了。然后,作者对检测网络部分(也就是后半部分)也进行fine tune。这样通过提升输入的分辨率,mAP获得了4%的提升。
Convolutional With Anchor Boxes
YOLOv1使用全连接层数据进行Bounding Box预测(要把1470*1的全链接层Reshape为7*7*30的最终特征),这会丢失较多的空间信息定位不准。
YOLOv2借鉴了Faster R-CNN中的Anchor思想:简单理解为卷积特征图上进行滑窗采样,每个中心预测9种不同大小和比例的建议框。由于都是卷积不需要Reshape,很好的保留的空间信息,最终特征图的每个特征点和原图的每个Cell一一对应。而且用预测相对偏移(Offset)取代直接预测坐标简化了问题,方便网络学习。
总的来说就是移除全连接层(以获得更多空间信息)使用Anchor Boxes来预测Bounding boxes。具体做法如下:
加入了Anchor Boxes后,可以预料到的结果是召回率上升,准确率下降。
我们来计算一下,假设每个Cell预测9个建议框,那么总共会预测13* 13* 9=1521个Boxes,而之前的网络仅仅预测7* 7*2=98个Boxes。具体数据为:没有Anchor Boxes,模型Recall为81%,mAP为69.5%;加入Anchor Boxes,模型recall为88%,mAP为69.2%。这样看来,准确率只有小幅度的下降,而召回率则提升了7%,说明可以通过进一步的工作来加强准确率,的确有改进空间。
Dimension Clusters
使用Anchor时,作者发现Faster-RCNN中Anchor Boxes的个数和宽高维度往往是手动精选的先验框(Hand-Picked Priors),设想能否一开始就选择了更好的、更有代表性的先验Boxes维度,那么网络就应该更容易学到准确的预测位置。解决办法就是统计学习中的K-means聚类方法,通过对数据集中的Ground True Box做聚类,找到Ground True Box的统计规律。以聚类个数k为Anchor Boxs个数,以k个聚类中心Box的宽高维度为Anchor Box的维度。
如果按照标准K-means使用欧式距离函数,大Boxes比小Boxes产生更多Error。但是,我们真正想要的是产生好的IOU得分的Boxes(与Box的大小无关)。因此采用了如下距离度量:
随着k的增大,IOU也在增大(高召回率),但是复杂度也在增加。所以平衡复杂度和IOU之后,最终得到k值为5。上面右图:5聚类的中心与手动精选的Boxes是完全不同的,扁长的框较少瘦高的框较多。作者文中的对比实验说明了K-means方法的生成的Boxes更具有代表性,使得检测任务更好学习。
Direct Location Prediction
使用Anchor Boxes的另一个问题是模型不稳定,尤其是在早期迭代的时候。大部分的不稳定现象出现在预测Box的(x,y)坐标时。
在区域建议网络(RPN)中会预测坐标就是预测tx,ty。对应的中心点(x,y)按如下公式计算:
公式中,符号的含义解释一下:x是坐标预测值,xa 是anchor坐标(预设固定值),x∗ 是坐标真实值(标注信息),其他变量 y,w,h 以此类推,t变量是偏移量。
这个公式的理解为:当预测 tx=1,就会把box向右边移动一定距离(具体为anchor box的宽度),预测 tx=−1,就会把box向左边移动相同的距离。
这个公式没有任何限制,使得无论在什么位置进行预测,任何anchor boxes可以在图像中任意一点结束(我的理解是,tx 没有数值限定,可能会出现anchor检测很远的目标box的情况,效率比较低。正确做法应该是每一个anchor只负责检测周围正负一个单位以内的目标box)。模型随机初始化后,需要花很长一段时间才能稳定预测敏感的物体位置。
定位预测值被归一化后,参数就更容易得到学习,模型就更稳定。作者使用Dimension Clusters和Direct location prediction这两项anchor boxes改进方法,mAP获得了5%的提升。
Fine-Grained Features
修改后的网络最终在13 * 13的特征图上进行预测,虽然这足以胜任大尺度物体的检测,如果用上细粒度特征的话可能对小尺度的物体检测有帮助。
Faser R-CNN和SSD都在不同层次的特征图上产生区域建议以获得多尺度的适应性。*YOLOv2使用了一种不同的方法,简单添加一个Passthrough Layer,把浅层特征图(分辨率为26 26)连接到深层特征图。**
Passthrough Laye把高低分辨率的特征图做连结,叠加相邻特征到不同通道(而非空间位置) ,类似于Resnet中的Identity Mappings。
这个方法把26* 26*512的特征图叠加成13* 13*2048的特征图,与的深层特征图相连接,相当于做了一次特征融合,有利于检测小目标。
YOLOv2的检测器使用的就是经过扩展后的的特征图,它可以使用细粒度特征,使得模型的性能获得了1%的提升。
Multi-Scale Training
原始YOLO网络使用固定的448*448的图片作为输入,加入Anchor Boxes后输入变成416*416,由于网络只用到了卷积层和池化层,就可以进行动态调整(检测任意大小图片)。
为了让YOLOv2对不同尺寸图片的具有鲁棒性,在训练的时候也考虑了这一点。
不同于固定网络输入图片尺寸的方法,每经过10批训练(10 Batches)就会随机选择新的图片尺寸。网络使用的降采样参数为32,于是使用32的倍数{320,352,…,608},最小的尺寸为320*320,最大的尺寸为608*608。调整网络到相应维度然后继续进行训练。
这种机制使得网络可以更好地预测不同尺寸的图片,同一个网络可以进行不同分辨率的检测任务,在小尺寸图片上YOLOv2运行更快,在速度和精度上达到了平衡。
在低分辨率图片检测中,YOLOv2是检测速度快(计算消耗低),精度较高的检测器。输入为228*228的时候,帧率达到90FPS,mAP几乎和Faster R-CNN的水准相同。使得其更加适用于低性能GPU、高帧率视频和多路视频场景。
在高分辨率图片检测中,YOLOv2达到了先进水平,VOC2007 上mAP为78.6%,而且超过实时速度要求。
YOLO一向是速度和精度并重,作者为了改善检测速度,也作了一些相关工作。
大多数检测网络有赖于VGG-16作为特征提取部分,VGG-16的确是一个强大而准确的分类网络,*但是复杂度有些冗余。**224 224的图片进行一次前向传播,其卷积层就需要多达306.9亿次浮点数运算。
YOLOv2使用的是基于Googlenet的定制网络,比VGG-16更快,一次前向传播仅需85.2亿次运算。可是它的精度要略低于VGG-16,单张224 * 224取前五个预测概率的对比成绩为88%和90%(低一点点也是可以接受的)。
Darknet-19
YOLOv2使用了一个新的分类网络作为特征提取部分,参考了前人的先进经验,比如类似于VGG,作者使用了较多的3 * 3卷积核,在每一次池化操作后把通道数翻倍。借鉴了network in network的思想,网络使用了全局平均池化(global average pooling),把1 * 1的卷积核置于3 * 3的卷积核之间,用来压缩特征。也用了batch normalization(前面介绍过)稳定模型训练。
最终得出的基础模型就是Darknet-19,如下图,其包含19个卷积层、5个最大值池化层(maxpooling layers ),下图展示网络具体结构。Darknet-19运算次数为55.8亿次,imagenet图片分类top-1准确率72.9%,top-5准确率91.2%。
Training For Classification
作者使用Darknet-19在标准1000类的ImageNet上训练了160次,用的随机梯度下降法,starting learning rate 为0.1,polynomial rate decay 为4,weight decay为0.0005 ,momentum 为0.9。训练的时候仍然使用了很多常见的数据扩充方法(data augmentation),包括random crops, rotations, and hue, saturation, and exposure shifts。 (这些训练参数是基于darknet框架,和caffe不尽相同)
初始的224 * 224训练后,作者把分辨率上调到了448 * 448,然后又训练了10次,学习率调整到了0.001。高分辨率下训练的分类网络在top-1准确率76.5%,top-5准确率93.3%。
Training For Detection
为了把分类网络改成检测网络,去掉原网络最后一个卷积层,增加了三个 3 * 3 (1024 filters)的卷积层,并且在每一个卷积层后面跟一个1 * 1的卷积层,输出维度是检测所需数量。
对于VOC数据集,预测5种Boxes,每个Box包含5个坐标值和20个类别,所以总共是5 * (5+20)= 125个输出维度。也添加了Passthrough Layer,从最后3 * 3 * 512的卷积层连到倒数第二层,使模型有了细粒度特征。
学习策略是:先以10^-3的初始学习率训练了160次,在第60次和第90次的时候学习率减为原来的十分之一。Weight Decay为0.0005,Momentum为0.9,以及类似于Faster-RCNN和SSD的数据扩充(Data Augmentation)策略: Random Crops, Color Shifting, Etc。使用相同的策略在 COCO 和VOC上训练。
作者提出了一种在分类数据集和检测数据集上联合训练的机制。使用检测数据集的图片去学习检测相关的信息,例如Bounding Box 坐标预测,是否包含物体以及属于各个物体的概率。使用仅有类别标签的分类数据集图片去扩展可以检测的种类。
训练过程中把监测数据和分类数据混合在一起。当网络遇到一张属于检测数据集的图片就基于YOLOv2的全部损失函数(包含分类部分和检测部分)做反向传播。当网络遇到一张属于分类数据集的图片就仅基于分类部分的损失函数做反向传播。
这种方法有一些难点需要解决。检测数据集只有常见物体和抽象标签(不具体),例如 “狗”,“船”。分类数据集拥有广而深的标签范围(例如ImageNet就有一百多类狗的品种,包括 “Norfolk terrier”, “Yorkshire terrier”, “Bedlington terrier”等. )。必须按照某种一致的方式来整合两类标签。
大多数分类的方法采用Softmax层,考虑所有可能的种类计算最终的概率分布。但是Softmax假设类别之间互不包含,但是整合之后的数据是类别是有包含关系的,例如 “Norfolk terrier” 和 “dog”。 所以整合数据集没法使用这种方式(Softmax 模型),
作者最后采用一种不要求互不包含的多标签模型(Multi-label Model)来整合数据集。这种方法忽略了数据集的结构(例如 COCO数据集的所有类别之间是互不包含的)。
Training For Detection
ImageNet的标签参考WordNet(一种结构化概念及概念之间关系的语言数据库)。例如:
很多分类数据集采用扁平化的标签。**而整合数据集则需要结构化标签。**WordNet是一个有向图结构(而非树结构),因为语言是复杂的(例如“dog”既是“canine”又是“domestic animal”),为了简化问题,作者从ImageNet的概念中构建了一个层次树结构(Hierarchical Tree)来代替图结构方案。
创建层次树的步骤是:
一、遍历ImageNet的所有视觉名词。
二、对每一个名词,在WordNet上找到从它所在位置到根节点(Physical Object)的路径。 许多同义词集只有一条路径。所以先把这些路径加入层次树结构。
三、迭代检查剩下的名词,得到路径,逐个加入到层次树。路径选择办法是:如果一个名词有两条路径到根节点,其中一条需要添加3个边到层次树,另一条仅需添加一条边,那么就选择添加边数少的那条路径。
最终结果是一颗 WordTree(视觉名词组成的层次结构模型)。用WordTree执行分类时,预测每个节点的条件概率。如果想求得特定节点的绝对概率,只需要沿着路径做连续乘积。
为了验证这种方法作者在WordTree(用1000类别的ImageNet创建)上训练了Darknet-19模型。为了创建WordTree1k作者添加了很多中间节点,把标签由1000扩展到1369。训练过程中Ground Truth标签要顺着向根节点的路径传播:例如 如果一张图片被标记为“Norfolk terrier”它也被标记为“dog” 和“mammal”等。为了计算条件概率,模型预测了一个包含1369个元素的向量,而且基于所有“同义词集”计算Softmax,其中“同义词集”是同一概念的下位词。
使用相同的训练参数,层次式Darknet-19获得71.9%的Top-1精度和90.4%的Top-5精度。尽管添加了369个额外概念,且让网络去预测树形结构,精度只有略微降低。按照这种方式执行分类有一些好处,当遇到新的或未知物体类别,预测精确度降低的很温和(没有突然巨幅下降)。例如:如果网络看到一张狗的图片,但是不确定狗的类别,网络预测为狗的置信度依然很高,但是,狗的下位词(“xx狗”)的置信度就比较低。
这个策略野同样可用于检测。不在假设每一张图片都包含物体,取而代之使用YOLOv2的物体预测器(Objectness Predictor)得到Pr(Physical Object)的值。检测器预测一个Bounding Box和概率树(WordTree)。沿着根节点向下每次都走置信度最高的分支直到达到某个阈值,最终预测物体的类别为最后的节点类别。
Dataset Combination With WordTree
可以使用WordTree把多个数据集整合在一起。只需要把数据集中的类别映射到树结构中的同义词集合(Synsets)。使用WordTree整合ImageNet和COCO的标签如下图所示:
Joint Classification And Detection
使用WordTree整合了数据集之后就可以在数据集(分类-检测数据)上训练联合模型。我们想要训练一个检测类别很大的检测器所以使用COCO检测数据集和全部ImageNet的前9000类创造一个联合数据集。为了评估我们使用的方法,也从ImageNet Detection Challenge 中向整合数据集添加一些还没有存在于整合数据集的类别。相应的WordTree有9418个类别。由于ImageNet是一个非常大的数据集,所以通过Oversampling COCO数据集来保持平衡,使ImageNet:COCO = 4:1。
使用上面的数据集训练YOLO9000。采用基本YOLOv2的结构,Anchor Box数量由5调整为3用以限制输出大小。
当网络遇到一张检测图片就正常反向传播。其中对于分类损失只在当前及其路径以上对应的节点类别上进行反向传播。当网络遇到一张分类图片仅反向传播分类损失。在该类别对应的所有Bounding Box中找到一个置信度最高的(作为预测坐标),同样只反向传播该类及其路径以上对应节点的类别损失。反向传播Objectness损失基于如下假设:预测Box与Ground Truth Box的重叠度至少0.31IOU。采用这种联合训练,YOLO9000从COCO检测数据集中学习如何在图片中寻找物体,从ImageNet数据集中学习更广泛的物体分类。
作者在ImageNet Detection Task上评估YOLO9000。ImageNet Detection Task和COCO有44个物体类别是相同的。这意味着YOLO9000只从大多数测试数据集中看到过分类数据而非检测数据。最终整体精度为19.7 mAP,在从未见过的156个物体检测数据类别上精度为16.0 mAP。这个结果高于DPM,但是YOLO9000是在不同数据集上进行半监督训练。而且YOLO9000可以同时实时检测9000多种其它物体类别。
作者也分析了YOLO9000在ImageNet上的性能,发现可以学习新的动物表现很好,但是学习衣服和设备这类物体则不行。因为从COCO数据集上动物类别那里学习到的物体预测泛化性很好。但是COCO数据集并没有任何衣服类别的标签数据(只有”人”类别),所以YOLO9000很难对“太阳镜”,“游泳裤”这些类别建模。