YOLO 论文笔记

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u014061630/article/details/80860462

YOLO:You Only Look Once: Unified, Real-Time Object Detection

摘要

YOLO 将目标检测问题看作 bbox 回归和分类问题。在预测中,由一个网络完成 bbox预测 和 类别预测。

YOLO 的检测速度极快,每秒可处理45张图片(Titan X)。Fast YOLO(更小的YOLO)每秒可以处理155张照片。

代码:http://pjreddie.com/yolo/

1. 简介

R-CNN 首先在图片上计算产生很多潜在的 bbox,然后在这些潜在的 bbox 上运行分类器。在分类器后,后处理被使用去修正 bbox,消除重复的检测,根据场景中其它的object,对 bbox 进行重新打分。整个检测过程很慢、很难去优化,因为每一个部件需要单独进行训练。

YOLO 将目标检测看作一个回归问题,直接从图像的像素计算 bbox 和 类别概率。

下图是YOLO的架构图:
这里写图片描述
从图中可以看出,YOLO 使用单个卷积网络来预测 bbox 和 类别概率(simultaneously)。YOLO 在所有的图片上进行训练,直接优化检测性能。

YOLO相比传统检测算法,有以下几个优点:

  • YOLO 非常快。
  • YOLO 根据整张图片做出预测。不像sliding window 和 region proposal-based 技术,YOLO 训练和测试时将整张图片作为输入,这使得它可以对语境信息进行处理。Fast R-CNN 将背景误判为object,因为它不能感知图片的语境。YOLO对于背景误判的数量比Fast R-CNN少一半。
  • YOLO 学习 object 的泛化的表示。YOLO 的性能比DPM、R_CNN高许多。因为 YOLO 的泛化性能很好,所以在应用于新的数据集时,性能不会有太大的下降。

YOLO 仍然落后于当前的 state of art 检测算法。虽然它能快速的识别图片中的 object,但是它很难精确定位一些 object,尤其是一些小物体。

YOLO 的训练和测试代码是开源的。并且作者开源了很多预训练好的模型。

2. 单步检测(同时检测位置和类别:Unifed Detection)

YOLO 将检测的定位和识别过程合二为一。YOLO 基于整张图片的特征来预测每一个 bbox。它能够同时预测所有类的 bbox。这意味着YOLO的预测是基于整张图片和图片中的所有目标的。同时,单步检测使得 YOLO 的检测速度非常快。

YOLO 将输入图像划分为 S×SS \times S 的网格。如果一个 object 的中心落入一个网格单元内,则该网络单元负责检测该 object。

每一个网格单元预测 BB 个 bbox 以及这些 bbox 的概率。这些概率反映该 box 包含 object 的概率,同时也反映预测 box 的概率。作者将这个概率定义为:Pr(Object)*IoUpredtruth\text{Pr(Object)*IoU}_{\text{pred}}^{\text{truth}}。如果一个网格单元不包含 object,则该网格单元对应的概率为0。否则,我们我们令该网格单元的概率等于预测的 box 和 ground truth box 的 IoU。

每一个 bbox 包含5个预测:x,y,w,hx, y, w, h 和 confidence。(x,y)(x,y) 为 bbox 的中心网格单元。wwhh 表示相对于整个网络的宽度和高度。最后,confidence 表示预测的 box 和 ground truth box 的 IoU。

每个网络单元还预测 CC 条件概率。Pr(ClassiObject)\text{Pr}(\text{Class}_{i}|\text{Object})。计算网格单元包含一个 object 的情况下各类的条件概率。无论boxes BB 的数量有多少,每一个网格单元只进行一次分类概率计算。

在测试时,YOLO 将 box 的概率和网格单元上的条件概率相乘,Pr(ClassiObject)Pr(Object)IoUtruthpred=Pr(Classi)IoUtruthpred\text{Pr}(\text{Class}_{i}|\text{Object})*\text{Pr}(\text{Object})*\text{IoU}\frac{\text{truth}}{\text{pred}}=\text{Pr}(\text{Class}_{i})*\text{IoU}\frac{\text{truth}}{\text{pred}}
这给每个 box 的各个类别的概率。这些概率表示 在 box 中每个类别的概率 和 这些box和object的契合程度。

