论文原文:https://arxiv.org/pdf/1506.02640.pdf

Tensorflow版本yolo v1:https://github.com/gliese581gg/YOLO_tensorflow

Abstract 摘要

 本文提出了一种新的物体检测方法YOLO。YOLO之前的物体检测方法主要是通过region proposal产生大量的可能包含待检测物体的 potential bounding box,再用分类器去判断每个 bounding box里是否包含有物体,以及物体所属类别的 probability或者 confidence,如R-CNN,Fast-R-CNN,Faster-R-CNN等。YOLO不同于这些物体检测方法,它将物体检测任务当做一个regression问题来处理,使用一个神经网络,直接从一整张图像来预测出bounding box 的坐标、box中包含物体的置信度和物体的probabilities。因为YOLO的物体检测流程是在一个神经网络里完成的,所以可以end to end来优化物体检测性能。YOLO检测物体的速度很快,标准版本的YOLO在Titan X 的 GPU 上能达到45 FPS。网络较小的版本Fast YOLO在保持mAP是之前的其他实时物体检测器的两倍的同时,检测速度可以达到155 FPS。相较于其他的state-of-the-art 物体检测系统,YOLO在物体定位时更容易出错,但是在背景上预测出不存在的物体(false positives)的情况会少一些。而且,YOLO比DPM、R-CNN等物体检测系统能够学到更加抽象的物体的特征,这使得YOLO可以从真实图像领域迁移到其他领域,如艺术。

1,Introduction(介绍)

 人们瞥视图像,立即知道图像中的物体,它们在哪里以及它们如何相互作用。 人类的视觉系统是快速和准确的,使我们能够执行复杂的任务,例如驾驶时几乎没有意识的想法。 快速,准确的目标检测算法可以让计算机在没有专门传感器的情况下驾驶汽车,使辅助设备能够向人类用户传达实时的场景信息,并释放通用目标响应式机器人系统的潜力。
 当前的物体检测系统使用分类器来完成物体检测任务。为了检测一个物体,这些物体检测系统要在一张测试图的不同位置和不同尺寸的bounding box上使用该物体的分类器去评估是否有该物体。如DPM系统,要使用一个滑窗(sliding window)在整张图像上均匀滑动,用分类器评估是否有物体。
 在DPM之后提出的其他方法,如R-CNN方法使用region proposal来生成整张图像中可能包含待检测物体的potential bounding boxes,然后用分类器来评估这些boxes,接着通过post-processing来改善bounding boxes,消除重复的检测目标,并基于整个场景中的其他物体重新对boxes进行打分。整个流程执行下来很慢,而且因为这些环节都是分开训练的,检测性能很难进行优化。
 本文提出的YOLO(you only look once),将物体检测任务当做回归问题(regression problem)来处理,直接通过整张图片的所有像素得到bounding box的坐标、box中包含物体的置信度和class probabilities。通过YOLO,每张图像只需要输入到神经网络就能得出图像中都有哪些物体和这些物体的位置。
 YOLO非常简单:参见图1.单个卷积网络可同时预测多个边界框和这些盒的类概率.YOLO训练全图像并直接优化检测性能。 这种统一的模型与传统的物体检测方法相比有许多优点。

图1:YOLO检测系统。 用YOLO处理图像简单而直接。 我们的系统(1)将输入图像的大小调整为448×448,(2)在图像上运行单个卷积网络,以及(3)通过模型的置信度对结果检测进行阈值。

YOLO模型相对于之前的物体检测方法有多个优点:
1、YOLO检测物体非常快。
因为没有复杂的检测流程,只需要将图像输入到神经网络就可以得到检测结果,YOLO可以非常快的完成物体检测任务。标准版本的YOLO在Titan X 的 GPU 上能达到45 FPS。更快的Fast YOLO检测速度可以达到155 FPS。而且,YOLO的mAP是之前其他实时物体检测系统的两倍以上。
2、YOLO可以很好的避免背景错误,产生false positives。
不像其他物体检测系统使用了滑窗或region proposal,分类器只能得到图像的局部信息。YOLO在训练和测试时都能够看到一整张图像的信息,因此YOLO在检测物体时能很好的利用上下文信息,从而不容易在背景上预测出错误的物体信息。和Fast-R-CNN相比,YOLO的背景错误不到Fast-R-CNN的一半。
3、YOLO可以学到物体的泛化特征。
当YOLO在自然图像上做训练,在艺术作品上做测试时,YOLO表现的性能比DPM、R-CNN等之前的物体检测系统要好很多。因为YOLO可以学习到高度泛化的特征,从而迁移到其他领域。
尽管YOLO有这些优点,它也有一些缺点:
1、YOLO的物体检测精度低于其他state-of-the-art的物体检测系统。
2、YOLO容易产生物体的定位错误。
3、YOLO对小物体的检测效果不好(尤其是密集的小物体,因为一个栅格只能预测2个物体)。

