【卷积神经网络】Lesson 3--目标检测
课程来源:由吴恩达教授开设的深度学习课程中的《卷积神经网络》部分 梯记整理:由王小草同学负责整理 时间:2018年6月8日
1.目标定位Object localization
1.1 什么是目标定位
明确下目标定位与检测的定义。
将一张图片的类型(例如动物图像分类)称为图像分类image classification ,例如下一张图片被归类为汽车图像。

不仅能够识别图片的不同类别,并将目标物体的位置进行标注并称为分类定位classification with localization

识别图像内所有目标物体的具体位置被称为目标检测detection。例如,在一张交通图中通过识别并标注出车辆、行人、自行车以及交通信号灯等对象。(值得注意的是与分类标记不同在于单幅图像内可能包含多个不同类别的对象并标明其位置)

本节将探讨第二种情况:对图片进行分类任务,并对目标物体的位置进行定位与标注。
1.2 定位方法的介绍
典型的图像分类任务中

如何实现对图片中汽车位置的定位?可以让该神经网络增加若干输出端口,并用于生成汽车边界信息。仅需4个数值即可表征边界信息:b_x为边界中心点横坐标值……

因此,在标注训练数据时,在提供类别标签的同时还需要提供表示边框的四个数字;随后利用具有监督性的方法对模型进行训练后将能够生成相应的分类标签以及四个边界参数值
1.3 符号约定
为标签y赋值 其维度为8×1矩阵(为了简化起见,在当前讨论中假设每幅图像仅包含一个目标物体)。

P_c 代表概率值:是否存在目标物?具体而言:
- 当存在车辆、摩托车或行人作为目标物时(即至少有一个为目标),则 P_c = 1;
- 如果没有任何一个为目标,则 P_c = 0。
其中, - b_x 和 b_y 代表目标边界框的中心坐标参数,
- b_h 和 b_w 分别代表高度与宽度参数。
此外, - 当 P_c = 1 时(即判定存在某一类别的目标物),
- 变量 C_1 对应于车辆类别的归属度,
- 而变量 C_2 和 C_3 则分别对应于摩托车与行人的归属度。
由此可见,在这个案例中,标记y可以标注为左侧图像(图左),而未检测到的情况则标注为右侧图像(图右)。

(2)定义损失函数
将每个样本的目标变量表示为八个变量 y₁ 到 y₈,并令 Pc = y₁;其余位置依次类推。
针对每个样本的损失计算:
当该位置标记值为 1 时,则计算所有预测值与实际值之间的均方误差总和;
如果对应位置标记值为 0,则仅计算该位置的平方误差。

在实践中,并不必按照这种方式定义。我们可以采用逻辑回归的损失函数来定义y₁的输出;使用平方差和来计算bx、by、bh和bw各自的值;同时分别采用softmax Log损失函数来计算c₁、c₂和c₃三个参数。
2.特征点检测Landmark detection
神经网络可以通过对特征点(x,y)的输出来识别目标特征。来举2个例子。
为了识别脸部左眼角的特征点,则需要让神经网络的最后一层生成(Pc,lx,ly)三个值

为了精确定位两眼眼角的位置(共有四个角点),我们可以将输出数据转换为四组坐标数据(l1_x,l1_y), (l2_x,l2_y), (l3_x,l3_y), (l4_x,l4_y)。

为了更好地定位人眼周围的区域,则需要提取大约10至15个关键特征点。同时将输出结果增加到10至15个坐标位置即可实现对人脸上眼睛形状等关键特征的有效识别,并据此进行后续判断工作。类似地,则可以通过提取脸部更多部位如嘴唇等部位的特征点来获取更多的面部形态信息,并根据这些形态特征分析任务目标者的表情状态是喜还是忧。

假设总共有128个特征点,则输出有129维,y={Pc, l1_x,l1_y,…l128_x,l128_y}
通过特征点检测技术的应用,在我们常用的美颜相机中可以添加一些外置装饰物(如猫耳、王冠、帽子等),这些附加物品能够根据面部动作的变化而精准安置于正确位置。同样地,并发现在这些关键部位所存在的独特几何特性后,并发现在这些关键部位所存在的独特几何特性后(或者对了?),并发现在这些关键部位所存在的独特几何特性后(或者对了?),并发现它们位于特定位置之后(或者对了?)。同样地,并发现它们位于特定位置之后(或者对了?),并发现了它们位于特定位置之后(或者对了?)。同样地,并发现了它们位于特定位置之后(或者对了?)。同样的道理,在这些关键部位上发现了独特的几何特性之后(或者对了?),又发现了独特的几何特性之后(或者对了?)。同样的道理,在这些关键部位上发现了独特的几何特性之后(或者对了?)。同样的道理,在这些关键部位上发现了独特的几何特性之后(或者对了?)。同样的道理,在这些关键部位上发现了独特的几何特性之后(或者对了!)。同样的道理,在这些关键部位上发现了独特的几何特性之后!同样的道理,在这些关键部位上发现了独特的几何特性!同样的道理,在这些关键部位上发现了独特的几何特性!同样的道理,在这些关键部位上发现了独特的几何特性!同样的道理,在这里发现了一些特殊的规律!同样的道理在这里发现了一些特殊的规律!同样的道理在这里发现了一些特殊的规律!同样的道理在这里发现了一些特殊的规律!
例子2:
若将身体的关键点作为特征点,则可以识别任务的动作与形态:

3.目标检测object detection
目标检测实则分为两步。
为了检测图片中的所有车辆 第一步是图像分类 首先收集相关图片 从有车辆的图片中提取出车辆并确定其在图像中的中心位置 然后对图像中的物体进行分类标注 并训练卷积神经网络以实现对车辆类型的自动识别

第二步:滑动窗口检测


若遍历完所有区域仍未能检测到车辆,则放大一小幅度窗口后重新开始遍历搜索。

这种做法存在明显的弊端,并且必须每次都使用神经网络进行预测,在计算上造成了很大的负担
4.滑动窗口的卷积实现
在之前的章节中讨论了通过滑动窗口方法进行目标检测的技术。然而由于该方法导致计算开销较大因此本节将探讨如何在卷积层中模拟滑动窗口机制以提高检测速度和计算效率。
该研究源自Sermanet及其合著者于2014年发表的论文,并整合了基于卷积神经网络的识别、定位和检测技术
4.1 将全连接层转变为卷积层
首先认识如何转换全连接层为卷积层,在之后滑动窗口实现时会用到这一技术。
传统的图像分类架构通常如下:接收输入图片后,在经历了卷积运算与池化处理之后,在随后经历全连接层以及softmax过程后能够预测分类类别的概率。

注

于是后面3层的全连接都变成了卷积层的模式。
4.2 滑动窗口的卷积实现
将全连接层转换为卷积层后的展示图(注意:实际上是一个三维结构,并为了便于后续讲解而采用二维展示)

我们已经训练并建立了该四分类模型。
通常的做法是采用2像素步长,在行和列方向上逐步滑动。
通过这种方式,在每次滑动后将截取的部分输入到卷积神经网络中进行分类。
这样的方法在处理大规模图像时会产生巨大的计算负担。

具体而言,在4次卷积操作中存在较多的冗余计算。我们采用16×16×3大小的图片同样采用如上的卷积方式进行处理,则与1×1×400对应的输出结果会是2×2×400。在最终输出结果中的四个分割块中,左上角那个蓝色区域实际上对应的是左上角原图中14×14×3的那个蓝色区域。

因此,在实际操作中,并不需要通过滑动窗口逐帧提取截取图像来进行前向传播的分类预测;相反地可以直接对原始图像应用卷积操作,在这一过程中重叠区域能够显著减少计算量

不需要滑动n次的同时并进行n次分类预测
5.Bounding box预测
5.1 yolo算法
上一节所提出的方案显著降低了目标检测的计算量;然而该方法仍然存在不足:边界框定位精度不高。本节将专门针对这一问题进行改进。
很多时候,窗口无论怎么滑动都取不到完整的目标物体:

为解决这一问题,在现有研究中常用的一种方法是YOLo算法(Y Labeling and Object detection algorithm),其优势在于只需进行一次查看即可完成目标检测任务。
给出一张100 100的图片,为了方便讲解,此处粗粒度地分为3 3的格子。

通常情况下,在处理每个格子对应的图像时会采用分类预测的方法;这种方法所采用的方式与第1节所述一致。因此,在训练数据中对每个格子都进行了标注。

因此,对于最左上角的格子,什么东东都没有,得标记成:

其中大多数车体占据两个单元格(Yolo算法将物体中心位于相应单元格内的该单元格视为包含该物体)

考虑到该模型中存在...变量标记的情况下
yolo的整个过程是,输入图片100 100 3,若以3 3的根子为划分,经过卷积神经网络,输出3 3 _8

如果一个格子中包含多个对象,则后续将进行详细讨论;然而,在实际应用中通常会选择较小尺寸的网格(例如19×19),这使得在同一网格单元中出现多个目标的概率大大降低。
yolo的优势:
(1)能够输出更加精确的坐标,并不受滑动窗法分类器步长限制
(2)通过卷积实现的过程得以一次性完成
3.2 如何编码边框坐标
在yolo算法中,每个格子的左上角是(0,0),右下角是(1,1),以下图右车为例:

车辆中线点的坐标值为(0.4, 0.3),即bx=0.4, by=0.3
bx和by必定都是介于0到1之间的坐标数值;而bw和bh可能会超出这个范围,在某些情况下车辆的实际长度可能会超出每个网格单元的尺寸;导致部分车身会延伸至相邻的网格区域。
6.交并化Intersection over union
我们如何确定对象检测算法运行得是否良好?一种常用的方法是采用并交比(Intersection over Union, IoU)来进行评估。
假设下图,红框是正确的检测边框,紫框是模型预测出来的检测边框

评估模型预测的表现时,我们可以通过计算两者的交集与并集的比例来确定其性能指标,在区间[0,1]内。通常我们会设定一个阈值为0.5;当该比例达到或超过该阈值时,则认为模型预测的结果是符合要求的。建议将阈值设定得更高以提高判断标准。
7.非极大值抑制Non-max suppression
NMS能够确保仅在图像中对每个物体进行一次检测,并且通过避免重复检测来提高计算效率。
采用Yolo算法将图像划分为19×19的网格区域;这些车辆主要归类于它们各自车辆中心所在的具体网格区域;然而实际上,在某些情况下(例如当车辆覆盖相邻或重叠的网格区域时),系统可能会误认为这些覆盖区域属于同一辆车辆;从而导致系统出现重复计算的情况。

直观得来了解下Non-max suppression是如何起作用的。

首先通过多通道检测机制识别出多个候选边界区域这些区域均包含有汽车元素;随后系统会为每个候选边界计算出对应的目标物体的并交比系数
在目标物体同一区域的不同候选边界中进行对比分析;在满足一定条件时会对具有最高匹配度的边界进行放大处理;同时对其他候选边界进行渐弱处理以降低其对比度
最终能够得到一个较为清晰且连贯的目标边界
通过深入研究透彻理解Non-max suppression算法的过程

假设只识别汽车这一个类别,每个网格的输出就是:

1.首先抛弃掉pc<=0.6的box
2.对剩下的boxs(边界框):
- 选择具有最大值的那个输出项作为预测值。
- 对剩余的pc与预测值相同的box中满足IoU≥0.5的进行保留。
直到所有box均被处理完毕时,在这些处理后的结果中:
- 对剩余的pc与预测值相同的box中满足IoU≥0.5的进行保留。
- 这些则直接作为最终的预测结果。
- 其余那些与现有输出结果重叠度过高的则予以剔除。
若同一张图片中检测n个目标物,则要对每个物体都进行以上步骤。
8.Anchor Boxes
所有这些方法都存在一些问题。主要缺点在于每个单元格目前仅能识别单一物体。如果希望单个单元格能够识别多个物体,则可以采用锚框技术(Anchor Boxes)。
假设这样一张图片:

注

就不行了,因为一次只能输出一个类别。
该方法主要是预先设定两个非特定形状的锚框(在实践中通常会采用更多数量)

然后将预测结果将这两个anchor box关联起来。
重新定义标签y:

前面8个元素是针对行人的预测,后面8个元素是针对汽车的预测。
在训练过程中不仅需要重视边界框与标注的一致性还需要求预测边界框与锚盒之间的匹配质量较高
例子:
还是这张图片:

预定义两个Anchor Boxes

输出标签y的形式:

因此又有人又有车的网格的标签应该是y:

若检测到某边框与其对应的Anchors Box1的最大重叠比显著高,则将其预测值标记为y上方连续8个位置;反之若其与Anchors Box2的最大重叠程度相对较大,则将其预测值标记为y下方连续8个位置;通过这种方法可以帮助我们判断这些检测到的边界框究竟是属于人类还是汽车。
若没有人只有车,则y:

Anchor Boxes算法存在两个主要缺陷:
(1)当两个目标物体的边界非常相似或完全相同时(例如,在检测电视机和电脑时),该算法就会失准;
(2)如果数据集中同时存在三个及以上目标物体,则该算法将不再适用,并需重新构建模型框架并相应地调整输出层结构。
9.YOLO算法
至此为止,我们已经阐述了对象检测算法的主要组成部分;本节将对这些主要组件进行整合以构建完整的Yolo目标检测算法.
9.1 构建训练集
为了检测图片中包含的三个类别:pedestrain、car和motocycle,并将其划分为一个3×3的网格(在实践中通常采用19×19的尺寸)。

训练集的标签y为3 3 2 8:(2 8分别是2个Anchor Boxes对应的类别)

特征x遍历网格中的每个小格子,并对每个小格子进行标记。实际上,在这张图片中只有一个格子包含车辆信息,在其余八个格子中未放置车辆标记。因此未放置车辆标记的那些格子将被视为无车区域。所以这些未放置车辆标记的区域将被视为无车区域。

有车的标记为

其中bx,by,bh,bw就是这辆车在该格子中的边框
9.2 预测
因此向卷积神经网络中输如图像为100 100 3,若分割成3 3的网格,则输出的大小为3 3*16

###9.3 使用Non-max suppression
为了让例子更有趣,我们用一张新的美女图。

在设置2个anchor box的情况下,对每个网格而言,系统会输出2个预测边框,其中某个概率值pc较低(需要注意的是,这些边框可能会超出该单元格的宽度或高度范围)

接着,你要抛弃pc概率低的预测,得到这些剩下的边框

然后,在你有三个类别(行人、车辆和摩托车)的情况下,则你需要依次对每个类别执行Non-max suppression操作,并重复执行三次以获得最终结果。
10 RPN网络Region proposals
10.1 R-CNN
如果你深入阅读对象检测领域的论文后,你会了解到一个关键概念被称为Region proposals候选区域,在计算机视觉领域具有重要意义。
论文[Girshik et al, 2013, Rich feature hierarchies for accurate object detection and semantic segmentation]提出了一种叫做R-CNN的算法。该算法通过在图片中滑动窗口区域运行卷积神经网络来检测目标物体。然而,在实际应用中发现这种方法存在不足:即使用R-CNN对没有目标物体的滑动窗口进行计算会浪费大量计算资源时间。针对这一问题,在回归上文的算法(非Yolo)中采用了一种改进方案:即只对含有目标物体的关键区域运行卷积神经网络计算即可满足精度要求的同时又大幅降低了运算开销。
运行图像分割算法,得到如下结果:

然后将每个色块作为一个整体输入到分类器中进行分析(假设包含2000个色块),进而观察到上图中蓝色区域的分布情况可能会出现一个人体轮廓,在淡蓝色区域则可能出现一辆车辆的特征标识
基于图像分割技术,在不影响检测效果的前提下
10.2 R-CNN的改进
然而R-CNN的运行速度依然无法满足研究者的期望水平。因此针对这一算法展开了一系列改进工作
经典的R-CNN主要流程如下:首先通过图像分割技术确定候选区域的位置;接着将各个候选区域进行分类识别;最后系统会输出对应的类别标签以及边界框位置。
Fast R-CNN:
Faster R-CNN模型:
但实际上,大部分更快的R-CNN,都还是比yolo算法慢。