这里写图片描述

YOLO 在 Pascal VOC数据集上测试时,使用 S=7S=7B=2B=2。Pascal VOC 有20类,所以 C=20C=20,所以最终的预测是一个 7×7×307 \times 7 \times 30 的tensor。

2.1. 网络设计

YOLO 整体上就是一个卷积网络。前面的卷积层从图片中提取特征,后面的FC输出概率和坐标。

YOLO 受 GoogLeNet 的启发,网络有24个卷积层 + 2个FC层。与GoogLeNet 不同的是,YOLO 在 3x3 卷积前加了 1x1 卷积。这和 NIN 网络有点像,整个网络的架构如下图。

这里写图片描述

在 ImageNet 上进行预训练,然后将图像的分辨率调高一倍,来做目标检测

作者也训练了一个 Fast YOLO 来提高检测速度。Fast YOLO 使用了 9 层卷积。除了网络的尺寸,Fast YOLO 的其他配置和 YOLO 完全一致。

YOLO 最终的输出是一个 7×7×307 \times 7 \times 30 的 Tensor。

2.2. 训练

作者在 ImageNet-1K 上预训练卷积网络。对于预训练,作者使用图3中的前 20 个卷积层 + 一个平均池化层 + 一个 FC 层。作者将这个网络预训练大概1周,在 ImageNet 2012 验证集上取得了单一裁剪 top-5 准确率:88%,和 caffe model zoo 里的 GoogLeNet 不同,作者使用 Darknet 框架进行训练和推理。

然后将模型转换到检测任务。Ren 等人表明:在预训练好的网络上添加卷积层和全连接层能够提高性能。按照它们的思路,作者添加了 4 个 conv 层和 2 个 FC 层,添加的层的权重采用随机初始化。检测经常需要细粒度的视觉信息,所以作者将网络的输入的分辨率从 224x224 增加到 448x448。

YOLO 的最后一层同时预测类别的概率和 bbox 坐标。作者根据图像的宽度和高度对 bbox 的宽度和高度进行了归一化。我们将 bbox 的 xxyy 坐标定义为一个网格单元的偏移量(offsets),所以xxyy介于0到1之间。

