02 边缘检测示例(Edge Detection Example)
02 边缘检测示例(Edge Detection Example)
一、核心思想
卷积运算是卷积神经网络(CNN)中最基本的操作。
在 CNN 的早期层中,网络通常执行边缘检测(如垂直/水平边缘),后续层则逐步组合这些低级特征,形成更复杂的语义(如物体部件、完整物体,例如人脸)。
本节以垂直边缘检测为例,讲解卷积如何工作。
二、输入与过滤器(Filter / Kernel)
- 输入图像:假设为灰度图,尺寸为 $6 \times 6$,即张量维度为 $6 \times 6 \times 1$。
过滤器(Filter) :也称“核(Kernel)”,是一个 $3 \times 3$ 的小矩阵,用于提取特定特征。
垂直边缘检测常用过滤器:
\[F = \begin{bmatrix} 1 & 0 & -1 \\ 1 & 0 & -1 \\ 1 & 0 & -1 \end{bmatrix}\]此过滤器对左侧亮、右侧暗的区域响应强烈(即存在从左到右的亮度突变 → 垂直边缘)。
注:在数学中,卷积用符号 $\ast$ 表示;但在 Python 中
*通常表示逐元素乘法,因此实际编程中需调用专用函数(如tf.nn.conv2d)。
三、卷积运算过程
给定输入图像 $I$($6 \times 6$)和过滤器 $F$($3 \times 3$),卷积输出尺寸为:
\[\text{输出尺寸} = (n - f + 1) \times (n - f + 1) = (6 - 3 + 1) \times (6 - 3 + 1) = 4 \times 4\]其中:
- $n = 6$:输入边长
- $f = 3$:过滤器边长
- 默认步幅(stride)为 1,无填充(padding = 0)
卷积计算步骤(以输出左上角元素为例):
- 将过滤器 $F$ 对齐到输入图像左上角的 $3 \times 3$ 区域。
- 执行逐元素相乘(element-wise product) 。
- 将所有乘积结果求和,得到输出的一个元素。
例如,若输入局部区域为:
\[\begin{bmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \\ a_{31} & a_{32} & a_{33} \end{bmatrix}\]则输出值为:
\[\sum_{i=1}^{3} \sum_{j=1}^{3} I[i,j] \cdot F[i,j]\]这本质上是两个矩阵的点积(dot product) 。
滑动窗口遍历整个图像,即可得到完整的 $4 \times 4$ 输出特征图(Feature Map)。
四、为什么该过滤器能检测垂直边缘?
考虑一个理想化的测试图像:
\[I = \begin{bmatrix} 10 & 10 & 10 & 0 & 0 & 0 \\ 10 & 10 & 10 & 0 & 0 & 0 \\ 10 & 10 & 10 & 0 & 0 & 0 \\ 10 & 10 & 10 & 0 & 0 & 0 \\ 10 & 10 & 10 & 0 & 0 & 0 \\ 10 & 10 & 10 & 0 & 0 & 0 \\ \end{bmatrix}\]- 左半边像素值为 10(亮),右半边为 0(暗)→ 存在明显的垂直边缘在第 3–4 列之间。
使用上述垂直边缘过滤器 $F$ 卷积后,输出中间列会出现高正值(如 30),表明此处检测到强垂直边缘。
例如,在跨越边缘的位置(如第 2–4 列):
\[\begin{bmatrix} 10 & 10 & 0 \\ 10 & 10 & 0 \\ 10 & 10 & 0 \\ \end{bmatrix} \ast \begin{bmatrix} 1 & 0 & -1 \\ 1 & 0 & -1 \\ 1 & 0 & -1 \\ \end{bmatrix} = 10 \cdot 1 + 10 \cdot 0 + 0 \cdot (-1) + \cdots = 30\]而纯亮区或纯暗区的响应为 0(因为左右对称,正负抵消)。
✅ 结论:该过滤器对“左亮右暗”的突变敏感 → 检测垂直边缘。
五、输出解释与局限性
- 输出的 $4 \times 4$ 矩阵可视为一张新图像(特征图),高亮区域对应检测到的边缘位置。
- 在小图像(如 $6 \times 6$)中,边缘看起来“较粗”,这是因为分辨率低。
- 在真实大图(如 $1000 \times 1000$)中,该方法能精确定位细锐的垂直边缘。
六、编程实现提示
在深度学习框架中,不直接使用 $\ast$ 符号,而是调用封装好的卷积函数:
| 框架 | 函数名 |
|---|---|
| TensorFlow | tf.nn.conv2d |
| Keras | Conv2D 层 |
| PyTorch | torch.nn.Conv2d |
这些函数自动处理:
- 多通道输入(如 RGB 图像)
- 多个过滤器(输出多通道特征图)
- 步幅(stride)、填充(padding)等超参数
七、关键公式汇总(KaTeX 兼容)
输出尺寸(无填充,步幅=1) :
\[n_{\text{out}} = n_{\text{in}} - f + 1\]卷积运算(单通道) :
\[(I \ast F)[i, j] = \sum_{m=0}^{f-1} \sum_{n=0}^{f-1} I[i+m, j+n] \cdot F[m, n]\]垂直边缘检测器:
\[F_{\text{vertical}} = \begin{bmatrix} 1 & 0 & -1 \\ 1 & 0 & -1 \\ 1 & 0 & -1 \end{bmatrix}\]水平边缘检测器(补充知识) :
\[F_{\text{horizontal}} = \begin{bmatrix} 1 & 1 & 1 \\ 0 & 0 & 0 \\ -1 & -1 & -1 \end{bmatrix}\]
八、学习启示
- 卷积是一种局部特征提取机制。
- 通过设计不同的过滤器,可检测不同方向/类型的边缘。
- 在 CNN 中,这些过滤器不是人工设定的,而是通过反向传播自动学习得到的,从而适应具体任务(如分类、检测)。
- 边缘检测是理解 CNN 如何从像素构建高层语义的关键第一步。
✅ 总结:本节通过垂直边缘检测这一经典例子,直观展示了卷积运算的机制、意义与效果,为理解 CNN 的特征学习能力奠定了坚实基础。