《You Only Look Once: Unified,Real-Time object Detection》

论文链接: https://pjreddie.com/publications/

本文为最早提出的一批 one-stage 的目标检测方法,此方法速度很快,可以达到 45帧/秒 (在 Titan X 上运行)的速度,若精简网络结构,可以达到 155帧/秒(在 Titan X 上运行),并且准确度方面是其他可以实时检测方法的两倍。

1. Introduction

人们看一张图片的时候,只要一眼,就可以立即知道图片中的物体是什么,它们在哪,以及它们的交互方式。人类的视觉系统是很快和准确的,所以人们在进行一些复杂的工作(例如开车)时,也可以不全神贯注。 准确,实时的目标检测算法也同样可以使计算机在没有特殊传感器的基础上实现自动驾驶,或者就是一些辅助性设备可以实时向人类使用者传输数据,从而解锁更多应用的可能。

目前的方法更早一点的是 DPM(deformable parts models),使用滑动窗口的方法,来对每一个子窗进行分类。 更近一点的 R-CNN 则是使用 region proposal 的方法来产生可能包含物体的候选区域,然后对这些候选区域进行分类,最后进行框的位置修正,及消除多余的候选框。 这些复杂的方法都是很慢并且很难优化的,因为每一个独立的模块都要分别训练。

本文将目标检测问题再构为回归问题,直接从图像像素点上生成 bounding box 以及得到目标的分类概率。使用本文方法,你只需要看图片一眼,就可以知道其中的物体是什么,它们在哪。( YOLO 名字由来)

本文方法特点有三:

    1. 。前面有提到在 Titan X 上的速度,并且是同类实时性目标检测算法精度的两倍
    1. 预测时考虑图片全局信息。 不同于滑动窗口及 region proposal 的方法,YOLO 在训练和测试时候是利用整张图像的,所以它可以编码更多的文本信息。 Fast R-CNN 背景错误率很高就是因为它不能捕捉到更大的背景,YOLO 则比 Fast R-CNN 背景错误率低。
    1. 更具泛化性。 若在自然图像中训练,在艺术作品上测试, YOLO 比 DPM 和 R-CNN 好了一大截。

但是 YOLO 的整体准确性能还是比当时的 state-of-the-art (非实时性检测方法)落下一截的。

2. Unified Detection

目标检测: YOLOv1

首先将图片分成 SxS 个小网格,如果一个物体的中心(坐标)落在了某个小网格中,则这个小网格就负责检测这个物体。 每个网格会生成 B 个 bounding box ,**这些 bounding box 的宽高范围是全图。**并且每个 bounding box 有自己的置信度。这个置信度反映了这个网格中包含物体的可能性,并且对 bounding box 的预测的准确性。 每个 bounding box 会有 5 个预测:(x,y,w,h)confidencex,y 为 bounding box 的中心坐标,w,h 为整幅图片的宽和高,confidence 则是表示预测的 bounding box 与真值框的 IoU。 每个小网格还会预测 C 个条件类别概率,对映于 C 个类,最终找出最大概率对应的类别:

目标检测: YOLOv1

由上面的公式可以得到每个 bounding box 的 confidence score , 所以最后网络会将一个图片编码成一个 S x S x (B*5 + C) 的张量, 最后在 VOC 数据集上测试的YOLO ,设置 S=7,B=2,C=20, 最后是一个 7x7x30 的张量。

2.1 Network Design

本文网络结构的灵感来自于 GoogLeNet, 网络有 24 个卷积层和 2 个全连接层,卷积层用来提取特征,全连接层用来进行预测。 不同的是没有用多分支结构,而是只用了 1x1 来降低通道数后跟上 3x3 的卷积层,有点类似于 Network In Network。

目标检测: YOLOv1

2.2 Training

网络预先将卷积网络预先在 1000 分类的 ImageNet 上进行了预训练。预训练的网络是使用了网络的前 20 层卷积层 + 1个average pooling + 1个全连接层。 然后基于[参考文献29] 提出的增加卷积层和全连接层可以提升网络目标检测的性能,由此在预训练网络的基础上,本文增加了 4 个卷积层以及两个全连接层。为了增加图像的细节信息,把输入图像的分辨率从 224x224 变成了 448x448。 网络的最后同时预测分类概率和 bounding box 坐标。 训练时将坐标信息都映射到 [0,1] 之间, 网络的**函数使用的是 Leaky ReLu, 用了平方和误差函数来优化网络。 为了平衡坐标损失函数与分类损失函数, 将它们乘以了不同的系数,这里 坐标损失函数的系数为 λcoord= 5 ,分类损失函数系数为 λnoord=0.5。

目标检测: YOLOv1

其中的 1iobj 表示物体的中心是否出现在第 i 个格子中,1i,jobj 表示第 i 个栅格中的第 j 个 bounding box 是否负责预测这个物体。

函数第1部分 : 负责坐标信息 (x,y,w,h) 的预测。这里不是直接对 w,h 直接进行计算,而是开根后计算损失函数是为了减少大小差别较大的边界框之间的差距

函数第2部分 : 含 object 的 box 的 confindence 预测

函数第3部分 : 不含 object 的 box 的 confindence 预测。所有分格中,不包含物体中心坐标的格子占大多数,所以累计起来 第三部分的数值会很大,为了平衡相互之间的大小关系,这里乘以了一个 0.5 的系数

函数第4部分 : 对具有类别中心的格子进行类别预测

为了避免过拟合,训练时网络也加入了 0.5 概率的 dropout 和一些数据增广的操作。最后的采用非极大值抑制来消除冗余的检测框。

2.4 Limitations of YOLO

由于每个网格单元只能预测两个框,并且只能有一个类,因此Yolo对边界框预测施加了强大的空间约束。这个约束在物体距离很近的时候效果并不好,且在检测小目标上效果不好。网络对待大bounding box 和 小 bounding box 的处理方式是一样的,但是一个同等的数值,对大 bounding box 与真值框的 IoU 影响不是很大,但是对于 小 bounding box 的预测却可能产生很大的影响。

第一版出来以后作者提出的 darknet等都是在自己的网站上实现的而不是主流框架,这可能也是当时没有流行起来的原因。后面随着YOLO系列的不断改进, 逐渐被越来越多的人所使用。

具体实验操作及结果对比可以参见论文原文!

参考博客:http://www.cnblogs.com/fariver/p/7446921.html