YOLO9000: Better, Faster, Stronger
注:本文不区分YOLO9000或者YOLOv2的描述,尽管本质上它们可能微微有所区别,但统一用YOLOv2描述本文提到的算法。
YOLOv2
标题的名字就是提出的网络能检测9000种物体,因为网络训练的时候是通过某种方式结合了检测数据集和分类数据集(没有真实边界框)进行训练的,所以有一定能力检测那些只在分类数据集出现而没有在检测数据集出现过的物体,但mAP很低,大致只有十几。一般来讲分类任务的训练样本标签比较容易标,相比之下检测任务的框就比较难标记,短期内也不见得检测样本会有大规模的增加,所以作者倾向于用一种弱监督的方式来利用未标记的数据做检测。值得注意的是,YOLOv2仍一如既往地保持实时运行的能力。
网络改进与提高
YOLOv1一个最大的问题就是容易发生定位错误,因此其与利用了region proposal的算法对比来说有更低的召回率。本文的工作就是基于第一版的YOLO,考虑更多更新的理念,其中涉及到的一些改进罗列如下面这张表:
下面对YOLOv2较于YOLOv1最大的改进进行分析,具体的改进所带来的提升看上面那个。(我猜那个hi-res应该是结合多尺度分辨率训练的意思(hierarchical-resolution?),即不断改变输入图像尺寸,**仅个人理解)
1、批规范化:YOLOv2移除了YOLOv1中的dropout层,并且在所有的卷积层后面添加Batch normalization。
2、多分辨率训练:实际训练时先用低分辨率在ImageNet上训练分类,然后分辨率增大到 448 × 448 448\times 448 448×448在ImageNet继续fine tune分类任务10个epoch,最后再把分类任务改成检测任务进行fine tune。
3、使用Anchor Boxes(宽高不同的几个预选框):移除了YOLOv1中的全连接层,学习Faster R-CNN中的region proposal network预测坐标补偿(offsets),采用了anchor boxes方法。通过预测补偿而不是直接预测坐标位置大大简化了检测问题,也使得网络的训练变得更容易。不过使用anchor boxes会使原本只需要预测的98个boxes增加到上千个。anchor boxes的出现使得mAP微微下降0.3个点,但使召回率上升7%个点,总体来说还是提升比较多。
4、增大输出尺寸:YOLOv2移除了一个池化层,使得分辨率上升一个量级,并且把YOLOv1的输入尺寸 448 × 448 448\times 448 448×448改成了 416 × 416 416\times 416 416×416,这样就保证最后一层特征映射一定有一个中心点,方便预测那些几何中心恰好和特征映射中心重合的物体。
5、anchor boxes聚类:一般anchor boxes的大小和比值设定一般是手选的,而网络能根据这些预设定的boxes尺寸去适配学习到合适的参数。但是作者认为如果可以通过优化这些预先能设定好的尺寸,就能使得网络把所有注意力集中在要学的东西。为了解决这个问题,这里采用了一个k-means聚类的方法,并且用IOU指标作为距离度量方法(传统的度量方法欧式距离会使得小物体更敏感,而IOU是和框的尺寸解耦的,与框大小没有关系)。该定义的距离 d ( b o x , c e n t r o i d ) = 1 − I O U ( b o x , c e n t r o i d ) d(box, centroid)=1-IOU(box, centroid) d(box,centroid)=1−IOU(box,centroid),从公式中可知IOU越大,这个距离也就越小,说明两个IOU重合度高的框容易被分到一个类。这里一共聚了5个类,也就是在实际训练中每个grid都会有5个预设定好的anchor boxes。下面这张表,例举了anchor boxes个数和是否使用k-means带来的提升:
6、定位预测:在预测(x, y)的时候采用sigmoid来把数值限制在(0, 1)中,因为如果不这么限定,可能原本A grid负责的一个物体会跑到B grid中,极大导致训练的不稳定性。具体的计算方式如下,其中 c x , c y c_x, c_y cx,cy是某个grid相对于输入图片左上角的位置补偿。
这个公式中具体的参数都可以从下面那种图直观看到:
7、细粒度特征:网络把较前的 26 × 26 26\times 26 26×26分辨率的特征映射层通过一个通道叠加到最后的 13 × 13 13\times 13 13×13的特征映射层。为了可以使得尺寸适配,直接通过通道concatenate,本文的做法是把大分辨率特征映射中相邻的特征像素打散到不同的通道中,使得 26 × 26 × 512 26\times 26\times 512 26×26×512变成 13 × 13 × 1024 13\times 13\times 1024 13×13×1024。(说是类似ResNet的做法?)
8、多尺度训练:YOLOv2的图像输入从原本YOLOv1的 448 × 448 448\times 448 448×448换成了 416 × 416 416\times 416 416×416,但是训练固定尺寸并不能给网络带来图片不同尺度预测的鲁棒性,因此,YOLOv2采取了一种多尺度的训练策略。具体是每当进行10个batches的运算后,随机从一个32倍数像素的集合 { 320 , 352 , . . . , 608 } \{320, 352, ..., 608\} {320,352,...,608}挑选一个尺寸进行训练,也就是最小训320像素的,最大有608像素。当然,实际预测的时候用小像素能提高运算速度,比如 288 × 288 288\times 288 288×288的能达到90 fps。高分辨率的时候,mAP能达到SOTA效果。
下表是YOLOv2用不同分辨率输入得到的输出结果,所有网络的权重都来自于同一个训练好的模型,也就是不同分辨率测试所用的权重都是一样的,而没有针对某个分辨率单独练一个权重。速度测试是基于Titan X。
优化结构提升质量与速度
一些检测网络用VGG-16来作为检测器,但作者认为其浮点计算量太大,因此YOLOv1采用了基于GoogLenet的结构,其比VGG-16的浮点计算少很多。在ImageNet分类方面,YOLOv1结果的效果仅仅比VGG-16逊色2个百分点。这次作者为YOLOv2新提出了一个Darknet-19,类似VGG,大部分用的都是 3 × 3 3\times 3 3×3的滤波器,每遇到下采样,就加倍通道数。参考NIN网络,Darknet-19采用了 1 × 1 1\times 1 1×1的核来压缩通道数量。整个Darknet-19包含有19个卷积层和5个池化层,下面是具体的结构信息。
分类时:类似YOLOv1,YOLOv2在数据增强方面采用了随机裁剪、旋转、调整色度、饱和度和曝光度(exposure shifts不知是否是这么翻译)。
检测时:把分类的最后一层移掉,然后使用1024个 3 × 3 3\times 3 3×3的核来生成特征映射,然后用 1 × 1 1\times 1 1×1的核来生成最终需要的通道数目。比如对于VOC,作者预测了5个边界框,每个有5个坐标相关信息和20个类别,因此就会需要125个 1 × 1 × 1024 1\times 1\times 1024 1×1×1024的核。
更鲁棒、功能更强
本文作者提出了一种能结合分类和检测数据的一种训练策略,使得网络对标准的检测数据集中没出现过的一些类别也有一定的泛化能力。在训练的时候,当输入的训练数据是标准的检测数据集,就会计算标准的YOLOv2损失函数,也就是所有的损失项都会用上,而当数据集是用于分类的,就只对特定的分类相关的loss进行计算。
当然这种简单操作也有一些问题,比如检测狗只标记“Dog”,对于分类任务可能比较细化,即可能会把狗标记为“Norfolk terrier”或者“Yorkshire terrier”等等(都是狗的类别),这就会导致明明都是狗类,而在检测的时候就会有些波动。具体怎么处理的作者利用了文本层级分类的信息,这里在原文中有比较详细的描述,有兴趣自行了解。
作者把最终的效果在ImageNet detection任务上进行了测试,该任务共有44种与COCO数据集一模一样的类别,也就是数据集中剩余的大部分类别是YOLOv2没有使用完整的标准检测数据集学习过的。尽管如此,对于包含有156中YOLOv2从没见过的检测数据,效果仍有16mAP。不过对于衣物等样式过多的物体类别,YOLOv2可以说基本是瞎子了,什么都预测不到。
总结
大幅优化了YOLOv1没注意到的一些结构特性。提出了Darknet-19。能巧用分类数据使得检测器能检测一些没学习过的box。作者提到未来弱监督可能是一个还不错的研究方向。