《You Only Look Once: Unified, Real-Time Object Detection》论文精读报告

YOLO是当前最常用的实时目标检测方法之一,从YOLOv1发布起已经经历了诸多版本迭代与改进,截止到2023年1月,YOLOv8已经问世。

《You Only Look Once》这篇论文就是在2016年提出YOLOv1的论文,从标题的Unified(统一)、Real-Time(实时)就可以看出YOLO的卖点:架构简单,速度快。

背景

目标检测是人类能够快速准确地识别图像中的物体,并感知它们的位置和关系,但计算机很难做到这一点。快速准确的目标检测算法可以使计算机在没有专门传感器和辅助设备的情况下执行驾驶等任务,为人类提供实时场景信息。目标检测关心图像中出现的物体类别位置大小,并且实时的目标检测通常有速度要求(30FPS)

当前的检测系统通过重用分类器来执行检测。为了检测对象,这些系统为该对象获取分类器,并在测试图像中的不同位置和尺度对其进行评估。如DPM使用滑动窗口方法,其中分类器在整个图像上以均匀间隔的位置运行。

更近期的方法,如R-CNN,则使用区域建议方法首先在图像中生成潜在的bounding box,然后在这些提议的bounding box上运行分类器。分类后,使用后处理来调整边界框、消除重复检测,并基于场景中的其他物体对框进行重新评分。由于每个单独的组件必须分别进行训练,所以这些复杂的流水线很难进行优化。

通过这些步骤的描述就可以看出,当前的目标检测方法都是需要有一套相应的pipline,这种复杂的流程很难达到实时检测的速度要求。

传统目标检测方法(如R-CNN、Fast R-CNN、Faster R-CNN等)存在的问题包括:

  • 计算量大:这些方法需要多次计算,速度较慢。
  • 候选区域生成不准确:这些方法先生成大量候选区域,再对每个区域进行分类,但是生成的候选区域往往包含很多不相关的区域,造成了冗余计算。
  • 模型结构复杂:这些方法的模型结构比较复杂,需要多个组件的组合和调整。

而YOLO将目标检测看成一个简单的回归问题而非分类问题,这样有许多好处:

  • 只需一次前向计算:YOLO算法只需要一次前向计算就能同时完成目标检测和分类任务,避免了多次计算的问题,速度更快
  • 基于全图卷积:YOLO采用全图卷积的方式进行目标检测,通过对整个图像进行卷积来检测目标,避免了候选区域生成的问题。
  • 简单的模型结构:YOLO的模型结构比较简单,只包含卷积层、池化层和全连接层,便于实现和调整,可以端到端地训练网络

方法

预测阶段

YOLO将图片划分为$S\times S$的网格,其中每个网格负责预测中心落在其中的B个bounding box,并预测是grid cell中的bounding box是某一类别的条件概率$𝑃𝑟(𝐶𝑙𝑎𝑠𝑠_𝑖│𝑂𝑏𝑗𝑒𝑐𝑡)$

每个bounding box由5个参数组成:中心点的位置$x$, $y$,大小$h$, $w$,以及bounding box内有一个物体的置信度$Pr⁡(𝑂𝑏𝑗𝑒𝑐𝑡)\times 𝐼𝑂𝑈_{𝑝𝑟𝑒𝑑}^{𝑡𝑟𝑢𝑡ℎ}$

在共有$C$种物体的情况下,我们会获得一个$S\times S\times (B\times 5+C)$的张量

在YOLO原文所使用的PASCAL VOC数据集中,$S=7$, $B=2$, $C=20$

比起以往的算法,YOLO的预测阶段非常简单:

  1. Resize图片为$448\times 448$
  2. 输入单个卷积神经网络,输出一个$S\times S\times (B\times 5+C)$的张量
  3. 对这个张量进行后处理(非极大值抑制),即可得到所有物体的位置、大小、类别

网络设计

YOLO的网络设计非常简单,只有24个卷积层,4个最大池化层和2个全连接层。这种简单的结构也是YOLO运行速度快的重要原因。

后处理

为了从神经网络输出的结果中得到最终结果,我们需要对输出结果进行后处理:

  1. 用每个bounding box所预测的置信度乘以对应grid cell所预测的每个类别的条件概率,得到每个bounding box中是对应类别的概率,即$B\times S\times S$个大小为$C$的向量
  2. 将低于域值的所有值置为0(因为概率太低)
  3. 对每种类别分别按概率对向量排序,并采取NMS算法
  4. 将剩余的非0值作为目标检测结果