2,Unified Detection

我们将目标检测的单独集成到单个神经网络中。 我们的网络使用整个图像的特征来预测每个边界框。 它还同时预测所有类的所有边界框。 这意味着我们的网络能够在全球范围内全面了解图像中的全部图像和图像中的所有对象YOLO设计可实现端到端训练和实时速度,同时保持较高的平均精度。
YOLO将输入图像划分为S*S的栅格,每个栅格负责检测中心落在该栅格中的物体。
q u a d 每一个栅格预测B个bounding boxes,以及这些bounding boxes的confidence scores。这个 confidence scores反映了模型对于这个栅格的预测:该栅格是否含有物体,以及这个box的坐标预测的有多准。公式定义如下:
c o n f i d e n c e = P r ( O b j e c t ) I O U p r e d t r u t h
如果这个栅格中不存在一个object,则confidencescore应该为0。否则的话,confidence score则为predicted bounding box与 ground truth box之间的 IOU(intersection over union)。
YOLO对每个bounding box有5个predictions:x, y, w, h,
and confidence。
坐标x,y代表了预测的bounding box的中心与栅格边界的相对值。
坐标w,h代表了预测的bounding box的width、height相对于整幅图像width,height的比例。
confidence就是预测的bounding box和ground truth box的IOU值。 每一个栅格还要预测C个conditional class probability(条件类别概率):Pr(Classi|Object)。即在一个栅格包含一个Object的前提下,它属于某个类的概率。我们只为每个栅格预测一组(C个)类概率,而不考虑框B的数量。整个yolo算法的流程如图2.

图2: 我们的YOLO系统将检测模型化为回归问题。 它将图像划分为S×S网格,并且每个网格单元预测B个边界框,对这些框的置信度以及C类概率。 这些预测值被编码为S×S×(B * 5 + C)张量。为了评估PASCAL VOC上的YOLO,我们使用S = 7,B = 2。PASCAL VOC有20个标记类,因此C = 20。我们的最终预测是7×7×30张量。

2.1 Network Design

我们将此模型作为卷积神经网络实施并在PASCAL VOC检测数据集上进行评估。 网络的初始卷积层从图像中提取特征,而全连接的层预测输出概率和坐标。
YOLO网络借鉴了GoogLeNet分类网络结构。不同的是,YOLO未使用inception module,而是使用1x1卷积层(此处1x1卷积层的存在是为了跨通道信息整合)+3x3卷积层简单替代。完整的网络结构如图3所示。

最终的输出结果是一个7*7*30的张量。

2.2 训练

首先利用ImageNet 1000-class的分类任务数据集Pretrain卷积层。使用上述网络中的前20 个卷积层,加上一个 average-pooling layer,最后加一个全连接层,作为 Pretrain 的网络。训练大约一周的时间,使得在ImageNet 2012的验证数据集Top-5的精度达到 88%,这个结果跟 GoogleNet 的效果相当。
将Pretrain的结果的前20层卷积层应用到Detection中,并加入剩下的4个卷积层及2个全连接。同时为了获取更精细化的结果,将输入图像的分辨率由 224* 224 提升到 448* 448。
将所有的预测结果都归一化到 0~1, 使用 Leaky RELU 作为激活函数。 Leaky RELU的公式如下:

Leaky RELU可以解决RELU的梯度消失问题。
损失函数的设计目标就是让坐标(x,y,w,h),confidence,classification 这个三个方面达到很好的平衡。
简单的全部采用了sum-squared error loss来做这件事会有以下不足:
a) 8维的localization error和20维的classification error同等重要显然是不合理的。
b) 如果一些栅格中没有object(一幅图中这种栅格很多),那么就会将这些栅格中的bounding box的confidence 置为0,相比于较少的有object的栅格,这些不包含物体的栅格对梯度更新的贡献会远大于包含物体的栅格对梯度更新的贡献,这会导致网络不稳定甚至发散。 为了解决这些问题,YOLO的损失函数的定义如下:

还有一张网上的详细的对损失函数的解释图

更重视8维的坐标预测,给这些损失前面赋予更大的loss weight, 记为 λcoord ,在pascal VOC训练中取5。(上图蓝色框)
对没有object的bbox的confidence loss,赋予小的loss weight,记为 λnoobj ,在pascal VOC训练中取0.5。(上图橙色框)
有object的bbox的confidence loss (上图红色框) 和类别的loss (上图紫色框)的loss weight正常取1。
对不同大小的bbox预测中,相比于大bbox预测偏一点,小box预测偏相同的尺寸对IOU的影响更大。而sum-square error loss中对同样的偏移loss是一样。
为了缓和这个问题,作者用了一个巧妙的办法,就是将box的width和height取平方根代替原本的height和width。 如下图:small bbox的横轴值较小,发生偏移时,反应到y轴上的loss(下图绿色)比big box(下图红色)要大。

