吴恩达deeplearning之CNN—目标检测(1)

来源:互联网 发布:英版iphone6s支持网络 编辑:程序博客网 时间:2024/05/21 00:20

1 目标定位

  这一周学习的主要内容是对象检测,它是计算机视觉领域一个新兴的应用方向,相比两年前,它的性能也越来越好,在构建对象检测之前,需要先了解一下对象定位。
这里写图片描述
  对于图片分类任务大家都耳熟能详,算法通过遍历如下图片来判断其中是不是汽车。而对象定位不仅需要算法判断图片中是不是汽车,还要在图片中标记处它的位置,用边框或红色方框把车圈出来,这就是定位分类问题,在后面的章节我们还会分享如果同一幅图片中有多个目标时应该如何检测,比如,你正在做一个自动驾驶程序,程序需要检测出其它的车辆、行人、摩托车等等。这里我们研究的定位分类问题,通常只有一个较大的对象位于图片正中间位置。
这里写图片描述
  对于图片分类问题,把图片输入到多层卷积神经网络,神经网络会输出一个特征向量并反馈给softmax单元来预测图片类型,如果你还想定位图片中对象的位置的话可以让神经网络多输出几个单元,具体来说就是多四个标识对象边界框位置的参数bx,by,bh,bw
  本周课程的一些符号约定:图片左上角坐标(0,0),图片右下角坐标(1,1),对象边框中心点坐标(bx,by),边框的高度bh,边框的宽度(bw),因此训练集不仅包含对象的分类标签还要包含标识边框位置的四个参数。之后就可以按照监督学习算法输出一个分类标签还有四个参数值,从而给出被检测对象的边框位置,此例子中bx的理想值是0.5,因为它标识汽车位于图片水平方向的中间位置,by大约是0.7,表示汽车位于距离图片底部3/10的位置,bh约为0.3,因为红色方框的高度是图片高度的大约0.3倍,bw约为0.4,因为红色方框的宽度是图片宽度的0.4倍。
这里写图片描述
  这里有pedestrain、car、motorcycle、background四个类,神经网络输出的是bx,by,bh,bw四个数字和一个分类标签,或分类标签出现的概率,目标标签y可以表示为一个向量,第一个元素Pc表示是否含有对象,如果对象属于pedestrain、car、motorcycle则Pc=1否则为Pc=0,如果检测到参数就同时输出对象的边框参数bx,by,bh,bwc1,c2,c3表示该对象属于1-3中的哪一类,这里我们假设我们图像中只有一个对象。
  以含有汽车图片为例的话标签y可以表示为:[1,bx,by,bh,bw,0,1,1]
  以不包含任何对象的图片为例标签y可以表示为:[0,?,?,?,?,?,?,?] ?表示对应位置上的值没有任何的含义。
这里写图片描述
  这类问题的损失函数可以表示为L(yˆ,y),如果采用平方误差策略损失函数可以写成:

L(yˆ,y)={8i=1(yiˆyi)2(yˆ1y1)y1=1y1=0

  从公式可以看出,如果图像中包含对象那么需要考虑所有的目标输出,如果图像中不包含对象那么只需要考虑第一个表示是否包含对象的元素是否预测正确即可,也就是只考虑神经网络评估pc的准确度。
  这里为了让大家了解对象定位的细节,用平方误差简化了描述过程,实际应用中可以
1)对pc应用逻辑回归函数
2)对边界框bx,by,bh,bw用平法误差或其他类似的方法。
3)对类别c1,c2,c3用softmax函数

2 特征点检测

  在上一节中主要阐述了如何利用神经网络进行对象定位,即通过输出四个参数值bx,by,bh,bw给出图像中对象的边界框,更概括的说神经网络可以输出图片上特征点的(x,y)坐标,来实现对目标特征的识别。
  假设你正在构建一个人脸识别应用,如果你希望算法可以给出眼角的具体位置,眼角的坐标为(x,y),你可以让神经网络的最后一层多输出两个数字lx,ly,作为眼角的坐标,如果你想知道两只眼睛的四个眼角的具体位置,那么从左到右,依次用四个特征点l1x,l1y)(l2x,l2y)(l3x,l3y)(l4x,l4y)来表示四个眼角,你还可以输出更多的特征点,来确定嘴的形状,从而判断人物是在微笑还是在皱眉;也可以提取鼻子周围的关键特征点,为了便于描述你可以设置特征点的特殊,假设脸部有64个特征点,有的点甚至可以帮助你定义脸部轮廓或下颌轮廓,选定特征点个数,并生成包含这些特征点的标签训练集,然后用神经网络输出脸部特征点的位置。
