吴恩达deep learning ai 笔记总结(4-3) 目标检测

1.Object Localization

图片检测问题分为三个部分:

  • 分类问题:判断图中是否为汽车;
  • 目标定位:判断是否为汽车,并确定具体位置;
  • 目标检测:检测不同物体并定位。

分类与定位是针对一个对象,而检测是多个对象
在这里插入图片描述

目标分类与定位

对于目标分类与定位问题, 标准的CNN模型结构如下:
在这里插入图片描述
Output: 包含图片中存在的对象及定位框

  • 1.Pedestrian : 0 or 1
  • 2.car : 0 or 1
  • 3.motorcycle : 0 or 1
  • 4.background : 0 or 1
  • 对相框:bx,by,bh,bw
    其中,bx,by表示汽车中点,bh,bw分别表示定位框的高和宽。

以图片左上角为(0,0),以右下角为(1,1),这些数字均为位置或长度所在图片的比例大小。

定义目标Label y:

在这里插入图片描述

  • 当Pc=1时,表示图片中存在物体;
  • 当Pc=0时,表示图片中不存在物体,那么此时,输出y的其他值为多少均没有意义,也不会参与损失函数的计算
    在这里插入图片描述

Loss Function

采用平方误差Square error 形式的损失函数:
在这里插入图片描述

  • 当Pc=1时,即y1 = 1时:我们需要关注神经网络对所有输出值的准确度;
  • 当Pc=0时,即y1 = 0时:此时,我们只关注神经网络对背景值的准确度。

当然在实际的目标定位应用中,我们可以使用更好的方式是:

  • 对c1、c2、c3,c1、和softmax使用对数似然损失函数;
  • 对边界框的四个值应用平方误差或者类似的方法;
  • 对Pc应用logistic regression损失函数,或者平方预测误差。

2.Landmark Detection

由前面的目标定位问题,我们可以知道,神经网络可以通过输出图片上特征点的坐标(x,y),来实现对目标特征的识别和定位标记。
在这里插入图片描述
如对于人脸表情识别的问题中,我们通过标定训练数据集中特征点的位置信息,来对人脸进行不同位置不同特征的定位和标记。AR的应用就是基于人脸表情识别来设计的,如脸部扭曲、增加头部配饰等。

在人体姿态检测中,同样可以通过对人体不同的特征位置关键点的标注,来记录人体的姿态。

3.Object Detection

目标检测采用的是基于滑动窗口(Sliding Windows)的检测算法。
在这里插入图片描述

车辆目标检测网络模型:

在这里插入图片描述

  • 训练集X:将有汽车的图片进行适当的剪切,剪切成整张几乎都被汽车占据的小图或者没有汽车的小图;
  • 训练集Y:对X中的图片进行标注,有汽车的标注1,没有汽车的标注0。

滑动窗口目标检测:

在这里插入图片描述
步骤:
1.首先选定一个特定大小的窗口,将窗口内的图片输入到模型中进行预测;

2.以固定步幅滑动该窗口,遍历图像的每个区域,对窗内的各个小图不断输入模型进行预测;

3.继续选取一个更大的窗口,再次遍历图像的每个区域,对区域内是否有车进行预测;

4.遍历整个图像,可以保证在每个位置都能检测到是否有车。

滑动窗口限制

滑动窗算法的优点是原理简单,且不需要人为选定目标区域(检测出目标的滑动窗即为目标区域)

但是,缺点很明显:
1.计算成本巨大,每个窗口的小图都要进行卷积运算

2.窗口边框形状都是固定的,滑动窗过小或过大,步进长度过大均会降低目标检测正确率。

为解决上述问题,滑动窗算法可以使用卷积方式实现,以提高运行速度,节约重复运算成本。

4.Convolutional Implementation of Sliding Windows

将FC层转变为CONV层

首先,单个滑动窗口区域进入CNN网络模型时,包含全连接层。

那么滑动窗口算法卷积实现的第一步就是将全连接层转变成为1 x 1卷积层,如下图所示:
在这里插入图片描述
我们已经知道了,1×1的卷积核相当于在一个三维图像的切片上应用了一个全连接的神经网络。同样,全连接层也可以由1×1大小卷积核的卷积层来替代。需注意卷积核的个数与隐层神经元个数相同。

滑动窗口的卷积实现

实现了以卷积层替代全部的全连接层以后,在该基础上进行滑动窗口在卷积层上的操作。
以下图一个小的图片为例:

在这里插入图片描述
使用上面训练好的模型,输入一个 16×16×3 大小的整幅图片,图中蓝色部分代表滑动窗口的大小;
我们以2为大小的步幅滑动窗口,分别与卷积核进行卷积运算,最后得到 4幅 10×10×16 大小的特征图;
然而因为在滑动窗口的操作时,输入部分有大量的重叠,也就是有很多重复的运算,导致在下一层中的特征图值也存在大量的重叠,所以最后得到的第二层激活值(特征图)构成一副 12×12×16 大小的特征图。对于后面的池化层和全连接层也是同样的过程。

