Object Detection - YOLO

Paper
code: Tensorflow, Caffe, Pytorch

YOLO 和 R-CNN 系列的 Object Detection 网络完全不同,采用了两种不同的思路。从 YOLO 的名字 You Only Look Once 就可以知道,原始的 R-CNN 系列是先得到 proposal 然后通过网络分类和回归。YOLO 则是直接在输出层回归 bounding box 的位置和目标的类别,该方法最大的特性就是快,可以达到实时检测,在 TITAN X 上可以达到 45 帧每秒,不过准确度显然是不如 R-CNN 系列的高了。

主要思想

该算法的主要思想是:

  • 将整张输入图片分为 $7 \times 7$ 的网格,共有 49 个格子。每个网格若包含某个物体的中心点,那么这个网格就负责这个物体的预测。
  • 首先通过传统的 CNN 来进行特征的提取等操作
  • 网络最后一层输出 $7 \times 7 \times 30$ 维的 Tensor,$7 \times 7$ 代表了原始划分的那 49 个网格。30 维每一维分别代表了不同的信息,包括位置,类别等

网络结构

Screenshot from 2017-12-15 16-13-43.png

细节部分

预训练

该网络首先在 ImageNet 上预训练,之后根据 Object detection networks on convolutional feature maps 文章所说,在预训练好的网络中,加入卷积和全连接层,可以增加性能,所以本网络的作者在预训练的网络中增加了 4 个卷积层和 2 个全连接层,随机初始化权重。同时输入提高到 448x448,因为检测通常需要 fine-graine 的信息。

最后 $7 \times 7 \times 30$ 的解释

首先,$7 \times 7$ 中的每一个 $1 \times 1$ 对应着我们一开始设定的划分好的 $7 \times 7$ 的格子。

接下来每一个 30 可以按照下图这样划分:
Screenshot from 2017-12-15 16-28-36.png
每一个格子需要预测两个不同比例的框,所以前两个 5 维的位置包含的分别是着两个不同比例的框的中心横纵座标,长宽,是否含有目标的置信度。后面的 20 维代表了属于 20 类中的哪一类。

损失函数

由于位置信息,类别,置信度等多种信息融合在了一个 30 维的 tensor 中,那么直接做普通的 loss 是显然不合适的,为了平衡每部分的 loss 的权重,该文章是这样设计 loss 的:

  • 特别重视前 10 维中的包含座标信息的 8 维。给予更大的权重,记为 $\lambda_{coord}$.
  • 对没有物体的 confidence loss 赋予更小的权重,记为 $\lambda_{noobj}$.
  • 对有物体的 confidence loss 赋予稍大的权重,记为 $\lambda_{noobj}$.
  • 对于小目标的位置偏移应采取更多的惩罚,但是在计算 loss 的时候,实际是一样的,为了解决这个问题,作者将 box 的 width 和 height 取平方根代替原本的 height 和 width。这样就可以通过平方根函数的曲线就可以看出,即便横轴间距相同(即不同物体偏移量相同),横轴座标越大(即物体尺寸更大),相应的差就越小。