从边缘检测到卷积计算

under 算法  tag CNN    Published on April 20th , 2019 at 11:13 pm

卷积(convolution)是CNN中的重要概念,虽然其计算方式很容易理解,但是表示的实际含义并不直观
在此借边缘检测的例子来解释卷积的含义:
边缘检测.png
对于左侧的图片来说,它的垂直边缘和水平边缘分别为右图所示
而为了获取一张图片的边缘图像,我们要采用卷积的方式
conv.png
卷积的过程如上图所示

左侧是一张$6*6*1$px的图像(RGB图像有3个通道,不同于灰度图像,应为$x*y*3$),即抽象成一个$6*6$的矩阵
$*$是数学中标准的卷积符号,但在编程语言中一般用函数来进行卷积操作
中间的$3*3$矩阵被称为为过滤器(filter)或者核(kernel)
右侧是我们通过卷积运算得到的$4*4$的输出图像

卷积的运算过程如图,将过滤器从左上角开始覆盖到对应的输入矩阵的子矩阵上,然后对应相乘再求和,即$$3*1+1*1+2*1+0*0+5*0+7*0+1*-1+8*-1+2*-1=-5$$之后将过滤器在输入矩阵上依次滑动,通过卷积计算得到完整的输出矩阵如下
conv2.png
卷积的含义我们以下图为例
conv3.png
我们的目标是通过卷积检测出垂直边缘,即找到不同亮度像素间的分割线

左侧矩阵是我们的输入图像矩阵,数字大的元素表示亮的像素点,反之表示暗的像素点,它呈现出来的图像在左侧矩阵下所示,即一张左侧亮右侧灰的图像
而我们的过滤器矩阵则设置成一张亮灰暗的图像,这是为了放大像素亮度间的差异,当被过滤器覆盖的输入矩阵区域亮度相近或相同时,过滤器左侧的亮将和右侧的暗中和。但当该区域中部有明显的亮度差异时,过滤器就会成倍的放大这种差异

卷积结果由右图所示,得到的中部亮带就是我们需要的垂直边缘线(亮带较宽的原因是我们输入矩阵和过滤器的维数相差过小导致,在实际的应用中将会趋于一条线)

由此我们可以看出卷积就是将输入图像的信息做区域化的处理,通过选取不同的过滤器来处理输入图像,以得到输出信息

接下来我们将对过滤器进行一些讨论,当我们将上面的输入图片左右翻转后将会得到什么结果呢?

通过计算得知中间的30将会变成-30,即检测出的边缘从亮线变成了暗线。如果我们不关心线的亮暗,我们可以通过取绝对值的方式来统一风格,但当我们需要图像的一些信息时,我们就可以利用这项特性来通过过滤器分析原图像的属性

那研究完二维平面上的卷积后,三维卷积的定义也就不难理解了。之前我们处理的是一张灰度图片,它的通道数(channel)只有$1$,那假设我们要处理一张有$3$通道的RGB图片,三维卷积就登场了
conv4.png
与三维输入图像对应的是三维的过滤器,过滤器的通道数应和输入图像的通道数相同,然后将所有对应部分的乘积求和就能输出一张二维图像。假设我们有两个不同的过滤器,我们就可以得到两张$4*4$的输出图像,将其叠在一起,就又得到$4*4*2$的双通道输出图像了。
如果只检测R通道上的边缘,我们可以将过滤器的$2、3$通道置零。类似的,通过改变过滤器的不同通道就可以呈现不同的结果

在数学中卷积的定义其实与上文略有不同,在做乘法与求和运算前要将过滤器沿左下到右上的对角轴做翻转。不反转的运算其实被称为互相关(cross-correlation),但在深度学习领域,我们就称其为卷积


本文由 cxh 创作,采用 知识共享署名4.0 国际许可协议进行许可,转载前请务必署名
  文章最后更新时间为:April 21st , 2019 at 11:54 pm
分享到:Twitter  Weibo  Facebook






  1. wzw

    真是让人受益匪浅!!

    Reply