论文笔记-You Only Look Once:Unified,Real-Time Object Detection

摘要:YOLO的统一架构可以达到每秒45帧的速度,更小一点的版本,Fast YOLO,可以达到155fps。相比于最先进的检测系统,YOLO的检测错误更多,但是对于图片背景预测的准确率更高。

1. 简单介绍

在YOLO出现之前,检测系统都是基于对象分类来进行对象检测。为了检测一个对象,基于分类的检测系统都是先对对象进行分类,然后在大量不同的位置和尺寸窗口上来评估和测试这个对象分类的准确性。

更近一点的方法,类似于R-CNN,使用推荐区域的方法。该方法首先在一幅图像中产生可能的边界框,然后在这些推荐边界框上运行分类器。在分类之后,还需要进行后续的处理,从而优化和减少边界框的数量。因为每一个推荐区域都需要单独训练,所以这些复杂的方法运行起来很慢,而且很难去优化。

YOLO的整体思想和架构非常简单,请看下图:
这里写图片描述
相较于传统的目标检测算法,YOLO有一些优势。首先,YOLO的速度很快。因为YOLO把检测看成一个回归问题,所以它并不需要很复杂的管线。在一个Titan X上运行,YOLO的基础网络可以达到45fps,更快的版本可以达到150fps以上。其次,在做预测时,YOLO能够全局化的看待一幅图像,而滑动窗口和基于推荐区域的方法只能局部的看一张图像。因此YOLO可以编码整张图像分类的上下文信息。再次,YOLO能够学习到图像的泛化表征。当测试集图像和训练集图像不隶属于一个分布时,YOLO同样能够有很好的表现。

YOLO在精确度上仍然落后于当前最先进的算法,尤其在检测小的物体上。还需要后面的改进。在后面的论文笔记中,我们会介绍YOLO的改进版本。

2. YOLO的检测原理

YOLO将一幅输入图像分割成S*S个网格。如果检测对象的中心落在某一个网格内,那么该网格就负责检测这个对象。
每一个网格预测出B个边界框(bounding boxes)和这些边界框的置信分数。置信分数反映了边界框包含一个对象的自信度和预测到的边界框就是想要得到的边界框的准确度。将置信分数定义为:
这里写图片描述
其中如果有ground true box(人工标记的物体)落在一个grid cell里,第一项取1,否则取0,即如果在一个单元格中没有对象,那么置信分数就是0,否则置信分数就是预测边界框和真实边界框的交并比(IOU)。

解释一下交并比(IOU):就是预测边界框和真实边界框的相交面积除以两者的相并面积。两者的相交和相并类似于集合的交集和并集。

每一个边界框包含5个预测值:x,y,w,h和置信分数。(x,y)坐标代表所预测的边界框的中心。w和h,即边界框的宽度和高度是相对于整个图像来说的(之所以说是相对于整个图像来说,主要是为了将w和h进行归一化处理,后文会提到)。置信预测表示预测框和真实框的IOU。

每一个网格也同时预测C个条件分类概率,
这里写图片描述
这个条件概率是在一个网格单元中存在我们要检测的对象的前提下,出现一个对象的概率。一个网格中预测出B个边界框,但是只预测一类对象的条件概率。

在测试时,我们将条件概率和单一边界框的置信预测相乘,
这里写图片描述
该式子求出了每一个边界框预测出的指定类别的置信分数。该分数即包含了一个对象出现在预测框内的概率,同时包含了预测框拟合对象程度的好坏。
这里写图片描述
原论文是在Pascal VOC数据集上进行评估的,S=7,B=2。Pascal VOC有20个标签类,所以C=20。最终的预测是7*7*30形状的张量。

2.1 网络设计

整个模型基于卷积神经网络。网络的初始卷积层提取图像的特征,后面的全连接层预测输出概率和坐标。
网络架构主要借鉴了GoogleNet模型。有24个卷积层,后面有两个全连接层。用1*1,后面跟3*3的卷积层代替了原模型中的Inception模块。整个网络架构如下:
这里写图片描述
原论文还训练了一个更快的YOLO网络,只使用了9个卷积层和更少的滤波器。其余的训练和测试参数都一样。

2.2 训练

网络在ImageNet数据集上进行了预训练。预训练使用了上图架构的前20个卷积层和平均池化层,最后跟一个全连接层。训练了一周时间,在ImageNet的验证集上得到了88%的top-5准确度。

在预训练模型的基础上,增加了4个卷积层和1个全连接层来构成完整的网络。最后一个全连接层预测类别概率和边框坐标。用边框的宽度w和高度h除以图像的宽度和高度,使w和h在[0, 1]之间;让边框的x和y坐标表示一个特定网格位置的补偿,以此使x和y也在[0, 1]之间,从而实现了归一化。

网络的最后一层使用线性激活,其它层使用leaky线性激活,leaky激活的公式如下:
这里写图片描述
YOLO的损失函数解读如下:
这里写图片描述

