论文名:You Only Look Once:Unified, Real-Time Object Detection
论文作者:Joseph Redmon et.al.
期刊/会议名:CVPR 2016
发表时间:2016-5
论文地址:https://arxiv.org/pdf/1506.02640
1.摘要
我们提出了一种新的目标检测方法YOLO。先前的目标检测工作重新使用分类器来执行检测。相反,我们将目标检测框架为空间分离的边界框和相关类概率的回归问题。单个神经网络在一次评估中直接从完整图像中预测边界框和类别概率。由于整个检测管道是一个单一的网络,因此可以直接对检测性能进行端到端的优化。
我们的统一架构非常快。我们的基本YOLO模型以每秒45帧的速度实时处理图像。一个更小版本的网络,快速YOLO,每秒处理惊人的155帧,同时仍然达到其他实时探测器的两倍mAP。与最先进的检测系统相比,YOLO会产生更多的定位错误,但不太可能预测背景误报。最后,YOLO学习对象的非常一般的表示。当从自然图像推广到其他领域(如艺术品)时,它优于其他检测方法,包括DPM和R-CNN。
之前的方法(RCNN系列)
1.通过region proposal产生大量的可能包含待检测物体的potential bounding box。
2.再用分类器去判断每个bounding box里是否包含有物体,以及物体所属类别的probability或者 confidence。
3.最后回归预测。
YOLO
本文将检测变为一个regression problem(回归问题),YOLO 从输入的图像,仅仅经过一个神经网络,直接得到一些bounding box以及每个bounding box所属类别的概率。因为整个的检测过程仅仅有一个网络,所以它可以直接进行end-to-end的优化。
end-to-end: 端到端指的是输入原始数据,输出的是最后结果,原来输入端不是直接的原始数据,而是在原始数据中提取的特征。通过缩减人工预处理和后续处理,尽可能使模型从原始输入到最终输出,给模型更多可以根据数据自动调节的空间,增加模型的整体契合度。在CV中具体表现是,神经网络的输入为原始图片,神经网络的输出为(可以直接控制机器的)控制指令。
2.前言
传统两阶段目标检测模型 VS YOLO单阶段目标检测模型
之前的研究:
DPM: 系统为检测对象使用分类器,并在测试图像的不同位置和尺度对其进行评估
R-CNN:SS方法提取候选框+CNN+分类+回归。
YOLO处理步骤:
(1)将输入图像的大小调整为448×448,分割得到7*7网格;
(2)通过CNN提取特征和预测;
(3)利用非极大值抑制(NMS)进行筛选
YOLO的定义:
YOLO将目标检测重新定义为单个回归问题,从图像像素直接到边界框坐标和类概率。YOLO可以在一个图像来预测:哪些对象是存在的?它们在哪里?
如 Figure 1:将图像输入单独的一个 CNN 网络,就会预测出 bounding box,以及这些 bounding box 所属类别的概率。YOLO 用一整幅图像来训练,同时可以直接优化性能检测。
性能检测对比:
YOLO的优点:
(1)YOLO的速度非常快。能够达到实时的要求。在 Titan X 的 GPU 上 能够达到 45 帧每秒。
(2)YOLO在做预测时使用的是全局图像。与FastR-CNN相比,YOLO产生的背景错误数量不到一半。
(3)YOLO 学到物体更泛化的特征表示。因此当应用于新域或意外输入时,不太可能崩溃。
3.统一检测
网格单元思想:
YOLO将目标检测问题作为回归问题。我们的系统将输入图像分成S×S网格。如果一个物体的中心落在一个网格单元中,这个网格单元负责检测这个物体。一个格子只能预测一个物体,会生成两个预测框。
对于每个grid cell:
(1)预测B个边界框,每个框都有一个置信度分数(confidence score)这些框大小尺寸等等都随便,只有一个要求,就是生成框的中心点必须在grid cell里。
(2)每个边界框包含5个元素:(x,y,w,h,c)。
● x,y: 是指bounding box的预测框的中心坐标相较于该bounding box归属的grid cell左上角的偏移量,在0-1之间。
在上图中,绿色虚线框代表grid cell,绿点表示该grid cell的左上角坐标,为(0,0);红色和蓝色框代表该grid cell包含的两个bounding box,红点和蓝点表示这两个bounding box的中心坐标。有一点很重要,bounding box的中心坐标一定在该grid cell内部,因此,红点和蓝点的坐标可以归一化在0-1之间。在上图中,红点的坐标为(0.5,0.5),即x=y=0.5,蓝点的坐标为(0.9,0.9),即x=y=0.9。
● w,h: 是指该bounding box的宽和高,但也归一化到了0-1之间,表示相较于原始图像的宽和高(即448个像素)。比如该bounding box预测的框宽是44.8个像素,高也是44.8个像素,则w=0.1,h=0.1。
红框的x=0.8,y=0.5,w=0.1,h=0.2。
(3)不管框 B 的数量是多少,只负责预测一个目标。
(4)预测 C 个条件概率类别(物体属于每一种类别的可能性)。
综上,S×S 个网格,每个网格要预测 B个bounding box (中间上图),还要预测 C 个类(中间下图)。将两图合并,网络输出就是一个 S × S × (5×B+C)。(S x S个网格,每个网格都有B个预测框,每个框又有5个参数,再加上每个网格都有C个预测类)。
Q1:为什么每个网格有固定的B个bounding box?(即B=2)
在训练的时候会在线地计算每个predictor预测的bounding box和ground truth的IOU,计算出来的IOU大的那个predictor,就会负责预测这个物体,另外一个则不预测。这么做有什么好处?我的理解是,这样做的话,实际上有两个predictor来一起进行预测,然后网络会在线选择预测得好的那个predictor(也就是IOU大)来进行预测。
Q2:每个网格预测的两个bounding box是怎么得到的?
YOLO中两个bounding box是人为选定的(2个不同 长宽比)的box,在训练开始时作为超参数输入bounding box的信息,随着训练次数增加,loss降低,bounding box越来越准确。Faster RCNN也是人为选定的(9个 不同长宽比和scale),YOLOv2是统计分析ground true box的特点得到的(5个)。
预测特征组成
最终的预测特征由边框的位置、边框的置信度得分以及类别概率组成,这三者的含义如下:
- 边框位置: 对每一个边框需要预测其中心坐标及宽、高这4个量, 两个边框共计8个预测值边界框宽度w和高度h用图像宽度和高度归一化。因此 x,y,w,h 都在0和1之间。
- 置信度得分(box confidence score) c : 框包含一个目标的可能性以及边界框的准确程度。类似于Faster RCNN 中是前景还是背景。由于有两个边框,因此会存在两个置信度预测值。
- 类别概率: 由于PASCAL VOC数据集一共有20个物体类别,因此这里预测的是边框属于哪一个类别。
注意
- 一个cell预测的两个边界框共用一个类别预测, 在训练时会选取与标签IoU更大的一个边框负责回归该真实物体框,在测试时会选取置信度更高的一个边框,另一个会被舍弃,因此7×7=49个gird cell最多只能预测49个物体。
- 因为每一个 grid cell只能有一个分类,也就是它只能预测一个物体,这也是导致YOLO对小目标物体性能比较差的原因。如果所给图片极其密集,导致 grid cell里可能有多个物体,但是YOLO模型只能预测出来一个,那这样就会忽略在本grid cell内的其它物体。
3.1. 网络设计
网络结构
YOLO网络结构借鉴了 GoogLeNet (经典神经网络论文超详细解读(三)——GoogLeNet InceptionV1学习笔记(翻译+精读+代码复现))。输入图像的尺寸为448×448,经过24个卷积层,2个全连接的层(FC),最后在reshape操作,输出的特征图大小为7×7×30。
Q:7×7×30怎么来的?
张量剖面图
(图片来源:YOLO v1详细解读_yolov1详解_迪菲赫尔曼的博客-CSDN博客)
7×7: 一共划分成7×7的网格。
30: 30包含了两个预测框的参数和Pascal VOC的类别参数:每个预测框有5个参数:x,y,w,h,confidence。另外,Pascal VOC里面还有20个类别;所以最后的30实际上是由5x2+20组成的,也就是说这一个30维的向量就是一个gird cell的信息。
7×7×30: 总共是7 × 7个gird cell一共就是7 × 7 ×(2 × 5+ 20)= 7 × 7 × 30 tensor = 1470 outputs,正好对应论文。
网络详解
(1)YOLO主要是建立一个CNN网络生成预测7×7×1024 的张量 。
(2)然后使用两个全连接层执行线性回归,以进行7×7×2 边界框预测。将具有高置信度得分(大于0.25)的结果作为最终预测。
(3)在3×3的卷积后通常会接一个通道数更低1×1的卷积,这种方式既降低了计算量,同时也提升了模型的非线性能力。
(4)除了最后一层使用了线性激活函数外,其余层的激活函数为 Leaky ReLU 。
(5)在训练中使用了 Dropout 与数据增强的方法来防止过拟合。
(6)对于最后一个卷积层,它输出一个形状为 (7, 7, 1024) 的张量。 然后张量展开。使用2个全连接层作为一种线性回归的形式,它输出1470个参数,然后reshape为 (7, 7, 30) 。
3.2.训练
预训练分类网络
在 ImageNet 1000数据集上预训练一个分类网络,这个网络使用Figure3中的前20个卷积层,然后是一个平均池化层和一个全连接层。(此时网络输入是224×224)。
Q:主干结构的输入要求必须是448x448的固定尺寸,为什么在预训练阶段可以输入224x224的图像呢?
主要原因是加入了平均池化层,这样不论输入尺寸是多少,在和最后的全连接层连接时都可以保证相同的神经元数目。
训练检测网络
经过上一步的预训练,就已经把主干网络的前20个卷积层给训练好了,前20层的参数已经学到了图片的特征。接下来的步骤本质就是迁移学习,在训练好的前20层卷积层后加上4层卷积层和2层全连接层,然后在目标检测的任务上进行迁移学习。
在整个网络(24+2)的训练过程中,除最后一层采用ReLU函数外,其他层均采用leaky ReLU激活函数。leaky ReLU相对于ReLU函数可以解决在输入为负值时的零梯度问题。YOLOv1中采用的leaky ReLU函数的表达式为:
NMS非极大值抑制
概念:NMS算法主要解决的是一个目标被多次检测的问题,意义主要在于在一个区域里交叠的很多框选一个最优的。
YOLO中具体操作
(1)对于上述的98列数据,先看某一个类别,也就是只看98列的这一行所有数据,先拿出最大值概率的那个框,剩下的每一个都与它做比较,如果两者的IoU大于某个阈值,则认为这俩框重复识别了同一个物体,就将其中低概率的重置成0。
(2)最大的那个框和其他的框比完之后,再从剩下的框找最大的,继续和其他的比,依次类推对所有类别进行操作。 注意,这里不能直接选择最大的,因为有可能图中有多个该类别的物体,所以IoU如果小于某个阈值,则会被保留。
(3)最后得到一个稀疏矩阵,因为里面有很多地方都被重置成0,拿出来不是0的地方拿出来概率和类别,就得到最后的目标检测结果了。
注意: NMS只发生在预测阶段,训练阶段是不能用NMS的,因为在训练阶段不管这个框是否用于预测物体的,他都和损失函数相关,不能随便重置成0。
损失函数
损失函数包括:
localization loss -> 坐标损失
confidence loss -> 置信度损失
classification loss -> 分类损失
损失函数详解:
(1)坐标损失
- 第一行: 负责检测物体的框中心点(x, y)定位误差。
- 第二行: 负责检测物体的框的高宽(w,h)定位误差,这个根号的作用就是为了修正对大小框一视同仁的缺点,削弱大框的误差。
Q:为啥加根号?
在上图中,大框和小框的bounding box和ground truth都是差了一点,但对于实际预测来讲,大框(大目标)差的这一点也许没啥事儿,而小框(小目标)差的这一点可能就会导致bounding box的方框和目标差了很远。而如果还是使用第一项那样直接算平方和误差,就相当于把大框和小框一视同仁了,这样显然不合理。而如果使用开根号处理,就会一定程度上改善这一问题 。
这样一来,同样是差一点,小框产生的误差会更大,即对小框惩罚的更严重。
(2)置信度损失
- 第一行: 负责检测物体的那个框的置信度误差。
- 第二行: 不负责检测物体的那个框的置信度误差。
(3)分类损失
负责检测物体的grid cell分类的误差。
特殊符号的含义:
3.3.推论
(1)预测测试图像的检测只需要一个网络评估。
(2)测试时间快。
(3)当图像中的物体较大,或者处于 grid cells 边界的物体,可能在多个 cells 中被定位出来。
(4)利用NMS去除重复检测的物体,使mAP提高,但和RCNN等相比不算大。
3.4.YOLO的局限性
(1)对于图片中一些群体性小目标检测效果比较差。因为yolov1网络到后面感受野较大,小目标的特征无法再后面7×7的grid中体现,针对这一点,yolov2已作了一定的修改,加入前层(感受野较小)的特征进行融合。
(2)原始图片只划分为7x7的网格,当两个物体靠的很近时(挨在一起且中点都落在同一个格子上的情况),效果比较差。因为yolov1的模型决定了一个grid只能预测出一个物体,所以就会丢失目标,针对这一点,yolov2引入了anchor的概念,一个grid有多少个anchor理论上就可以预测多少个目标。
(3)每个网格只对应两个bounding box,当物体的长宽比不常见(也就是训练数据集覆盖不到时),效果较差。
(4)最终每个网格只对应一个类别,容易出现漏检(物体没有被识别到)。
4.与其它目标检测算法的比较
DPM
用传统的HOG特征方法,也用的是传统的支持向量机SVM分类器,然后人工造一个模板,再用滑动窗口方法不断的暴力搜索整个待识别图,去套那个模板。这个方法比较大的问题就是在于设计模板,计算量巨大,而且是个静态的,没办法匹配很多变化的东西,鲁棒性差。
R-CNN
第一阶段:每个图片使用选择性搜索SS方法提取2000个候选框。
第二阶段:将每个候选框送入CNN网络进行分类(使用的SVM)。
YOLO对比他们俩都很强,YOLO和R-CNN也有相似的地方,比如也是提取候选框,YOLO的候选框就是上面说过的那98个 bounding boxes,也是用到了NMS非极大值抑制,也用到了CNN提取特征。
Other Fast Detectors
Fast和Faster R-CNN :这俩模型都是基于R-CNN的改版,速度和精度都提升了很多,但是也没办法做到实时监测,也就是说FPS到不了30,作者在这里并没有谈准确度的问题,实际上YOLO的准确度在这里是不占优势的,甚至于比他们低。
Deep MultiBox
训练卷积神经网络来预测感兴趣区域,而不是使用选择性搜索。多盒也可以用单个类预测替换置信预测来执行单个目标检测。YOLO和MultiBox都使用卷积网络来预测图像中的边界框,但YOLO是一个完整的检测系统。
OverFeat
OverFeat有效地执行滑动窗口检测,优化了定位,而不是检测性能。与DPM一样,定位器在进行预测时只看到本地信息。OverFeat不能推理全局环境。
MultiGrasp
YOLO在设计上与Redmon等人的抓取检测工作相似。边界盒预测的网格方法是基于多重抓取系统的回归到抓取。
5.实验
5.1.与其它实时系统的比较
Table 1 在Pascal VOC 2007 上与其它检测方法的对比
结论:实时目标检测(FPS>30),YOLO最准,Fast YOLO最快。
5.2.VOC 2007误差分析
本文使用HoeMm等人的方法和工具。对于测试时间的每个类别,查看该类别的N个预测。每个预测要么是正确的,要么是基于错误类型进行分类的:
参数含义:
Correct:正确分类,且预测框与ground truth的IOU大于0.5,既预测对了类别,预测框的位置和大小也很合适。
Localization:正确分类,但预测框与ground truth的IOU大于0.1小于0.5,即虽然预测对了类别,但预测框的位置不是那么的严丝合缝,不过也可以接受。
Similar: 预测了相近的类别,且预测框与ground truth的IOU大于0.1。即预测的类别虽不正确但相近,预测框的位置还可以接受。
Other:预测类别错误,预测框与ground truth的IOU大于0.1。即预测的类别不正确,但预测框还勉强把目标给框住了。
Background:预测框与ground truth的IOU小于0.1,即该预测框的位置为背景,没有目标。
Figure 4 显示了所有20个类中每种错误类型的平均细分情况
结论:YOLO定位错误率高于Fast R-CNN;Fast R-CNN背景预测错误率高于YOLO 。
5.3.Fast R-CNN与YOLO的结合
Table2模型组合在VOC2007上的实验结果对比
结论:因为YOLO在测试时犯了各种错误,所以它在提高快速R-CNN的性能方面非常有效。但是这种组合并不受益于YOLO的速度,由于YOLO很快,和Fast R-CNN相比,它不增加任何有意义的计算时间。
5.4.VOC 2012结果
Table 3 在VOC2012上mAP排序
结论:Fast R-CNN从与YOLO的组合中得到2.3%的改进,在公共排行榜上提升了5个百分点。
5.5.泛化性:图像中的人物检测
Figure 5 通用性(Picasso 数据集和 People-Art数据集)
结论:YOLO都具有很好的检测结果。
6.自然环境下的实时检测
结论:将YOLO连接到一个网络摄像头上,并验证它是否保持了实时性能,包括从摄像头中获取图像和显示检测结果的时间。结果证明效果很好,如上图所示,除了第二行第二个将人误判为飞机以外,别的没问题。
7.结论
到底什么是YOLO?
YOLO眼里目标检测是一个回归问题
一次性喂入图片,然后给出bbox和分类概率
简单来说,只看一次就知道图中物体的类别和位置
YOLO过程总结:
训练阶段:首先将一张图像分成 S × S个 gird cell,然后将它一股脑送入CNN,生成S × S × (B × 5 + C)个结果,最后根据结果求Loss并反向传播梯度下降。
预测、验证阶段:
首先将一张图像分成 S × S网格(gird cell),然后将它一股脑送入CNN,生成S × S × (B × 5 + C)个结果,最后用NMS选出合适的预选框。