NMS算法:对于每两个bounding box,若其IOU大于某一域值,则认为指向同一物体,将概率较小值设为0。

YOLO的后处理流程非常简单,这也是其高处理速度的原因之一。

训练阶段

YOLOv1在ImageNet-1000 Class上预训练前20层卷积层,后接平均池化层和全连接层,然后在用预训练的20层卷积层后接随机权重的4层卷积层和2层全连接层。

在训练之前,通过图像宽度和高度对bounding box的宽度和高度进行归一化,使它们落在 $0$ 到 $1$ 之间。将bounding box的$x$ 和 $y$ 坐标参数化为特定grid cell位置的偏移量,因此它们也限制在 $0$ 到 $1$ 之间。这样一来所有的输入输出值均应处于$[0, 1]$,便于神经网络进行处理。

在网络中,最后一层不使用激活函数,其他层使用leaky ReLU作为激活函数

损失函数使用平方和误差函数,易于优化。但平方和误差与最大化平均精度、最大化目标检测性能并不能很好吻和,会产生各类问题。为了消除或削弱这些问题,作者给出了他们的解决方法:

  1. 由于一张图片中物体通常很少,所以负责真正预测目标的bounding box数量过少,会导致不预测的bounding box所带来的Loss占比过大:因此需要对负责预测的和不负责预测的bouding box采用不同的权值。论文中$\lambda_{𝑐𝑜𝑜𝑟𝑑}=5$,$\lambda_{𝑛𝑜𝑜𝑏𝑗}=0.5$
  2. 对于不同大小的bounding box,在相对误差相同时,大框的绝对误差更大,而平方和误差没有考虑这一点。为了削减这一点,对长宽开根以削弱大框的误差。

由此我们可以得到最终的损失函数:

其中:

  • 前三行是负责检测物体的bounding box的损失函数
  • 第四行是不负责检测物体的bounding box的损失函数
  • 第五行是负责检测物体的grid cell的损失函数

  • 第一行是中心点的损失函数

  • 第二行是宽和高的损失函数
  • 第三四行是置信度误差
  • 最后一行是分类误差

  • 第三行中$\hat 𝐶_𝑖$为bounding box与ground truth的IOU

  • 第四行中$\hat C_i$为0

在论文中,作者也给出了他们训练时所用的超参数和一些细节:
num_epochs=135, batch_size=64, momentum=0.9, decay=0.0005, 学习率从$10^{-3}$Warm up到$10^{−2}$,然后再逐渐衰减(75次$10^{-2}$,30次$10^{−3}$,30次$10^{-4}$),Drop_out=0.5,并使用了适当的数据增强

评价

限制

从模型结构和算法流程中我们可以看出,YOLO虽然快,但也有一些天然的限制:

  • 每个grid cell只能产生B个bounding box,1个类别,只能预测出一个物体。对于密集的小目标而言效果不佳
  • 由于YOLO从数据中学习预测边界框,并且因为架构中有多个池化层和下采样层,使用相对粗粒度的特征来预测边界框,很难推广到新的或不寻常的纵横比或配置中的对象
  • 最后,YOLO在小bounding box和大bounding box中采用相同的损失函数。大框中的一个小误差通常是良性的,但小框中的一个小误差对 IOU 的影响要大得多。主要误差来源是不正确的定位

与其他模型的比较

以往的目标检测流程通常从输入图像中提取一组鲁棒的特征,然后,用classifiers或localizers在特征空间中识别目标。这些classifiers或localizers在整个图像上以滑动窗口的方式运行,或者在图像的某些区域子集上运行。

  • DPM:DPM的pipeline非常长且采用静态特征,YOLO使用更简单的单一网络构建了更快更准的模型。
  • R-CNN:R-CNN是多阶段的流程,每个阶段都需要精确地独立地调整,产生2000个候选框,处理一张图片需要40秒。而YOLO将各步骤组建在一起,只产生98个候选框,每秒能处理45张图片
  • 其他的快速的Detectors:
    • Fast R-CNN和Faster R-CNN在R-CNN的基础上进行了改进和加速,虽然在速度和精度上都比R-CNN要高,但仍然达不到实时检测的速度需求
    • 很多工作提出了很多方法试图加速DPM的速度,但只有30Hz DPM能够达到实时检测的速度
    • Dectector在一些特殊的、专用的目标检测领域可以被高度优化
    • 而YOLO从设计方面就决定是非常的,是一个通用目标检测模型,可以检测大部分物体
  • Deep MultiBox:无法实现通用目标检测,且是一个庞大的工作流程
  • OverFeat:采用滑动窗口方法,有所有滑动窗口方法的共有问题:无法感知全图信息。同时需要庞大的后处理工作才能产生符合逻辑的结果。
  • MultiGrasp:MultiGrasp的目标是找到一个可抓取的区域,无关大小,位置等,而YOLO需要把所有信息预测出来

