YOLO9000:Better, Faster, Stronger
声明:笔者翻译论文仅为学习研究,如有侵权请联系作者删除博文,谢谢!
源论文地址:https://arxiv.org/abs/1612.08242
注:文字中标粗和亮色的部分为笔者认为有创新改进余地和需要注意的地方,斜体部分为笔者的一些想法,因水平所限,部分笔触可能有不实和错误之处,敬请广大读者批评指正,让我们一起进步~
YOLO v2 和 YOLO 9000 可以看成是两部分,其中v2是对v1的各个部分进行技术上的加持和改进;9000是对数据集和检测类别进行扩展。这里我们重点说YOLO v2部分。
v2相对于v1来说,速度更快、精度更高。具体改进措施有以下几点:
1. 各卷积层后添加BN层;
2. YOLO2在采用 224×224 图像进行分类模型预训练后,再采用 448×448 的高分辨率样本对分类模型进行微调(10个epoch),使网络特征逐渐适应 448×448 的分辨率。然后再使用 448×448 的检测样本进行训练,缓解了分辨率突然切换造成的影响;
3. 引入anchor boxes(召回率上升,准确率略微下降),448×448 -> 416×416
通过使用K-means聚类方法筛选出一个网格cell里预测5个锚点框最合适;
通过给anchor boxes公式加约束的方式使anchor只负责周围的boxes,稳定模型;
4. 网络加入passtrough层(类似于ResNet),进行特征融合,提升检测小目标的能力;
5. 网络进行动态调整,每10 epoch随机输入新的图片尺寸{320,352,…,608};
6. 提出新的特征提取网络Darknet-19。
整体框架如下:
对比YOLO1的输出张量7×7×(20+5×2),YOLO2的主要变化就是会输出5个先验框,且每个先验框都会尝试预测一个对象。输出的 13×13×5×25 张量中,25维向量包含 20 个对象的分类概率 + 4个边框坐标 + 1个边框置信度。
loss函数:
好,以下进行论文的翻译和注解:
摘要
我们介绍YOLO9000,一个最先进的,实时目标检测系统,可以检测超过9000个目标类别。首先,我们提出对YOLO检测方法的各种改进方法,包括新颖的和从以前的工作中得出的。改进的模型YOLO v2在如PASCAL VOC和COCO标准检测任务是最先进的。使用一种新颖的多尺度训练方法,相同的YOLO v2模型可以运行在不同的大小的图片上,提供速度和精度之间的轻松权衡。在67 FPS时,YOLO v2在VOC 2007上获得76.8 mAP。在40 FPS时,YOLO v2获得78.6 mAP,性能优于最先进的方法,例如使用ResNet的faster RCNN和SSD,同时运行速度明显更快。最后,我们提出了一种联合训练目标检测和分类的方法。使用这种方法,我们在COCO检测数据集和ImageNet分类数据集上同时训练YOLO 9000。我们的联合训练方法允许YOLO 9000预测没有标记检测数据的目标类的检测。我们在ImageNet检测数据集上验证我们的方法。YOLO 9000在ImageNet检测验证集上获得19.7 mAP,尽管只有200个类中的44类检测数据。在COCO的156类中,YOLO 9000获得16.0 mAP。但是YOLO可以检测超过200个类;它预测超过9000个不同目标类别的检测。它仍然实时运行。
1 引言
通用目标检测应该快速,准确,并且能够识别各种各样的目标。自从引入神经网络以来,检测框架已经变得越来越快速和准确。然而,大多数检测方法仍然局限于一小组目标。
与分类和标记等其他任务的数据集相比,当前目标检测数据集是有限的。最常见的检测数据集包含数十到数十万的图像,具有几十到几百个标签。分类数据集具有数百万个具有数十或数十万类别的图像。
我们希望检测可以缩放到目标分类的级别。然而,用于检测的标记图像比用于分类或标记的标记(标签通常由用户免费提供)昂贵得多。因此,我们不太可能在不久的将来看到与分类数据集相同规模的检测数据集。
我们提出了一种新方法来利用我们已经拥有的大量分类数据,并使用它来扩大当前检测系统的范围。我们的方法使用目标分类的层次视图,允许我们将不同的数据集合在一起。
我们还提出了联合训练算法,允许我们在检测和分类数据上训练目标检测器。我们的方法利用标记的检测图像来学习精确地定位目标,同时使用分类图像来增加其词汇和鲁棒性。
使用这种方法,我们训练YOLO9000,一个实时目标检测器,可以检测超过9000不同的目标类别。首先,我们改进基本的YOLO检测系统,以产生YOLOv2,一个最先进的实时检测器。然后我们使用我们的数据集组合方法和联合训练算法来训练来自ImageNet的超过9000个类的模型以及来自COCO的检测数据。
我们的所有代码和预训练模型都可以在http://pjreddie.com/yolo9000/在线获得。
2 更好
相对于现有技术的检测系统,YOLO具有各种缺点。与fast RCNN相比,YOLO的误差分析显示YOLO产生大量的定位误差。此外,与基于候选区域的方法相比,YOLO具有相对较低的召回率。因此,我们主要集中在改进召回率和定位,同时保持分类精度。(分析完YOLO的不足(召回率低,定位不准,无法检测密集小目标),提出了改进的方向。)
计算机视觉通常趋向于更大,更深的网络。更好的性能通常取决于训练更大的网络或将多个模型组合在一起。然而,使用YOLOv2,我们需要一个更加精确的检测器使得它仍然很快。我们不是扩展我们的网络,而是简化网络,使其更容易学习。我们从过去的工作中融合了我们自己的新概念的各种想法,以提高YOLO的性能。结果总结可以在表2中找到。
Batch Normalization (批归一化)
CNN在训练过程中网络每层输入的分布一直在改变, 会使训练过程难度加大,但可以通过normalize每层的输入解决这个问题。新的YOLO网络在每一个卷积层后添加batch normalization,通过这一方法,mAP获得了2%的提升。batch normalization 也有助于规范化模型,可以在舍弃dropout优化后依然不会过拟合。
High Resolution Classifier (使用高分辨率图像微调分类模型)
目前的目标检测方法中,基本上都会使用ImageNet预训练过的模型(classifier)来提取特征,如果用的是AlexNet网络,那么输入图片会被resize到不足256×256,导致分辨率不够高,给检测带来困难。为此,新的YOLO网络把分辨率直接提升到了448×448,这也意味之原有的网络模型必须进行某种调整以适应新的分辨率输入。对于YOLOv2,作者首先对分类网络(自定义的darknet)进行了finetune,分辨率改成448×448,在ImageNet数据集上训练10轮(10 epochs),训练后的网络就可以适应高分辨率的输入了。然后,作者对检测网络部分(也就是后半部分)也进行finetune。这样通过提升输入的分辨率,mAP获得了4%的提升。
(预训练网络的输入都需要固定尺寸的图片。图像分类的训练样本很多,而标注了边框的用于训练对象检测的样本相比而言就比较少了,因为标注边框的人工成本比较高。所以对象检测模型通常都先用图像分类样本训练卷积层,提取图像特征。但这引出的另一个问题是,图像分类样本的分辨率不是很高。所以YOLO v1使用ImageNet的图像分类样本采用 224×224 作为输入,来训练CNN卷积层。然后在训练对象检测时,检测用的图像样本采用更高分辨率的 448×448 的图像作为输入。但这样切换对模型性能有一定影响。
所以YOLO2在采用 224×224 图像进行分类模型预训练后,再采用 448×448 的高分辨率样本对分类模型进行微调(10个epoch),使网络特征逐渐适应 448×448 的分辨率。然后再使用 448×448 的检测样本进行训练,缓解了分辨率突然切换造成的影响。)
Convolutional With Anchor Boxes. (采用先验框)
为了引入anchor boxes来预测bounding boxes,作者在网络中果断去掉了全连接层。剩下的具体怎么操作呢?首先,作者去掉了后面的一个池化层以确保输出的卷积特征图有更高的分辨率。然后,通过缩减网络,让图片输入分辨率为416×416,这一步的目的是为了让后面产生的卷积特征图宽高都为奇数,这样就可以产生一个center cell。作者观察到,大物体通常占据了图像的中间位置, 就可以只用中心的一个cell来预测这些物体的位置,否则就要用中间的4个cell来进行预测,这个技巧可稍稍提升效率。最后,YOLOv2使用了卷积层降采样(factor为32),使得输入卷积网络的416×416图片最终得到13×13的卷积特征图 。(416/32=13)
加入了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%,说明可以通过进一步的工作来加强准确率,的确有改进空间。
(YOLO加入锚点框,不像是Faster R-CNN,每个像素点就是9个锚点框这样铺开,还是坚持用原来的每个cell里几个建议框,所以这几个建议框要很好的进行筛选,不用像Faster R-CNN里直接全覆盖就行。)
Dimension Clusters. (聚类提取先验框尺度)
作者在使用anchor的时候遇到了两个问题,第一个是anchor boxes的宽高维度往往是精选的先验框(hand-picked priors),虽说在训练过程中网络也会学习调整boxes的宽高维度,最终得到准确的bounding boxes。但是,如果一开始就选择了更好的、更有代表性的先验boxes维度,那么网络就更容易学到准确的预测位置。
和以前的精选boxes维度不同,作者使用了K-means聚类方法类训练bounding boxes,可以自动找到更好的boxes宽高维度。传统的K-means聚类方法使用的是欧氏距离函数,也就意味着较大的boxes会比较小的boxes产生更多的error,聚类结果可能会偏离。为此,作者采用的评判标准是IOU得分(也就是boxes之间的交集除以并集),这样的话,error就和box的尺度无关了,最终的距离函数为:
d(box,centroid)=1−IOU(box,centroid)
本文通过改进的K-means对训练集中的boxes进行了聚类,判别标准是平均IOU得分,聚类结果如下图:
作者在召回率和模型复杂度之间进行平衡之后,取了k=5。意味着作者选择了5种大小的box维度来进行定位预测,这与手动精选的box维度不同。结果中扁长的框较少,而瘦高的框更多。
本文做了实验来对比两种策略的优劣,如下图,使用聚类方法,仅仅5种boxes的召回率就和Faster R-CNN的9种相当。说明K-means方法的引入使得生成的boxes更具有代表性,为后面的检测任务提供了便利。
Direct location prediction.
在YOLO模型上采用anchor boxes的第二个关键是模型不稳定性,特别是在前面几轮训练。大部分不稳定因素来源于预测boxes位置(x,y)。作者将预测偏移量改变为YOLO的预测grid cell的位置匹配性(location coordinate),将预测值限定在0-1范围内,增强稳定性。网络对feature map中的每个cell预测5个bounding boxes。对每一个bounding boxes,模型预测5个匹配性值(tx,ty,tw,th,to)。采用聚类方法选择boxes维度和直接预测bounding boxes中心位置提高YOLO将近5%准确率。大部分的不稳定现象出现在预测box的坐标(x,y)上面。在区域建议网络中,预测(x,y)以及tx,ty用到了如下公式:
这个公式的理解为:当预测tx=1,就会把box向右边移动一定距离(具体为anchor box的宽度),预测 tx=−1,就会把box向左边移动相同的距离。 这个公式没有任何限制,使得无论在什么位置进行预测,任何anchor boxes可以在图像中任意一点结束,模型随机初始化后,需要花很长一段时间才能稳定预测敏感的物体位置。.
(这里的公式是有问题的: 应该是"+"
这个是Faster R-CNN中anchor的预测方式,x,y,w,h指的是边界框中心坐标、宽、高。变量x,xa,x* 分别指预测的边界框、anchor的边界框、GT的边界框(对y,w,h也是一样)的x坐标。可以理解为从anchor边界框到附近的GT边界框的边界框回归。)
现在,神经网络在特征图(13×13)的每个cell上预测5个bounding boxes(聚类得出的值),同时每一个bounding box预测5个坐标值,分别为tx,ty,tw,th,to,其中前四个是坐标,to是置信度。
如果这个cell距离图像左上角的边距为(cx,cy)以及该cell对应box(bounding box prior)的长和宽分别为(pw,ph),那么边界框的五个预测值可以表示为:
(这几个公式参考上面Faster R-CNN和YOLOv1的公式就比较容易理解。tx,ty 经sigmod函数处理过,取值限定在了0~1,实际意义就是使anchor只负责周围的box,有利于提升效率和网络收敛。σ 函数的意义没有给,但估计是把归一化值转化为图中真实值,使用 e 的幂函数是因为前面做了 ln 计算,因此,σ(tx)是bounding box的中心相对cell左上角的横坐标,σ(ty)是纵坐标,σ(to)是bounding box的confidence score。定位预测值被归一化后,参数就更容易得到学习,模型就更稳定。)
作者使用Dimension Clusters和Direct location prediction这两项anchor boxes改进方法,mAP获得了5%的提升。
Fine-Grained Features.
改进后的YOLO对13×13 的feature map进行目标检测。更精确的特征(finer grained features)可以提高对于小目标的检测。作者向网络加入passtrough层(转移层)以增加特征。passthrough类似于ResNet,将高分辨率特征和低分辨率特征结合,使26×26×512的特征图转化为13×13×2048的特征图。该改进增加了1%的性能。
(
关于passthrough layer,具体来说就是特征重排(不涉及到参数学习),前面26×26×512的特征图使用按行和按列隔行采样的方法,就可以得到4个新的特征图,维度都是13×13×512,然后做concat操作,得到13×13×2048的特征图,将其拼接到后面的层,相当于做了一次特征融合,有利于检测小目标。)
Multi-Scale Training
原来的YOLO网络使用固定的448 * 448的图片作为输入,现在加入anchor boxes后,输入变成了416 * 416。目前的网络只用到了卷积层和池化层,那么就可以进行动态调整。作者希望YOLOv2具有不同尺寸图片的鲁棒性,因此在训练的时候也考虑了这一点。
不同于固定输入网络的图片尺寸的方法,作者在几次迭代后就会微调网络。每经过10次训练(10 epoch),就会随机选择新的图片尺寸。YOLO网络使用的降采样参数为32,那么就使用32的倍数进行尺度池化{320,352,…,608}。最终最小的尺寸为320 * 320,最大的尺寸为608 * 608。接着按照输入尺寸调整网络进行训练。
这种机制使得网络可以更好地预测不同尺寸的图片,意味着同一个网络可以进行不同分辨率的检测任务,在小尺寸图片上YOLOv2运行更快,在速度和精度上达到了平衡。
在小尺寸图片检测中,YOLOv2成绩很好,输入为228 * 228的时候,帧率达到90FPS,mAP几乎和Faster R-CNN的水准相同。使得其在低性能GPU、高帧率视频、多路视频场景中更加适用。在大尺寸图片检测中,YOLOv2达到了先进水平,VOC2007 上mAP为78.6%,仍然高于平均水准,下图是YOLOv2和其他网络的成绩对比:
Further Experiments
作者在VOC2012数据集和COCO数据集上进行了实验,结果如表4和表5所示。
3. 更快
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的卷积层(可参考darknet中cfg文件),并且在每一个上述卷积层后面跟一个1 * 1的卷积层,输出维度是检测所需的数量。对于VOC数据集,预测5种boxes大小,每个box包含5个坐标值和20个类别,所以总共是5 *(5+20)= 125个输出维度。同时也添加了转移层(passthrough layer ),从最后那个3 * 3 * 512的卷积层连到倒数第二层,使模型有了细粒度特征。作者的检测模型以0.001的初始学习率训练了160次,在60次和90次的时候,学习率减为原来的十分之一。其他的方面,weight decay为0.0005,momentum为0.9,依然使用了类似于Faster-RCNN和SSD的数据扩充(data augmentation)策略。
4. Stronger
这一部分,作者使用联合训练方法,结合wordtree等方法,使YOLOv2的检测种类扩充到了上千种。
具体借鉴:https://blog.csdn.net/weixin_35654926/article/details/72473024 相关部分
5. 结论
我们介绍YOLOv2和YOLO9000两种实时检测系统。YOLOv2是最先进的,并且比其他检测系统在各种检测数据集中更快。此外,它可以以各种图像大小运行,以提供速度和精度之间的平滑权衡。
YOLO9000是一个通过联合优化检测和分类检测9000多个目标类别的实时框架。我们使用WordTree来组合来自各种来源的数据和我们的联合优化技术同时训练ImageNet和COCO。YOLO9000是关闭检测和分类之间的数据集大小差距的强大步骤。
我们的许多技术泛化到目标检测之外。ImageNet的ImageTree表示为图像分类提供了更丰富,更详细的输出空间。使用分层分类的组合在分类和分割领域将是有用的。诸如多尺度训练的训练技术可以在各种视觉任务中提供益处。
对于未来的工作,我们希望使用类似弱监督图像分割的技术。我们还计划使用更强大的匹配策略来改进我们的检测结果,以在训练期间将弱标签分配给分类数据。计算机视觉有大量的标记数据。我们将继续寻找方法,将不同的数据源和结构的数据结合在一起,形成更强大的视觉世界模型。
参考资料:
PS:前两篇总结的相对更好一些 ~
https://zhuanlan.zhihu.com/p/47575929
https://www.cnblogs.com/zhangAlin/p/10661770.html
https://blog.csdn.net/just_sort/article/details/80822038
https://blog.csdn.net/weixin_35654926/article/details/72473024
http://www.360doc.com/content/17/0810/10/10408243_678094588.shtml
https://blog.csdn.net/jesse_mx/article/details/53925356
来源:CSDN
作者:dexterod
链接:https://blog.csdn.net/dexterod/article/details/104569694