深度学习之目标检测-YOLO算法(二)

Hits: 61

上文我们介绍了目标检测和目标定位的基础知识,本文我们就正式开始介绍YOLO算法。YOLO全称是You Only Look Once,这个算法来源于Joseph Redmon等人在CVPR 2015上发表的一篇论文:You Only Look Once: Unified, Real-Time Object Detection,它不仅解决了目标边界框不精确的问题,而且算法速度也很快,下面让我们看看它是如何实现的。

基本思路

YOLO的基本思路是,把一个大的图像分割成更小更精细的n等份的网格,然后每个网格都打上标签,这个格子内是否有目标,目标的位置以及目标所属类别。为了简单起见,我们以\(3 \times 3\)的网格为例,实际使用中的表格会更精细,比如\(19 \times 19\),它们的示意图如下:

Imgur

这样一来输出层的大小就是\(3 \times 3 \times 8\)或者\(19 \times 19 \times 8\)。值得注意的是,YOLO算法是一个卷积实现,所以它的速度非常快,基本可以做到实时检测。还有一个小细节是,在计算每个格子中目标的位置时,我们不再以整张图标作为参考,而是以那个格子作为参考系,格子的左上角是\((0,0)\),右下角是\((1,1)\)。中心点坐标的数值依然是比例,大小介于0到1之间,但是宽和高则有可能大于1。

并交比(Intersection over Union)

我们如何判断目标检测算法运作良好呢?我们通过一种叫做并交比的度量方法来判定。并交比,Intersection over Union(简称IoU),指的是预测的边界框和实际边界框重叠部分(交集)占两者并集的比例。示意图如下:
Imgur
一般地,\(IoU \geq 0.5 \)则表示这个预测结果是可以接受的。

非极大值抑制(No-max Suppression)

在实际场景中,一个目标会有多个预测值,因为如果格子划分很细的话,相邻的格子很可能会有很接近的预测值,就会出现如下图所示的情况:
Imgur
(图中的数值指的是\(p_c\)值,即有多大概率存在目标)
那么我们如何去筛选出最优的结果呢?算法如下:

  • 1).舍弃所有\(p_c \leq 0.6\)的格子
  • 2).如果还有剩余的格子(While Loop):
    • a).取出\(p_c\)值最大的那个格子作为预测值,并且
    • b).舍弃掉所有与它的\(IoU \geq 0.5 \)的格子

该算法的第一步是从全局上舍弃所有不合格的预测值;然后依次取最大的\(p_c\)值(步骤a),选定之后再把跟它接近的预测值去掉(步骤b)。如此往复,直到没有剩余的格子。这个算法被称为非极大值抑制算法,说白了就是如何筛选出最优结果。讲真,这些个算法在实际工程项目中太常见了,根本不值一提。然而高大上的学术圈却给它去了一个十分优雅,高深的名字:非极大值抑制。不得不感叹,好的学术也需要包装啊。

Anchor Box

上面介绍的算法存在一个问题:一个格子只能检测出一个目标。但在实际场景中,我们很可能会遇到一个格子里有两个目标,比如:
Imgur
左边的图像中第三行第二列的格子就可能存在两个目标,一个是竖着的人,另一个是横着的汽车。那么怎么解决这个问题呢?很简单,只要让一个格子可以预测两个目标就行了,一个是竖着的(右图中的Anchor Box 1),另一个是横着的(右图中的Anchor Box 2)。这里为了方便举例我们只使用了两个Anchor Box,实际使用中可能更多。那么对于输出标签\(y\)来说,它的大小就变成16了,前8位表示Anchor Box 1的信息,后8位表示的是Anchor Box 2的信息。

好了,到此为止呢,把上面所有内容整合起来就是YOLO算法的全部了。接下来再介绍一些其他的目标检测算法。

候选区域网络(Region Proposals Network)

所谓的候选区域算法(Proposal Region)指的是不再死板地对图像中所有的窗口进行一一检测分类,而是先通过某种算法筛选出其中一部分有高概率是目标的区域,然后再对这些区域进行分类。接下来,我们大致介绍下这三种算法的基本原理:

  • R-CNN
    Ross Girshick在CVPR 2014上发表了一篇论文Rich feature hierarchies for accurate object detection and semantic segmentation率先提出了这个算法。它是先通过某种图像分割算法(Segmentation Algorithm)把图像变成一些色块组合,然后再挑选出一些色块放到CNN里去分类。这个算法缺点是不够快,所以会有下面一系列的研究工作去改进它。
    Imgur

  • Fast R-CNN
    该算法的作者依然是上面这个老哥Ross Girshick,这篇论文(Fast R-CNN)发表在ICCV,2015上。这个算法跟R-CNN没有太大区别,它只不过对滑动窗口采用了卷积实现而已。也就是说对候选区块不是通过滑动窗口的形式一个一个依次放到CNN里去分类,而是通过卷积的方式实现的。它直接对全图进行卷积,获得特征图。再将候选区块的位置映射到feature map中从而得到每个候选区块所对应的特征。这样就避免了对每一个候选块都使用一遍CNN,从而提升了速度。虽然速度提升了不少,但是在选取候选块上仍然不够快。

  • Faster R-CNN
    为了进一步提高速度,CV届的几个大神们Shaoqing Ren, Kaiming He, Ross Girshick, Jian Sun在NIPS 2015上发表了一篇论文:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks,提出通过CNN的方法去提取候选区块,而不再使用传统的图像分割算法。

以上这些工作在CV届还是很有影响力的,从长期来看的话,Andrew更看好YOLO。但我觉得候选区域这个想法还是很有意思的。你想想人是如何识别物体的?肯定不是一个格子一个格子看的,人眼一眼就能识别出哪个是物体了。因此,相比于这种算法,我反而倒是觉得YOLO太原始了,太暴力了,不够聪明。但是,实践证明,以上这些R-CNN算法都没有YOLO快,我们可以看个视频来感受下YOLO实时检测的速度和精度,可以说是相当牛逼了。


发表评论

电子邮件地址不会被公开。 必填项已用*标注