YOLO论文笔记

    论文:Joseph Redmon, Santosh Divvala, Ross Girshick, Ali Farhadi.You Only Look Once: Unified, Real-Time Object Detection.8 Jun 2015


素质三连

1.论文贡献

提出YOLO目标检测模型,是一个single-stage目标检测模型,直接从图像回归bbox。

YOLO运行速度快,可是实现实时检测,精度高,能学到全局信息,泛化能力强。

将Fast RCNN和YOLO结合,可以大幅提高Fast RCNN的检测精度。

2.实验结果   

YOLO的检测速度达到45fps,Fast YOLO的检测速度达到155fps。

Fast R-CNN + YOLO在VOC 2012 test上的mAP超越Faster RCNN,达到70.7。

3.存在的问题

每个网格只能预测一个类,难以检测成群的小目标。


模型概要

    使用不同尺度滑动窗口的方案进行目标检测,比如DPM,逐个窗口提取特征。也可以像 OverFeat一样,利用卷积计算的特点减少滑动窗口的计算量。目前SOTA方法是 RCNN系,首先生成region proposal和特征提取,再进行边框回归和proposal的分类。基于region proposal方法相比与基于滑动窗口的方法,其proposal数量更少,精度高。

    而这里把目标检测看作直接从图像像素到包围框和类别概率的单一回归问题,提出YOLO算法。YOLO:you only look once,即模型只需要看一遍图片就能实现目标检测,其架构十分简单,如下图:

1.jpg

    流程是:1.将图片缩放某一大小,2.在缩放后的图片上运行卷积神经网络提取用于回归和识别的特征,3.对预测结果执行NMS。相比于之前的目标检测算法,YOLO的优点如下:

1.检测速度很快。其Pipeline很简单,YOLO的基础版本可以达到45fps,快速版本可以达到150fps。

2.可以学到图片的全局信息。不像基于滑动窗口或区域推荐的算法,YOLO会看整个图片(在卷积过程中)因此可以隐性的编码到关于类和外观的上下文信息[原文:it implicitly encodes contextual information about classes as well as their appearance]

3.可以学到更加泛化的表示。


YOLO原理

    YOLO将输入图片划分为SxS个网格,目标物体中心所在的网格负责预测该物体的bbox(包围框)和class。每个网格预测B个bbox以及每个bbox对应的置信度。bbox置信度定义为Pr(Object)*IOU_truth_pred,包含模型对该bbox里有目标的置信度和模型对包围框精度的置信度。当目标不存在于该网格时,Pr(Object)=0,此时Pr(Object) * IOU_truth_pred = 0。而当目标存在时,Pr(Object)=1,此时置信度=IOU_truth_pred。

    因此每个bbox由5个实数组成:x,y,w,h,fi。(x,y)是包围框的中心坐标,注意坐标原点是该网格的左上角,坐标数值相对于单元格的宽高,比如预测的像素坐标是(X,Y),单元格的宽高是W,H,那么(x,y)=(X/W,Y/H)。w,h是包围框的宽和高,其数值是相对于整张图片的宽高的。fi是该bbox的置信度。所有的输出的范围都是0-1。

    一共有C类目标,每个单元格要预测该单元格存在的目标属于哪一类,预测的条件概率为:Pr ( class_i | Objcet ),只有该单元格包含目标的时下才有预测目标类别的必要。每个单元格预测B个包围框,但每个网格只预测一个分类。

    在测试时,将类别概率与包围框置信度乘起来, 这就是该包围框对某个类别的置信度,即该类目标出现在该包围框的置信度以及包围框的精度。如下:

2.jpg

    在本文中,YOLO在VOC上测试,所以类别数C=20,使用S=7,B=2,最终预测的是7x7x30(30=5x2+20)的张量。下图是一个示例:

3.jpg

    网格最终只预测一个包围框。然而,一些大的目标或靠近多个包围框边界的目标可以被多个包围框包围,因此使用NMS解决这个问题。


