YOLO v1 论文笔记 01
前言
看过很多的YOLO中文版学习笔记,干货比较多,但是,有点干,对于很多想要入门的童鞋来说,看着很难理解,一些概念晦涩难懂,一些英文表述不知为何意。所以从这一篇博客开始,我尽量用比较简单的语言来讲述YOLO v1,把我个人的理解分享给大家,希望大家能够学懂YOLO,会用YOLO。
我会讲的很细,所以一篇博客来说一篇论文,内容有点多,我会分成两个博客来讲述YOLO论文还会有一部分博客作为补充,希望大家能认真学习,文中的如果哪里写的不好或者有错误,还希望大家能够不吝赐教。
一
Abstract(概括)
这篇文章提出了一个新的物体检测的方法:You Only Look Once(YOLO),之前的物体检测方法通常都转变为了一个分类问题,如 R-CNN、Fast R-CNN 等等。
而这篇文章将检测变为一个回归问题,YOLO 从输入的图像,仅仅经过一个 neural network,直接得到 bounding boxes 以及每个 bounding box 所属类别的概率。正因为整个的检测过程仅仅有一个网络,所以它可以直接进行end-to-end (端对端:指的是输入原始数据,输出的是最后结果,应用在特征学习融入算法,无需单独处理)的优化。
这一段主要说明YOLO相对于其他神经网络的优点,那就是快,特别快(extremely fast),标准版本的YOLO在Titan X 的 GPU 上能达到45 FPS。网络较小的版本Fast YOLO在保持mAP是之前的其他实时物体检测器的两倍的同时,检测速度可以达到155 FPS。
相较于其他的state-of-the-art (先进的物体检测系统),YOLO在物体定位时更容易出错,但是在背景上预测出不存在的物体(false positives)的情况会少一些。而且,YOLO比DPM、R-CNN等物体检测系统能够学到更加抽象的物体的特征,这使得YOLO可以从真实图像领域迁移到其他领域,如艺术。
二
Introduction(介绍)
人们看一眼图像并立即知道图像中的物体是什么,它们在哪里,以及它们是如何相互作用的。人类视觉系统是快速和准确的,使我们能够执行复杂的任务,如驾驶与小有意识的想法。快速、准确的目标检测算法将允许计算机在没有专用传感器的情况下驾驶汽车,使辅助设备能够将实时场景信息传达给人类用户,并开启通用、响应性机器人系统的潜力。
现在的 detection systems(检测系统) 将物体检测问题,最后会转变成一个分类问题。在检测中,detection systems 采用一个 classifier(分类器) 去评估一张图像中各个位置一定区域的 window 或 bounding box 内,是否包含一个物体?包含了哪种物体?
YOLO之前的物体检测系统使用分类器来完成物体检测任务。为了检测一个物体,这些物体检测系统要在一张测试图的不同位置和不同尺寸的bounding box上使用该物体的分类器去评估是否有该物体。如DPM系统,要使用一个sliding window(滑窗)在整张图像上均匀滑动,用分类器评估是否有物体。
在DPM之后提出的其他方法,如R-CNN方法使用region proposal(区域建议)来生成整张图像中可能包含待检测物体的可能的 bounding boxes,然后用分类器来评估这些boxes,接着通过post-processing来改善bounding boxes,消除重复的检测目标,并基于整个场景中的其他物体重新对boxes进行打分。整个流程执行下来很慢,而且因为这些环节都是分开训练的,检测性能很难进行优化。
用YOLO处理图像分为三个步骤:
(1)将输入图像的大小调整为448×448;
(2)在图像上运行单个卷积网络;
(3)根据模型的置信度对得到的检测进行阈值化。
图示如下:
YOLO 的 idea 十分简单,如 Figure 1:将图像输入单独的一个 CNN 网络,就会预测出 bounding boxes(边界框:找出要找的内容,用一个矩形边框将其圈出,这个矩形边框即为边界框),以及这些 bounding boxes 所属类别的概率。YOLO 用一整幅图像来训练,同时可以直接优化 detection performance(性能检测)。
YOLO 的 idea 十分简单,如 Figure 1:将图像输入单独的一个 CNN 网络,就会预测出 bounding boxes(边界框:找出要找的内容,用一个矩形边框将其圈出,这个矩形边框即为边界框),以及这些 bounding boxes 所属类别的概率。YOLO 用一整幅图像来训练,同时可以直接优化 detection performance(性能检测)。
这种统一模型的优点:
(1)YOLO 检测系统非常非常的快。受益于将 detection(检测) 架构设计成一个回归问题,以及简单的 pipeline。在 Titan X 上,不需要经过批处理,标准版本的 YOLO 系统可以每秒处理 45 张图像;YOLO 的极速版本可以处理 150 帧图像。这就意味着 YOLO 可以以小于 25 毫秒延迟的处理速度,实时地处理视频。同时,YOLO 实时检测的mean Average Precision(mAP:在目标检测算法(如Faster RCNN, YOLO ,SSD)中mAP常做为一种基准来衡量算法的精确度好坏。mAP的本质其实是多类检测中各类别最大召回率(recall)的一个平均值) 是其他实时检测系统的两倍。
(2)YOLO 在做 predict 的时候,YOLO 使用的是全局图像。与 sliding window 和 region proposals 这类方法不同,YOLO 一次“看”一整张图像,所以它可以将物体的contextua(l整体)的 class information(类别信息) 以及 appearance information(外观信息) 进行 encoding(编码)。目前最快最好的Fast R-CNN,较容易误将图像中的 background patches (背景的一个小块)看成是物体,因为它看的范围比较小。YOLO 的 background errors(背景错误) 比 Fast R-CNN 少一半多。
(3)YOLO 学到物体更泛化的特征表示。当在自然场景图像上训练 YOLO,再在 artwork 图像上去测试 YOLO 时,YOLO 的表现要优于 DPM、R-CNN。YOLO 模型更能适应新的领域,由于其是高度可推广的,即使有非法输入,它也不太可能崩溃。
几类模型流程对比:
但是YOLO也存在问题,即YOLO仍然落后于最先进的检测系统的准确性。虽然它能快速识别图像中的物体,但它却努力精确地定位某些物体,尤其是小物体。
三
Unified Detection(统一检测)
我们将对象检测的分离组件统一为单个神经网络。我们的网络使用来自整个图像的特征来预测每个 bounding boxes(边界框)。它还预测所有边界的所有图像的包围盒。这意味着我们在整体范围内对整个图像和图像中的所有对象进行网络推理。YOLO设计使端到端的训练和实时速度成为可能,同时保持高的平均精度。
YOLO 检测系统,先将输入图像分成 S * S个 grid(栅格),如果一个物体的中心掉落在一个 grid cell (网格单元)内,那么这个 grid cell (网格单元)就负责检测这个物体。
每一个 grid cell 预测 B 个 bounding boxes,以及这些 bounding boxes 的得分:score。这个 score 反应了模型对于这个 grid cell 中预测是否含有物体,以及是这个物体的可能性是多少。我们把confidence(可信度)正式定义为
如果这个 cell 中不存在一个 object,则 score 应该为0 ;否则的话,score 则为 predicted box 与 ground truth 之间的 IoU(intersection over union:一种测量在特定数据集中检测相应物体准确度的一个标准)。
换句话说:若bounding box包含物体,则P(object) = 1;否则P(object) = 0。IOU(intersection over union)为预测边框与物体真实区域的交集面积(以像素为单位,用真实区域的像素面积归一化到[0,1]区间)。
每个边框由五个预测值组成:x,y,w,h,confidence。坐标(x,y) 代表了 bounding box 的中心与 grid cell 边界的相对值。width、height 则是相对于整幅图像的预测值(边框的宽和高)。confidence 就是 IoU 值。
注意:实际训练过程中,w和h的值使用图像的宽度和高度进行归一化到[0,1]区间内;x,y是边框中心位置相对于当前格子位置的偏移值,并且被归一化到[0,1]。
每一个栅格还要预测C个 conditional class probability(条件类别概率):Pr(Classi|Object)。即在一个栅格包含一个Object的前提下,它属于某个类的概率。我们只为每个栅格预测一组(C个)类概率,而不考虑框B的数量。
注意:conditional class probability信息是针对每个网格的。confidence信息是针对每个bounding box的。
在测试阶段,将每个栅格的conditional class probabilities与每个 bounding box的 confidence相乘:
这样既可得到每个bounding box的具体类别的confidence score。这乘积既包含了bounding box中预测的class的 probability信息,也反映了bounding box是否含有Object和bounding box坐标的准确度。
将YOLO用于PASCAL VOC数据集时:论文使用的 S=7,即将一张图像分为7×7=49个栅格每一个栅格预测B=2个boxes(每个box有 x,y,w,h,confidence,5个预测值),同时C=20(PASCAL数据集中有20个类别)。因此,最后的prediction是7×7×30 { 即S * S * ( B * 5 + C) }的Tensor(张量)。
注意:1.由于输出层为全连接层,因此在检测时,YOLO训练模型只支持与训练图像相同的输入分辨率。2.虽然每个格子可以预测B个bounding box,但是最终只选择只选择IOU最高的bounding box作为物体检测输出,即每个格子最多只预测出一个物体。当物体占画面比例较小,如图像中包含畜群或鸟群时,每个格子包含多个物体,但却只能检测出其中一个。这是YOLO方法的一个缺陷。
1、Network Design(网络设计)
作者实现这一模型将其作为卷积神经网络,并在PASCAL VOC检测数据集评估它。网络的初始卷积层从图像中提取特征,而完全连接的层预测输出的概率和坐标。
YOLO网络结构借鉴了 GoogLeNet 。YOLO检测网络包括24个卷积层和2个全连接层,如下图所示。
1、举例
如下图所示,图片分成7x7个网格(grid cell),某个物体的中心落在这个网格中此网格就负责预测这个物体。图中物体狗的中心点(红色框)落入第5行、第2列的格子内,所以这个格子负责预测图像中的物体狗。
最后一层输出为 7x7x30的维度。每个 1x1x30的维度对应原图7x7个cell中的一个,1x1x30中含有类别预测和bounding box坐标预测。总得来讲就是让网格负责类别信息,bounding box主要负责坐标信息(部分负责类别信息:confidence也算类别信息)。
每个网格(1*1*30维度对应原图中的cell)要预测2个bounding box (图中黄色实线框)的坐标(x,y,w,h) ,其中:中心坐标的(x,y)相对于对应的网格归一化到0-1之间,w,h用图像的width和height归一化到0-1之间。每个bounding box除了要回归自身的位置之外,还要附带预测一个confidence值。这个confidence代表了所预测的box中含有object的置信度和这个box预测的有多准两重信息:confidence =
其中如果有ground true box(人工标记的物体)落在一个grid cell里,第一项取1,否则取0。第二项是预测的bounding box和实际的ground truth box之间的IOU值。即:每个bounding box要预测 x,y,w,h,confidence,共5个值 ,2个bounding box共10个值,对应 1*1*30维度特征中的前10个。
每个网格还要预测类别信息,论文中共有 20 类。7 x 7 的网格,每个网格要预测 2 个 bounding box 和 20 个类别概率,输出就是 7 x 7 x ( 5 x 2 + 20)。(通用公式:S x S个网格,每个网格要预测 B 个bounding box 还要预测 C 个categories,输出就是 S x S x ( 5 x B + C ) 的一个tensor。注意:class信息是针对每个网格的,confidence信息是针对每个bounding box的)。
2、Training(训练)
1、训练
预训练分类网络: 在 ImageNet 1000-class competition dataset上预训练一个分类网络,这个网络是Figure3中的前20个卷机网络+average-pooling layer(平均池化层)+ fully connected layer(全连接层) (此时网络输入是224*224)。
训练检测网络:转换模型去执行检测任务,《Object detection networks on convolutional feature maps》提到说在预训练网络中增加卷积和全链接层可以改善性能。在作者的例子基础上添加4个卷积层和2个全链接层,随机初始化权重。检测要求细粒度的视觉信息,所以把网络输入把224*224变成448*448。
我们的最后一层预测类概率和包围盒坐标。我们通过图像宽度和高度对包围盒宽度和高度进行归一化,使它们下降到0和1之间。我们将边界框x和y坐标参数化为特定网格单元位置的偏移,因此它们也在0和1之间。
我们使用一个线性激活函数的最终层和所有其他层使用函数(2)线性激活。
2、损失函数
需要注意的是:我们在模型输出中求平方和误差的优化。我们使用和平方误差,因为它是容易优化的,但是它并不完全符合我们最大化平均精度的目标。它的定位误差与分类误差相等,可能不是理想的。而且,在每个图像中,许多网格单元不包含任何对象。这就把这些细胞的“置信度”分数推到零,往往超过了包含对象的细胞的梯度。这可能导致模型不稳定,导致训练早期发散。
解决方案:增加边界框坐标预测的损失,并且减少了不包含对象的框的置信度预测的损失。我们使用两个参数来实现这一点,即
这两个参数前者g。赋值为5,后者赋值为0.5。
下图为损失函数设计图:
损失函数的设计目标就是让坐标(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的,这会导致网络不稳定甚至发散。
解决方案如下:
更重视8维的坐标预测,给这些损失前面赋予更大的loss weight,在pascal VOC训练中取5。(上图蓝色框)
对没有object的bbox的confidence loss,赋予小的loss weight,在pascal VOC训练中取0.5。(上图橙色框)
有object的bbox的confidence loss (上图红色框) 和类别的loss (上图紫色框)的loss weight正常取1。
对不同大小的bbox预测中,相比于大bbox预测偏一点,小box预测偏一点更不能忍受。而sum-square error loss中对同样的偏移loss是一样。为了缓和这个问题,作者用了一个比较取巧的办法,就是将box的width和height取平方根代替原本的height和width。如下图:small bbox的横轴值较小,发生偏移时,反应到y轴上的loss(下图绿色)比big box(下图红色)要大。
一个网格预测多个bounding box,在训练时我们只需要每个object(ground true box)只有一个bounding box专门负责(一个object 一个bbox)。具体做法是与ground true box(object)的IOU最大的bounding box 负责该ground true box(object)的预测。这种做法称作bounding box predictor的specialization(专职化)。每个预测器会对特定(sizes,aspect ratio or classed of object)的ground true box预测的更好,从而提高整体召回率。
为了避免过度拟合,我们使用dropout和广泛的数据扩充。在第一个连接层之后我们丢弃具有速率=0.5的层,防止层之间的co-adaptation(相互影响)。对于数据增强,我们引入随机缩放和最多原始图像大小的20%的translations。我们还随机调整曝光和饱和度的图像多达1.5倍的HSV颜色空间。
3、Inference(推论)
就像在训练中,预测测试图像的检测只需要一个网络评估。在PASCAL VOC上,网络预测每个图像的98个边界盒和每个盒子的类概率。YOLO在测试时间非常快,因为它只需要单个网络评估,不像基于分类器的方法。
当图像中的物体较大,或者处于 grid cells 边界的物体,可能在多个 cells 中被定位出来。可以用Non-Maximal Suppression(NMS,非极大值抑制) 进行去除重复检测的物体,可以使最终的 mAP 提高,但相比较于 NMS 对于 DPM、R-CNN 的提高并不算大。
4、Limitations of YOLO(YOLO的局限性)
YOLO对相互靠的很近的物体(挨在一起且中点都落在同一个格子上的情况),还有很小的群体 检测效果不好,这是因为一个网格中只预测了两个框,并且只属于一类。 测试图像中,当同一类物体出现的不常见的长宽比和其他情况时泛化能力偏弱。 由于损失函数的问题,定位误差是影响检测效果的主要原因,尤其是大小物体的处理上,还有待加强。 |
我们的公众号
AI与区块链技术
编辑人:呓语 审核人:水亦心