0%

【CS230-DL】11 目标检测

前面我们熟悉了 CNN 的几个经典模型,这节课我们来看看计算机视觉领域中新型的方向 —— 目标检测。


更新历史

  • 2019.10.21: 完成初稿

目标定位 Object Localization

目标定位的关键在于定位,也就是识别出来某个对象后,还要能指出它在图片中的位置,如下图所示:

注意,本文中介绍的定位,一张图片只包含一个要识别和定位的对象。

那么问题来了,前面我们通过 softmax 来做多分类,现在还要输出对象在图片中的位置,咋办?其实也很简单,我们先看一下目标标签 y,这里需要做一些改动:

这里 $p_c$ 表示是否包含对象,包含的话为 1;$b_x,b_y,b_h,b_w$ 表示被检测对象的边框参数,$c_1,c_2,c_3$ 表示对象具体属于那一类(原来的 softmax 部分)。我们可以使用平方误差策略来构造损失函数,损失值等于每个元素相应差值的平方和。

特征点检测 Landmark Detection

与目标检测类似,特征点相当于把 $b_x,b_y,b_h,b_w$ 给推广了,具体要输出的是某几个点(需要在训练数据中进行标注处理),如下图所示:

注意,这些特征点的数目和所代表的含义是提前确定好的。

目标检测 Object Detection

有了目标定位和特征点检测的基础,我们就可以通过基于滑动窗口的目标检测算法来进行目标检测了。

如上图所示,我们通过不同尺寸的小矩形,一格一格遍历图片,我们要做的就是检测在不同的小窗口中检测是否出现目标。但是该方法缺点同样明显:计算成本太高。好在现在已经有了很好的方案,可以高效地在卷积层上应用滑动窗口目标检测器。

卷积的滑动窗口实现 Convolutional Implementation of Sliding Windows

为了提高效率,我们先要把神经网络的全连接层转成卷积层,要用到前面提到的 1x1 矩阵了,其实也很简单,如下图所示:

全都变成卷积之后,我们就可以一次得到所有的预测值,这就大大降低了运算。这里的思路和前面向量化有异曲同工之妙,大家可以感受下,具体如下图所示:

但现在依然有不足的地方,就是我们无法得到最精准的边框,我们最终得到的结果,和滑动窗口的大小是完全一致的。

Bounding Box 预测

想要得到更精准边界框,我们可以使用 YOLO(You only look once) 算法。具体逻辑如下:

YOLO 是一个卷积实现,可以达到实时识别(但是 YOLO 论文难度很高,请注意)。

交并比 Intersection over Union

我们通过交并比函数来评价对象检测算法。具体如下:

如果 IoU >= 0.5,那么检测正确。一般不会比 0.5 低,如果需要更严格,可以到 0.6/0.7 这样。

非极大值抑制 Non-max Suppression

简单来说,非极大值抑制这个方法可以确保算法对每个对象只检测一次。先来看一个实际的例子:

上图基于每个格子的检测中,123456 都会认为自己格子里有车。那么非极大值抑制的做法就是清理重复的检测结果,而不是每辆车都触发多次检测。简单来说就是如果检测出来的边界用重叠,那么选概率最高的,如下图所示,最后留下的是白色框框:

接下来,我们会用 Anchor Boxes 进一步优化效果。

Anchor Boxes 主要处理的是两个对象在同一个格子的情况,并且也可以根据要监测的对象的特征进行区别对待(比如行人和汽车的长宽比例不同,如下图所示)

一般来说,我们会手动指定 Anchor Box 的形状。

YOLO 算法

我们把前面学到的放到一起,就可以得到完整的 YOLO 对象检测算法!如下图所示:

训练的时候,我们可以看到对于格子 1(蓝色箭头指的向量),很多是问号,因为这个框里没有目标,只要 $p_c$ 是 0 就行。而对于格子 2(绿色箭头指的向量),就包括了 $b_x,b_y,b_h,b_w$,这里因为红色框与编号为 5 的 Anchor Box 交并比更高,所以后面 8 个位置是有值的。

预测的时候也差不多,输出是一个 3x3x2x8 的向量,如下图所示:

最后再做一次非极大值抑制即可。注意,如果有多个检测类别,需要对每个类别单独运行非极大值抑制。

这就是 YOLO,最有效的对象检测算范之一,包含非常多精妙的思路!

候选区域 Region Proposals

候选区域是计算机视觉中很重要的概念,简单来说就是不在整张图片上做滑动窗口检测,而是只在少数可能有目标的窗口上运行。那么如何知道哪个窗口比较靠谱呢?首先会用分割算法划分图片,然后在可能有内容的地方设定窗口进行检测,如下图所示:

这就是所谓的 R-CNN,但问题在于,速度比较慢,即使有一些改进的做法,但还是要比 YOLO 慢不少(毕竟需要两步)。