网络设计

    YOLO使用CNNs抽取图片特征,使用FC预测包围框及其概率。网络架构参照GoogLeNet,有24层卷积层,2层全连接层,但是使用1x1卷积+3x3卷积代替GoogLeNet中的inception模块,如下图所示:

4.jpg

    作者还训练了YOLO的快速版本Fast YOLO,使用更少卷积层(只有9层)以及更少的卷积核,因此运行速度更快。


训练

    YOLO使用的是Darknet框架实现。先在ImageNet上预训练模型,该模型是使用如Figure 3所示的前20层卷积层,后接一层平均池化层和一层FC层构成。然后作者训练这个模型花了一周,得到的模型在ImageNet 2012验证集上的top-5准确率为88%(单模型)。

    将得到的分类模型转换为检测模型。[Object detection networks on convolutional feature maps]这篇论文展示了在预训练模型后面增加卷积层和全连接层可以提高迁移的性能,这里参照他们的做法。目标检测最好有细粒度(fine-grained)的视觉信息,因此把模型的输入分辨率从224x224增加到448x448。

    激活函数的使用,最后一层使用线性激活函数,其它层使用Leaky ReLU:

5.jpg

    损失函数使用平方和误差,因为它很容易优化,单平方误差跟想要的目标:最大化mAP不完美对应,它把定位误差和分类误差看作同等重要,这应该不是最理想的方案。

    事实上,大部分网格并不包含目标,这使得该网格预测边框的置信度趋于0,如此包含目标的网格的梯度就会被大多数不包含目标的网格的0梯度所淹没[This pushes the “confidence” scores of those cells towards zero, often overpowering the gradient from cells that do contain objects.],即梯度变得很小。这会导致模型变得不稳定,引起过早diverge。为了修正这点,对不包含目标的包围框,增加包围框预测的损失,减小了置信度损失,通过设置两个参数lambda_coord和lambda_noobj实现。这里设置lambda_coord=5,lambda_noobj=0.5。

    平方和误差还将大包围框和小包围框的误差看作同等重要,但是同样的误差,对小的包围框要比大的包围框的影响程度是更大的。通过使用包围框宽高的平方根,部分的解决这个问题。

    YOLO对每个网格预测多个包围框,但是只有与ground-truth的IOU最高的包围框负责预测该网格中的物体。这会This leads to specialization between the bounding box predictors. Each predictor gets better at predicting certain sizes, aspect ratios, or classes of object, improving overall recall。

    总损失函数包含四个部分:位置误差、不包含目标的置信度误差、包含目标的置信度误差、分类误差。如下:

6.jpg

    1_obj_i表示网格i是否存在目标,1_obj_ij表示网格i的第j个预测的包围框(此包围框与ground-truth有最高的IOU)的置信度。只有网格i存在目标时,1_obj_i=1,只有该网格存在物体而且包围框j与与ground-truth有最高的IOU时,1_obj_ij=1。其它包围框和网格不参与计算。

    训练配置:在VOC 2007/2012上训练了135epoch,在VOC 2012上测试,batch_size=64,sgd优化器动量系数=0.9,惩罚系数=0.0005。第一个epoch的学习率缓慢的从10^-3升到10^-2,接着使用10^-2训练70个epochs,再使用10^-3训练30个epoch,最后使用10^-4训练30epoch。在第一个FC层后使用dropout=0.5。数据增强:20%的随机缩放和平移,在HSV颜色空间随机曝光1.5倍。


YOLO的限制

    1.YOLO的每个单元格只能预测两个包围框和只有一个类,这限制了YOLO预测多个相邻目标的能力,比如一组小目标:一群鸟,YOLO就挑战失败。

    2.YOLO直接从数据中回归包围框,所以它很难泛化到新的宽高比或配置中。而且YOLO使用的特征相对粗糙。

    3.在损失函数中,大包围框和小包围框的误差的权重相等,但事实上相同误差小包围框更加敏感。



