特征的提取

图像检测的第一步依然是特征的提取,关于特征提取的原理之前其实已经讲得很明白了,使用简单的卷积核/滤波器对图像全部像素进行扫描,其实就很容易提取出图像上面的轮廓信息(更准确地讲,这里仅对灰度图像比较有效,对于使用RGB通道表示的彩色图像理论上来讲也有效果,但情况可能更复杂)。

关于如何提取轮廓特征,参考上面的sobel算子,以及对卷积层的描述,这里不再细讲了。那么提取到轮廓特征有什么用呢?我们已经说了,对提取到的特征的运用,是遵循由小到大,由简单到复杂的原则,最开始是提取简单的线条特征,然后由线条组成部件特征,再由简单的小部件组成复杂部件,最后由复杂部件来推导出图像分类。

特征的组合

这里举一个例子。

上面是一个除号的图片,假如我们使用sobel算子,分别从垂直的方向和水平的方向提取边缘特征,很容易分别提取出垂直方向和水平方向的边缘线条。假设这个除号在一幅20 x 20的图像的左上方,如下图所示:

现在我们用两个更简单的filter来提取垂直和水平方向的特征,第一个filter是

为简单起见,仅针对图形左侧局部进行计算,得到如下结果。

接着我们再增加一个filter,用于提取水平方向的特征。

在图像同样的位置计算结果如下。

很容易看出,如果我们将这两个结果叠加起来,可以提取出一个这样的特征。

用“x”标示出来的像素其特征值不为0,而其他像素为0。为方便起见,暂时给这个局部特征或者部件起个名字,称为“左横”。那么怎么将单独的filter所提取到的线条特征组合成一个复杂的部件特征呢?现在我们假设第一层网络用到两个filter,分别提取垂直和水平方向的边缘线条。得到一个2通道的20 x 20的输出层。根据上面的介绍,在进行第二层的卷积网络的时候,filter的通道数量也将是二。那么我们来手工设计一下这个2通道的filter,实际上在真实的应用中它应该是通过学习得到的。

假设这个filter的大小仍是3 x 3,那么第一个通道如下:

它的作用是提取右侧的竖线。

第二个通道如下:

它的作用是提取上下两条水平线,为简单起见,我们将两条水平线设置成一正一负。那么计算结果如下(这里略去了下采样层等,假设计算之后图像大小仍为20 x 20):

看图像中有一个数值明显高于其他数值,这个位置就是提取到加号“左横”特征的位置。如果要提取这个特征值,还需要作一些加工步骤。第一步,将卷积结果加一个bias,偏置值。假如这个值是-4000,那么计算结果为

可以看到除背景为黄色的像素是正数外,其他像素值都为负数。然后我们再用激活函数RELU加工一下,即变成

在左上角位置像素值为1865,而且其他位置都为0,说明我们在这个位置提取到了“左横”这一特征部件,而其他位置没有提取到。所以,在输出结果中,仅需一个节点,就可以表示某个特征是否被提取到,而其位置有时候则不重要。

同样的方法,如果我们提取到了“右横”、“上圆”、“下圆”,那么合起来,则可以提取到一个“除号”的特征值。

可以用下面的网络层次来简单表述这一推理过程。