Coursera吴恩达《卷积神经网络》课程笔记(3)-- 目标检测

红色石头的我的网站:redstonewill.comweb

《Convolutional Neural Networks》是Andrw Ng深度学习专项课程中的第四门课。这门课主要介绍卷积神经网络(CNN)的基本概念、模型和具体应用。该门课共有4周课时,因此我将分红4次笔记来总结,这是第3节笔记,主要介绍目标检测。算法

1. Object Localization

前两节课程中,咱们介绍的是利用CNN模型进行图像分类。除此以外,本周课程将继续深刻介绍目标定位和目标检测(包含多目标检测)。windows

这里写图片描述

标准的CNN分类模型咱们已经很熟悉了,以下所示:网络

这里写图片描述

原始图片通过CONV卷积层后,Softmax层输出4 x 1向量,分别是:机器学习

[ 1 0 0 0 ] [ 0 1 0 0 ] [ 0 0 1 0 ] [ 0 0 0 1 ] svg

注意,class label也多是几率。上述四个向量分别对应pedestrain,car,motorcycle和background四类。函数

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

这里写图片描述

原始图片通过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。学习

输出label可表示为:测试

[ P c b x b y b h b w c 1 c 2 c 3 ] Pc=1: [ 1 b x b y b h b w c 1 c 2 c 3 ] Pc=0: [ 0 ? ? ? ? ? ? ? ]

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

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

  • Pc=1,即 y 1 = 1

L ( y ^ , y ) = ( y ^ 1 y 1 ) 2 + ( y ^ 2 y 2 ) 2 + + ( y ^ 8 y 8 ) 2

  • Pc=0,即 y 1 = 0

L ( y ^ , y ) = ( y ^ 1 y 1 ) 2

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

2. Landmark Detection

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

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

这里写图片描述

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

除了人脸特征点检测以外,还能够检测人体姿式动做,以下图所示:

这里写图片描述

3. Object Detection

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

这里写图片描述

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

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

这里写图片描述

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

4. 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便可。

5. 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个元素:

y = [ P c b x b y b h b w c 1 c 2 c 3 ]

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

划分的网格能够更密一些。网格越小,则多个目标的中心坐标被划分到一个网格内的几率就越小,这偏偏是咱们但愿看到的。

6. Intersection Over Union

IoU,即交集与并集之比,能够用来评价目标检测区域的准确性。

这里写图片描述

如上图所示,红色方框为真实目标区域,蓝色方框为检测目标区域。两块区域的交集为绿色部分,并集为紫色部分。蓝色方框与红色方框的接近程度能够用IoU比值来定义:

I o U = I U

IoU能够表示任意两块区域的接近程度。IoU值介于0~1之间,且越接近1表示两块区域越接近。

7. Non-max Suppression

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

这里写图片描述

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

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

这里写图片描述

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

  • 1. 剔除Pc值小于某阈值(例如0.6)的全部网格;

  • 2. 选取Pc值最大的网格,利用IoU,摒弃与该网格交叠较大的网格;

  • 3. 对剩下的网格,重复步骤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值均大于某阈值,则检测到了两个目标。

这里写图片描述

y = [ P c b x b y b h b w c 1 c 2 c 3 P c b x b y b h b w c 1 c 2 c 3 ]

在使用YOLO算法时,只需对每一个Anchor box使用上一节的非最大值抑制便可。Anchor Boxes之间并行实现。

顺便提一下,Anchor Boxes形状的选择能够经过人为选取,也可使用其余机器学习算法,例如k聚类算法对待检测的全部目标进行形状分类,选择主要形状做为Anchor Boxes。

9. YOLO Algorithm

这一节主要介绍YOLO算法的流程,算是对前几节内容的回顾。网络结构以下图所示,包含了两个Anchor Boxes。

  • 1. For each grid call, get 2 predicted bounding boxes.

  • 2. Get rid of low probability predictions.

  • 3. For each class (pedestrian, car, motorcycle) use non-max suppression to generate final predictions.

这里写图片描述

10. Region Proposals

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

这里写图片描述

为了解决这一问题,尽可能避免对无用区域的扫描,可使用Region Proposals的方法。具体作法是先对原始图片进行分割算法处理,而后支队分割后的图片中的块进行目标检测。

这里写图片描述

Region Proposals共有三种方法:

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

  • Fast R-CNN: 利用卷积实现滑动窗算法,相似第4节作法。

  • Faster R-CNN: 利用卷积对图片进行分割,进一步提升运行速度。

比较而言,Faster R-CNN的运行速度仍是比YOLO慢一些。

更多AI资源请关注公众号:红色石头的机器学习之路(ID:redstonewill)
这里写图片描述