吴恩达深度学习笔记之卷积神经网络(目标检测)

3.1 目标定位

定位分类问题意味着我们不仅要用算法判断出图片中是否有该物体,还要标记出它的位置,例如图片有一辆汽车,我们需要用边框把汽车圈起来。
图像分类问题已不陌生,例如输入一张图片到多层卷积神经网络,它会输出一个特征向量,并反馈给softmax来预测图片类型。
比如某张图片包括以下几类,人,汽车,摩托车,背景。如果在该张图片中没有检测到对象,则输出结果就会是背景,这些分类就是softmax函数可能输出的结果。
如果还想定位图片中的汽车,行人等的位置,此时我们可以让神经网络多输出几个单元,输出一个边界框,具体来说就是让神经网络多输出四个数字,标记为bx,by,bh,bw分别代表边框的中心坐标,以及边框的长和宽,当然还可以有其他的表示方法。

定义以下标签

行人
汽车
摩托车
背景

注意:这里有4个分类,神经网络输出的是这 4个数字,和一个分类标签出现的概率。目标标签Y的定义如下:他是一个向量。如下所示: y=[pcbxbybhbwc1c2c3]T 其中 pc 表示有无有无要检测的对象如果 pc =0表示只有背景,则后面的参数均无意义,如果 pc =1,表示有检测对象,同时输出 c1 , c2 , c3 表示该对象属于1-3中的哪一个类。
最后一下,我们介绍训练神经网络的损失函数,其参数为类别Y,和网络输出 Y^ ,这里损失函数采用平方误差策略, L(Y^,Y)=(Y^1Y1)2+(Y^2Y2)2++(Y^8Y8)2 ,因为上向量有8个参数,损失值等于每个元素相应差值的平方和,如果图片中存在定位对象,损失值就是不同元素的平方和,另一种情况,如果不存在对象,损失值就是 (Y^1Y1)2 ,因为对于这种情况,我们不需要考虑其他元素。
目标定位的简单模型如下:

这里写图片描述

3.2 目标检测(objection detection)

这节我们主要介绍基于滑动窗口的目标检测算法,具体步骤先看可能下面的图:

这里写图片描述

这里写图片描述

步骤如下:首先选定一个特定大小的窗口,将这个窗口输入卷积网络,卷积网络开始进行预测,即判断红色方框内是否存在汽车。接着处理第二张图片,如此循环下去。在这里可以调节步幅以及窗口的大小,这就是滑动窗口检测的简要步骤。
滑动窗口目标检测有明显的缺点,就是计算成本太大,因为要剪出太多的小方块,然后卷积网络要一个一个的处理,如果选用步幅太大,又会影响性能。

3.3 卷积的滑动窗口实现(Convolution implementation of sliding windows)

上一小节,我们学习了如何通过卷积网络实现窗口对象检测算法,但是其效率很低,这一节我们介绍如何在卷积上应用这个算法。
为了构建滑动窗口的卷积应用,首先需要把神经网络的全连接层转化为卷积层。
如图所示:

这里写图片描述

输出表示分别对应softmax单元所输出的4个分类出现的概率,如下演示将上述的全连接层转为卷积层。

这里写图片描述

利用400个5*5*16的过滤器将其转化为1*1*400的输出,接着使用1*1卷积。1*1卷积的作用在这里不在赘述 。以上就是用卷积层代替全连接层的过程。
我们再看看如何通过卷积实现滑动窗口检测算法
为了简单起见,假设向滑动窗口卷积网络输入14*14*3的训练集图片如下:

这里写图片描述

测试集图片为16*16*3如下:

这里写图片描述

该卷积操作的原理是我们不需要把输入图片分割成四个子集,分别执行前向传播,而是把他们作为一张图片输入给卷积网络进行计算,其中的共有区域可以共享很多计算。
总结一下:滑动窗口的实现过程,在图片上剪切出一块区域,假设它的大小是14*14,将它输入到卷积网络,继续输入下一块区域,重复此操作。但是现在我们不用依靠连续的卷积操作来识别图片中的汽车,比如我们可以对大小为28*28的整张图片进行卷积操作,一次性得到所有预测值,这样神经网络就可以识别出汽车的位置,他提高了整个算法的效率。
缺点:边界框的位置可能不够准确。
如下所示:

这里写图片描述

3.4 Bounding Box 预测