注:上图中损失函数的坐标预测部分有错误,应该是(预测坐标-真实坐标),上图写成相加了,在此更正。

损失函数的设计目标就是让坐标(x,y,w,h),confidence,classification 这三个方面达到很好的平衡。简单的全部采用了sum-squared error loss来做这件事会有以下不足:

a) 8维的localization error和20维的classification error同等重要显然是不合理的;

b) 如果一个网格中没有object(一幅图中这种网格很多),那么就会将这些网格中的box的confidence push到0,相比于较少的有object的网格,这种做法是overpowering的,这会导致网络不稳定甚至发散。

解决方案如下:

1)更重视8维的坐标预测,给这些损失前面赋予更大的loss weight, 记为 lambda_{coord} ,在pascal VOC训练中取5。(上图蓝色框)

2)对没有object的bbox的confidence loss,赋予小的loss weight,记为 lambda_{noobj} ,在pascal VOC训练中取0.5。(上图橙色框)

3)有object的bbox的confidence loss (上图红色框) 和类别的loss (上图紫色框)的loss weight正常取1。

平方和误差同时对在大边界框和小边界框中的误差采用了相同的权重。我们的误差指标应该认为,在大边界框中的微小偏差应该没有在小边界框中的微小偏差重要。因此,网络最后预测边界框宽度w和高度h的平方根。

YOLO网络会在每个网格中预测出多个边界框,由于我们针对每个对象,只希望有一个边界框能够最好的拟合对象,因此我们选择与真实边界框有最大IOU的预测框作为对象的预测器。

作者在Pascal VOC2007和2012数据集上共迭代训练了135次,batch_size为64,采用动量梯度为0.9,衰减率为0.0005。

学习率的设定如下:第一次训练迭代,学习率从0.001慢慢增加到0.01。当开始设定比较大的学习率时,模型往往由于不稳定的梯度而产生偏离。用0.01训练75次迭代,然后用0.001的学习率训练30次迭代,最后用0.0001训练最后30次迭代。

为了避免过拟合,训练使用了dropout方法和广泛的数据增强。在第一个全连接层上应用了神经节点保存率为0.5的dropout层。对于数据增强,我们引入了原始图像大小上涨20%的随机规模转换。

2.3 测试

测试时,每个网格预测的class信息( Pr(Class_i | Object) )和bounding box预测的confidence信息( Pr(Object) * IOU^{truth}_{pred} ) 相乘,就得到每个bounding box的制指定类别的置信分数。
这里写图片描述
等式左边第一项就是每个网格预测的类别信息,第二三项就是每个bounding box预测的confidence。这个乘积即encode了预测的box属于某一类的概率,也有该box准确度的信息。
这里写图片描述
这里写图片描述

对每一个网格的每一个bbox执行同样操作: 7x7x2 = 98 bbox (每个bbox既有对应的class信息又有坐标信息)
这里写图片描述
这里写图片描述
这里写图片描述
得到每个bbox的class-specific confidence score以后,设置阈值,滤掉得分低的boxes,对保留的boxes进行NMS处理,就得到最终的检测结果。
这里写图片描述

2.4 YOLO的局限

YOLO在边界框预测上引入了很强的空间约束,每个网格单元仅仅预测两个边界框和一个分类对象。这种空间约束性限制了模型可预测对象的数量。当输入图片上有很多小的对象时,模型表现的不是很好。

模型从输入数据中来学习预测边界框,因此当测试图像的尺寸具有特殊的长宽比时,模型很难有很好的泛化表现。因为,模型有多个下采样层,因此预测边界框使用的是原始输入图像相对粗糙的特征。

最后,我们用损失函数训练模型时,损失函数对小边界框和大边界框的损失采用相同的权重。在大边界框中产生的小的误差是可以接受的,但是在小边界框内产生的小的误差却会对最后的预测结果产生很大的影响。

3. 实验

3.1 YOLO与其它实时检测算法的对比

这里写图片描述

3.2 将Fast R-CNN与YOLO结合

这里写图片描述
如上表所示,当单独运行Fast R-CNN时,平均精确度为71.8%,当结合YOLO时,精确度上升3.2%,达到了75%。当Fast R-CNN与其他版本的R-CNN结合时,精确度上升很小。

3.3 YOLO在原图中的人像检测

这里写图片描述
上图对比了YOLO与不同算法的泛化能力。
这里写图片描述
上图对比了YOLO在人像检测方面的表现。

4. 结论

YOLO作为一个用于目标检测的统一模型,简单,而且可以在整个图像上进行训练。与基于分类的方法不同,YOLO是基于一个损失函数进行训练,该损失函数直接反应检测结果的好坏。YOLO的整个模型是共同训练的。

快速YOLO是最快的通用的目标检测模型,而且在实时测量上是最先进的。对于新的区域的检测,YOLO也同样具有很强的泛化能力,这使得对于模型的快速和目标检测的鲁棒性要求较高的场合也可以使用。

猜你喜欢

转载自blog.csdn.net/liven_zhu/article/details/80709528