专栏 | 目标检测算法之YOLOv1
- 2019 年 11 月 29 日
- 笔记
前言
今天开始分享一下 YOLO 系列的目标检测算法,前面介绍了 SSD 算法和 Faster-RCNN,现在公司用 Faster-RCNN 的似乎不是很多,主要集中在 YOLO,SSD 以及 CenterNet 等。我们的检测和宇宙和分割宇宙刚刚开始,之后会更新一些这些算法的代码实战等,敬请期待吧。
创新点
- 将整张图作为网络的输入,直接在输出层回归 bounding box 的位置和所属类别。
- 速度快,One-Stage 检测算法开山之作。
介绍
回顾 YOLO 之前的目标检测算法,都是基于产生大量可能包含物体的先验框,然后用分类器判断每个先验框对应的边界框里是否包含待检测物体,以及物体所属类别的概率或者置信度,同时需要后处理修正边界框,最后基于一些准则过滤掉置信度不高和重叠度较高的边界框,进而得到检测结果。这种基于先产生候选区域再进行检测的方法虽然有较高的精度,但速度非常慢。YOLO 直接将目标检测堪称一个回归问题进行处理,将候选区和检测两个阶段合二为一。YOLO 的检测过程如下所示:

Fig1
事实上,YOLO 并没有真正的去掉候选区,而是直接将输入图片划分成 7×7=49 个网格,每个网格预测两个边界框,一共预测 49×2=98 个边界框。可以近似理解为在输入图片上粗略的选取 98 个候选区,这 98 个候选区覆盖了图片的整个区域,进而用回归预测这 98 个候选框对应的边界框。
原理介绍
YOLO 将输入图像划分为 S*S 的栅格,每个栅格负责检测中心落在该栅格中的物体。每一个栅格预测 B 个 bounding boxes,以及这些 bounding boxes 的 confidence scores。这个 confidence scores 反映了模型对于这个栅格的预测:该栅格是否含有物体,以及这个 box 的坐标预测的有多准。公式定义如下:

如果这个栅格中不存在一个 object,则 confidence score 应该为 0。相反,confidence score 则为预测框与真实框框之间的交并比。
YOLO 对每个 bounding box 有 5 个 predictions:x, y, w, h,和 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 的数量。如 Fig2 所示:

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

训练
首先利用 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 的损失函数的定义如下:

网上找到一张详细的损失函数解释图:

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 对特定的物体尺寸、长宽比的物体的类别的预测会越来越好。
测试
测试的时候,每个网格预测的 class 信息

和 bounding box 预测的 confidence 信息

相乘,就得到每个 bounding box 的 class-specific confidence score。

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

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

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

NMS 的过程如下:

算法优缺点
优点
- 就像在训练中一样,图像的检测只需要一个网络评估。在 PASCAL VOC 上,网络预测每个图像的 98 个边界框和每个框的类概率。YOLO 在测试时间速度非常快,因为它只需要一个网络预测,而不像基于分类器的方法,所以速度很快。
- 速度快,YOLO 将物体检测作为回归问题进行求解,整个检测网络 pipeline 简单。在 titan x GPU 上,在保证检测准确率的前提下(63.4% mAP,VOC 2007 test set),可以达到 45fps 的检测速度。
- 背景误检率低。YOLO 在训练和推理过程中能‘看到’整张图像的整体信息,而基于 region proposal 的物体检测方法(如 rcnn/fast rcnn),在检测过程中,只‘看到’候选框内的局部图像信息。因此,若当图像背景(非物体)中的部分数据被包含在候选框中送入检测网络进行检测时,容易被误检测成物体。测试证明,YOLO 对于背景图像的误检率低于 fast rcnn 误检率的一半。
- 通用性强。YOLO 对于艺术类作品中的物体检测同样适用。它对非自然图像物体的检测率远远高于 DPM 和 RCNN 系列检测方法。
缺点
- 每个 grid cell 只预测一个 类别的 Bounding Boxes,而且最后只取置信度最大的那个 Box。这就导致如果多个不同物体(或者同类物体的不同实体)的中心落在同一个网格中,会造成漏检。
- 预测的 Box 对于尺度的变化比较敏感,在尺度上的泛化能力比较差。
- 识别物体位置精准性差。
- 召回率低。
和其它算法对比
Table1 给出了 YOLO 与其他物体检测方法,在检测速度和准确性方面的比较结果(使用 VOC 2007 数据集)。

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

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