所以你要做的是准备图片X以及图片中人物脸部特征点的标签Y的集合作为输入数据,将图片输入卷积网络输出
这里写图片描述
  [pc,l1x,l2y,...,l64yx,l64y],其中pc=1表示图片中包含人脸,pc=0表示不包含,最终输出129个单元。这是实现人脸部表情识别的基本构造模块,如果你用过Snapchat或其它的一些娱乐产品,snapchat实现了在脸上画皇冠和其它一些特殊效果。
  如果你对人体姿态检测感兴趣,还可以定义一些关键特征点,如胸部的中点,左键,左肘,腰等等,然后用神经网络输出这些关键特征点,就相当于输出了人物的姿态动作。

3 目标检测

  本节讲述滑动窗口目标检测算法,假如你想构建一个汽车检测算法那,步骤如下:
1)创建一个标签训练集,X是适当检测的汽车图片样本,出于对训练集的期望,可以使用适当剪切的图片就是整张图片几乎都被汽车占据,有了这个标签训练集就可以训练一个卷积网络,来判断图片中是否包含汽车。
这里写图片描述
2)基于步骤1)训练的卷积网络,就可以实现滑动窗口目标检测,具体步骤如下,首先选择一个特定大小的窗口,窗口在图像上从左上角开始等步长滑动,遍历图像的每个区域,将窗口圈定的区域输入到步骤1)训练的卷积网络进行预测,判断窗口内有没有汽车。
3)重复步骤2)的操作,选择一个更大的窗口
4)重复步骤2)的操作,选择一个更更大的窗口
这里写图片描述
  只要图片中有汽车,这样循环往复,总有一个窗口可以检测到它,滑动窗口目标检测算法有着明显的缺点就是计算成本高,因为你在图片中剪出来太多的图像区域,卷积网络要一个一个的处理,如果你选择的步幅很大,显然会减少输入卷积网络的窗口个数,但是粗粒度可能会影响性能,反之,如果采用小粒度,传递给卷积窗口的小窗口会特别多,所以在神经网络出现之前人们通常采用更简单的分类器进行对象检测,比如简单的线性分类器,因为每个分类器的计算成本都很低,所以滑动窗口目标检测算法表现良好,是个不错的算法,然而卷积网络运行单个分类任务的成本却高得多,这样滑动窗口效率就太慢了,但是庆幸的是计算成本问题已经有了很好的解决方案,大大提高了再卷积层上应用滑动窗口目标检测器的效率,这也是下一部分的内容。

4.卷积滑动窗口实现

  在上一部分内容中,了解了如何通过卷积网络实现滑动窗口对象检测算法,但是效率很低,这一部分我们学习怎么用卷积网络高效实现这个算法。
这里写图片描述
  要构建滑动窗口的卷积应用,首先需要知道如何把神经网络的全连接层转化成卷积层,

  假设你的目标检测算法输入图像大小是14143,为了演示方便图像选取的很小,选取16个5*5大小的滤器,14143的图像经过滤器处理后映射为10*10*16,然后通过参数为2*2的最大池化操作,将图像缩减为5*5*16,然后添加一个连接400个单元的全连接层,接着再添加一个400个单元的全连接层,最后通过softmax单元输出Y,这里输出结果有4个类。
如何把上述问题中的全连接层转换为卷积层?除了全连接层,其它和上述描述的网络结构一直,对于第一个全连接层可以用400个5*5的过滤器实现,对于5*5*16的图像,用400个5*5的过滤器进行卷积操作输出结果为1*1*400,我们不在把它看成包含400个节点的集合,而是一个1*1*400的输出层,然后再添加一个卷积层,包含400个1*1过滤器,下一层输出仍然是1*1*400,最后经由1*1过滤器的处理得到一个softmax激活值大小为1*1*4。
这里写图片描述
以下的部分参考了文献[1],
  假设想滑动窗口卷积网络输入14*14*3的图像,测试集图像大小为16*16*3,这里给输入图像加上了黄色边块,在最初的滑动窗口算法中,会把蓝色区域输入卷积网络生成0或1分类,接着滑动窗口步幅为2个像素,会逐次的将红色、绿色、橙色、黄色输入卷积网络,在这个16*16*3的测试图像中进行了4次卷积操作,输出了四个标签,结果发现,这4次卷积操作中的很多计算都是重复的。尤其是在第一步,卷积网络运行同样的参数使用同样的5*5*16过滤器进行卷积操作得到12*12*16的输出层,然后执行同样的最大池化输出结果为6*6*16,照旧应用400个5*5的过滤器得到一个2*2*400的输出层,应用1*1过滤器得到另一个2*2*400的输出层在做一个全连接的得到最终的2*2*4的输出单元,最终在输出层的4个单元中,依次对应红色、绿色、橙色和黄色方框区域。
这里写图片描述
  以真实的图像为例,我们可以通过这种方式对整幅图像进行卷积最终一下得到所有区域的预测结果,判断是否包含汽车,这就是卷积层上应用滑动窗口算法的内容,它提高了整个算法那的效率,但是算法仍然存在一个缺点就是边界框的位置可能不够准确,下一部分内容将探索如果提高边界框定位精准度。
这里写图片描述
参考文献
[1] OverFeat:Intergrated recognition,localization and detection using convolutional networks

原创粉丝点击