网络的最后一层使用线性激活函数,其它的所有的层使用 leaky rectified linear activation:ϕ={xif x>00.1xotherwise\phi=\left\{ \begin{array}{lr} x & \text{if}\text{ }x>0 \\ 0.1x & \text{otherwise}\\ \end{array}\right.

作者选择了平方和误差函数(sum-squared error),因为该函数很容易去优化,但是它和我们的目标(mAP)是不一致的。它对于定位误差和分类误差的权重是一样的,这可能不是理想的(完美的)。同时,在每张图片中,很多网格单元不包含任何 object。这使得这些网格单元的 confidence 趋向于0,通常掩盖了包含 object 的网格单元的梯度。这可能导致模型不稳定,导致训练初期的发散。

为了弥补这个缺点,作者增加了 bbox 坐标预测的损失函数,同时减少了不包含任何 object 的 boxes 的损失函数(the loss from confidence predictions for boxes that don’t contain objects)。作者使用了两个参数:λcoord\lambda_{coord}λnoobj\lambda_{noobj} 来达到这个目的。作者设置 λcoord=5\lambda_{coord}=5λnoobj=0.5\lambda_{noobj}=0.5

平方和误差函数对于大 boxes 和小 boxes 的 error 设置相等的权重。我们的误差函数应该有这样的特性:小 boxes 的小偏差比大 boxes 的小偏差更重要(意思是:小的 boxes 对于偏差更敏感)。为了部分缓解这个问题,网络预测 bbox 的宽度和高度的平方根(square root),而不是直接预测宽度和高度。

每个网格单元,YOLO 预测多个 bbox。在训练时,作者只想让一个 bbox predictor 负责一个 object。作者指定一个 predictor 预测一个 object(predicted bbox 与 ground truth 有最高的 IoU 的预测)。这导致 bbox 和 predictor 之间的专一性(一个predictor预测一个bbox)。每一个 predictor 擅长预测固定尺寸、宽高比 或 类别的物体、提高整体的 recall。

训练过程中,作者优化下面的 multi-part loss function:
公式

其中,1iobj\mathbb{1}_{i}^{\text{obj}} 表示第 ii 个网格单元负责预测该目标;1i,jobj\mathbb{1}_{i,j}^{\text{obj}} 表示第 ii 个网格单元的第 jj 个 bbox 负责预测该目标。

注意:如果一个物体的位置预测正确,则损失函数只惩罚分类误差(因此使用条件概率)。如果位置预测不正确,则只惩罚位置误差(原始英文为:Note that the loss function only penalizes classification error if an object is present in that grid cell (hence the conditional class probability discussed earlier). It also only penalizes bounding box coordinate error if that predictor is “responsible” for the ground truth box (i.e. has the highest IOU of any predictor in that grid cell).)

我们在 VOC 07+12 数据集 trainval 上,总共训练了 135 个 epoch。batch size 为 64,momentum 为 0.9,decay 为 0.0005。当在 VOC 2012 测试集上测试时,作者也使用了 VOC 07 测试集来训练。

学习速率的策略是:第一个 epoch,将学习速率从 10310^{-3} 调到 10210^{-2}。如果一开始就使用一个高的学习速率,模型很容易由于不稳定的梯度而发散。后面继续使用 10210^{-2} 的学习速率训练 75 个 epoch,然后使用 10310^{-3} 的学习速率训练 30 个 epoch,最后使用 10410^{-4} 的学习速率训练 30 个epoch

为了避免过拟合,作者使用了 dropout 和 数据增强技术。在第一个 FC 层后使用 rate=0.5 的dropout 层来阻止层之间相互适应[参考文献18]。数据增强技术,作者使用了随机缩放(最高缩放20%的尺寸)、随机调整曝光度、饱和度。

2.3. 推理(Inference)

在 VOC 数据集上,每张图片产生 98 个bbox和相应的类别概率。与 classifier-based方法不同,YOLO 测试时,同时预测位置和类别。

网格式的设计保证了预测的 bbox 的多样性。通常object位于哪个网格单元是很清楚的,对于每一个 object 只能预测一个 bbox。但是,一些大的object 或 靠近多个单元的边缘的object 能够用多个单元来很好的定位。NMS 被用来去除掉多余的预测。虽然 NMS 不是核心,但是和 R-CNN 或 DPM 类似,NMS 能够将 mAP 提高 2-3%。

2.4 YOLO 的缺点

YOLO 对 bbox 预测施加了很强的空间限制:每一个网格单元只能预测两个 box,每个网格单元只能有一个类别。这个限制导致 YOLO 能够检测的临近物体的数量很有限。YOLO 对于成群的小目标的检测有点困难,比如:成群的鸟。

因为YOLO直接从图像中学习怎么去预测 bbox,所以它很难泛化到新的或不常见的宽高比的 object。因为 YOLO 架构中使用了多个池化层,这导致 YOLO 最后的bbox 是基于相对粗糙的特征产生的。

最后,YOLO 使用的损失函数 对待 大 bbox 和 小 bbox 的权重是相同的。在大 bbox 上有小的误差是良性的,但是小 bbox 上的偏差对于 IoU 有很大的影响。YOLO 的主要错误是定位错误。

3. 与其它的检测系统的对比

目标检测算法一般首先从图像中提取一系列鲁棒的特征(例如,Haar [25],STFT [23],HOG [4],卷积特征 [6]),然后使用分类器[ 36211310] 或 定位器 [132] 在特征空间识别目标。这些分类器和定位器对 sliding window 或 图像的某一块区域[351539] 进行判别。我们将 YOLO 和大量的顶尖的检测算法做了对比,并强调了相同和不同。

Deformable parts models 对比
Deformable parts model 又称 DPM。【非常值得研读】DPM 使用 sliding window 方法来检测目标 [10]。DPM是一种基于部件的检测方法,对目标的形变具有很强的鲁棒性。DPM算法采用了改进后的HOG特征,SVM分类器和滑动窗口(Sliding Windows)检测思想,针对目标的多视角问题,采用了多组件(Component)的策略,针对目标本身的形变问题,采用了基于图结构(Pictorial Structure)的部件模型策略。此外,将样本的所属的模型类别,部件模型的位置等作为潜变量(Latent Variable),采用多示例学习(Multiple-instance Learning)来自动确定。

R-CNN 对比
R-CNN 和它的变种使用 region proposals 来寻找图像中的对象。Selective Search [35] 产生很多潜在的 bbox(就是可能有目标的位置),然后一个卷积网络提取特征,一个 SVM 根据卷积提取的特征对 region proposal 进行分类(scores the boxes),一个线性模型调整 bbox,NMS 消除重复的检测。该检测方法的每一个阶段都需要独立地精调,这导致模型很复杂,也很慢,测试时每张图片耗时40秒(注意这里使用的Titan X 显卡,不是渣渣 CPU 时间)。

YOLO 与 R-CNN 有一些相似之处。基于卷积特征,每一个网格单元给出潜在的 bbox 并 对 scores 这些 bbox。但是,YOLO 限制了每一个网格单元上给出的潜在的bbox 的数量,有助于减轻物体的重复检测。YOLO 预测的bbox也更少,Selective Search 每张图片生成2000个proposal,而YOLO一张图片只有98个proposal。最后,YOLO是一个单步检测系统。

Other Fast Detectors
FastFaster R-CNN 主要焦点是通过共享计算、使用神经网络去 propose regions 来加速 R-CNN 检测框架。他们将R-CNN的检测速度加快了许多,但仍达不到实时检测。

很多研究的焦点是加速DPM。它们使用级联、使用GPU等方式加快 HOG 的计算。但是DPM实时检测只做到了 30 帧。

Deep MultiBox 对比
Szegedy 等人 [8] 使用卷积神经网络去预测 RoI,而不再采用 Selective Search。MultiBox 也能够进行单类别目标检测,只需要用一个 single class 预测代替confidence 预测。但是,MultiBox 不能够进行通用目标检测。如果MultiBox要进行通用目标检测,仍需要进一步的 image patch 分类。YOLO 和 MultiBox 都使用了卷积网络去预测 bbox,但是 YOLO 是一个完整的检测系统。

OverFeat 对比
Sermanet 等人 [32] 训练一个卷积神经网络去进行定位,并且采用定位器去进行检测。OverFeat 高效地进行 sliding window 检测,但是它仍然是一个多阶段系统。OverFeat 优化了定位过程,而不是检测性能。类似于 DPM,定位器只观察局部的信息,因此需要牛掰的后处理程序去处理相干涉的检测。

MultiGrasp 对比
YOLO 的设计和 Redmon 等人设计的抓取(grasp)检测算法相似。YOLO 基于网格预测 bbox 的想法来自于 MultiGrasp。但是,抓取检测是一个比目标检测简单的多的任务。MultiGrasp只需要去对包含一个目标的图像预测一个抓取的区域。它不需要去估计尺寸、位置、边界、类别,只需要找出适合抓取的一个区域。YOLO 既预测bbox,又预测类别。

4. 实验

待续

4.1. 与其它实时检测系统的对比

待续

4.2. VOC 2007 数据集上的错误分析

待续

4.3. YOLO 和 Fast RCNN的比较

待续

4.4. VOC 2012 数据集上的结果

待续

4.5. Generalizability: Person Detection in Artwork

待续

5. Real-Time Detection In The Wild

待续

6. 结论

待续

参考文献:

参考文献18

**YOLO:**https://blog.csdn.net/Zfq740695564/article/details/79754578 里面的动图很有意思,值得一看。

目标检测算法总结http://www.cnblogs.com/lillylin/p/6207119.html

darknet 转Keras http://www.cnblogs.com/tensorflownews/p/8922359.html

展开阅读全文

没有更多推荐了,返回首页