那么由此可知,滑动窗口在整幅图片上进行滑动卷积的操作过程,就等同于在该图片上直接进行卷积运算的过程。
所以卷积层实现滑动窗口的这个过程,我们不需要把输入图片分割成四个子集分别执行前向传播,而是把他们作为一张图片输入到卷积神经网络中进行计算,其中的重叠部分(公共区域)可以共享大量的计算。

总结:

之前的滑动窗算法需要反复进行CNN正向计算,例如16 x 16 x 3的图片需进行4次,28 x 28 x3的图片需进行64次。而利用卷积操作代替滑动窗算法,则不管原始图片有多大,只需要进行一次CNN正向计算,因为其中共享了很多重复计算部分,这大大节约了运算成本。值得一提的是,窗口步进长度与选择的MAX POOL大小有关。如果需要步进长度为4,只需设置MAX POOL为4 x 4即可。

汽车目标检测:

依据上面的方法,我们将整张图片输入到训练好的卷积神经网络中。无需再利用滑动窗口分割图片,只需一次前向传播,我们就可以同时得到所有图片子集的预测值
在这里插入图片描述
利用卷积的方式实现滑动窗口算法的方法,提高了整体的计算效率。

5.Bounding Box Predictions

卷积方式实现的滑动窗口算法,使得在预测时计算的效率大大提高。但是其存在的问题是:
不能输出最精准的边界框(Bounding Box)。

滑动窗口算法有时会出现滑动窗不能完全涵盖目标的问题,如下图蓝色窗口所示。所以我们需要寻找更加精确的边界框。
在这里插入图片描述

解决方法:YOLO

YOLO(You Only Look Once)算法可以解决这类问题,使得滑动窗口算法寻找到更加精准的边界框(如上图红色窗口)。

在这里插入图片描述

  • YOLO算法首先将原始图片分割成n x n网格,每个网格代表一块区域。为简化说明,上图中将图片分成3 x 3网格。

  • 采用图像分类和定位算法,分别应用在图像的 n×n 个格子中。

  • 定义训练标签:(对于每个网格,定义如前面的向量y)
    在这里插入图片描述

  • 利用卷积形式实现滑动窗口算法的思想,对该原始图片构建CNN网络,得到的的输出层维度为3 x 3 x 8。其中,3 x 3对应9个网格,每个网格的输出包含8个元素。
    如果目标中心坐标(bx、 by)不在当前网格内,则当前网格Pc=0;相反,则当前网格Pc=1(即只看中心坐标是否在当前网格内);
    判断有目标的网格中,bx、 by,bh、bw限定了目标区域。值得注意的是,当前网格左上角坐标设定为(0, 0),右下角坐标设定为(1, 1),.中点bx、 by表示坐标值,在 01之间,但是宽高bh、bw~表示比例值,存在>1的情况。
    因为目标可能超出该网格,横跨多个区域,如上图所示。目标占几个网格没有关系,目标中心坐标必然在一个网格之内。

划分的网格可以更密一些。网格越小,则多个目标的中心坐标被划分到一个网格内的概率就越小,这恰恰是我们希望看到的。

YOLO表示法:

  • 将对象分配到一个格子的过程是:观察对象的中点,将该对象分配到其中点所在的格子中,(即使对象横跨多个格子,也只分配到中点所在的格子中,其他格子记为无该对象,即标记为“0”)
  • YOLO显式地输出边界框,使得其可以具有任意宽高比,并且能输出更精确的坐标,不受滑动窗口算法滑动步幅大小的限制
  • YOLO是一次卷积实现,并不是在 n × n 网格上进行 n 2 n^2 次运算,而是单次卷积实现,算法实现效率高,运行速度快,可以实现实时识别。

6. Intersection Over Union

交并比(Intersection-over-Union)函数用来评价目标检测算法是否运作良好。
在这里插入图片描述
对于理想的边界框和目标探测算法预测得到的边界框,交并比函数计算两个边界框交集和并集之比
在这里插入图片描述
I o U = I U = IoU = \frac{I}{U} = \frac{两块区域的交集}{两块区域的并集}
IoU可以表示任意两块区域的接近程度。IoU值介于0~1之间,且越接近1表示两块区域越接近,约定如果 IoU⩾0.5 ,那么就说明检测正确。

7.Non-max Suppression

YOLO算法中,可能会出现多个网格都检测出到同一目标的情况,例如几个相邻网格都判断出同一目标的中心坐标在其内。

在这里插入图片描述
上图中,三个绿色网格和三个红色网格分别检测的都是同一目标。那如何判断哪个网格最为准确呢?方法是使用非最大值抑制算法。