滑动窗口的卷积实现,该算法效率高,但是存在一个问题就是不能输出精准的边界框。有一个得到更精准的边界框的算法是YOLO(you only look once)算法,它的思想如下:加入我们输入图像是100*100的,然后在图像上放一个网格,可能是3*3,也可能是19*19,如图为了方便,我们设置为3*3

这里写图片描述

然后对这9个格子,每个格子都指定一个标签,y是8维向量,和我们之前看到的一样, y=[pcbxbybhbwc1c2c3]T ,YOLO算法做的就是取两个对象的中点,然后将对象分配给包含对象中点的格子。如图所示

这里写图片描述

对于3*3的网格,9个格子中的任何一个,我们都会得到一个8维的输出向量,总的输出标签尺寸是3*3*8。
YOLO算法的优点是可以输出精确的边界框。只要每个格子中对象数目没有超过一个,这个算法就应该没什么问题,如果存在多个对象,后面再讨论。
YOLO算法的好处是它的运行速度非常快,几乎可以达到实时识别。

重要细节

就是在YOLO算法中,bx,by,bh,bw是如何定义的,我们看下面一张图就一目了然了。

这里写图片描述

格子的左上角坐标定义为(0,0),右下角坐标定义为(1,1)
bx,by在0到1之间,而bh,bw可以大于1。它们是相对格子尺度的比例。

3.5 交并化(Intersection over union)

交并化可以用来评价对象检测算法的好坏。它做的是计算两个边界框交集和并集之比。如下所示:

这里写图片描述

一般约定,在计算检测任务中,如果说IoU>0.5,就说检测正确,IoU越高,边界框越精确,这是一种衡量定位精确度的方式。

3.6 非最大值抑制(Non-max suppression)

我们的算法可能对同一个对象做多次检测,非最大值抑制就是上述的一些检测结果,只输出概率最大的分类结果。如图所示:

这里写图片描述

上面那张图有多个检测结果,但是我们只保留概率为0.9,和概率为0.8的结果,其余的结果均丢弃掉,这就叫非最大值抑制。
如下图所示:

这里写图片描述

3.7 Anchor Boxes

到目前为止,对象检测存在的问题是每个格子只能检测出一个对象,如果想要检测多个对象,可以使用anchor box这个概念。
假设我们有下面这样一张图:

这里写图片描述

对于这样一个例子,如果我们继续使用3*3网格,我们会发现行人和汽车的中店几乎一样,两者都落在同一个格子中,所以此时,我们需要定义两个anchor box,一般来说需要定义5到10个anchor box,这里为了简单,定义两个。此时,我们需要做的是将预测结果和这两个anchor box关联起来,用的向量也不再是以前的向量,而是如下图所示的向量:

这里写图片描述

前面8个参数和anchor box1关联,后面8个参数和anchor box2 关联。然后我们就看哪一个anchor box和实际边界框的交并比更高。
我们建立anchor box这个概念是为了处理两个对象出现在 同一个格子的情况。
人们一般手工指定anchor box的形状,我们可以选择5到10个anchor box 形状覆盖到多种不同的形状。

3.8 RPN 网络

R-CNN:意思是带区域的卷积神经网络,该算法尝试选出一些区域,在这些区域上运行卷积网络分类器。所以这里不再针对每个滑动窗跑检测算法,而是选择一些窗口,在少数窗口上运行卷积网络分类器,选出候选区域的方法是运行图像分割算法,如图所示:

这里写图片描述

分割算法在某个地区找到一个色块,然后在这个色块上跑分类器,这样可以减少卷机网络分类器运行时间,比在图像所有位置跑一遍分类器要快,这就是R-CNN的概念。
注意:R-CNN不会直接新人输入的边界框,它也会输出一个边界框bx,by,bh,bw,这样得到的边界框比较精确,但是R-CNN还是太慢了。
Fast-RCNN:Fast-RCNN基本上是R-CNN,不过用卷积实现了滑动窗法
Faster-RCNN:使用的是卷积神经网络,而不是更传统的分割算法来获得候选区域色块,结果比快速Fast-Rcnn快得多。
R-CNN:Propose regions,classify proposed regions one at a time,output label+bounding box
Fast R-CNN : Use convolution implementation of sliding windows to classified all the proposed regions
Faster R-CNN : Use convolutional network to propose regions .

猜你喜欢

转载自blog.csdn.net/liushao123456789/article/details/78847926