一 为什么读这篇
旧文重读,大名鼎鼎的YOLO,目标检测一阶段法的代表。在做水印项目时第一个用到的网络,当时也没见过其他网络,再对Faster R-CNN系列有了认识后,通过这次重读重新梳理一下YOLO系列。
二 截止阅读时这篇论文的引用次数
2018.2.13 3298次。差不多是Faster R-CNN的一半。
三 相关背景介绍
15年6月首次挂在arXiv上,和Faster R-CNN几乎同一时间出现。好像也投了15年的NIPS,不过没中,但是中了16年的CVPR。一作Joseph Redmon是个相当逗比的大神,记得当时看他GitHub上的commit,写得相当独特(xx我要在你晚上熟睡时murder你。。)个人网站上料也很多。为了搞YOLO,用纯C手撸一个DarkNet框架出来。6,7年前也玩kaggle,不过名次不是很高,拿了3个银牌。一直在华盛顿大学。二作Santosh Divvala和四作Ali Farhadi也是华盛顿大学的,同时隶属于微软人工智能实验室,另外YOLO的v1-v3都是Joseph和四作一起合作的(因为四作是他老板。。)。三作是Ross Girshick,rbg大神不用多说了,没想到YOLO v1居然也有他的身影。
四 关键词
YOLO
one-stage
五 论文的主要贡献
1 提出当时速度最快的,准确率也OK的目标检测网络
2 一阶段法目标检测的代表
六 详细解读
1 介绍
之前目标检测的工作都是通过重新使用分类器来执行检测,而本文将目标检测定义为回归问题,通过空间上分离的bbox及相关的类概率来定义。使用一个网络来直接预测bbox和类概率。检测速度相当快,可达45FPS,而小网络Fast YOLO甚至高达155FPS。
像R-CNN这样复杂的pipeline既慢又难优化,因为每个独立的部分必须分开来训练。
YOLO相比传统方法有如下几个优势:
a. YOLO相当快
因为将检测定义为回归问题,因此不需要复杂的pipeline。
b. YOLO在做预测时是基于对图像的全局理解
不像滑窗或基于候选区域的方法,YOLO在训练和测试时看到的都是整个图像,所以它隐式地编码了上下文信息。
c. YOLO学习到了目标的泛化表示
当用自然图像训练,艺术品预测时,效果也比其他方法好。
缺点在于很难精准地定位某些目标,特别是小目标。
2 统一检测
YOLO将输入图像分为的格网,如果一个目标的中心点落在了一个格子上,则这个格子负责响应检测的目标。每个格子预测个bbox及其置信度。将置信度定义为。如果格子上没有目标,则置信度为0,否则置信度为IOU。每个bbox由5个预测值组成:和置信度。坐标表示相对于格子的中心,预测的宽高相对于整个图像。同时每个格子也预测个类概率的置信度:,这些概率以包含目标的格子为条件。只预测每个格子的一组类概率,而不用管bbox的数量(两者是分开的)。
在测试时,将条件类概率与预测的单个bbox的置信度相乘:
这样就得到每个box与类相关的置信度。它们反应了类出现在box中的概率以及预测box与目标的拟合程度。
在VOC上的测试,参数做如下设置:,最终的预测为的张量。
2.1 网络设计
卷积层提取特征,全连接层预测输出概率和坐标。受GoogLeNet启发,有24个卷积层,2个全连接层。不同的是将Inception块简化为3 x 3卷积层后跟着1 x 1降维层,整体如图3所示。
另外也训练了一个更快的YOLO,网络更轻量点(9个卷积层,更少的filters)
2.2 训练
在ImageNet上训练了将近一周得到分类top-5准确率为88%的预训练模型,网络是图3的前20个卷积层加平均池化层加全连接层。执行检测时又加了随机初始化的4个卷积层和2个全连接层。因为检测通常需要细粒度的视觉信息,因此将网络的输入分辨率从224 x 224增大到 448 x 448。
最后一层同时预测类概率和bbox坐标。用原图的宽高规范化了bbox的宽高,以使它们位于0到1之间。将bbox x和y的坐标参数化为指定网格单元位置的偏移,因此它们也在0和1之间。
除了最后一层用线性激活外其余层都用leaky ReLU:
模型用平方和损失进行优化,因为其容易优化,不过对于最大化平均准确率的目标来说并不很完美。它将定位误差与分类误差相等地加权,这可能并不是十分理想。此外在每张图像上,许多网格单元不包含任何目标,这将使这些网格单元的置信度推向零,从而压制了包含目标的网格单元的梯度,这会导致模型不稳定,在很早的时候就出现训练发散。
为了解决这个问题,增加了bbox坐标预测的损失,减少了不包含目标box的置信度预测的损失,用和这两个参数来完成。设置第一个为5,第二个为0.5。
平方和损失对于大box和小box也是用相等的权重。而损失度量应该反映出大box的小偏差比小box的小,为了部分解决这个问题,去预测bbox的宽和高的平方根,而不是直接预测宽和高。
YOLO在每个网格单元预测多个bbox。在训练时仅仅想要一个bbox负责响应每个目标。根据哪个预测具有当前最高IOU,将其分配为响应预测目标,这将导致bbox预测之间的特化。每个预测都能更好地预测某些大小,纵横比或目标类别,从而提高整体的召回率。整个损失函数如下所示:
其中表示如果目标出现在网格单元,表示在网格单元的第个bbox响应那个预测。
需要注意的是,仅当目标存在于该网格单元时,损失函数才惩罚分类错误。也仅当预测响应真实box时惩罚bbox的坐标误差(如网格单元中具有最高IOU的预测)。
训练135个epoch,batch size为64,动量为0.9,decay为0.0005。第一个epoch学习率从缓慢上升到(如果刚开始学习率过大会导致不收敛),之后用训练75个epoch,训练30个epoch,训练最后40个epoch(学习率调度有意思了,完全就是CLR的思路)。
为了避免过拟合,使用dropout和数据增强。在第一个全连接层后接上0.5丢失率的dropout层。对于数据增强,引入了高达原始图像大小20%的随机缩放和平移。 并在HSV颜色空间中用1.5的因子随机调整图像的曝光和饱和度。
2.3 预测
对于VOC,每张图预测98个bbox(7 x 7 x 2)。网格的设计使bbox预测强制实现了空间多样性。通常很清楚一个目标落入哪个网格单元,并且网络仅为每个目标预测一个box。 然鹅,一些大目标或多个网格单元边界附近的目标可以通过多个单元很好地定位。非极大值抑制(NMS)用来解决这种多个预测的问题,NMS提升了2-3%的mAP。
2.4 YOLO的限制
YOLO对bbox的预测有很强的空间约束,因为每个网格单元只预测两个box,并且只能有一个类,这个约束限制了模型可以预测的附近目标的数量。模型也很难处理一组小目标,例如成群的鸟类。
因为模型是从数据中学习预测bbox,因此很难泛化到具有新的或不一致纵横比的目标。
使用相对粗糙的特征来预测bbox,因为架构有多个下采样层。
最后,损失函数对待小bbox和大bbox的错误是一致的。大box中的小错误通常是可以接受的,而小box中的小错误对IOU的影响要大得多。YOLO主要的错误源就是定位不准。
3 与其他检测系统的比较
Deformable parts models(DPM)
10年提出,二作是rbg,基于滑动窗口方法,各组件分离。
R-CNN
YOLO和R-CNN也有一些相似点。在每个网格单元提出潜在的bbox,并使用卷积特征对这些box进行评分。然而,YOLO对网格单元的候选设置了空间限制,这有助于减轻同一目标的多次预测。YOLO提出更少的bbox,98个,而用Selective Search的R-CNN有2000个。
Other Fast Detectors
还是比Fast R-CNN和Faster R-CNN快。
Deep MultiBox
OverFeat
MultiGrasp
4 实验
4.1 与其他实时系统的比较
反正YOLO最快就对了。
作者也用VGG16训练了YOLO,准确率更高不过速度明显慢于YOLO。
VGG16的Faster R-CNN比YOLO高10个mAP,不过慢6倍。
4.2 VOC2007错误分析
定位错误在YOLO中占大头。Fast R-CNN有更少的定位错误,不过有更多的背景错误。
4.3 结合Fast R-CNN和YOLO
YOLO比Fast R-CNN有更少的背景错误,用YOLO消除Fast R-CNN中的背景错误会有一个明显的性能提升。说白了就是做ensemble。见表2的结果。
4.4 VOC2012结果
4.5 泛化能力:艺术品上的人像检测
艺术品和自然图像在像素级别上非常不同,不过它们在目标的大小和形状方面相似,因此YOLO仍可以很好的预测出来。
5 真实场景的实时检测
用摄像机的结果进行检测。
6 总结
YOLO是一个构建简单的,可以直接在全图上训练的模型。和基于分类的方法有所不同,YOLO直接响应检测性能的损失函数,同时整个模型被联合训练。
七 读后感
本文写的还是非常口语化,如沐春风。相关工作这一节明面上省了,不过用和其他检测系统的比较来代替。感觉YOLO重点还是玩损失函数这一块,针对各种特点,针对性的设置损失函数,网络结构没什么好讲的。
大神还是非常有个性的,YOLO v2写的真随性,根本没按论文的标准段落来。
素质四连
要解决什么问题
实时目标检测
用了什么方法解决
将检测视为回归问题,不需要复杂的pipeline,用统一的网络来预测,魔改损失函数
效果如何
当时背景下可用目标检测系统中最快的一个。
还存在什么问题
对小目标捉急,对成群出现的目标捉急,定位错误占大头,每个网格单元只预测两个box,并且只能有一个类,详见2.4节作者自己总结的。