Non-max Suppression(NMS)非最大值抑制可以确保我们的算法对每个对象只检测一次。

Non-max Suppression 算法:

算法思想:

  • 在对n×n个网格进行目标检测算法后,每个网格输出的Pc为一个0~1的值,表示有车的概率大小。其中会有多个网格内存在高概率;
  • 得到对同一个对象的多次检测,也就是在一个对象上有多个具有重叠的不同的边界框;
  • NMS 对多种检测结果进行清理:选取最大Pc的边界框,对所有其他与该边界框具有高交并比或高重叠的边界框进行抑制;
  • 逐一审视剩下的边界框,寻找最高的Pc值边界框,重复上面的步骤。
  • 非最大值抑制,也就是说抑制那些不是最大值,却比较接近最大值的边界框。

算法流程

1.对于图片每个网格预测输出矩阵:yi = [Pc bx by bh bw], 其中Pc表示有对象的概率;

2.剔除Pc值小于某阈值(例如0.6)的所有网格;

3.选取Pc值最大的网格,利用IoU,摒弃与该网格交叠较大的网格, 抛弃和选取的边界框IoU⩾0.5的剩余的边界框

4.对剩下的网格,重复步骤2。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

8.Anchor Boxes

到目前为止,我们介绍的都是一个网格至多只能检测一个目标。那对于多个目标重叠的情况,例如一个人站在一辆车前面,该如何使用YOLO算法进行检测呢?方法是使用不同形状的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值均大于某阈值,则检测到了两个目标。

在这里插入图片描述

Anchor Boxes算法

在这里插入图片描述

Anchor Boxes实例

如下面的图片,里面有行人和汽车,我们为其分配两个Anchor box。对于行人形状更像Anchor box 1,汽车形状更像Anchor box 2,所以我们将人和汽车分配到不同的输出位置。
在这里插入图片描述
如果格子中只有汽车的时候,我们使用了两个Anchor box,那么此时我们的目标向量就成为:
yi=[0 ? ? ? ? ? ? ? 1 bx by bh bw 0 1 0]yi=[0 ? ? ? ? ? ? ? 1 bx by bh bw 0 1 0]
其中,“?”代表的是该位置是什么样的参数我们都不关心。

Anchor Boxes存在的问题

  • 如果我们使用了两个Anchor box,但是同一个格子中却有三个对象的情况,此时只能用一些额外的手段来处理;
    *同一个格子中存在两个对象,但它们的Anchor box 形状相同,此时也需要引入一些专门处理该情况的手段。

Anchor box 的选择

  • 一般人工指定Anchor box 的形状,选择5~10个以覆盖到多种不同的形状,可以涵盖我们想要检测的对象的形状;
  • 高级方法:K-means 算法:将不同对象形状进行聚类,用聚类后的结果来选择一组最具代表性的Anchor box,以此来代表我们想要检测对象的形状。

9.YOLO Algorithm

假设我们要在图片中检测三种目标:行人、汽车和摩托车,同时使用两种不同的Anchor box。
训练集:

  • 输入X:同样大小的完整图片;
  • 目标Y:使用3×33×3网格划分,输出大小3×3×2×8,或者3×3×16
  • 对不同格子中的小图,定义目标输出向量Y。
    在这里插入图片描述
    模型预测:

输入与训练集中相同大小的图片,同时得到每个格子中不同的输出结果:3×3×2×8。
在这里插入图片描述
运行非最大值抑制(NMS):

  • 假设使用了2个Anchor box,那么对于每一个网格,我们都会得到预测输出的2个bounding boxes,其中一个Pc比较高;
  • 抛弃概率Pc值低的预测bounding boxes;
  • 对每个对象(如行人、汽车、摩托车)分别使用NMS算法得到最终的预测边界框。

在这里插入图片描述

10.Region Proposals

之前介绍的滑动窗算法会对原始图片的每个区域都进行扫描,即使是一些空白的或明显没有目标的区域,例如下图所示。这样会降低算法运行效率,耗费时间。

为了解决这一问题,尽量避免对无用区域的扫描,可以使用Region Proposals的方法。具体做法是先对原始图片进行分割算法处理,然后只对分割后的图片中的块进行目标检测。
在这里插入图片描述
Region Proposals共有三种方法:

  • R-CNN: 滑动窗的形式,一次只对单个区域块进行目标检测,运算速度慢。

  • Fast R-CNN: 利用卷积实现滑动窗算法

  • Faster R-CNN: 利用卷积对图片进行分割,进一步提高运行速度
    在这里插入图片描述

发布了45 篇原创文章 · 获赞 4 · 访问量 2518

猜你喜欢

转载自blog.csdn.net/keke_Memory/article/details/103572761