Deeplearning.ai吴恩达笔记之卷积神经网络3

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35564813/article/details/86505943

Detection algorithms

Object Localization

在这里插入图片描述

标准的CNN分类模型我们已经很熟悉了,如下所示:

在这里插入图片描述

对于目标定位和目标检测问题,其模型如下所示:

在这里插入图片描述

原始图片经过CONV卷积层后,Softmax层输出8 x 1向量。除了包含上述一般CNN分类3 x 1向量(class label)之外,还包含了(bx, by),表示目标中心位置坐标;还包含了bh和bw,表示目标所在矩形区域的高和宽;还包含了Pc,表示矩形区域是目标的概率,数值在0~1之间,且越大概率越大。一般设定图片左上角为原点(0, 0),右下角为(1, 1)。在模型训练时,bx、by、bh、bw都由人为确定其数值。例如上图中,可得bx=0.5,by=0.7,bh=0.3,bw=0.4。

若Pc=0,表示没有检测到目标,则输出label后面的7个参数都可以忽略。

对于损失函数Loss function,若使用平方误差形式,有两种情况:

  • Pc=1,即 y 1 = 1 y_1=1

    L ( y ^ , y ) = ( y 1 ^ y 1 ) 2 + ( y ^ 2 y 2 ) 2 + + ( y ^ 8 y 8 ) 2 L(\hat{y} ,y)=(\hat{y_1}−y_1)^2+(\hat{y}_2−y_2)^2+⋯+(\hat{y}_8−y_8)^2

  • Pc=0,即 y 1 = 0 y_1=0 :
    L ( y ^ , y ) = ( y ^ 1 y 1 ) 2 L(\hat{y} ,y)=(\hat{y}_1−y_1)^2

当然,除了使用平方误差之外,还可以逻辑回归损失函数,类标签 c 1 , c 2 , c 3 c_1,c_2,c_3 也可以通过softmax输出。比较而言,平方误差已经能够取得比较好的效果。

Landmark Detection

除了使用矩形区域检测目标类别和位置外,我们还可以仅对目标的关键特征点坐标进行定位,这些关键点被称为landmarks。

例如人脸识别,可以对人脸部分特征点坐标进行定位检测,并标记出来,如下图所示:

在这里插入图片描述

该网络模型共检测人脸上64处特征点,加上是否为face的标志位,输出label共有64x2+1=129个值。通过检测人脸特征点可以进行情绪分类与判断,或者应用于AR领域等等。

除了人脸特征点检测之外,还可以检测人体姿势动作,如下图所示:

在这里插入图片描述

Object Detection

目标检测的一种简单方法是滑动窗算法。这种算法首先在训练样本集上搜集相应的各种目标图片和非目标图片。注意训练集图片尺寸较小,尽量仅包含相应目标,如下图所示:

在这里插入图片描述

然后,使用这些训练集构建CNN模型,使得模型有较高的识别率。

最后,在测试图片上,选择大小适宜的窗口、合适的步进长度,进行从左到右、从上倒下的滑动。每个窗口区域都送入之前构建好的CNN模型进行识别判断。若判断有目标,则此窗口即为目标区域;若判断没有目标,则此窗口为非目标区域。

在这里插入图片描述

滑动窗算法的优点是原理简单,且不需要人为选定目标区域(检测出目标的滑动窗即为目标区域)。但是其缺点也很明显,首先滑动窗的大小和步进长度都需要人为直观设定。滑动窗过小或过大,步进长度过大均会降低目标检测正确率。而且,每次滑动窗区域都要进行一次CNN网络计算,如果滑动窗和步进长度较小,整个目标检测的算法运行时间会很长。所以,滑动窗算法虽然简单,但是性能不佳,不够快,不够灵活。

Convolutional Implementation of Sliding Windows

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

首先,单个滑动窗口区域进入CNN网络模型时,包含全连接层。那么滑动窗口算法卷积实现的第一步就是将全连接层转变成为卷积层,如下图所示:

在这里插入图片描述

全连接层转变成卷积层的操作很简单,只需要使用与上层尺寸一致的滤波算子进行卷积运算即可。最终得到的输出层维度是1 x 1 x 4,代表4类输出值。

单个窗口区域卷积网络结构建立完毕之后,对于待检测图片,即可使用该网络参数和结构进行运算。例如16 x 16 x 3的图片,步进长度为2,CNN网络得到的输出层为2 x 2 x 4。其中,2 x 2表示共有4个窗口结果。对于更复杂的28 x 28 x3的图片,CNN网络得到的输出层为8 x 8 x 4,共64个窗口结果。

在这里插入图片描述

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

Bounding Box Predictions

滑动窗口算法有时会出现滑动窗不能完全涵盖目标的问题,如下图蓝色窗口所示。

在这里插入图片描述

YOLO(You Only Look Once)算法可以解决这类问题,生成更加准确的目标区域(如上图红色窗口)。

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

在这里插入图片描述

