卷积和边缘检测
垂直边缘检测器的卷积过程
最简单的垂直边缘检测
过滤器fliter在原图像上滚动。
在过小的图片上检测时,可能会出现边缘过大的问题。但在大图片上,其可以很好地检测边缘。
区分正边和负边的边缘检测
上面是由明向暗,下面是由暗到明。
水平边缘检测
其他边缘检测的滤波器
Sobel滤波器增加了中间一行元素的权重,这使得结果的鲁棒性更高一些。
Scharr滤波器实际上是一种垂直边缘检测,翻转90°就是水平边缘检测。
随着深度学习的发展,我们学习到,当我们真正想去检测出复杂图像的边缘,我们不一定要去使用那些研究者所使用的9个数值。
我们可以把这9个数字当作9个参数,在之后通过反向传播算法去理解这9个参数。
相比于单纯的垂直和水平检测,这种方法可以找到任何角度的边缘。神经网络可以自动去学习一些低级的特征(比如边缘)。
反向传播可以让神经网络学习任何它所需的3×3滤波器,并在整幅图片上去应用它。
将这9个数都作为参数的思想,已经称为计算机视觉中最有效的思想之一。
Padding
不加Padding直接卷积的缺点
不加Padding的两个缺点:
- 每次做卷积操作图像都会缩小。
- 丢掉了图像的边缘位置的许多信息
(如果你注意角落边的像素,这个像素点只被一个输出所触碰或者使用,而中间的像素点就会被许多3×3区域使用)
合理设置Padding的值和过滤器的size,可以使得输出维度等同于输入维度。这样就解决了图像减小的缺点。
而左上角涂绿的格子,影响了输出的4个格子。
Padding的时候,习惯上用0来填充。
Padding多少个像素
通常有两个选择:
- Valid卷积:不填充(no Padding)
- Same卷积:使输入输出维度一致(Pad so that output size is the same as the input size)。
习惯上,过滤器的size一般都是奇数的。
原因大概有两个: - 采用偶数,就只能使用不对称填充。
- 奇数维度的过滤器有中心点,有时在计算机视觉里,如果有一个中心像素点会更方便,便于之处滤波器的位置。
卷积步长
卷积中的步长是另一个构建卷积神经网络的基本操作。
[Z]
为向下取整,也叫做进行板除(the floor of Z)。
3×3的过滤器必须完全处于图像中或者填充后的图像区域内,才输出相应的结果
卷积为何有效
单个三维过滤器的卷积
上面讨论的都是通道数为1的图像,而面对通道数大于1的图像,情况也会有所不同。
以3通道的RGB图像为例,相比于单通道的图像,数据相当于多了一个维度(从6×6变为6×6×3)。同样,卷积过程中用到的过滤器的通道数要与输入图像一致(对应PyTorch库中Conv2d()
的in_channel
参数)。
但是最后输出的矩阵的维度仍为1。
具体的卷积过程如下:
过滤器与输入数据立方对应位置的数相乘,再求和,就得到了输出矩阵相应位置的一个数。
上面这张图告诉我们两个事情:
- 我们可以关注某一个特定的通道,对应的操作就是单独对相应通道的滤波器进行设置。
- 三维的输入数据立方 卷积 三维同深度过滤器,得到的是二维的输出矩阵。
多个三维过滤器的卷积
这样做的重要性在于:
你可以同时检测两个特征(比如水平和垂直特征),或者10个,或者128个,或者几百个不同的特征。
并且输出的通道会等于你要检测的特征数。
这张图的要点就是:
真正卷积的时候很多是用许多的不同的过滤器(Multiple filters)来卷积。采用的过滤器的种类数(或者叫个数),就等于输出数据立方的深度,对应PyTorch库中Conv2d()
的out_channel
参数。