YOLO V1 论文精讲
Posted 嗯~啥也不会
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了YOLO V1 论文精讲相关的知识,希望对你有一定的参考价值。
传统的目标检测两阶段方法,比如R-CNN,Fast-RCNN都是先提取候选框,再对每一个候选框逐一进行甄别(甄别包含分类和回归),所以它是分为两步,称为两阶段方法。但是YOLO不一样,它是直接把图像喂到一个神经网络里面,直接输出目标检测结果,类别,坐标全都在输出结果里面,只需要看一次就可以获得。它是单阶段目标检测模型。
作者简介: Joseph Redmon ,代表论文 YOLO V1,V2,V3,Darknet 框架,Xnor-net ,CVPR2016大会报告,两次TED演讲
Ross Grishick,被称为 RBG 大神,DPM , R-CNN , Fast R-CNN , Faster R-CNN , FPN , Mask R-CNN , RetinaNet YOLO
一、摘要:
我们提出了YOLO ,一个新的目标检测方法,先前的目标检测方法都是重复使用分类器,不管是用滑动窗口也好,或者是用先提取候选框,再对每一个候选框运用分类器也好,都是重复使用了分类器。与此相反 ,我们重新定义了目标检测,我们把它转换成了回归问题,原来的目标检测都是分类问题,就是一个框里是什么东西,而我们现在转成了回归问题,变成了预测出一系列连续的数值,那就把边界框的定位和分类从空间中分离开,关键就是把它变为一个回归问题。使用一个单独的神经网络,既可以预测,预测框的坐标,又可以预测类别,直接把全图输入,神经网络就一次性的做一次前向推断,就能够输出bbox(边界框,下文统一简称为bbox)的坐标和类别。因为我们把它整合到了一个神经网络里面,所以它可以进行端到端的优化。端到端其实是神经网络,特别是深度学习,最好的特点,不需要依赖上下游的流水线,也不需要依赖各种各样产业链的配合。
我们统一的架构是特别快的。因为不需要上下游的配合,不需要提取候选框,也不需要逐一的滑动窗口,逐一的对候选框进行甄别,所以直接就把结果输出出来。我们基础的YOLO 模型可以实现每秒 45 帧,实时的目标检测性能。一般我们认为超过每秒30帧就是目标检测了。一个令人震惊的,更小的版本,可以实现每秒 155 帧,又快,而且比其他的目标检测性能要好。mAP 比其他的实时目标检测性能高两倍。相比于2016年发表这篇论文时的比较好的目标检测系统,YOLO 会出现更多的定位误差,但是有一种误差比较小的,就是把背景误判为物体。究其原因就是把全图喂进去,而不是只提取某一个patch的候选框,所以它能够隐式的学习全图的信息,所以把背景误判为物体这种错误比较小。最后,YOLO是一种通用目标检测模型,它可以识别猫、狗,可以识别水果、交通工具、盆栽、行人等,它是通用的,而不是像某些领域,如文字检测、行人检测等聚焦于某一个特定领域。YOLO是普适的,通用检测目标模型,它超过了当年的其他方法,比如DPM和R-CNN,同时YOLO 的泛化迁移能力也非常强,它可以在自然图像数据上学习,再迁移到另外一个图像域,比如说艺术作品。
一、介绍
人类看一眼图片就立刻知道图片里有什么,东西在哪儿,东西之间是如何交互的。人类的视觉系统又快又准确,使我们能够用非常少的注意力,就可以实现非常复杂的任务,比如说开车、驾驶。但是又快又准确的目标检测模型就没那么简单了,要让计算机去开车,如果没有特定的传感器,没有特别的辅助设施的话,是非常困难的,但同时它又是非常重要的应用。把目标检测模型理解清楚就会有一系列潜在模型得到解锁,比如实时响应的机器人系统等。
当前的目标检测系统都是重复使用分类器。重复使用分类器包含好几种含义,包含在一个图片上的不同位置和不同尺度去重复应用。比如说滑动窗口分类器,就像 DPM 算法。DPM算法的滑动窗口,就是一个分类器平均的在图像上滑动,再把每一次滑动的结果汇总,综合出最后的目标检测结果。这种方式非常耗时、繁琐。
另外一个最近的方法是R-CNN,R-CNN先使用region proposal方法,比如说R-CNN先用selective search 选择性搜索方法,从图像中先提取出两三千个候选框,再逐一用卷积神经网络对两三千个候选框中的每一个候选框逐一进行分类和回归。
首先用Region Proposal 或Selective search筛选出潜在的候选框,然后再逐一的运行分类器,两个阶段。筛选之后再进行后处理,比如说用非极大值抑制来消除重复的预测框,微调每一个预测框。根据图像上其他的物体重新给每一个预测框打分,工作非常繁琐。依赖于一个庞大的产业链,上下游的供应链。任何一个步骤出问题,整个任务就都不能工作,每一个工序都需要单独的训练,所以复杂的工作流非常慢,难以优化,因为每一个工作,每一个步骤都需要分别单独的训练。它不是端到端的。
我们重新把目标检测任务,定义为一个简单的单一回归问题,直接从输入图像的像素空间映射到输出检测结果。输入图像运行神经网络,直接获得每一个预测框的坐标和类别,使用我们的系统,YOLO既可以实现每一个物体的分类,也可以实现每一个预测框的定位。这其实就是目标检测的定义。
YOLO是一个非常简单而且非常全新的结构,如图1。(图1展示了YOLO的检测系统,它展示的是预测阶段。这篇论文的一个重点是区分预测阶段和训练阶段。图1展示的是预测阶段,即已经训练好了模型,把整张图缩放成一个正方形的图片,然后喂到神经网络里面,而神经网络能够输出每一个预测框的坐标和类别。网络输出到最后的结果还有一些后处理,比如Confidence过滤,把低置信度的框滤掉,非极大值一直NMS可以把重复的过滤框只变成一个,避免重复的预测。多个框套一个物体,这种情况通过NMS来避免。)只有一个卷积神经网络,同时能输出多个预测框和类别,它是在整个图像上去训练的,直接端到端进行优化。统一的模型优许多好处。
首先YOLO非常快,因为我们把目标检测问题重新定义为了回归问题,所以它不需要复杂的工作流,它是可以端到端的用一个模型去解决。在预测阶段只需要把一个新图片放入神经网络里面就可以预测结果。基础网络可以实现每秒45帧的预测,它是一帧一帧放进去的,不需要进行批的处理,即不需要有batch,它是在Titan X GPU即显卡上跑的,是2016年英伟达的显卡,更快的YOLO版本可以实现150fps。这就意味着我们可以实时处理视频流数据,每一帧只需要25毫秒,一秒是1000毫秒,1000除以25,大概就是四十多帧,每秒四十多帧的速度,可以实现实时的目标检测。更进一步,YOLO相比于其他实时目标检测系统的mAP(mean average precision)即准确度性能,是它们的两倍,又快又准。可以把它接在摄像头上实时运行目标检测的效果。
第二个好处是输入了整张图片,它是能够分析全图的信息,而不是像两阶段或者划窗,划窗的话,每一个滑动窗口只能看到一小部分信息,而两阶段方法,只能看到候选框的信息,不能看到候选框周围和全图的信息,所以它们没有全局的学习能力,没有提取全局的图像特征,而YOLO 能够分析globally about the image,即能分析全图信息。不像滑动窗口和提取候选框的方法,它是能够捕获整张图片,隐式的编码图像的上下文信息(不同物体之间的关系,比如人骑自行车,人肯定在自行车上面,这个关系就可以被YOLO学到,而很难被滑窗和Region Proposal学到;物体和它的背景,一个飞机肯定是在蓝天上,飞机和蓝天的关系,前景和背景的关系就可以被YOLO隐式的学习到,而这个很难被滑窗和Region Proposal学习到)。它能带来很大的好处,后文也可以看到,YOLO把背景误识为物体的错误是大大降低的,得益于它能够全图的捕获信息。Fast R-CNN在2016年是一个非常不错的两阶段方法,它就回犯把背景误判为物体的错误,因为它无法看到更大的上下文,而YOLO这种错误只是它的一半,比一半还小。
第三个好处是它的泛化能力,特征表示,迁移能力比较强。把在自然图像上训练的YOLO模型,用艺术作品去预测,它是要比其他的目标检测方法,如DPM,R-CNN要高的多。因为YOLO高度可迁移、可泛化,所以它在用于新领域和与训练集不一致的输入图像域的时候,它的性能丧失是比较小的,重新迁移和微调,性能是比较强的。(YOLO是一个通用目标检测框架,它的迁移泛化能力非常好,可以用在自然图像上,比如MS COCO数据集或者VOC数据集上训练的模型,把它的预训练权重保留,再用自己的新领域,医疗也好,铁路也好,农业也好,用新数据集去训练,迁移泛化能力是非常好的)
YOLO得缺点:相比于当年最强的模型们,准确率较低。虽然非常快,但是在定位能力和小目标的识别能力上是比较差的。(因为每一个grid cell 只能预测出一个物体,到YOLO V5其小目标能力已经上来了)速度和准确率是不可兼得的。
所有的训练和测试代码都是开源的,而且一系列的预训练模型都是可以下载的。
二、统一的目标检测框架
我们把目标检测的几个组件整合在了一起,整合成了一个同一个单独的神经网络。这个神经网络能够捕获全图的信息来预测每一个预测框的坐标和分类。它可以同时输出所有的预测框和它们的类别,这就意味着我们的网络具备挖掘全图信息的能力(一步到位的识别出图片上的所有物体)。YOLO模型结构使得端到端的训练和实时的预测称为可能,同时保证了很高的准确率(即AP-PR曲线围成的面积,average precision),AP就是准确率。(mAP是各个类别AP的平均值,比如说VOC里面20个类别,就是20个AP的平均值,AP其实是PR曲线围成的面积,就是取不同的阈值,可以画出precision和Recall 的曲线,也可以取不同阈值下的precision,来取个均值,其实都差不多,结果相差不大)(根据IOU阈值和Confidence阈值,可以把每一个预测框都划为混淆矩阵中的某一个象限,既然是混淆矩阵,那么就可以用分类的评估指标)
YOLO把整个图片分成SXS个网格,在这篇论文中,S是7,即7X7个grid cell。如果在训练阶段,训练阶段有很多标注框,我们人要用标注软件去标注,比如说用label mean或label image去标注,如果人工标注的标注框的中心点落在了哪一个grid cell里面,在训练阶段就应该由那个grid cell来负责预测出这个物体。就是说这个grid cell产生的bbox就负责拟合人工标注的框。
一个grid cell负责预测出B个bbox,在这篇论文中 B=2,7 X 7=49个网格,每一个网格预测出2个bbox。哪一个bbox与人工标注的框IOU最大,就由哪一个bbox负责预测这个物体。(人工有一个标注框,这个标注框的中心点落在哪一个grid cell里面,就有这个grid cell预测出的bbox,去负责拟合人工标注的框,每一个grid cell能预测出B个bbox,那么有它两个的哪一个负责拟合呢?由它俩与标注框IOU最大的那个bbox去负责拟合标注框,另外一个就没有用了,训练阶段是一个监督学习,使损失函数最小化的过程,需要把预测结果和人工标注做比对,来尽可能使两者的差距越来越小,使损失函数越来越小)
每一个grid cell负责预测出B个bbox,每一个bbox都会产生一个confidence scores,我们称之为置信度。这个置信度就反映了bbox里面包含物体以及它离标注框有多近,即预测框有多准确。可以用数学公式表示出来,confidence就相当于是这个bbox包含物体的概率乘以bbox与人工标注框的交并比,即。如果 grid cell 里面没有人工标注框,没有任何人工标注框的中心点落在这个 grid cell 里面,那么这个 grid cell 产生的所有的B个bbox的置信度都应该为 0 才对。尽可能为0,才能跟实际情况吻合,我们的目标应该使得没有对应物体的grid cell预测出的bbox的confidence scores尽可能地越小越好,最好为0。如果这个 grid cell 负责预测某个物体,就是人工标注框中心点落在了某一个 grid cell 里面,那么它产生的bbox,它的confidence scores应该为它和人工标注框的IOU,因为此时=1,肯定包含物体,那么只剩下右边一项 。
---包含物体的概率,非0即1,而 是按照实际情况计算的。是预测框和人工标注框的交并比。两者相乘,就是训练阶段的confidence 的来历。两者相乘作为标签值,就是ground truth,我们希望预测出的confidence scores和标签值越接近越好,对于负责预测物体的box,这个标签值其实就是。(这一段就是说在训练阶段,confidence的标签值怎么计算,有了标签,我们才能够让预测框预测出的confidence scores尽可能接近于标签值,才能够学习,才能够训练)
在预测阶段,训练好模型后,回归出多少,就是多少,对于confidence scores,神经网络输出多少就是多少,不需要计算,而是隐式的包含两者。不用单独计算,其实这个公式说的是训练阶段,而不是预测阶段。
每一个bbox都包含5个参数,中心点的横坐标,中心点的纵坐标,框的宽度,框的高度,和confidence。是bbox中心点相对于所在grid cell 左上角格点的坐标。每一个 grid cell产生B个bbox,bbox的中心点都应该落在grid cell里面,好比是全班有49个学习小组,分为7X7,每一个学习小组里都有两个人,两个人的座位也许非常大,占得预测框非常大,但是中心点仍然是在这个学习小组里面的,他才能算是这个学习小组的人,而每一个学习小组预测出两个bbox,这两个bbox可以长宽各异,面积各异,大小各异,但是中心点必须在grid cell里面,因此是中心点相对于所在grid cell 左上角格点的坐标,它始终是在 0 到 1 之间。宽和高是相对于整幅图片的宽、高,所以也是在 0 到 1 之间。那么这五个参数就是 0 到 1 之间的数,就将其归一化,好处理。confidence表明了预测框和实际ground truth框的IOU,其实就相当于为1时的结果。
每一个grid cell除了预测出两个或者B个框之外,还能预测出C个类别的条件概率,对于VOC而言,C = 20,即20个类别的条件概率。条件概率就是假设grid cell在负责预测物体的条件下,它是狗的概率是多少,即该grid cell已经负责预测物体的条件下,它是狗或者猫的概率是多少。也就是说每一个grid cell生成两个预测框和C个条件概率。每个grid cell只预测一组条件类别概率,且B个bbox能够共享这个条件类别概率。
在测试阶段,我们就把每一个预测框的confidence乘以每一个类别的条件类别概率,
等式右边表示真正是某个类别的概率。所以就能获得每一个类别的confidence scores。分数就是等式右边这一项,既表明了分类的精度,也表明了回归定位的精度,
图2 :模型。我们的系统把目标检测问题转化为回归问题。把整个图片划分为SXS的网格,每一个网格预测B个bbox,每一个bbox包含四个位置参数和一个confidence参数,每一个grid cell还预测出C个类别条件概率。所以神经网络输出结果是 S X S X ( B X 5 + C ) 的向量。
假设现在是预测阶段,模型已经训练好了,当来了一张未知图片时,首先把这张图片划分成S X S个grid cell,输入图片已经缩放为正方形,把正方形图片划分为 S X S 个 grid cell,每一个grid cell预测出两个bbox,两个bbox可以大小各异,但是它的中心点必须落在所在的 grid cell里面,每一个 grid cell都产生四个位置参数和一个confidence参数,confidence参数用线的粗细表示,位置参数用框(即bbox)来表示。每一个grid cell 还能产生类别条件概率,五种颜色表示了五种类别,比如说一个grid cell预测出了20个条件类别概率,有一个值是比较高的,那么它对应的类别就是类别高的那一类所表示的颜色。把低置信度的框过滤掉,再把重复识别同一个物体的多个框用非极大值抑制替掉,再加上类别,就形成了最后的结果。我们就知道图像上每一个框的位置以及类别。
在训练阶段,人工标注框落在哪个grid cell里面,就应该由哪个grid cell产生的bbox去负责预测物体。每一个grid cell预测出B个bbox,由这B个bbox的哪一个去负责拟合人工画的框呢?就是由B个bbox里面与人工标注框IOU最大的框去负责预测物体,去负责拟合人工标注的框。每一个grid cell只能产生一个分类,也就是说每个grid cell只能预测出一个物体,S X S个网格,只能预测出S X S个物体。因此所有的bbox被分为三类,一类是负责预测物体的bbox,还有一类是在负责预测物体的grid cell里面,但不负责预测物体的bbox,就是被更大的IOU挤掉的那个,还有一类是在不负责预测物体的grid cell里面的bbox,所以分成了三类,这三类是分别计算损失函数的。
这篇论文是在PASCAL VOC数据集上训练的,S = 7,B = 2。包含20个类别,所以最后生成张量的维度是 7 X 7 X 30。这个张量怎么理解:首先7X7构成了一个矩阵,即构成了一张纸,这张纸上有49个数字,7行7列的49个数字,把30张这样的纸堆起来,变成一本书,就形成了这个数据结构。
2.1 网络设计
我们使用卷积神经网络,也就是深度学习来实现,在PASCAL VOC 目标检测数据集上进行评估。最开始的卷积层负责提取特征,后面全连接层负责预测出这些数值,和图像分类是类似的。只不过图像分类的全连接层输出的是每一个类别的概率,而在YOLO里面,全连接层负责输出 7 X 7 X 30维的张量。坐标和类别都在30里面。
这个网络是受到了GoogLeNet的启发,使用了Inception结构。网络包含24个卷积层,最后有两个全连接层。GoogLeNet使用的是 inception modules,本篇论文没有使用 inception modules,而是使用 1 X 1 卷积, 1 X 1 卷积启发于 Network in network 这篇文章, 1 X 1 卷积有很多作用,比如降维、升维、跨通道信息交流、减少权重等都是用 1 X 1 卷积实现的。就是 1 X 1 卷积,后面跟上3 X 3卷积,有点类似于Network in network。整个网络结构看图3。
我们也训练了一个更快的YOLO 版本,也就是说更小的YOLO版本,来把它的快速的性能推向极致。Fast YOLO使用更少的卷积层,只有9个卷积层,使用了更少的卷积核。其他的,除了网络的大小之外,所有的训练和测试参数都一样,都和基准的YOLO是一样的。
图3是网络结构。我们的目标检测模型有24个卷积层,最后是两个全连接层。在原图里面只画了一个卷积层,但实际上是有两个卷积层。在这里交替使用 1 X 1 卷积和3 X 3 卷积, 1 X 1 卷积 后面通道数比较小,而 3 X 3 卷积通道数比较大,也就说明 1 X 1 卷积的作用是降维,减少 feature map 的个数,也就是说减少了权重个数和计算量。整个网络先是用 ImageNet 图像分类数据集去训练,使用的是 224 X 224 图片的分辨率,然后再在 448 X 448 的分辨率上训练目标检测的模型。
可以看图中,输入的是 448 X 448 X 3 通道,RGB。用64个 7 X 7大小的卷积核,以步长为 2 进行卷积。最大池化。再用192个 3 X 3 卷积核进行卷积,然后再 2 X 2 最大池化,步长为2。这样级联这个工序。直到获得一个 7 X 7 X 1024 维的张量。将它拉平,喂到一个 4096 个神经元的全连接层,输出一个 4096 维的向量,再把 4096 维的向量 喂到一个 1470 维的全连接层,输出 1470 维的向量。把 1470 维的向量再 reshape 一下,就变成了 7 X 7 X 30 的张量。输入是 448 X 448 X 3,输出是 7 X 7 X 30。所有预测框的坐标和类别全都在 7 X 7 X 30 的数据结构里面。中间可以当做是一个黑箱子或者一个函数,最后解析输出 7 X 7 X 30,就可以获得目标检测的结果。
图3
2.2 训练
先是在1000个类别的ImageNet数据集上预训练模型,训练出了前20个卷积层,20个卷积层后面加一个全局平均池化(Global Average Pooling--GAP),相当于替代了全连接层,再跟一个全连接层去训练图像分类模型。训练完图像分类模型之后,训练了一个星期。达到了 single crop top-5准确率是 88 %,single crop 表示图片不进行任何裁剪和集成,直接把图片喂到模型里面,它的 top-5 准确率是 88 %,在 ImageNet 2012 验证集上,和在 Caffe 这个深度学习框架里面Google Net 模型的准确率是相当的。 Caffe的作者是中国人。我们使用 Darknet 深度学习框架去训练。(YOLO 作者自己用 C写的深度学习框架)这就是预训练的图像分类模型,然后再保留模型的权重来训练目标检测的模型。
任少卿这篇论文讲了在后面加卷积层和全连接层能够提升性能,所以根据这个思路,在后面加了四个卷积层和两个全连接层,这些层的权重都是随机初始化的。目标检测通常需要细粒度的视觉信息,因为要进行框的定位,不可能太粗粒度,所以把输入图像的分辨率提升到从 224 X 224 到 448 X 448。(任少卿和何凯明一起发表了ResNet,同时也是FastRNN的作者)
最后一层既预测出类别概率,也预测出定位坐标。宽度和高度,以及横坐标、纵坐标,中心点的横坐标、纵坐标都是归一化的,都是0到1的。预测框中心点的横纵坐标 x,y ,相当于是预测框左上角的偏移量,所以它也是在 0 到 1 之间的。因为 bbox 中心点肯定在它所属的 grid cell 里面。
最后一层使用的是线性激活函数,相当于是没有非线性激活函数,其他层使用的是 Leaky ReLu 函数,在 x >0 时 等于 x ,在 x < 0 时,等于 0.1 x 。传统的 ReLu 函数,在 x < 0 时,
y = 0,传统的 ReLu 函数只有在 x >0 时才能获得正值,才能获得梯度。如果 x < 0,就被抹平了,就没法学习。而 Leaky ReLu 函数部分的解决了这个问题,就算 x < 0,仍然可以获得很小的梯度。
损失函数使用的是平方和误差损失函数,其实就是回归问题的损失函数,YOLO 是把目标检测问题当做回归问题来解决的,回归问题要预测出连续的值,所以它肯定要把预测的值和标签值的差做一个损失函数,平方和误差就是最常用的回归问题的损失函数,就像我们计算欧式距离,计算平面直角坐标系两个点的距离一样,都是平方和误差。平方和误差很容易优化(平方求导很容易优化),但是它跟最大化平均精度,和最大化目标检测性能不能完全吻合。因为所有的 bbox 分为三类,第一类是负责预测物体的 bbox,后面两类都是不负责预测物体的。(好的学习小组里面有一个好孩子,一个坏孩子,而坏的学习小组里面全是坏孩子,一张图片的目标值是有限的,只有一个狗,一个自行车,一个汽车,坏孩子的个数肯定是很多的,如果强行使用平方和误差的话,坏孩子的损失函数会占主导,好孩子的作用就发挥不出来了,所以需要采取不同的权重)用原来的平方和误差损失函数,对于定位误差和分类误差是一视同仁的,而且一张图片上有许多 grid cell 不包含物体,不负责预测物体,这就使得坏孩子的 confidence 尽可能变到 0。这些坏孩子们的效应就回压到梯度,就会削弱好孩子的作用,会导致模型收敛不稳定,甚至导致早期的发散。就和训练强化学习一样。强化学习就很难获得正反馈,生来就是loser,很难收敛。而一个人做一件事马上就能知道做的对或者不对,及时反馈,那么就会收敛。用传统的平方和误差损失函数虽然易于优化,但是对于定位和分类误差一视同仁,对包含物体和不包含物体的bbox一视同仁,对大框和小框也一视同仁。
为了削弱坏孩子的作用,为了补偿效应,我们需要增加好孩子的权重,减少坏孩子的权重,即增加负责预测物体的 bbox 的权重,减少不负责预测物体的 bbox 的权重。分别给予 5 和 0.5 的权重。
平方和误差是绝对误差,它不管框是大框还是小框,大框偏差一点、小框偏差一点,绝对误差都差不多。如下图
对于小框而言,相对误差会大一点,用平方和误差是没有考虑到这一点的,所以在真正损失函数的时候,计算的是根号之差,不是直接的 x 坐标之差, y 坐标之差。这样对于大框而言,同样的误差造成的损失函数会比较小,能够削弱大框的误差,这样对大框比较公平。同样的相对误差的情况下,大框的绝对误差要大很多,对大框很不公平,所以取了一个根号,这样,同样的相对误差情况下,大框的绝对误差也比较小了。(针对大框小框一视同仁的情况,计算 h 和 w 平方根之差,引入损失函数,削弱大框误差)这样更加强调了小框的作用。我们的评估准则应该反映大框的偏差要比小框的偏差 matter less。同样的偏差,大框造成的损失函数应该比较小,而小框造成的损失函数应该比较大。只是部分的解决了这个问题。这个损失函数是对于高度和宽度这两个定位坐标来实施的,对于 x 和 y 横纵坐标并不实施。
YOLO 每一个 grid cell 预测 B 个 bbox 。我们希望每一个 bbox 负责预测一个物体。与 ground truth 有最大 IOU 的 bbox 负责预测这个物体,这里的 predictor 就是 bbox 的意思。在损失函数里可以看到, i 表示 grid cell ,B 表示 bbox 。每一个 grid cell 里面有一个物体负责预测 bbox,而另外一个不负责预测,长期训练下去的话,会产生像细胞分化一样的特化。有些预测框会越来越变得高瘦,比如预测行人,有一些预测框会越来越变得矮胖,比如预测自行车。就是说不同的框会逐渐特化,每一个框都会聚焦到不同的形状或长宽比,这是YOLO V1,从YOLO V2 开始引入 Anchor 机制,框一开始训练的时候就固定好了,矮胖的天生就负责预测矮胖的物体,高瘦的天生就负责预测高瘦的物体,B个框逐渐特化,每个框都聚焦至特定形状或长宽比。在YOLO V1 里面每一个框都是野蛮生长,刚开始训练的时候都是随机的,由 IOU 机制,便会逐渐特化,来提升最终的 recall 。recall 就是真正的物体被检测出来的比例。
下面是非常重要的损失函数:
损失函数包含五项,每一项都是平方和误差,都是某两项的差再平方,再求和,所以称之为平方和误差,这是一个典型的回归问题的损失函数,就是把预测出来的值,和实际标签值作差,再求平方,再求和。所以YOLO是一个把目标检测问题,转化为回归问题的模型。
第①项和第②项都是对于好孩子而言的,都是对于负责预测物体的bbox。
这一项是中心点的定位误差。
这一项是框的宽度和高度定位误差,为了对大框更公平,所以用的是根号。是好孩子的权重 5 。
是不负责检测物体的 bbox 。它的权重是
为 0.5 。
是好孩子的 confidence 误差。即预测值和标签值越接近越好。
是预测值,它是直接从 7 X 7 X 30 的张量中找到的 confidence score,而是标签值,它是 bbox 与人工标注框 ground truth 的 IOU。因为包含物体的这一项 为 1,所以
中只剩下右边这一项,对于好孩子而言,它的 confidence 的标签值 就是这个好孩子的 bbox 与人工标注框 ground truth 的 IOU。
是负责检测物体的分类误差,就是好孩子所在的学习小组,它的分类误差。分类误差,就是希望它和真正类别的概率越接近越好。即和越接近越好。
表示它是好孩子,表示它是坏孩子,表示它是好的学习小组,即好的grid cell 。
grid cell 分为两类,一类是负责预测物体的grid cell,一类是不负责预测物体的grid cell。预测物体的grid cell 又有两类bbox,一类是负责预测物体的bbox,一类是不负责预测物体的bbox,即该bbox与ground truth 的 IOU 比较小的,分别称之为好孩子和坏孩子。不负责预测物体的grid cell里的bbox也是坏孩子。
每一个人都有自己要拟合的东西,要预测的值,最后统一拟合损失函数,让损失函数越小越好。通过梯度下降,通过反向传播,调整神经网络里面每一个权重,让它损失函数越小越好,最终学习收敛。
这里面其实是有些关系的,如果它是一个好孩子,那么它的学习小组就是一个好的学习小组,所以
为 1 的话,那么 也为 1,表示grid cell 是不是包含物体的grid cell ,是不是包含物体的grid cell 。有就是 1,没有就是 0。而表示它是不是一个好 bbox,是不是对应预测物体的 bbox,有就 1 ,没有就是 0。表示grid cell ,即 S X S 个,表示 bbox,就是B个 bbox。表示坏孩子,就是它是不是不负责预测物体,如果它不负责预测物体,那么为 1,负责预测物体,那么为 0。也就是说,和两者,一个为 1,另外一个肯定为 0。
①②③④里面的求和是对每一个 bbox 求和,⑤求和是对每一个grid cell的每一个类别求和。
最后一项是负责惩罚分类的,前面这几项是负责惩罚坐标误差。
训练的时候是把模型训练了 135 轮,每一轮都是完整的遍历的训练集中所有的图片。在 PASCAL 2007 的训练集和验证集上训练的。在 2012 的测试集上进行预测。训练过程中使用了 64 的 batch size。就是每一步喂进去 64 张图片,动量因子 0.9,权重衰减是 0.0005。权重衰减其实就是 L2 正则化,L2 正则化就是对权重的平方项进行惩罚,反向传播求导的时候,平方项就下来了,权重项就变成一次项了,从更新权重的角度看,是减掉了一个一次项的权重,所以称之为权重衰减。
学习率的策略是这样的:在一开始,慢慢的增加学习率,从增加到 。如果一开始就用很高的学习率的话,那么这个模型就很容易发散和不稳定。用比较大的学习率训练 75 轮,用 训练 30 轮,最后用 更小的学习率训练 30 轮。就是先大踏步走,再小碎步收敛。
为了避免过拟合,我们使用 dropout 和非常广泛的数据增强。就是在训练阶段随机屏蔽掉一半的神经元,使得它输出和反向传播回来的梯度都为 0。它可以打破神经元之间的联合依赖适应性。数据增强也非常重要,它可以扩充数据集,可以防止过拟合,还可以让模型适应各种各样的变化,提高鲁棒性,比如说对图片进行剪裁、平移、翻转、亮度增加、拼贴,各种各样的变换,可以让模型学习到更普适的规律,抓住主要矛盾和它的本质特征。我们随机调整了曝光度和饱和度,使用 1.5 的因子在 HSV 色彩空间。( HSV 是色调、饱和度、明度的色彩空间)
2.3 预测推断
就像训练一样,YOLO 模型只需要一次预测就可以得到最终预测结果。在 PASCAL VOC 数据集上,预测出了 98 个 bbox,即 7X 7 X 2( S X S X B),还有每一个 bbox 的 confidence。如果把每一个 bbox 各confidence 乘以该 grid cell 的各类别的条件类别概率,那么就得到了各类别的概率。YOLO 是非常快的,因为它只需要一次前向推断,就可以获得结果,不像其他滑窗和 region proposal 的方法。
网格的设计其实是强制它在空间上造成了某种差异,即 7 X 7 个网格,是强制的。每一个地方强制的预测哪一个地方的物体。虽然每一个物体它该由哪个 grid cell 负责是比较清晰的,但是对于较大的物体和靠近边缘的物体,可能会有多个预测框预测同一个物体。这个时候就要通过非极大值抑制 NMS (Non-maximal suppression)来把低置信度的重复预测框过滤掉,只保留高置信度的框。孙然 NMS 对于 R-CNN 和 DPM 都不是很必要,但是对于 YOLO 而言,加了 2-3% 的 mAP。
2.4 YOLO 的缺陷
因为 YOLO 强制的实行了空间限制,就是这个地方的 grid cell 就负责预测这个地方的物体,每一个 grid cell 只能预测出两个边界框,只能预测出一个类别,也就是说一个 grid cell 只能产生一个物体,所以 7 X 7= 49 个 grid cell 只能预测 49 个物体。这个空间限制了模型能够预测出的物体个数。而且对于小目标而言,比如对于鸟群而言,是不太好的。
虽然我们的模型能够预测出边界框,但是它在新的场景或不寻常的高宽比或者是图像域里面,它的泛化性能是受限的。而且,我们的模型使用的是较粗粒度的特征,因为中间有很多池化层和下采样层。池化层和下采样层会导致空间信息的缺失,所以信息就没那么细粒度,而是粗粒度的信息。
最后,损失函数是对大小框同等对待的。对于大框而言,一个较小的误差是良性的,但是对于小框而言,一点小小的误差,就回带来很大的 IOU 的影响。所以 YOLO 的主要误差来源在于 incorrect localizations ,就是分类正确但定位误差大,就是坐标的拟合能力是比较差的。
3、与其他目标检测框架比较
目标检测是计算机视觉的核心问题。而目标检测的流程通常是从图像中提取出一系列鲁棒的特征,(比如说 Haar[25],Haar特征,SIFT[23],尺度不变特征变换,HOG[4]方向梯度直方图特征,用卷积神经网络提取的特征[6])。提取出特征之后,再用分类器和回归器在特征空间上来进行识别、分类和回归。分类器和回归器要么通过滑窗的形式,要么通过提取候选框,从图像中采取子集区域的方式来进行的。YOLO是完全不一样的结构,它完全摒弃了前面低效的方法,我们把YOLO 和其他的几个当年的top dection framework进行对比,突出强调了相似性和差异。
首先和 DPM 比较。DPM 是在2010年左右,非常有名的一个目标检测方法。DPM 是基于HOG,方向梯度直方图特征的传统的计算机视觉的方法,通过改进的HOG特征,再用SVM向量机分类器,对它进行识别,用滑动窗口的方式来把模板在图像上滑动。自行车有自行车的模板,人有人的模板,而且自行车的模板也有正面的和侧面的,人也有正面的和侧面的。用不同的模板在图像中不同的区域上滑动,最终识别出结果。而很多物体是包含子部分的,比如说,人手里拿一个球,或者是人有一个手,这个手的子部件和人的主部件是要有关系的,它可以通过弹簧模型来解释,弹簧模型是指一个图像上各个部分的关系,模型是多阶段的,依赖于每一部分的工作流,非常低效而且速度非常慢。它使用的是滑动窗口目标检测方法,它是一个不连贯的工作流,提取的是静态的特征,再对滑动窗口每一个区域进行分类,进而预测bbox 的坐标。而我们的 YOLO ,把所有的东西都整合成了一个单一的神经网络,YOLO 把特征提取,边界框的定位与分类,还有非极大值抑制,把上下文的分析,都同时的解决了,端到端的解决了。与 DPM 不同,YOLO 并不是使用的静态特征,即人工设计好的特征,这个模型使用的是端到端的优化,深度学习训练的,所以这种统一的架构能够实现更快更准的效果。DPM 检测不同的物体,需要人工设计不同的模板,而且对于人而言,人可能会有各种各样的姿势,比如张开双臂,或者跳舞,运动,不同的姿势需要设计出不同的模板,所以鲁棒性能很差,而一旦图片有一些畸变,比如宽高变了,里面的物体变了,效率就更差。所以 DPM 的鲁棒性是比较低的。而 YOLO 在这方面是比 DPM 强的。现在已经没有人提 DPM了。
R-CNN是基于深度学习的。R-CNN 是 region proposal 方法的一个变种,用region proposal 方法就不需要再使用滑动窗口了,而是先从图像中提取若干个候选框,比如说用 Selective search方法提取出 2000-3000 个候选框,再逐一的用卷积神经网络对每一个候选框,进行特征提取,再用支持向量机进行分类,然后再用线性模型进行坐标的回归,再用非极大值抑制,去除重复的框。它是一个多阶段的,或者叫两阶段的。每一个阶段都需要非常精确的独立的调整,依赖于一个精准协作的上下游产业链,一旦某一个工序有问题,那整个产业链就都毁了。处理一张图像甚至需要 40 秒。YOLO 是一秒钟可以处理 40 张图片,而 R-CNN 40 秒处理一张图片。
YOLO 和 R-CNN 有一些相似性。比如说每一个 grid cell 产生若干个潜在的候选框,再用卷积神经网络进行分类,和R-CNN有点像,相当于 98 个框都是候选框,然而 YOLO只有98个,所以它空间上是有限制的,所以它速度非常快,而 R-CNN 会产生 2000-3000 个候选框,这样就不会对同一个物体有重复的检测。而且只有 98 个候选框的话,相比于 2000 个Selective search 产生的候选框而言是效率要大大提高,工作量减小,计算量减小,要更快的。YOLO 是把各个独立的部件整合在一起,端到端的一起工作。
其他快速的目标检测。比如 Fast 和 Faster R-CNN。两者是在 R-CNN的基础上,进行了改进和加速,Fast R-CNN是先把全图用卷积神经网络过一遍,再筛选出候选框,这样所有的候选框都能共享一套特征,而不用逐一提取特征。而 Faster R-CNN 使用RPN网络去代替 Selective Search,来产生候选框。虽然这俩模型在速度和精度上都比 R-CNN要高,但是仍然达不到实时的性能。
有很多工作在尝试加速 DPM,比如加速 HOG方向梯度直方图特征的计算,使用级联,把计算放在GPU上。然而只有 30 HZ 的 DPM真正达到了实时检测。
YOLO 是把所有的工作流整合在了一起,从根上就是快的。即从原理上就是快的。而不是去优化每一个工作流。
对于人脸、行人或者文字这样特殊的目标检测而言,它是可以被高度优化的,因为这些图像域是固定的,特别是文字,图像域里面的图片不会有太大的变化。而 YOLO 是一个通用目标检测模型,能检测任何东西。行人、艺术品、交通工具等等。
Deep MultiBox 模型。它的作者是 Szegedy。他训练了一个类似 RPN 网络的模型,用神经网络来提取候选框。 MultiBox 可以实现单物体的检测,只需要把 confidence 换成单个类别的概率就可以了。但是 MultiBox 不能实现通用物体的检测,而且也依赖于一个庞大的目标检测工作流,需要对每一个候选框进行分类。仍然是多阶段的。 YOLO 和 MultiBox 都使用了卷积神经网络,但是 YOLO 是一个完整的目标检测系统,而 MultiBox 只是其中的一个组件。
OverFeat。是2013年ImageNet定位竞赛的冠军。OverFeat 使用卷积神经网络来进行定位,它是基于滑动窗口的。它高效的实现了 sliding window。但仍旧是各工序分离的。而且它是针对于定位任务进行优化的,而不是针对于目标检测任务。和 DPM 一样,OverFeat因为是滑动窗口,它的模型每次只能看到滑窗内部的东西,不能看到全景和全图。不能分析全图的上下文信息,因此它需要非常庞大的后处理工作,才能产生合乎逻辑的工作。
MultiGrasp。(作者自己的模型)grid cell 这种方法是基于 MultiGrasp 的启发,回归出了一个可抓取的区域。然而 MultiGrasp 只是一个更简单的任务,它不像目标检测这么复杂,它只需要预测出一个可抓取区域,让机器人去抓。图片中只需要包含一个物体。它不需要去评估尺寸、位置和边界,它是比目标检测简单的多的,只需要找到一个可抓取的区域即可。而 YOLO 是要把坐标、confidence 还有类别,全部都预测出来才行。而且要把图中每一个物体的信息都预测出来。
4、实验
首先把 YOLO 和其他的实时目标检测结果进行了对比。特别是把YOLO 和 R-CNN 的变种,在PASCAL 2007上的结果进行了对比。然后把 YOLO 和 Fast R-CNN各类错误的比例进行了分析。YOLO 将背景识别为物体的错误是比较少的,进一步把 YOLO 和 Fast R-CNN 进行结合,把这两个模型集成在一起,可以有效提升目标检测的性能。把 VOC 2012 的结果展示出来,比较了当前的几种最先进的目标检测的性能。最后表明 YOLO 在新领域的泛化能力是非常强的,比如说在艺术作品数据集上。
4.1 YOLO 与其他实时目标检测方法性能比较
有许多研究在努力让目标检测变得更快,但是只有它真正的实现了实时的目标检测(即 30 FPS 的目标检测)。我们把 YOLO和改进版的 DPM实现进行了对比,对于那些没有达到实时目标检测性能的模型,我们也把它放在了表里进行对比。如下表格:
Fast YOLO是当前 PASCAL VOC 目标检测模型里面最快的,而且相比于其他实时目标检测模型而言,它的准确率是别人的两倍。而 YOLO 相比于 Fast YOLO 模型而言,仍然是有 10 个mAP 的性能提升。并且 YOLO 能够保证实时的目标检测。
Fast YOLO是PASCAL VOC上最快的目标检测模型,而且据我们所知,这是现有的最快的目标检测模型。准确率达到了 52.7 %。是其他现有的实时目标检测的两倍。YOLO 在保持实时目标检测性能的同时,把 mAP 提升到了 63.4 %。
我们也在 VGG 16作为骨干模型,训练了 YOLO。这个模型是更加准确的,但是会比较慢,因为 VGG网络本身比较臃肿庞大,参数量比较大,这个模型用于比较以其他以 VGG 16作为骨干模型的模型。它也没有达到实时的效果。所以在文中其他部分没有提及。还是提 Faster models。
Fastest DPM 相比于 DPM 原生模型能够显著的提升,但是牺牲了很多的准确性。但是受限于 DPM 从原理上就决定的比较低的性能、准确性。相比于神经网络方法。
R-CNN minus R 是把 Selective Search 的方法转换成了一个静态的 bbox 候选框,虽然它比原生的R-CNN快,但是它仍然没有达到实时的性能。而且因为它把 region proposal 方法变成静态的、固定的,所以它的准确率也大大降低。
Fast R-CNN相比于 R-CNN 能够显著的提速,但是它仍然依赖 selective search 候选框提取,仍然需要每张图片两秒钟的预测时间。虽然它的 mAP 比较高,但是它的 FPS 只有 0.5。
最近的 Faster R-CNN 把 selective search 变成了 RPN 网络,用一个神经网络来提取一个候选框,和 Szegedy 的模型类似。在我们的实验中,Faster R-CNN 最准确的模型达到了 73.2,FPS 是 7。而它的更小的版本,准确率下降了,但是速度达到了 18。以 VGG 16作为骨干模型的Faster R-CNN,比 YOLO 而言,提升了 10 个mAP,但是要慢6倍。以Zeiler-Fergus 为骨干网络的 Faster R-CNN,只比 YOLO慢 2.5倍,但是仍然不够准确。
4.2 YOLO和Fast R-CNN 的各类错误比例分析
(相当于把模型做了一个可解释性分析,知道它最容易犯哪些错误,才容易打破它的黑箱子,来改进它)
为了更进一步分析 YOLO和目前最先进的目标检测性能的区别,我们使用l了一个能够打破黑箱子的分析预测结果的方法,把 YOLO 和 Fast R-CNN 做了比较,因为 Fast R-CNN是当前最有名,性能最好的 PASCAL数据集上的模型,而且它的所有预测结果都是公开的,所以对两者进行了比较。
借助 Hoiem提出的工具,我们能够把在测试阶段每一个类别的前 N 个预测结果来进行归类。每一个预测结果要么是正确的,要么是错误的,如果是错误的会被分为以下几类:
正确:类别正确,并且 IOU > 0.5
错误:
定位错误:类别正确,但是 0.1 < IOU < 0.5
similar错误:类别相似,而且 IOU > 0.1
其他:类别预测错误,IOU > 0.1
背景错误:IOU < 0.1 (即把背景误判为目标,也就是 false positive 错误 )
从下面这个图就可以看到 YOLO 和 Faster R-CNN 两个模型不同的错误比例,首先Faster R-CNN准确部分比 YOLO的高,因为Fast 毕竟是两阶段模型,它比较准;Faster R-CNN的定位误差是比较低的,即Loc,YOLO的定位误差是比较高的,因为YOLO使用的是粗粒度特征。它拟合坐标位置的性能不是很强。但是Faster R-CNN 的background 误差很高,而 YOLO 的就很低,甚至只有它的三分之一。这就是因为 YOLO 输入模型是全部的图片,它能够看到全图,所以它能够隐式的区分背景和物体,所以把背景误判为物体的误差就比较小。但是YOLO 的Loc能力比较差,而Faster R-CNN 模型只能看到候选框区域,所以它容易把背景误识为物体。
上图展示了不同错误类别的分析。
YOLO 的定位性能是比较差的。而且 YOLO 的定位误差,比其他误差之和都多,蓝色比黄色、橙色、红色之和都多,而Faster R-CNN 会犯更少的定位错误,但是会犯更多的背景错误。 13.6 %就是犯的背景错误,犯的都是 FP 误差,并不包含任何物体的背景,被它误判为物体。Faster R-CNN这类错误比 YOLO 多将近 3 倍。
4.3 Faster R-CNN 与 YOLO 优势互补
YOLO定位能力差,但识别背景能力好,而Faster R-CNN 定位能力好,而识别背景的能力差,把两者结合一下,就能优势互补。对于每一个bbox,Faster R-CNN预测的每一个预测框,看看YOLO是不是也预测出了一个类似的框,如果YOLO也预测出了一个框,那么就对这个框加一个 boost,加一个提升。根据 YOLO预测的概率,根据YOLO预测的框和Faster R-CNN 预测的两个框的重叠程度。
实验结果,如下所示:
单独的Faster R-CNN 性能是 71.8,在Faster R-CNN上加上变种模型,单独模型性能的mAP变为66.9,...。将四个模型分别加在基模型上,性能提升都有限,都提升的比较小,如第二行的 0.6,来源就是 0.6 = 72.4-71.8。基模型加上 YOLO,性能会提升很多。证明 YOLO和Faster R-CNN可以有效的优势互补。这也是集成模型的一个原则。集成模型要让基模型“好而不同”,优势互补。
下面这个表展示了 PASCAL
以上是关于YOLO V1 论文精讲的主要内容,如果未能解决你的问题,请参考以下文章