之前写物体检测系列文章的时候说过,关于YOLO算法,会在后续的文章中介绍,然而,由于YOLO历经3个版本,其论文也有3篇,想全面的讲述清楚还是太难了,本周终于能够抽出时间写一些YOLO算法相关的东西。本篇文章,我会先带大家完整的过一遍YOLOv1的论文,理解了YOLOv1才能更好的理解它的后续版本,YOLOv2和v3会在下一篇文章中介绍。
YOLOv1
论文:《 You Only Look Once: Unified, Real-Time Object Detection 》
地址: https://arxiv.org/pdf/1506.02640.pdf
摘要:
我们提出YOLO,一种新的目标检测方法。以前的目标检测是用分类的方式来检测,而我们将目标检测定义成回归问题,从空间上分隔出边界框和相关的类别概率。这是一个简洁的神经网络,看一次全图后,就能直接从全图预测目标的边界框和类别概率。因为整个检测线是一个单一的网络,在检测效果上,可以直接做端到端的优化。我们的统一架构非常快。我们的基础YOLO模型每秒可以处理45帧图片。该网络的一个更小的版本——Fast YOLO,每秒可以处理155帧图片,其mAP依然能达到其他实时检测模型的2倍。对比最先进的检测系统,YOLO有更多的定位误差,和更少的背景误检情况(把背景预测成目标)。最终,YOLO学到检测目标的非常通用的表示。在从自然图片到其他领域,比如艺术画方面,YOLO的泛化能力胜过其他检测方法,包括DPM和R-CNN。
1.引言
人类看一眼图片就能立即知道,图片里有哪些目标,目标的位置,以及目标之间的交互关系。人类视觉系统快且精确,这让我们不用做过多显性意识层面的思考,就能执行类似驾驶这样的复杂任务。快速、精确的目标检测算法,将让计算机无需特定的传感器就能驾驶汽车;将使辅助设备能实时传递场景信息给人类,将解锁通用目的的响应式机器人系统的潜力。当前的检测系统,使用分类器来执行检测。为了检测一个目标,这些系统利用这个目标的分类器在一个测试图片上的不同位置使用不同的尺度来评估是否是该目标。比如DPM(deformable parts models)系统,就是使用滑动窗口的方式以均匀的步长跑完整个图片上的位置。更近期一些的方法,比如R-CNN使用候选区域的方式,首先生成候选边界框,然后运行分类器,根据结果删除一批边界框,对剩余的边界框进行排重处理,并根据图片场景中的其他目标来重新对剩余的边界框进行打分。这些复杂的过程又慢又难以优化,因为每个独立的组件都必须分开来训练。我们重新把目标检测问题框定成一个回归问题,直接从图片像素到边界框和类别概率。使用我们的系统,你只需看一次(you only look once ,YOLO)图片,就可以预测有什么目标以及目标的位置。YOLO很简洁:看图1:
一个卷积网络同时预测多个边界框和类别概率。YOLO在完整的图片上训练,并直接优化检测效果。与传统的检测方法相比,这个统一模型有许多优点:
- 首先,YOLO非常快。因为我们框定检测是一个回归问题,所以我们不需要复杂的过程。我们在测试图片检测的时候,就简单的跑一下我们的神经网络,来做预测。我们的基础网络在TitanXGPU上,没有批处理的情况下,可以达到每秒45帧的速度,FastYOLO更快,可以达到150帧/秒。这意味着我们可以用不到25毫秒的延迟,实时处理视频流。此外,YOLO的平均精度是其他实时系统的2倍。我们系统在网络摄像头上实时运行的例子请查看我们的项目网页: http://pjreddie.com/yolo/.
- 第二,YOLO在预测的时候,是在图片的全部范围上进行推理。不想滑动窗口和候选区域技术,YOLO在训练和测试时,看的是完整的图片,所以YOLO隐式编码了关于类别和类别外观的上下文信息。Fast R-CNN,一个顶级的检测方法,错误的把背景部分当成检测目标,因为该算法无法看到更大的上下文信息。与Fast R-CNN相比,YOLO在产生的背景错误还不到一半。
- 第三,YOLO学习目标的通用表征。当在自然图片上训练好的模型,在艺术图片上测试时,YOLO的表现远超DPM和R-CNN。由于YOLO的高泛化能力,应用到新领域或未见过的输入上,相比之下不太可能出现故障。YOLO在检测精度方面,仍然落后于最先进的检测系统。虽然识别目标的速度快,但是很难精确的定位某些目标,尤其是小目标。我们会在实验中对此进行权衡。我们所有的训练和测试代码都是开源的。各种预训练的模型同样可以下载到。
2.统一检测
我们统一了独立的目标检测组件到一个单一的神经网络中。我们的网络使用完整的图片特征来预测每个边界框。 它还可以同时预测一个图像在所有类中的所有边界框。这意味着我们的网络推理的时候会考虑整个图片,包括图片中的所有对象。YOLO的设计,使其能做端到端的训练,并在保持一个高平均精度的同时实时的做预测。我们的系统将输入图片分成S*S的网格。如果一个目标的中心落在一个格子里,这个格子就负责这个目标的检测。每个格子预测B各边界框以及每个边界框的置信度分数。这个置信度分数反应了模型有多确定该边界框里包含目标,以及该边界框就是最合适框住目标的边界框。我们正式定义置信度的公式:
第一项是格子包含目标的概率,第二项是预测的边界框和真实边界框的交并比(IOU)。如果格子里没有目标,那么置信度应该是0。每个边界框有5个预测:x,y,w,h,confidence。(x,y)坐标是边界框中心点相对于格子边界的表示。w和h是相对整个图像预测的。置信度是预测框和真实框IOU的表示。每个格子也预测了C 个条件类别概率:
这些概率的条件是格子中包含目标。我们每个格子只预测一组类别概率,不管边界框数量B是多少。在测试时,我们将条件类别概率乘以单个边界框的置信度:
这样就得到了能反映每个边界框中的类别概率的置信度分数。也就是说,这个置信度分数中既包含了边界框里是某个类别的概率,又包含了边界框本身对目标的适合程度。Figure2:
图2:我们的系统模型将检测作为回归问题。它将图片分割成S*S的网格,每个格子预测B个边界框、这些边界框各自的置信度、C个类别概率,这个预测结果编码成一个S*S*(B*5+C)的张量。(其中的5表示边界框的x,y,with,heigh,confidence这个5个参数,具体含义上面的段落已经解释过了。)
2.1 网络设计
我们以卷积神经网络的方式实现这个模型,并在PASCAL VOC检测数据集上进行评估。网络初始的卷积层从图片提取特征,全连接层输出概率和坐标。我们的网络架构受 GoogLeNet图片分类模型的影响。我们的网络有24个卷积层跟着2个全连接层。相比GoogleNet的inception模型,我们简单使用1*1的reduction层,后面跟上3*3的卷积层,类似Lin et al[22]。完整的网络可以看图3: