吴恩达《深度学习-卷积神经网络》3--目标检测

时间:2024-03-28 13:56:54

1. Object Localization目标定位
1)什么是目标定位
分类解决了这是什么的问题,比如下图,这是一辆车,;
定位问题则是要把车的位置标识出来,叫做定位分类问题;
检测问题后面会讲,检测问题就是在一幅图像中有多个对象时,应该如何检测并确定其位置。

分类和定位问题使用的图像一般只有一个对象,位于图像的中间,而检测所用的图像一般会有多个对象,甚至是多个不同分类的对象

吴恩达《深度学习-卷积神经网络》3--目标检测
2)如何在分类的基础上实现目标定位

吴恩达《深度学习-卷积神经网络》3--目标检测

如上图,假设一共有行人、汽车、摩托、背景四类,通过softmax输出预测,那么要同时完成定位问题,可以增加一个边界输出,边界由中心点坐标以及长款四个参数确定,分别为bx,by,bh,bw,也就是在softmax的输出中增加四个参数。

如涉及softmax输出为下图:

吴恩达《深度学习-卷积神经网络》3--目标检测
Pc标识是否为背景,1表示是其他对象,0表示是背景;

bx,by,bh,bw是定位边界的参数,一般设定图片左上角为原点(0, 0),右下角为(1, 1)。在模型训练时,bx、by、bh、bw都由人为确定其数值。例如上图中,可得bx=0.5,by=0.7,bh=0.3,bw=0.4

c1,c2,c3表示是否输入行人、汽车、摩托类。

可以看出当Pc=1时其他参数才有意义,当Pc=0时,其他参数没有意义,所以若损失函数采用平方误差的形式,应当如下:

吴恩达《深度学习-卷积神经网络》3--目标检测
这里为了简化说明使用平方误差,实际中也可以对c1,c2,c3进行最大似然估计,最后只输出一个值,即对象从属的类,对边界参数通常采用平方误差的形式,对Pc采用逻辑回归损失函数,但直接使用平方误差也是可以的。
2. Landmark Detection特征点检测
除了使用矩形区域检测目标类别和位置外,我们还可以仅对目标的关键特征点坐标进行定位,这些关键点被称为landmarks。
例如人脸识别,可以对人脸部分特征点坐标进行定位检测,并标记出来,如下图所示:

吴恩达《深度学习-卷积神经网络》3--目标检测
该人脸检测模型共检测人脸上64处特征点,加上是否为face的标志位,输出label共有64x2+1=129个值。
如果有足够多的数据来输出这些特征,那么可以利用这些特征做很多有趣的事情,比如人物表情识别、判断人物姿态等
此方法发挥作用的关键是,设置的点的意义在所有图片中必须保持一致,也就是某个点代表某个特征,那么所有图像上这个点都必须代表这个特征,如点1代表右外眼角,点2代表右内眼角,那么所有的图片都必须按这个顺序标识。

3. Object Detection目标检测

本节介绍的是基于滑动窗口的目标检测算法

假设要建立一个汽车检测的算法:

    首先,创建一个标签训练集,因为我们要实现的是滑动窗口目标检测,所以训练集中的图片可以剪切掉汽车之外的部分,也就是让汽车位于图片的中间且基本占满整个图片;
   吴恩达《深度学习-卷积神经网络》3--目标检测
    然后,就可以利用这个带标签的数据集进行CNN网络训练;
    最后,用训练好的CNN进行滑动窗口目标检测,具体步骤如下:首先选定一个合适大小的窗口作为滑动窗口,然后以一定步长遍历图像整个区域(从左上到右下),将每次滑动区域内的小图像输入CNN,进行0或1的分类,分类为1的情况即为检测到汽车。

吴恩达《深度学习-卷积神经网络》3--目标检测

滑动窗口目标检测缺点是:计算成本大,因为要在图片中剪切出很多小图,每个都要经过CNN处理,如果增大步幅,那么有可能因为颗粒过大影响性能,而减小步幅,又会增加计算成本。所以在神经网络兴起之前,人们都采用简单的分类器进行对象检测,如线性分类器,因为分类器简单计算成本小,所以窗口滑动速度快,检测效果好,而CNN运行单个分类任务的成本要高得多,所以窗口滑动较慢,不过幸运的是,计算成本的问题已经有了很好的解决方案。

4. Convolutional Implementation of Sliding Windows
本节继续上节的问题,解决卷积网络下滑动窗口速度慢的问题,解决办法就是不切割图像多次带入CNN,而是一次性输入图像并计算所有值。具体做法分两步:
1)如何将全连接层转化为卷积层
    全连接层转变成卷积层的操作很简单,只需要使用与上层尺寸一致的滤波算子进行卷积运算即可。最终得到的输出层维度是1 x 1 x 4,代表4类输出值。
        吴恩达《深度学习-卷积神经网络》3--目标检测
2)输入图像进行卷积计算,一次计算所有小图像的预测值
吴恩达《深度学习-卷积神经网络》3--目标检测
如上图第一行表示滑动窗口大小,MAXPOOL为2x2表示其滑动步长为2。如果对16x16x3的图片进行如上的卷积计算,那么最终获得2x2=4个预测值,最左上角的蓝色方块的值,是原图最左上14x14x3的子图像的预测值,右上角的绿色方块的值,就是原图最右上角14x14x3的子图像的预测值,以原来的滑动方法需要进行4次卷积网络运算;以此类推。同理对28x28x3的图像进行同样的卷积操作,输出层是8x8,即以14x14x3为滑动窗口步长为2的所有子图像的预测值,以原来的滑动方法需要进行64次卷积网络运算。
这样做的优点是很多共用区域的值不用重复计算,从而大大节约计算成本。

5. Bounding Box Predictions

解决了计算成本的问题,本节讨论如何获得更精准的物体边框,方法就是YOLO算法。

YOLO(you only look at once),YOLO算法首先将原始图片分割成n x n网格,每个网格代表一块区域。为简化说明,下图中将图片分成3 x 3网格,如下图:

吴恩达《深度学习-卷积神经网络》3--目标检测
也就是步长为n(POOL为nxn),滑动窗口大小为33x33的基于滑动窗口的CNN检测算法,得到的的输出层维度为3x3x8。其中,3x3对应9个网格,每个网格的输出包含8个元素,如前所述,分别为Pc,bx,by,bh,bw,c1,c2,c3。Pc的值根据目标中心坐标bx,by在不在当前网格确定,即bx,by在当前网格Pc=1,否则Pc=0。关于边框bx,by,bh,bw的表示,这里提供一种可行的方法供参考,还有很多其他方式,目标的中心坐标bx和by按照其所在网格的比例确定,如上图假设左上角坐标为(0,0)右下角坐标(1,1),bx=0.3,by=0.4,这两个参数在网格中所以其值小于1,bh和bw表示目标的高和宽,由于目标可能跨窗口存在,所以这两个数值可以大于1。
YOLO算法由于计算目标外框的时候并不切割图像,所以可以获得更精准的边框。

此算法可能会有多个目标的中心坐标被划分到一个网格的情况,这个问题会在后面介绍,但是通常来讲,划分的网格越密,网格越小,则多个目标的中心坐标被划分到一个网格内的概率就越小

问题记录:

如果图像尺寸不能被平分呢,如上图100x100的图像分成3x3的网格,如果每个网格33x33,那多余的怎么办,如果34x34,必然会有覆盖,那么目标中心归属就是问题

6. Intersection Over Union交并比
如何判断对象检测算法运行良好呢?即有没有什么评价对象检测算法的指标呢?-----交并比

交并比(IoU)就是计算预测边框和实际边框的交集比上并集,如图:

吴恩达《深度学习-卷积神经网络》3--目标检测
如果IoU>=0.5,那么这个预测就是可接受的,一般约定0.5为阈值,不过阈值越大,获得的边框越精确。
还可以利用IoU改善YOLO算法,下面介绍。
7. Non-max Suppression非极大值抑制

非极大值抑制可以确保每个目标只被检测出来一次,防止同一目标被检测多次。

YOLO算法训练时由于标记了目标的中心,所以不存在目标被重复检测到的问题,但是对于一副新输入的图像来说,如果划分的网格较小,那么可能有多个网格都包含同一目标,那么这个目标就可能被重复检测出来。如下图,19x19的网格划分原图,同一辆车会被划分到多个网格,那么对应网格检测的Pc值为此网格检测到目标的概率(实际检测某一目标的概率应该是Pc*c1 or Pc*c2 or Pc*c3)
吴恩达《深度学习-卷积神经网络》3--目标检测

非最大值抑制(Non-max Suppression)就是先找到Pc最大的网格获得的边界框,与这个边界框具有高交并比的边界框都会被抑制(也就是删除),如下图左边汽车检测到了2次,那么选Pc最大的边界框即Pc=0.8的边界框,和它交并比较高的Pc=0.7的边界框要删掉,另一个同理取Pc=0.9的边界框,删掉和它交并比较高的0.6和0.7的边界框。

吴恩达《深度学习-卷积神经网络》3--目标检测


总结,非最大值抑制的总流程为:

吴恩达《深度学习-卷积神经网络》3--目标检测

首先,删去所有Pc过小的边界框;
然后,选取Pc最大的边界框作为预测值;

最后,删掉所有与选定边界框交并比较高的边界框。

注意,要对不同的输出类别单独进行非最大值抑制,即汽车类做一次非最大值抑制,摩托类做一次非极大值抑制……
问题记录:
第二步选取Pc最大的边界框,这一步应该怎样区分不同目标的Pc值呢,也就是如果两个检测目标,一个检测了两遍Pc为0.7 0.6,另一个检测了三遍Pc为0.6 0.8 0.9,理论上应该一个选0.7一个选0.9,那么选择Pc最大的边框是不是应该有个前提条件:在几个交并比较高的边框中选择Pc最大的,所以是不是要先计算边框的交并比,找到重叠较多的边框,然后在这几个边框中选择Pc最大的作为输出,其余删掉?

8. Anchor Boxes
本节讨论在一个网格中存在多个目标的情况。
如下图所示,同一网格出现了两个目标:人和车。为了同时检测两个目标,我们可以设置两个Anchor Boxes,Anchor box 1检测人,Anchor box 2检测车。也就是说,每个网格多加了一层输出。原来的输出维度是 3 x 3 x 8,现在是3 x 3 x 2 x 8(也可以写成3 x 3 x 16的形式)。这里的2表示有两个Anchor Boxes,用来在一个网格中同时检测多个目标。每个Anchor box都有一个Pc值,若两个Pc值均大于某阈值,则检测到了两个目标。

吴恩达《深度学习-卷积神经网络》3--目标检测

例子中两个Anchor Boxes一个瘦长用来框选行人,一个宽扁用来框选汽车,实际中Anchor Boxes形状的选择可以通过人为选取,即人为的根据经验将所有目标的形状设计出来,也可以使用其他机器学习算法,例如k聚类算法对待检测的所有目标进行形状分类,目前这是最好的自动选择Anchor Boxes的方法。

9. YOLO Algorithm

总结整个流程:

以包含两个Anchor Boxes的YOLO算法为例
吴恩达《深度学习-卷积神经网络》3--目标检测
吴恩达《深度学习-卷积神经网络》3--目标检测
10. Region Proposals RPN网络R-CNN

利用滑动窗算法对原始图片的每个区域都进行扫描,即使是一些空白的或明显没有目标的区域,这样会降低算法运行效率,耗费时间。解决办法就是候选区域(Region Proposal)
具体做法是:首先,对原始图片进行分割算法处理,找出可能存在对象的区域,即不同色块;然后对不同色块应用CNN检测。这样会比原先逐个区域检测检测次数要少的多。
吴恩达《深度学习-卷积神经网络》3--目标检测
但是现在来看这个算法的速度还是不够快,所以有一些对此的改进算法:
1)fast R-CNN:首先用图像分割聚类算法获得候选区,然后用滑动窗口的一次CNN(见本周第四节)实现检测。缺点:获得候选区这一步依旧非常慢
2)faster R-CNN:用CNN 来获得候选区。
通常来讲即使是最快的R-CNN速度也略逊色于YOLO算法,所以推荐YOLO算法

本文部分借鉴了博客http://blog.csdn.net/red_stone1/article/details/79028058