用卷积神经网络提取图像特征

前面讲到的都是基于知识的图像特征提取方法,除此之外还有另一条技术路线——基于深度学习的图像特征提取。

一、视觉机理与卷积神经网络

人在认知图像时是分层抽象的,首先理解的是颜色和亮度,然后是边缘、角点、直线等局部细节特征,接下来是纹理、几何形状等更复杂的信息和结构,最后形成整个物体的概念。
视觉神经科学(Visual Neuroscience)对于视觉机理的研究验证了这一结论,动物大脑的视觉皮层具有分层结构。眼睛将看到的景象成像在视网膜上,视网膜把光学信号转换成电信号,传递到大脑的视觉皮层(Visual cortex),视觉皮层是大脑中负责处理视觉信号的部分。1959年,David和Wiesel进行了一次实验,他们在猫的大脑初级视觉皮层内插入电极,在猫的眼前展示各种形状、空间位置、角度的光带,然后测量猫大脑神经元放出的电信号。实验发现,不同的神经元对各种空间位置和方向偏好不同。这一成果后来让他们获得了诺贝尔奖。
目前已经证明,视觉皮层具有层次结构。从视网膜传来的信号首先到达初级视觉皮层(primary visual cortex),即V1皮层。V1皮层简单神经元对一些细节、特定方向的图像信号敏感。V1皮层处理之后,将信号传导到V2皮层。V2皮层将边缘和轮廓信息表示成简单形状,然后由V4皮层中的神经元进行处理,它颜色信息敏感。复杂物体最终在IT皮层(inferior temporal cortex)被表示出来。

卷积神经网络可以看成是上面这种机制的简单模仿。它由多个卷积层构成,每个卷积层包含多个卷积核,用这些卷积核从左向右、从上往下依次扫描整个图像,得到称为特征图(feature map)的输出数据。网络前面的卷积层捕捉图像局部、细节信息,有小的感受野,即输出图像的每个像素只利用输入图像很小的一个范围。后面的卷积层感受野逐层加大,用于捕获图像更复杂,更抽象的信息。经过多个卷积层的运算,最后得到图像在各个不同尺度的抽象表示。

二、卷积网络的关键结构

1、卷积层(CONV)

顾名思义,卷积层由一组卷积单元(又称”卷积核”)组成,可以把这些卷积单元理解为过滤器,每个过滤器都会提取一种特定的特征,方法参见图像卷积

对卷积层功能的理解

  • 一般认为图像的空间联系是局部的像素联系比较密切,而距离较远的像素相关性较弱,因此,每个神经元没必要对全局图像进行感知,只要对局部进行感知,然后在更高层将局部的信息综合起来得到全局信息。
  • 给定一张输入图片,用一个卷积核去扫这张图,卷积核里面的数就叫权重,这张图每个位置是被同样的卷积核扫的,所以权重是一样的,这也就是权值共享。
  • 如权值共享的部分所说我们用一个卷积核操作只能得到一种特征可能获取不到全部特征,这么一来我们就引入了多核卷积。用不同的卷积核来学习不同的特征(每个卷积核学习到不同的权重)来提取原图特征。需要注意的是,在多核卷积的过程中每个卷积核的大小应该是相同的。

2、池化层(POOL)

卷积层的过滤器负责从图像中查找规律,过滤器越多则参数越多,这意味着卷积层的维度可能很庞大。我们需要一种方法来降低维数,这就是卷积网络中的池化层(又名”下采样层”)所扮的角色。

对池化层功能的理解

  • 降低了图片尺寸,也就是增大了感受野。感受野就是数字矩阵中的一个数字所对应的原图中的区域大小。因为池化是在某个范围内选择一个数字,也就是让这个数字代表这个范围内的所有的像素得值。这样做虽然也丢失了一些图片信息,但是同时增加了鲁棒性。
  • 增加平移不变性。图片中某个目标单纯的位置的移动,不应该影响识别结果。而池化捕捉的恰好是目标的特征,并不是目标所在的位置,因此增加了平移不变性。
  • 提升训练速度。因为在保留特征信息的前提下,降低了图片的尺寸。

池化主要有3种形式:一般池化,重叠池化和金字塔池化。

(1)一般池化

池化窗口的尺寸为n×n,一般情况下池化窗口都是正方形的。步长(stride)等于n。此时池化窗口之间是没有重叠的。对于超出数字矩阵范围的,只计算范围内的或者范围外的用0填充再计算。又可以分为最大值池化,均值池化。

  • 最大值池化

池化窗口范围内的最大值作为采样的输出值。
假如输入是一个4×4矩阵,执行最大池化是一个2×2矩阵,每次滑动2步。执行过程非常简单,把4×4的输入拆分成不同的区域,把这些区域用不同颜色来标记。对于2×2的输出,输出的每个元素都是其对应颜色区域中的最大元素值。

  • 均值池化

普通均值池化就是将池化窗口范围内的平均值作为采样的输出值。这种池化不如最大池化常用。

(2)重叠池化

池化窗口之间有重叠。也就是步长大于等于1小于n,计算和一般池化是一样的。

(3)金字塔池化

空间金字塔池化(Spatial Pyramid Pooling,简称SPP)可以将尺寸大小不一样的图片转换为同样的尺寸。
SPP首先把图片看成1块,对这1块进行最大值池化,得到1个值,分成4块,对这4块分别进行最大值池化,得到4个值;分成16块,对这16块分别进行最大值池化,得到16个值,以此类推。这样就可以保证对于不同尺寸的图片而言,最终得到的值的个数是一样的。因为是最大值池化,超出范围的用不用0填充不会影响结果。

三、卷积网络的设计公式

1、卷积层的填充(padding)公式

直接对原始图像做卷积,会存在两个问题。一是每次卷积后图像(特征图)都会缩小,这样卷不了几次就没了; 二是相比于图片中间的点,图片边缘的点在卷积中被计算的次数很少,导致边缘的信息易于丢失。
为了解决这个问题,我们可以采用填充的方法。我们每次卷积前,先给图片周围都补一圈空白,让卷积之后图片跟原来一样大,同时,原来的边缘也被计算了更多次。

比如,我们把(8,8)的图片给补成(10,10),那么经过(3,3)的filter之后,就是(8,8),没有变。
能够保证输入的数据和输出的数据具有相同的空间尺寸,假设零填充个数为p,卷积核为f×f,卷积核滑动步长为s,则p应设置为

$$ p=(f-1)/2 $$

2、计算卷积层输出大小的公式

假设原始输入图像为m×m,输出图像为n×n,零填充个数为p,卷积核为f×f,卷积核滑动步长为s,则输出尺寸为

$$ n=(m+2p-f)/s+1 $$

3、计算卷积后参数个数

假设输入图像为(m,m,d),其中d为图像深度(通道数),卷积核为f×f,卷积核个数为n,则
weight个数为

$$ f×f×n×d $$

bias个数:

$$ n $$

4、计算池化层输出大小的公式

池化层很少使用零填充。假设原始输入图像为m×m,输出图像为n×n,卷积核为f×f,卷积核滑动步长为s,则输出尺寸为

$$ n=(m-f)/s+1 $$

0%