Module 01 · Foundations of Convolutional Neural Networks
Edge Detection Example边缘检测示例
卷积操作是卷积神经网络(CNN)的核心构建块之一。在本视频中,我们将通过 边缘检测 的例子来展示卷积操作如何工作。
1. 卷积操作的基本概念
在之前的视频中,我提到过,神经网络的早期层可能会检测图像中的边缘,接着后续层可能会检测到对象的部分特征,而更深的层则可能识别出完整的物体(如人脸)。在本视频中,我们将重点介绍如何在图像中检测边缘。
例子:边缘检测操作
假设有一张图片,计算机需要识别其中的物体。首先,计算机可能会尝试检测图像中的垂直边缘。例如,图像中有一些垂直线条,表示建筑物或行人。这些边缘会在 垂直边缘检测器 的输出中得到体现。我们也可以检测 水平边缘,比如图片中的栏杆,形成了一个明显的水平线。
那么,如何在图像中检测边缘呢?让我们通过以下的例子来说明。
2. 如何实现边缘检测?
我们以一个 6x6 灰度图像 为例。由于这是灰度图像,它的维度是 6x6x1,而不是 6x6x3(因为没有单独的 RGB 通道)。
卷积操作步骤
为了检测图像中的垂直边缘,我们可以使用一个 3x3 卷积核(filter),如下所示:
在卷积神经网络(CNN)中,这个3x3的矩阵通常被称为 filter(有时研究论文也会称其为 kernel,但我们这里使用 filter 这一术语)。
卷积操作符:
卷积操作通常用 星号(*) 表示。值得注意的是,在数学中,星号表示卷积运算,而在Python中,它也用于表示乘法或逐元素乘法。因此,星号在不同上下文中有不同的含义。在本视频中,我将明确说明何时使用星号表示卷积。
卷积过程:
我们将 6x6 图像 与 3x3 filter 进行卷积,结果将是一个 4x4 的矩阵,可以理解为一个 4x4 的图像。计算每个输出元素的步骤如下:
- 计算 4x4 矩阵的第一个元素(左上角):
- 将 3x3 filter 放在原图像的 3x3 区域 上,进行逐元素乘法和求和。
- 例如,假设 filter 和图像区域的元素逐个相乘并求和,得到一个数值。
- 计算其它输出元素:
- 将 filter 在图像上滑动,每次移动一格,重复上述操作,直到计算完整个 4x4 矩阵。
卷积运算示例
假设我们已经得到了第一个输出元素 -5。接下来,我们可以继续进行右移、下移等操作,得到其余的元素。
| 输入图像 (6x6) | 3x3 Filter | 输出图像 (4x4) |
|---|---|---|
![]() |
![]() |
![]() |
图像与卷积核的关系:
- 左侧图像:我们将其看作输入图像。
- 中间的3x3矩阵:表示卷积核(filter)。
- 右侧的4x4矩阵:表示卷积操作后的输出,可以看作是卷积后得到的新图像。
3. 垂直边缘检测的实现
为了更好地理解卷积如何执行垂直边缘检测,让我们看一个简化的例子:
简化图像示例:
- 这是一张 6x6 图像,其左半部分是 10,右半部分是 0。
- 在图像中,显然可以看到一个非常强烈的 垂直边缘,即图像从左侧的明亮部分(10)过渡到右侧的黑暗部分(0)。
卷积操作:
- 将 3x3 filter 应用到此图像,得到的 4x4 输出图像 会呈现出明显的 垂直边缘,并形成亮区和暗区的过渡。
验证计算:
- 例如,卷积操作中的一个输出元素为 0,它由如下计算得出:左侧列的元素乘以 filter 对应位置的元素(例如,10、10、10),然后进行加法运算,得到最终的结果。
4. 纵向边缘检测的直观理解
通过上面的例子,你可以理解到,垂直边缘检测 关注的是图像中“左边亮、右边暗”的过渡区域。由于我们使用的是一个 3x3 filter,因此这个操作会关注图像中每个位置的左右亮度差异,并且根据这些差异判断是否为边缘。
小图像的边缘检测:
- 由于我们使用的是小尺寸的图像(6x6),所以边缘看起来可能有些“粗糙”。但在实际应用中,使用更大的图像(例如 1000x1000)时,卷积操作会更有效地检测出图像中的边缘。
5. 编程实现
在实际编程中,大多数深度学习框架提供了专门的函数来实现卷积操作,而不是直接使用星号(*)。例如:
- 在 TensorFlow 中,可以使用函数
tf.nn.conv2d。 - 在 Keras 中,也有类似的卷积函数
Conv2D。
这些函数在实现卷积操作时,封装了所有的计算过程,使得我们能够轻松地在深度学习模型中应用卷积操作。
小结
通过本视频,你已经了解了 卷积操作 的基本原理以及如何利用它来进行 边缘检测。在下一视频中,我们将讨论如何将这一操作作为卷积神经网络(CNN)的基础构建块,进一步展开学习。


