【论文阅读笔记】YOLO9000:Better,Faster,Stronger

论文链接:https://arxiv.org/abs/1612.08242
作者:Joseph Redmon, Ali Farhadi
发布时间:2016年12月25日发布



前言

  该文是YOLO系列第二篇,在模型结构上做的改变主要是添加了anchor boxes就如同Faster RCNN中的anchor boxes一样,但选择方式不同,Faster RCNN是通过直接设定尺度及长宽比的形式,而YOLOv2通过k-means对边框进行聚类);以及考虑了Fine-Grained Features问题,添加了一个passthrough,将不同resolution的特征结合在了一起;剩下的篇幅讲的是训练技巧、细节,从而得到更高的mAP这也是YOLO的问题所在,YOLO达到了实时的要求,但mAP和最先进的检测系统,如Faster RCNN/SSD,相差较大。

  该模型的输出的是一个tensor,为SS(5B+5C),其中S为图片分为SS个格子,一个格子里有B个bounding-boxes,数据集有C个类。(这里和YOLO不同的是,YOLOv2是一个边框预测一次对象的类别;而YOLO是一个网格只对一个对象负责,所以只预测一类别,其输出大小是5B+C

  YOLOv2YOLO9000是两个不同的模型,一并提出,YOLOv2 + join training = YOLO9000

  置信度是Pr(Object),而分类概率的预测是Pr(Class|Object).

  YOLOv2去掉了全连接层,使用的是全卷积网络,所以应对不同的输入分辨率(对应输出不同大小)。



概要

  YOLO9000的意思是该系统可以检测超过9000个类别。
  作者在YOLO基础上改进得到了YOLOv2YOLOv2是通过多尺度训练方法(不同size的输入)得到的,其能简单地在速度和准度上形成折中(在VOC2007上,如果需要67FPS,其能达到76.8mAP;如果需要40FPS,其能达到78.6mAP。该模型的结果比目前最好的检测模型,Faster RCNNSSD,精确度更高,检测速度更快)。

  最后,作者提出了一个目标检测和目标分类的联合训练方法。通过该方法,YOLO9000可以同时在COCO检测数据集和ImageNet分类数据集上训练。联合训练使得YOLO9000可以检测没有检测数据标签的对象类的检测。(就是说该对象在检测数据集上是没有的,即训练时是没有边框标签的,但拥有其分类标签。其原因可能在于,该模型是对于位置训练检测bounding-boxes的,不像Faster RCNN对于objectes训练检测bounding-boxes。当然,对于没有检测标签的类,其检测结果可能不太完美。YOLO9000ImageNet的检测数据上(200类中的44类在COCO数据集上有检测数据)的mAP19.7,在COCO数据集上没有检测数据的156个类的mAP16.0。)

引言

  目标检测的一般目标为:快速,精确,大范围识别目标。
  现在目标检测的数据库相对于目标分类的数据库来说是相对较小的。所以作者提出了联合训练的方法,使用分类数据集来帮助训练检测模型。



改进

Better

  YOLO相对于Fast RCNN之类的最先进的目标检测算法而言,其检测精度不足。与此同时,YOLO算法不是基于region proposal的,其对比基于区域候选的算法而言,Recall也相对较低。因此作者本文着重解决精度和召回率问题。

【论文阅读笔记】YOLO9000:Better,Faster,Stronger

  YOLOv2所做的尝试如上图所示,基本这些操作都大幅增加了算法的mAP,其中较为特殊的是anchor boxes和new network,前者在基本不改变mAP的同时增加了Recall,后者减少了35%的计算(33的卷积核之间添加11卷积核来降低特征维度

Batch Normalization
  和我们所知的一样,使用了Batch Normalization,(可以)相当于使用了(L2)正则化手段,同时可以丢弃YOLO训练时使用的dropout正则化手段(一般认为同时使用BN和dropout是冲突的,反而影响收敛效果)。作者在每个卷积层前都是用了BN,带来模型结果提升的mAP超过2%

High Resolution Classifier
  YOLO算法的预训练输入的size是224224,然后在(分类到检测)微调时增长到448448,这意味着模型需要同时适应学习不同的目标(从分类到检测)和适应新的输入分辨率。(预训练大多是在ImageNet的分类模型上完成的,YOLO是在AlexNet的基础上完成的,AlexNet的输入size是256256,大多数基于AlexNet微调的分类器模型输入都是小于此的,所以作者在YOLO模型选择时使用输入为224224

  作者在模型预训练之后,将输入转为448448,在ImageNet上训练10个周期,以期待网络模型能让它的卷积核更加适应新的输入分辨率。然后再微调网络用于检测。作者通过网络微调前训练10个周期的新输入分辨率于ImageNet,带来的模型结果提升接近4%

Convolutional With anchor boxes
  YOLO直接通过全连接层预测边框信息;而Faster RCNN通过手动设定bounding boxes,通过RPN的一个卷积层来预测anchor boxes的偏移和置信度;相对于直接预测边框坐标信息,预测偏移相对而言更简单些,也就是更容易让网络去学习。(因此YOLOv2采用了anchor boxes

  我们可以看到,YOLO的模型结构的输出最后如下第一个图,但其输出实际上是如下第二个图(是一个向量,每一个网格需要的信息在里面意义对应):

【论文阅读笔记】YOLO9000:Better,Faster,Stronger

【论文阅读笔记】YOLO9000:Better,Faster,Stronger

  作者通过去除全连接层,使用卷积层来使得结果如上图1的模型输出展示结果一样(每个网格可以在最后的output上找到对应的信息)。由于我们需要一个唯一的“中点”来表示一个网格中心,所以作者将原输入的size从448减小到了416因为YOLO的stride积为32,每一个网格的大小是(W32H32),所以输入的size需要是32的倍数。416416的输出是1313)【为什么需要用奇数网格来显示网络的“中心”?因为作者觉得,大的对象的中心较为倾向于在图片的中间,因此使用一个中心来表示对象比四个中心来表示对象要更好。实际上,这是作者的设定问题,作者的设定是一个对象只用一个网格来负责。但从后面的多尺度训练的Input_sizeYOLOv3的结构来看,其实这也不是作者一直奉承进行的。】

  使用了anchor boxes后,模型输出就是对每一个anchor boxes进行置信度预测(和ground truthIoU)& 类别预测 & 回归预测。每个网格预测两个anchor boxes。(因为YOLO有强烈的空间限制,对于每一个网格,只预测一个类别,所以对重叠的对象群,比如一群鸟,预测不太好。这里作者改进为一个边框预测一个

  从结果展示来看,YOLOv2使用了anchor boxes之后,mAP69.5掉到了69.2,但Recall从81%涨到了88%【这个mAP的下降不是基于相同数量的bounding box的。因为这里比较时,不适用anchor boxes直接预测时,作者说其预测了超过1000个边框,而不是YOLO论文中提到的98个。所以YOLOv2使用98anchor boxes比较的是1000个不使用anchor boxes的直接边框预测。检测速度不知道比较如何,可能优化时先使用了预测1000个边框,也就是每个网格预测超过20个边框,后面再参考Faster RCNN使用anchor boxes

Dimension Clusters
  在Faster RCNN中,anchor boxes是手动设计的。手动设计是设计者拥有前验知识判断的,所以作者想到使用k-means聚类算法来初始化anchor boxes一般认为,如果训练得当的话,一个好的初始化能更快得收敛,得到更好的结果,也就是更易于学习)。

  决定使用k-means后,使用怎样的距离判断就成为该聚类算法的关键。和传统基于欧式距离判断的距离不同,在目标检测中边框的“贴近”程度是依据IoU判断的,所以作者设计了一种使用于目标检测的距离函数:

d(box,centroid)=1<em>IoU</em>(box,centroid)
  最后基于计算复杂度和准确度的考虑,选择k=5。(适用平均IoU来评估聚类结果的好坏)

Direct location prediction
  从anchor boxes到最后的bounding boxes,其边框预测的方式和Faster RCNN差不多,只是将最后中心点(x,y)偏移的幅度限制了,避免出现一个边框范围的偏移(其实如果出现这么大的偏移,那么为该对象负责的格子一般也就是另一个,也就是说这个范围的偏移其实是不必要的“振荡”。因此,这个限制,作者认为是让模型从“不稳定”到稳定了)。对于每一个bounding boxes,模型预测5个值(txtytwthto),其中to是置信度。作者通过k-means聚类边框,和直接预测bounding boxes中心位置,带来的模型结果提升接近5%

Fine-Grained Features
  作者想着,Faster RCNNSSD都通过不同size的输入来得到不同精度的feature mAPs,而YOLO是采用resize处理不同输入,从而大对象和小对象都对应同一个精度,没得到区别对待。所以,作者想到了添加一个passthrough layer就像ResNet一样,但区别在于YOLO是将2626512添加到13132048上,而ResNet是处理相同size的连接),使得feature mAPs同时拥有不同精度的特征,其目的是为了更好地检测小目标。
  至于如何具体实现passthrough layer,作者是通过将2626512隔行隔列采样,得到4个新的feature mAPs1313512,再concat起来,得到13132048的feature mAPs,再与后面的层加起来,相当于作特征融合。细粒度特征融合,带来的模型结果提升接近5%

Multi-Scale Training
  由于YOLOv2的模型没有全连接层,所以其可以采用任意size的输入(相应得到不同的输出,但卷积核用的是相同的)。
  作者在训练时,想通过该特点来使得网络能处理不同分辨率的输入图片,所以作者在训练时每隔10epochs,就随机选取一个resize的输入:32{320352...608}模型的下采样参数为32)。通过该方法,模型处理不同size的输入可以得到不同FPS的结果与其对应的分辨率。(让小图片可以训练的更快,也不用失真的放大太多,从而影响检测结果)

【论文阅读笔记】YOLO9000:Better,Faster,Stronger

Faster

Darknet-19
  YOLOv2的网络和YOLO差不多(因为YOLO网络的Top-5分类准确率比VGG要稍微低一点,而VGG是当时大多数目标检测所用的网络),都在33卷积核的中间穿插使用11卷积核,从而大量减少计算量。YOLOv2网络模型的名字叫做Darknet-19,其拥有19个卷积层和5个最大池化层。

【论文阅读笔记】YOLO9000:Better,Faster,Stronger

Training for classification
  和YOLO一样,在标准的1000分类的ImageNet数据集上训练160个周期,其使用的工具为:lr=0.1,多项式衰减(pow=4)(学习衰减率的一种方式,有指数衰减,步长衰减,多项式衰减等),0.9的动量,权重衰减率为0.0005。在训练的同时使用数据增强手段,包括random crops,rotations,hue,saturation,exposure shifts。
  前面说了,这个论文提出,模型不应该微调的时候同时适应新的分辨率和新的目标任务(分类和检测),所以在原预训练之后,会增加10个周期的新输入分辨率。其训练使用的工具有:lr=0.001

Training for detection
  YOLOv2检测模型就不是Darknet-19最后一层是(11output_channel=1000)卷积核的池化层,此时输出为771000;后面再接一个平均池化层,此时输出为111000)了,训练检测时,将最后一个卷积层用三个33output_channel=1024的卷积核替代,每个33的卷积层中穿插着一个11,输出通道为检测目标通道(在VOC数据集中,每个格子预测5个bounding boxes,那么其输出channel为55+520=125)。

  训练工具:一共训练160个周期,模型初始学习率为0.001,学习率在第6090个周期都除以了10

  作者在训练检测时,也使用了passthrough layers。但是这里没理解怎么弄的,所以po出原文,等领悟了再看看吧。。。。We also add a passthrough layer from the final 33512 layer to the second to last convolutional layer so that our model can use fine grain features.吴恩达老师的网络课程《deeplearning.ai》中的目标检测模型讲的就是YOLO,依据其中运用了anchor boxes来看,老师是看了YOLO9000这论文的。但老师说他和他研究这方向的朋友也没完全看懂。。。所以这里就放着吧

Stronger
  识别的mAP其实不是很高,19.7%16.0%,所以就展示不弄了。