1. 目标定位
定位分类问题不仅要求判断出图片中物体的种类,还要在图片中标记出它的具体位置,用边框(Bounding Box,或者称包围盒)把物体圈起来。一般来说,定位分类问题通常只有一个较大的对象位于图片中间位置;而在目标检测问题中,图片可以含有多个对象,甚至单张图片中会有多个不同分类的对象。
为了定位图片中汽车的位置,可以让神经网络多输出 4 个数字,标记为 bx,by,bh,bw,将图片左上角标记为 (0, 0),右下角标记为 (1, 1),则有:
- 红色方框的中心点:bx,by
- 边界框的高度:bh
- 边界框的宽度:bw
因此,训练集不仅包含对象分类标签,还包含表示边界框的四个数字。定义目标标签 Y 如下:
pc表示是否含有对象,如果对象属于前三类(行人、汽车、摩托车),则pc=1,如果是背景,则pc=0,pc表示被检测对象属于某一分类的概率,背景分类除外。如果检测到对象,就输出被检测对象的边界框参数 bx、by、bh和bw。pc=1,同时输出c1、c2和c3
如果图片中没有检测对象,pc=0,y的其它参数全部写成问号,表示“毫无意义”的参数
2. 目标检测
特征检测:仅对目标的关键特征点坐标进行定位,这些关键点被称为landmarks。选定特征点个数,并生成包含特征点的标签训练集,利用神经网络输出图片特征关键点的位置。
通过输出图片上的特征点,来实现对目标特征的识别。在标签中,这些特征点以多个二维坐标的形式表示。
特征点的特性在所有图片中必须保持一致
通过卷积网络进行对象检测,采用的是基于滑动窗口的目标检测算法。该算法的步骤如下:
- 训练集上搜集相应的各种目标图片和非目标图片,样本图片要求尺寸较小,相应目标居于图片中心位置并基本占据整张图片。
- 使用训练集构建 CNN 模型,使得模型有较高的识别率。
- 选择大小适宜的窗口与合适的固定步幅,对测试图片进行从左到右、从上倒下的滑动遍历。每个窗口区域使用已经训练好的 CNN 模型进行识别判断
- 可以选择更大的窗口,然后重复第三步的操作。
滑动窗口目标检测的优点是原理简单,且不需要人为选定目标区域;缺点是需要人为直观设定滑动窗口的大小和步幅。滑动窗口过小或过大,步幅过大均会降低目标检测的正确率。另外,每次滑动都要进行一次 CNN 网络计算,如果滑动窗口和步幅较小,计算成本往往很大。
3. 基于卷积的滑动窗口实现
相比从较大图片多次截取,在卷积层上应用滑动窗口目标检测算法可以提高运行速度。所要做的仅是将全连接层换成卷积层,即使用与上一层尺寸一致的滤波器进行卷积运算。
如图,对于 16x16x3 的图片,步长为 2,CNN 网络得到的输出层为 2x2x4。其中,2x2 表示共有 4 个窗口结果。对于更复杂的 28x28x3 的图片,得到的输出层为 8x8x4,共 64 个窗口结果。最大池化层的宽高和步长相等。
运行速度提高的原理:在滑动窗口的过程中,需要重复进行 CNN 正向计算。因此,不需要将输入图片分割成多个子集,分别执行向前传播,而是将它们作为一张图片输入给卷积网络进行一次 CNN 正向计算。这样,公共区域的计算可以共享,以降低运算成本。缺点是边界框的位置可能不够准确
原来的滑动窗口实现是三个全连接层,现在是将全连接层换成卷积层,对图片进行卷积运算获取多通道结果
缺点是边界框的位置可能不够准确
4. 边框预测
YOLO 算法将原始图片划分为 n×n 网格,并将目标定位一节中提到的图像分类和目标定位算法,逐一应用在每个网格中,每个网格都有标签如:
如果将输入的图片划分为 3×3 的网格、需要检测的目标有 3 类,则每一网格部分图片的标签会是一个 8 维的列矩阵,最终输出的就是大小为 3×3×8 的结果。要得到这个结果,就要训练一个输入大小为 100×100×3,输出大小为 3×3×8 的 CNN。在实践中,可能使用更为精细的 19×19 网格,则两个目标的中点在同一个网格的概率更小。
YOLO 算法的优点:
- 和图像分类和目标定位算法类似,显式输出边框坐标和大小,不会受到滑窗分类器的步长大小限制。
- 仍然只进行一次 CNN 正向计算,效率很高,甚至可以达到实时识别。
如何编码边框bx,by.bw.bh, bx,by 的值是相对于网格长的比例。则bw,bh可以大于 1。当然,也有其他参数化的形式,且效果可能更好。
5. 交互比、非极大值抑制、锚框
- 交并比(loU)函数是计算两个边界框交集和并集之比,一般约定,在计算机检测任务中,如果loU≥0.5,就说检测正确,如果预测器和实际边界框完美重叠,loU=1
- 非极大值抑制(Non-max Suppression)在YOLO 中会通过清理检测结果,找到每个目标中点所位于的网格,确保算法对每个目标只检测一次。
- YOLO算法进行非极大值抑制的步骤如下:
- 将包含目标中心坐标的可信度 pc小于阈值(例如 0.6)的网格丢弃;
- 选取拥有最大pc的网格;
- 分别计算该网格和其他所有网格的 IoU,将 IoU 超过预设阈值的网格丢弃;
- 重复第 2~3 步,直到不存在未处理的网格。
- 上述步骤适用于单类别目标检测。进行多个类别目标检测时,对于每个类别,应该单独做一次非极大值抑制
- YOLO算法进行非极大值抑制的步骤如下:
- 多目标检测锚框: 一个网格标签包含多个锚框,相当于存在多个用以标识不同目标的边框。引入 Anchor Box 进行多目标检测时,图像中的目标则被分配到了包含该目标中点的那个网格以及具有最高 IoU 值的该网格的 Anchor Box。
- 缺点: 局限性,对于同一网络有三个及以上的目标,或者两个目标锚框高度重合的情况处理不好,
- 锚框一般通过人工选取,或者用k-means将两类对象形状聚类,选择最具代表性的锚框
6. R-CNN算法
R-CNN算法,即带区域的卷积网络,或者带区域的CNN。这个算法尝试选出一些区域,在少数窗口上运行卷积网络分类器。
R-CNN算法很慢,基本的R-CNN算法是使用图片分割在不同色块上求出候选区域,对每个候选区域运行一下分类器,每个区域会输出一个标签,有没有车子、行人、摩托车?并输出一个边界框,就能在确实存在对象的区域得到一个精确的边界框
- R-CNN算法不会直接信任输入的边界框,他也会输出一个边界框bx,by,bh和bw,这样得到的边界框比较精确,比单纯使用图像分割算法给出的色块边界要好
- Fast R-CNN算法用的是滑动窗法的一个卷积实现,和卷积的滑动窗口实现的相似,显著提升了R-CNN的速度,问题是得到候选区域的聚类步骤仍然非常缓慢
- 更快的R-CNN算法(Faster R-CNN),使用的是卷积神经网络,而不是更传统的分割算法来获得候选区域色块,比Fast R-CNN快得多
- 大多数R-CNN算法都比YOLO算法慢很多