在 YOLO中,每个栅格预测多个bounding box,但在网络模型的训练中,希望每一个物体最后由一个bounding box predictor来负责预测。
因此,当前哪一个predictor预测的bounding box与ground truth box的IOU最大,这个 predictor就负责 predict object。
这会使得每个predictor可以专门的负责特定的物体检测。随着训练的进行,每一个 predictor对特定的物体尺寸、长宽比的物体的类别的预测会越来越好。

2.3 Inference

就像在训练中一样,图像的检测只需要一个网络评估。 在PASCAL VOC上,网络预测每个图像的98个边界框和每个框的类概率。 YOLO在测试时间速度非常快,因为它只需要一个网络预测,而不像基于分类器的方法。

2.4 Limitations of YOLO

  1. 每个 grid cell 只预测一个 类别的 Bounding Boxes,而且最后只取置信度最大的那个 Box。这就导致如果多个不同物体(或者同类物体的不同实体)的中心落在同一个网格中,会造成漏检。
  2. 预测的 Box 对于尺度的变化比较敏感,在尺度上的泛化能力比较差。
  3. 识别物***置精准性差
  4. 召回率低

3. 和其他的目标检测算法的对比

下表给出了YOLO与其他物体检测方法,在检测速度和准确性方面的比较结果(使用VOC 2007数据集)。

论文中,作者还给出了YOLO与Fast RCNN在各方面的识别误差比例,如下图。YOLO对背景内容的误判率(4.75%)比fast rcnn的误判率(13.6%)低很多。但是YOLO的定位准确率较差,占总误差比例的19.0%,而fast rcnn仅为8.6%。

YOLO算法的优点如下:
1,速度快,YOLO将物体检测作为回归问题进行求解,整个检测网络pipeline简单。在titan x GPU上,在保证检测准确率的前提下(63.4% mAP,VOC 2007 test set),可以达到45fps的检测速度。
2,背景误检率低。YOLO在训练和推理过程中能‘看到’整张图像的整体信息,而基于region proposal的物体检测方法(如rcnn/fast rcnn),在检测过程中,只‘看到’候选框内的局部图像信息。因此,若当图像背景(非物体)中的部分数据被包含在候选框中送入检测网络进行检测时,容易被误检测成物体。测试证明,YOLO对于背景图像的误检率低于fast rcnn误检率的一半。
3,通用性强。YOLO对于艺术类作品中的物体检测同样适用。它对非自然图像物体的检测率远远高于DPM和RCNN系列检测方法。

4 测试

Test的时候,每个网格预测的class信息 ( P r ( C l a s s i | O b j e c t ) ) 和bounding box预测的confidence信息 ( P r ( O b j e c t ) I O U p r e d t r u t h ) 相乘,就得到每个bounding box的class-specific confidence score。

1. 等式左边第一项就是每个网格预测的类别信息,第二三项就是每个bounding box预测的confidence。这个乘积即encode了预测的box属于某一类的概率,也有该box准确度的信息。

2. 对每一个网格的每一个bbox执行同样操作: 7x7x2 = 98 bbox (每个bbox既有对应的class信息又有坐标信息)

3. 得到每个bbox的class-specific confidence score以后,设置阈值,滤掉得分低的boxes,对保留的boxes进行NMS处理,就得到最终的检测结果。

5 NMS(非极大值抑制)

在得到Bounding Box,Confidence, Class probability后利用非极大值抑制算法保留目标框。

6 思考

  1. YOLOv1最大的开创性贡献在于将物体检测作为一个回归问题进行求解,输入图像经过一次inference,便能得到图像中所有物体的位置和其所属类别及相应的置信概率。而rcnn/fast rcnn/faster rcnn将检测结果分为两部分求解:物体类别(分类问题),物***置即bounding box(回归问题),所以YOLO的目标检测速度很快。
  2. YOLO仍然是一个速度换精度的算法,目标检测的精度不如RCNN

参考文档:
https://blog.csdn.net/hrsstudy/article/details/70305791
https://zhuanlan.zhihu.com/p/25236464
https://blog.csdn.net/jningwei/article/details/80010567
https://zhuanlan.zhihu.com/p/24916786?utm_source=qq&utm_medium=social
https://www.bilibili.com/video/av23354360?from=search&seid=14097781066157427376