检测模型的比较

    目标检测的第一步通常是特征抽取(Haar,SIFT,HOG,CNNs),接着在特征空间进行包围框回归和分类。回归器和分类器运行在滑动窗口或区域子集(如RCNN系列)。下面是YOLO和各个模型的比较。

    Deformable parts models,论文[Object detection with discriminatively trained part based models]。DPM使用滑动窗口方案,使用不相交的pipeline提取静态特征,分类区域,预测高分区域的包围框等。而YOLO将一个CNNs代替各个分离的部分,比DPM更快、更精确。

    R-CNN。R-CNN先使用SS生成候选区域,再使用CNNs提取特征,然后使用FC回归边框和使用SVM分类区域,最后使用NMS。特点是多个阶段都需要独立训练和优化,而且很慢。而YOLO就是单个网络,速度很快。

    Fast R-CNNFaster R-CNN,改进了R-CNN的速度和精度,但是速度仍然比不上YOLO。

    Deep MultiBox,论文[Scalable object detection using deep neural networks],使用CNN预测RoI,通过替换置信度为分类概率,MultiBox也可以实现单目标检测,但是MultiBox并不能实现一般的目标检测任务,它只是目标检测系统的一部分。YOLO和MultiBox都使用CNNs预测包围框,但是YOLO是一个完整的目标检测系统。

    OverFeat。通过卷积神经网络高效的提取滑动窗口的特征,它用于定位更好而不是检测。OverFeat仅仅看到局部信息,而且用于检测需要做大量的后处理。

    MultiGrasp。[Real-time grasp detection using convolutional neural networks] 这个跟YOLO有点像,但是MultiGrasp仅仅需要预测单一可抓取的区域,不评估目标的大小、位置和边界。而YOLO显然全面的多。



实验

各个目标检测系统比较

7.jpg

    从上图可以看到,在各检测系统中,YOLO兼具性能和速度。


误差分析

    在VOC 2007上进行误差分析,比较YOLO和Fast R-CNN。在测试时,对目标类看top N的预测,预测的类型如下:

Correct: correct class and IOU > 0.5

Localization: correct class, 0.1 < IOU < 0.5

Similar:class is similar,IOU > 0.1

Other: class is wrong, IOU > 0.1

Background: IOU < 0.1 for any object

    下图显示两个模型的对比结果:

8.jpg

    结果显示YOLO的定位错误率很高,达到19%。而Fast R-CNN定位错误率低,但是其容易误判背景,错误率达到13.6%,这比YOLO要高得多。


联合Fast R-CNN与YOLO

    从上面Figure 4可以看到,YOLO不容易误判背景,则使用YOLO去评估背景检测将提高Fast R-CNN的性能。对于R-CNN预测的每个边界框,我们检查YOLO是否预测了类似的框。如果是的话,我们会根据YOLO预测的概率和两个框之间的重叠来提高预测。下面是对比的结果:

9.jpg

    第一行是主模型,第2-5是用来联合的模型。可以看到,Fast R-CNN和Fast R-CNN联合带来的收益并不大,而Fast R-CNN+YOLO带来的提升是巨大的,提高了3.2%。这是因为YOLO和Fast R-CNN能优势互补的缘故。


在VOC 2012上的实验结果

    下面是各个模型在VOC 2012上的结果:

10.jpg

    从上面可以看到,YOLO的mAP仅仅是R-CNN VGG的水平。具体到分类,对比R-CNN,YOLO对小目标,比如bottle, sheep tv/monitor结果更差。而Fast R-CNN+YOLO就是最好的模型之一。


概括性

    为了测试目标检测系统学习到的概括性,在Picasso Dataset和People-Art Dataset两个数据集进行人体目标检测。结果如下:

11.jpg

12.jpg

    结果显示YOLO的概括性远好于其它模型。




下一篇:

首页 所有文章 机器人 计算机视觉 自然语言处理 机器学习 编程随笔 关于