【Nan‘s 吴恩达深度学习笔记】第四课第三周 目标检测
3.1 目标定位(object localization)
Classification
图片分类问题,例如,输入一张图片到多层卷积神经网络。这就是卷
积神经网络,它会输出一个特征向量,并反馈给 softmax 单元来预测图片类型。
Object localization
如果还想定位图片中汽车的位置,我们可以让神经网络多输出几个单元,输出一个边界框。具体说就是让神经网络再多输出 4 个数字,标
记为𝑏𝑥,𝑏𝑦,𝑏ℎ和𝑏𝑤,这四个数字是被检测对象的边界框的参数化表示。
本周课程将使用的符号表示,图片左上角的坐标为(0,0),右下角标记为(1,1)。
红色方框的中心点,这个点表示为(𝑏𝑥,𝑏𝑦),若对象位于图片中间位置则bx理想值为0.5.
𝑏ℎ和𝑏𝑤分别表示红色方框的高度和宽度是图片高度的xx倍
为监督学习任务定义目标标签 𝑦:
- 𝑝𝑐表示是否含有对象,如果对象属于前三类(行人、汽车、
摩托车),则𝑝𝑐 = 1,如果是背景,则图片中没有要检测的对象,则𝑝𝑐 = 0。𝑝𝑐它表示被检测对象属于某一分类的概率,背景分类除外。 - 如果检测到对象,就输出被检测对象的边界框参数𝑏𝑥、 𝑏𝑦、 𝑏ℎ和𝑏𝑤.
- 如果存在某个对象即𝑝𝑐 = 1,同时输出𝑐1、 𝑐2和𝑐3,表示该对象属于 1-3 类中的哪一类。
- 𝑝𝑐 = 0, 𝑦的其它参数将变得毫无意义。
Loss function
神经网络的损失函数,其参数为类别𝑦和网络输出 y ^ \hat{y} y^,如果采用平方误差策略,则𝐿( y ^ \hat{y} y^ , 𝑦) = ( y ^ 1 − y 1 ) 2 \hat{y}_1 − y_1)^2 y^1−y1)2+ ( y ^ 2 − y 2 ) 2 \hat{y}_2 − y_2)^2 y^2−y2)2 + ⋯ ( y ^ 8 − y 8 ) 2 \hat{y}_8−y_8)^2 y^8−y8)2,损失值等于每个元素相应差值的平方和
特征点检测(Landmark detection)
神经网络可以通过输出图片上特征点的(𝑥, 𝑦)坐标来实现对目标特征的识别。
假设脸部有 64 个特征点。选定特征点个数,并生成包含这些特征点的标签训练集,然后利用神经网络输出脸部关键特征点的位置。
具体做法
准备一个卷积网络和一些特征集,将人脸图片输入卷积网络,输出 1 或 0,1 表示有人脸, 0 表示没有人脸,然后输出( 𝑙1𝑥, 𝑙1𝑦) ……直到( 𝑙64𝑥, 𝑙64𝑦)。这里𝑙代表一个特征,这里有 129 个输出单元,其中 1 表示图片中有人脸,64 个特征,64×2=128,所以最终输出 128+1=129 个单元。
为了构建这样的网络,你需要准备一个标签训练集,也就是图片𝑥和标签𝑦的集合,这些点都是人为辛苦标注的。
目标检测(Object detection)
通过卷积网络进行对象检测,采用的是基于滑动窗口的目标检测算法。
①首先创建一个标签训练集,也就是𝑥和𝑦表示适当剪切的汽车图片样本。(适当剪切的图片,就是整张图片𝑥几乎都被汽车占据)
②用标签训练集,训练卷积网络,输入这些适当剪切过的图片(编号 6),卷积网络输出𝑦, 0 或 1 表示图片中有汽车或没有汽车
③训练完这个卷积网络,就可以用它来实现滑动窗口目标检测,具体如下:
- 首先选定一个特定大小的窗口,将这个红色小方块输入卷积神经网络,卷积网络开始进行预测,即判断红色方框内有没有汽车。
- 滑动窗口目标检测算法会继续处理第二个图像,即红色方框稍向右滑动之后的区域,并输入给卷积网络,因此输入给卷积网络的只有红色方框内的区域,依次重复操作,直到这个窗口滑过图像的每一个角落。
-
- 思路是以固定步幅移动窗口,遍历图像的每个区域,把这些剪切后的小图像输入卷积网络,对每个位置按 0 或 1 进行分类,这就是所谓的图像滑动窗口操作。
-
- 重复上述操作,不过这次选择更大的窗口,截取更大的区域,并输入给卷积神经网络处理,你可以根据卷积网络对输入大小调整这个区域,然后输入给卷积网络,输出 0或 1。
-
- 滑动窗口目标检测算法的缺点:如果步幅很大,显然会减少输入卷积网络的窗口个数,但是粗糙间隔尺寸可能会影响性能。反之,如果采用小粒度或小步幅,传递给卷积网络的小窗口会特别多,这意味着超高的计算成本。
滑动窗口的卷积实现(Convolutional implementation of sliding windows)
为了构建滑动窗口的卷积应用,首先要知道如何把神经网络的全连接层转化成卷积层.
- 对于下一层,也就是这个全连接层,我们可以用 5×5x16 的过滤器来实现,数量是 400 个(方块 1 所示),输出维度就是 1×1×400.
- 我们再添加另外一个卷积层(方块 2 所示),这里用的是 1×1 卷积,假设有 400 个 1×1的过滤器,在这 400 个过滤器的作用下,下一层的维度是 1×1×400。
- 通过卷积网络,最终得到 1×1×4 的输出层,而不是这 4 个数字(方块 3 所示)。
- 卷积操作的原理是我们不需要把输入图像分割成四个子集,分别执行前向传播,而是把它们作为一张图片输入给卷积网络进行计算,其中的公共区域可以共享很多计算
假设输入给卷积网络的图片大小是 14×14×3,测试集图片是 16×16×3,我们就会在这个 16×16×3 的小图像上滑动窗口,卷积网络运行了 4 次,输出 4 个标签。
缺点: 边界框的位置可能不够准确
Bounding Box 预测
能得到更精准边界框的算法是 YOLO 算法
在图像上放一个网格。为了简单一些,用 3×3 网格,实际实现时会用更精细的网格,将这个对象分配给包含对象中点的格子。
算法的优点:
- 神经网络可以输出精确的边界框
- 这是一个卷积实现,实际上它的运行速度非常快,可以达到实时识别
交并比(Intersection over union)
交并比(IoU)函数做的是计算两个边界框交集和并集之比。
- 在计算机检测任务中,如果𝑙𝑜𝑈 ≥ 0.5,就说检测正确。loU 越高,边界框越精确
- 如果预测器和实际边界框完美重叠, loU 就是 1.
非极大值抑制(Non-max suppression)
当你运行算法的时候,最后可能会对同一个对象做出多次检测,所以非极大值抑制做的就是清理这些检测结果。
这样一辆车只检测一次,而不是每辆车都触发多次检测。
这个算法做的是,首先看看每次报告每个检测结果相关的概率𝑝𝑐,实际上是𝑝𝑐乘以𝑐1、 𝑐2或𝑐3。
这个𝑝𝑐检测概率,看概率最大的那个,这是最可靠的检测,非极大值抑制就会逐一审视剩下的矩形,所有和这个最大的边框有很高交并比,高度重叠的其他边界框,这些输出就会被抑制。
意味着你只输出概率最大的分类结果,但抑制很接近,但不是最大的其他预测结果,所以这方法叫做非极大值抑制
- 将所有的预测值,所有的边界框𝑝𝑐小于或等于某个阈值,比如𝑝𝑐 ≤ 0.6的边界框去掉
- 一直选择概率𝑝𝑐最高的边界框,然后把它输出成预测结果
- 把这些和输出边界框有高重叠面积和上一步输出边界框有很高交并比的边界框全部抛弃
Anchor Boxes
建立 anchor box 这个概念,是为了处理两个对象出现在同一个格子的情况。
若想让一个格子检测出多个对象,可以使用 anchor box 这个概念。
预先定义两(多)个不同形状的 anchor box,你要做的是把预测结果和这两(多)个 anchor box 关联起来。
定义类别标签,也需要变化(每8个参数与一个anchor box形状对应):
- 每个对象都和之前一样分配到同一个格子中,分配到对象中点所在的格子中,以及分配到和对象形状交并比最高的 anchor box中
- 观察哪一个 anchor box 和实际边界框的交并比更高,这个对象不只分配到一个格子,而是分配到一对,即( grid cell, anchor box)对
选择方法
- 手工指定 anchor box 形状
- k-means算法,可以将两类对象形状聚类,选择最具有代表性的一组 anchor box,可以代表你试图检测的十几个对象类别,但这其实是自动选择 anchor box 的高级方法
候选区域(Region proposals)
R-CNN
带区域的卷积网络
这个算法尝试选出一些区域,在这些区域上运行卷积网络分类器是有意义的,不再针对每个滑动窗运行检测算法,而是只选择一些窗口,在少数窗口上运行卷积网络分类器。
选出候选区域的方法:图像分割算法 segmentation algorithm
- 可以减少卷积网络分类器运行时间,比在图像所有位置运行一遍分类器要快。
- 同时在各种尺度运行分类器。
- R-CNN 算法不会直接信任输入的边界框,它也会输出一个边界框。这样得到的边界框比较精确,比单纯使用图像分割算法给出的色块边界要好
Fast R-CNN
用卷积实现了滑动窗法!!
Faster R-CNN
使用卷积神经网络来获得候选区域色块