然后,利用上一节卷积形式实现滑动窗口算法的思想,对该原始图片构建CNN网络,得到的的输出层维度为3 x 3 x 8。其中,3 x 3对应9个网格,每个网格的输出包含8个元素。

如果目标中心坐标 ( b x , b y ) (b_x,b_y) 不在当前网格内,则当前网格Pc=0;相反,则当前网格Pc=1(即只看中心坐标是否在当前网格内)。判断有目标的网格中, b x , b y , b h , b w b_x,b_y,b_h,b_w 限定了目标区域。值得注意的是,当前网格左上角坐标设定为(0, 0),右下角坐标设定为(1, 1), ( b x , b y ) (b_x,b_y) 范围限定在[0,1]之间,但是 b h , b w b_h,b_w 可以大于1。因为目标可能超出该网格,横跨多个区域,如上图所示。目标占几个网格没有关系,目标中心坐标必然在一个网格之内。

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

Intersection Over Union(交并比)

在这里插入图片描述

对于理想的边界框和目标探测算法预测得到的边界框,交并比函数计算两个边界框交集和并集之比。

一般在目标检测任务中,约定如果IoU$\geq$0.5 ,那么就说明检测正确。当然标准越大,则对目标检测算法越严格。得到的IoU值越大越好。

Non-max Suppression(非极大抑制)

非最大值抑制(Non-max Suppression)做法很简单,图示每个网格的Pc值可以求出,Pc值反映了该网格包含目标中心坐标的可信度。首先选取Pc最大值对应的网格和区域,然后计算该区域与所有其它区域的IoU,剔除掉IoU大于阈值(例如0.5)的所有网格及区域。这样就能保证同一目标只有一个网格与之对应,且该网格Pc最大,最可信。接着,再从剩下的网格中选取Pc最大的网格,重复上一步的操作。最后,就能使得每个目标都仅由一个网格和区域对应。如下图所示:

在这里插入图片描述

总结一下非最大值抑制算法的流程:

  • 1. 剔除Pc值小于某阈值(例如0.6)的所有网格;
  • 2. 选取Pc值最大的网格,利用IoU,摒弃与该网格交叠较大的网格;
  • 3. 对剩下的网格,重复步骤2。

Anchor Boxes

通过上面的各种方法,目前我们的目标检测算法在每个格子上只能检测出一个对象。使用Anchor box 可以同时检测出多个对象。

在这里插入图片描述

对于重叠的目标,这些目标的中点有可能会落在同一个网格中,对于我们之前定义的输出,只能得到一个目标的输出。

而Anchor box 则是预先定义多个不同形状的Anchor box,我们需要把预测目标对应地和各个Anchor box 关联起来,所以我们重新定义目标向量如上图所示:

用这样的多目标向量分别对应不同的Anchor box,从而检测出多个重叠的目标。

  • 不使用Anchor box:训练图片中的每个对象,根据对象的中点,分配到对应的格子中。输出大小(例如8)。
  • 使用Anchor box:训练图片的每个对象,根据对象的中点,分配到对应的格子中,同时还分配到一个和对象形状的IoU最高的Anchor box 中。输出大小(例如两个Anchor box)。

难点问题:

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

但是以上的两种问题出现的可能性不会很大,对目标检测算法不会带来很大的影响。

Anchor box 的选择:

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

YOLO Algorithm

训练:

在这里插入图片描述

模型预测:

输入与训练集中相同大小的图片,同时得到每个格子中不同的输出结果:

在这里插入图片描述

运行非最大值抑制(NMS):

  • 假设使用了2个Anchor box,那么对于每一个网格,我们都会得到预测输出的2个bounding boxes,其中一个比较高:

    在这里插入图片描述

  • 抛弃概率值低的预测bounding boxes:

    在这里插入图片描述

  • 对每个对象(如行人、汽车、摩托车)分别使用NMS算法得到最终的预测边界框:

    在这里插入图片描述

Region Proposals

R-CNN:

R-CNN(Regions with convolutional networks),会在我们的图片中选出一些目标的候选区域,从而避免了传统滑动窗口在大量无对象区域的无用运算。

所以在使用了R-CNN后,我们不会再针对每个滑动窗口运算检测算法,而是只选择一些候选区域的窗口,在少数的窗口上运行卷积网络。

具体实现:运用图像分割算法,将图片分割成许多不同颜色的色块,然后在这些色块上放置窗口,将窗口中的内容输入网络,从而减小需要处理的窗口数量。

在这里插入图片描述

更快的算法:

  • R-CNN:给出候选区域,对每个候选区域进行分类识别,输出对象标签和 bounding box,从而在确实存在对象的区域得到更精确的边界框,但速度慢;
  • Fast R-CNN:给出候选区域,使用滑动窗口的卷积实现去分类所有的候选区域,但得到候选区的聚类步骤仍然非常慢;
  • Faster R-CNN:使用卷积网络给出候选区域。

猜你喜欢

转载自blog.csdn.net/qq_35564813/article/details/86505943