这些对比主要突出了YOLO的几个关键特征:快速、简单、通用

实验

为了验证YOLO的性能,作者进行了几个实验:

  1. 首先和其他实时检测系统,特别是R-CNN的变种在Pascal VOC 2007上进行了对比
  2. 和Fast R-CNN一起,对各类错误的比例进行了分析。
  3. 把YOLO和Fast R-CNN进行了结合以提升目标检测的性能
  4. 展示了2016年当年最先进的几种目标检测方法在VOC 2012上的性能
  5. 最后展示YOLO在新领域的非常强的泛化能力,如艺术作品数据集

实验一:与其他实时目标检测方法对比

  1. 在所有实时目标检测方法中,YOLO是最准的(其他模型的两倍),Fast YOLO是最快的
  2. YOLO比Fast YOLO高了10个mAP,同时保持住了实时目标检测的水准

实验二:YOLO与Fast R-CNN的错误比例分析

作者分别使用YOLO和Fast R-CNN,将测试阶段时每一个类别的概率最高的N个预测结果进行分类:

  • Correct:类别正确且IOU>0.5
  • Localization:类别正确且0.1<IOU<0.5
  • Similar:类别相似且IOU>0.1
  • Other:类别错误,IOU>0.1
  • Background:IOU<0.1

这里的IOU指的都是预测值与ground truth的IOU

结论:

  1. Fast R-CNN比YOLO准确性更高
  2. YOLO的定位错误比例更高
  3. YOLO的背景区分错误率很低

分析原因:

  1. Fast R-CNN是两阶段模型,其精度比单一阶段的YOLO更准确
  2. YOLO使用粗粒度特征,在细节的把控上较差
  3. YOLO能看到全部的图片,能隐式地区分背景和物体,而Fast R-CNN只能看到候选框内的物体

实验三:结合Fast R-CNN与YOLO

Fast R-CNN定位能力强而识别背景能力差,YOLO定位能力差而识别背景能力强。这让作者想到能否使用YOLO来优化Fast R-CNN的性能:

对于Fast R-CNN预测出的每一个bounding box,如果YOLO也预测出了类似的bounding box,则根据YOLO预测出的概率和两个bounding box的重合程度对其加一个boost。

可以看到Fast R-CNN在前三种优化中提升都较小,而结合了YOLO后较基模型提升较大。Fast R-CNN和YOLO的原理差别很大,这种大差别的两个模型的结合才能获取较大程序的优化。

实验四:Pascal VOC 2012测试集排行榜

作者在论文中给出了各种模型在Pascal VOC 2012测试集上的排行榜:

在排行榜上我们可以看出:

  • YOLO是排行榜上唯一的实时检测模型
  • YOLO在小物体上的性能不如其他模型
  • Fast R-CNN在结合了YOLO后排名上升了5名

这个排行榜与运行速度无关,只考虑结果精度,这让以速度见长的YOLO吃了小亏。

实验五:泛化能力

该实验测试了YOLO在其他的数据集(People-Art和Picasso)的性能,所有模型均在VOC 2007自然数据集上训练,然后拿到一些艺术品的数据集上去测试。在Picasso模型上训练VOC 2012的数据,在People-Art上训练VOC2010的数据。

在最后,作者也给我们看了一下YOLO的定性实验结果:

可以看到,除了下方第二张图将空中飞人识别成了飞机外,没有出现其他错误。这样的定性结果是相当好的。

总结

本文介绍了一种统一的目标检测模型YOLO。YOLO构造简单,可以直接在完整的图像上进行训练。

与基于分类器的方法不同,YOLO是在直接对应于检测性能的损失函数上进行训练的,并且整个模型是联合训练的。

Fast YOLO是当年(2016年)最快的通用对象检测模型,YOLO推动了实时对象检测的最先进技术。

YOLO还可以很好地推广到新的领域,使其成为依赖于快速、健壮的对象检测的应用程序的理想选择。