卷积网络的边缘检测

神经网络由浅层到深层,分别可以检测出图片的边缘特征、局部特征(例如眼睛、鼻子等),到后面的一层就可以根据前面检测的特征来识别整体面部轮廓。这些工作都是依托卷积神经网络来实现的。

卷积运算(Convolutional Operation)是卷积神经网络最基本的组成部分。我们以边缘检测为例,来解释卷积是怎样运算的。


边缘检测

图片最常做的边缘检测有两类:垂直边缘(Vertical Edges)检测和水平边缘(Horizontal Edges)检测。

Different-edges

图片的边缘检测可以通过与相应滤波器进行卷积来实现。以垂直边缘检测为例,原始图片尺寸为 6x6,中间的矩阵被称作滤波器(filter),尺寸为 3x3,卷积后得到的图片尺寸为 4x4,得到结果如下(数值表示灰度,以左上角和右下角的值为例):

Vertical-Edge-Detection

可以看到,卷积运算的求解过程是从左到右,由上到下,每次在原始图片矩阵中取与滤波器同等大小的一部分,每一部分中的值与滤波器中的值对应相乘后求和,将结果组成一个矩阵。

下图对应一个垂直边缘检测的例子:

Convolutional-operation-example


如果将最右边的矩阵当作图像,那么中间一段亮一些的区域对应最左边的图像中间的垂直边缘。

这里有另一个卷积运算的动态的例子,方便理解:

Convolutional-operation

图中的*表示卷积运算符号。因为在计算机中这个符号表示一般的乘法,在不同的深度学习框架中,卷积操作的 API 定义可能不同:

在 Python 中,卷积用 conv_forward() 表示;
在 Tensorflow 中,卷积用 tf.nn.conv2d() 表示;
在 keras 中,卷积用 Conv2D() 表示。


更多边缘检测的例子

如果将灰度图左右的颜色进行翻转,再与之前的滤波器进行卷积,得到的结果也有区别。实际应用中,这反映了由明变暗和由暗变明的两种渐变方式。可以对输出图片取绝对值操作,以得到同样的结果。

Another-Convolutional-operation-example

垂直边缘检测和水平边缘检测的滤波器如下所示:

Convolutional-operation

其他常用的滤波器还有 Sobel 滤波器和 Scharr 滤波器。它们增加了中间行的权重,这样可能更加稳健。

Sobel-Filter-and-Scharr-Filter

滤波器中的值还可以设置为参数,通过模型训练来得到。这样,神经网络使用反向传播算法可以学习到一些低级特征,从而实现对图片所有边缘特征的检测,而不仅限于垂直边缘和水平边缘。