吴恩达deeplearning之CNN—目标检测(1)
1 目标定位
这一周学习的主要内容是对象检测,它是计算机视觉领域一个新兴的应用方向,相比两年前,它的性能也越来越好,在构建对象检测之前,需要先了解一下对象定位。
对于图片分类任务大家都耳熟能详,算法通过遍历如下图片来判断其中是不是汽车。而对象定位不仅需要算法判断图片中是不是汽车,还要在图片中标记处它的位置,用边框或红色方框把车圈出来,这就是定位分类问题,在后面的章节我们还会分享如果同一幅图片中有多个目标时应该如何检测,比如,你正在做一个自动驾驶程序,程序需要检测出其它的车辆、行人、摩托车等等。这里我们研究的定位分类问题,通常只有一个较大的对象位于图片正中间位置。
对于图片分类问题,把图片输入到多层卷积神经网络,神经网络会输出一个特征向量并反馈给softmax单元来预测图片类型,如果你还想定位图片中对象的位置的话可以让神经网络多输出几个单元,具体来说就是多四个标识对象边界框位置的参数
本周课程的一些符号约定:图片左上角坐标
这里有pedestrain、car、motorcycle、background四个类,神经网络输出的是
以含有汽车图片为例的话标签y可以表示为:
以不包含任何对象的图片为例标签y可以表示为:
这类问题的损失函数可以表示为
从公式可以看出,如果图像中包含对象那么需要考虑所有的目标输出,如果图像中不包含对象那么只需要考虑第一个表示是否包含对象的元素是否预测正确即可,也就是只考虑神经网络评估
这里为了让大家了解对象定位的细节,用平方误差简化了描述过程,实际应用中可以
1)对
2)对边界框
3)对类别
2 特征点检测
在上一节中主要阐述了如何利用神经网络进行对象定位,即通过输出四个参数值
假设你正在构建一个人脸识别应用,如果你希望算法可以给出眼角的具体位置,眼角的坐标为
所以你要做的是准备图片X以及图片中人物脸部特征点的标签Y的集合作为输入数据,将图片输入卷积网络输出
如果你对人体姿态检测感兴趣,还可以定义一些关键特征点,如胸部的中点,左键,左肘,腰等等,然后用神经网络输出这些关键特征点,就相当于输出了人物的姿态动作。
3 目标检测
本节讲述滑动窗口目标检测算法,假如你想构建一个汽车检测算法那,步骤如下:
1)创建一个标签训练集,X是适当检测的汽车图片样本,出于对训练集的期望,可以使用适当剪切的图片就是整张图片几乎都被汽车占据,有了这个标签训练集就可以训练一个卷积网络,来判断图片中是否包含汽车。
2)基于步骤1)训练的卷积网络,就可以实现滑动窗口目标检测,具体步骤如下,首先选择一个特定大小的窗口,窗口在图像上从左上角开始等步长滑动,遍历图像的每个区域,将窗口圈定的区域输入到步骤1)训练的卷积网络进行预测,判断窗口内有没有汽车。
3)重复步骤2)的操作,选择一个更大的窗口
4)重复步骤2)的操作,选择一个更更大的窗口
只要图片中有汽车,这样循环往复,总有一个窗口可以检测到它,滑动窗口目标检测算法有着明显的缺点就是计算成本高,因为你在图片中剪出来太多的图像区域,卷积网络要一个一个的处理,如果你选择的步幅很大,显然会减少输入卷积网络的窗口个数,但是粗粒度可能会影响性能,反之,如果采用小粒度,传递给卷积窗口的小窗口会特别多,所以在神经网络出现之前人们通常采用更简单的分类器进行对象检测,比如简单的线性分类器,因为每个分类器的计算成本都很低,所以滑动窗口目标检测算法表现良好,是个不错的算法,然而卷积网络运行单个分类任务的成本却高得多,这样滑动窗口效率就太慢了,但是庆幸的是计算成本问题已经有了很好的解决方案,大大提高了再卷积层上应用滑动窗口目标检测器的效率,这也是下一部分的内容。
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