Edge Detection Example
Last updated
Was this helpful?
Last updated
Was this helpful?
卷积运算是卷积神经网络的 基础组成单元之一 在这个视频中 我们用边缘检测 作为引发兴趣的例子 你将了解卷积运算是如何进行的
在之前的一节中 我已经讨论过神经网络的前几层 是怎样检测边缘的 并且后几层可能会 检测对象的某些部分 而更后的几层会检测 到某些整个的对象 比如在此例中的人脸
在本视频中你将看到 如何在一个图像中进行边缘检测 举个例子来看我们举个例子说明 给出一张这样的图片 让电脑算出 在这张图片中的物体是什么 你做的第一件事可能是 检测图片中的垂直边缘
例如在这个图像中 垂直的线是栅栏所在的地方 还有比较垂直的线 是这些行人的轮廓 所以在这个垂直边缘检测结果中 它们被检测出来了
你也许也想要检测水平边缘 比如说有一个非常明显的 水平线段在栅栏在的地方 它也被检测到 大概在这里
所以你怎样才能 在像这样的图像中检测边缘呢 我们来看个例子 1:27 这里是一个6x6的灰度图像 因为这是一个灰度图像 所以只是一个6x6x1的矩阵 而不是6x6x3 因为没有分开的RGB通道 1:41 为了检测边缘 比如这个图像中的垂直边缘 你能做的是建立一个3x3的矩阵 在池化(pooling)过程中 用卷积神经网络中的专业术语来说 这会被称为一个过滤器(filter) 1:57 我将要建立一个3x3的过滤器 或者说是3x3的矩阵 像这样 111 000 -1 -1 -1的 有时候科研论文中会将它 称为核(kernel)而不是过滤器 但是在这个视频中我将会用过滤器这个术语
你需要做的是获得6x6的图像 并求其卷积 卷积运算用这个星号代替
用这个3x3的过滤器去求它的卷积 稍微有点遗憾的是 这个符号在数学中 星号是卷积的标准符号 但是在Python中这被用来表示乘法 也许元素积乘法 所以这个星号有双重用法 这是个重复的符号 但是当星号表示卷积的时候 我会在这个视频中明确表示 这个卷积运算的输出是 一个4x4的矩阵 你可以将它理解为一个4x4的图像 下面是计算这个4x4输出的方法 计算第一个元素 也是就这个 4乘以4矩阵中左上角的这个元素 你要做的是用这个3X3的过滤器 把它粘贴到你的原始图像的 这块3x3区域上面 我在这里写了111 0 0 0 -1 -1 -1 你需要做的是计算元素积 所以第一个是3乘以1 然后第二个是1乘1 把它放到这里 1乘1 然后加上这个 2乘1 然后把九个结果全部加起来 所以中间的列得到 0乘0加5乘0加7乘0 然后最右边的列得到1乘-1 8乘-1加上2乘-1 把这九个数字相加你将得到-5 然后我把-5填在这里 对 你当然可以用 任何顺序把这九个数字相加 比如说我先计算第一列 然后第二列 然后第三列 接下来 为了计算出第二个元素 你要将蓝色的方形向右平移一步 像这样 让我把这里的绿色标记都去掉 你将要求同样的元素积然后相加 所以你有0乘1加上5乘1加7乘1 加1乘0加8乘0加2乘0 加2乘-1加9乘-1加5乘-1 如果你把这九个数加起来 你得到-4 以此类推 如果你把这个向右平移得到九个乘积 然后把它们相加得到0 然后在这里你应该得到8 只是验证一下 你有2加9加5 得到16 然后中间的列得到0 最右边的列 4加1加3乘-1 得到-8 然后就是在左边的列是16 -8 然后得8 和我们算好的一样 接下来 为了得到下一行的元素 你需要做的是把这个 蓝色的方形往下移一步 然后它现在在这个位置 然后再次重复元素积然后相加 如果你这么做了 你在这里得到-10 6:05 然后你把它向右移一步 应该得到-2 然后是2 然后是3等等 然后算出矩阵中的所有元素 6:21 再解释清楚一点 这个-16是 从右下端的3x3区域得到的 6:31 所以用3x3矩阵卷积6x6的矩阵 将得到一个4x4的矩阵 6:38 这些是图像和过滤器 这些都只是多维的矩阵 6:44 不过左边的矩阵可以 容易地理解为一个图像 中间这个我们把它理解为 一个过滤器 然后右边的这一个 也许可以理解为另一个图像 这就是一个垂直边缘检测器 你会在下一页知道为什么是这样的 在我们继续之前我有另一个提醒 那就是如果你将这运用到编程语言中 在实践中 大部分的编程语言 都会有一些不同的方法 而不用一个星号去标记卷积 比如说在编程练习中 你会实现一个conv_forward函数 如果你用TensorFlow做 有一个函数tf.nn.conv2d 而在其他的深度学习编程框架中 比如Keras 后面会学到 有一个函数Conv2D来实现卷积运算 但是所有支持卷积的深度学习框架 都会有一些函数实现这个卷积运算 7:56 为什么这是在进行垂直边缘检测呢 让我们看看另一个例子。 8:03 为了更好的解释 我们用一个简化了的图像 这有一个简单的6x6的图像 这个图像的左半边是10 右半边是0 如果你以图片形式得到它 它将是这个样子的 左半边的10 得到更亮的像素强度值 右半边得到比较暗的像素强度值 我们用灰色来表示0 虽然可能也能画成黑色 但是在这个图像的正中间 很清晰地有一个明显的垂直边缘 是从白到黑或者说 从白到暗色的过度 8:44 所以当你用这个3x3的过滤器 做卷积运算 这个3x3的过滤器 可以被可视化成这样 更明亮的像素点在左边 然后有中间调的颜色在中间 然后更暗的在右边 你得到的是在右边的这个矩阵 9:06 如果你想 可以验证这个数学运算 比如说这个0 是取元素积 然后与这个3x3的块相乘得到的 然后从最左列你得到10加10加10 然后中间是0 然后-10 -10 -10 这就是为什么你最后在这里得到0 与之不同 30是从这里得到的 9:36 从10加10加10得到的 然后-0 -0 这是为什么 你最后在那里得到30 如果你把最右边的矩阵画成图像 它将会是这样 更亮的区域在正中间 这与检测出的垂直边缘相对应 在这个6x6的图像的中间 这里的维数看起来不太对 检测出来的边缘看起来很厚 那只是因为我们在这个例子中 用了一个很小的图像 如果你用一个1000x1000的图像 而不是一个6x6的图像 你会发现 它能很好得检测出 在你图像中的垂直边缘 在这个例子中 这个在中间的明亮区域 只是用输出图像的方式 来表示有一个强垂直边缘 正好在图像的中间 垂直边缘检测里也许能 得到一个直观的理解 一个垂直边缘是一个3x3的区域 因为我们用的是3x3的过滤器 左边有亮像素 你并不在意中间有什么 然后在右边是暗像素 在这个6x6的图像的中间 可能会有亮像素在左边 暗像素在右边 这就是为什么它认为 那里有一个垂直边缘 卷积运算提供了一个 方便的方法去弄清楚 如何在图像中找到这些垂直边缘 所以现在你知道卷积运算 是怎么发挥作用的 在下一个视频中 你会看到如何运用它 作为卷积神经网络中的 一个基本构成
你已经了解了卷积操作是如何进行 垂直边缘检测的 在本视频中 你将会学会 正边缘和负边缘的差别 即由亮变暗和由暗变亮的边缘过渡 你还将会看到其他几种边缘检测器 以及如何让算法来学习 (这个边缘检测器) 而不是手动设定边缘检测器 我们目前一直还是这样的 现在我们进入正题
这是我们在上一个视频中看到的例子 有一个图片 6x6大小 左边亮 右边暗 将它与垂直边缘检测器进行卷积 得到在图中间的垂直边缘
如果将颜色翻转 将会发生什么 即左边是暗的部分 右边是亮的部分 因此 10现在在右半部分 0现在在左半部分。 如果将它与相同的边缘检测器做卷积 你将会在中间部分得到-30 而不是30 你可以将结果画出来 可能看起来是这样 因为亮暗变化是反的 这些30现在也反了 变为-30 表示由暗变亮 而不是由亮变暗的转换 如果你不在乎这两个的区别 你可以取输出矩阵的绝对值 但是这个过滤器 确实能够区分亮到暗的边界 和暗到亮的边界
现在看更多边界检测的例子 我们已经学习了能够检测 垂直边界的3乘3的过滤器 因而你不会太惊讶于 3乘3的过滤器同样能够 检测水平的边界 回顾一下 由这个过滤矩阵 得到的垂直边界 是个3乘3的区域 左边比较亮 右边区域比较暗 同样的 一个水平边界 也会是3乘3的区域 其上方区域比较亮而下面比较暗 现在有一个更加复杂的例子 其左上方和右下方的元素全为10 如果将之视为图片 元素为0的区域会比较暗 将这些暗的区域涂黑 左上方和右下方比较亮 如果用一个水平边界检测器来卷积 你会得到这个矩阵
拿几个例子来看 这个30对应了这个3乘3的区域 在这个区域里 上方的像素比较亮 下方的像素比较暗 在这里 检测器在这里找到了一个 很强的正边界 这个-30对应了这个3乘3的区域 在这个区域里 上方的比较暗 下方比较亮 因此在这个例子里是一个负边界 这是一个有些不实际的例子 我们在考虑一个只有6乘6个像素 的非常小的图片 但是这些介于中间的值 像-10 反映了过滤器捕捉到了 左边正边界的一部分 和右边负边界的一部分 因此混合在一起 从而得到介于两者之间的值 如果这是一个非常大的图片 比方说这是一个1000乘1000的图片 同样是棋盘形式 那么就不会有这些 元素为10的过渡区域 这些过渡值相对于 图片的大小会非常小 总而言之 不同的过滤器 可以找到垂直和水平的边界 事实上 这些3乘3的 垂直边界检测器 只是一个可能的选择 在计算机视觉的文献中 对于用哪些数字组合是最好的 仍然存在相当大的争议 这里你也可以选择使用别的数字 比如1 2 1 0 0 -1 -2 -1 这个被称为Sobel过滤器 这个过滤器的优点在于 它给中间行赋予了更大的权重 从而可能使得它更加稳定 计算机视觉的研究人员 同样会使用其他的数字组合 比方说可以使3 10 3 而不是1 2 1 另外一列为-3 -10 -3 这个被称为Scharr过滤器 这个过滤器有些 其他的略微不同的性质 上面这个只是对于 垂直边界检测器而言 如果将上面这些矩阵旋转90度 可以得到水平边界检测器 随着深度学习的发展 我们发现 如果你想要检测一些 复杂图片的边界 可能并不需要计算机视觉的研究人员 挑选出这9个矩阵元素 你可以把矩阵里的 这9个元素当做参数 通过反向传播来学习 得到他们的数值 目标是要获得这9个参数 使得对6乘6的图片 用这个3乘3的过滤器进行卷积 能得到一个优良的边界检测器
在后面的视频中可以看到 将这9个元素当成参数学习 如果需要的话 反向传播可以选择 学习得到1 1 1 0 0 0 -1 -1 或者是Sobel过滤器 或是Scharr过滤器 更有可能的是它能学到 比前述这些人为定义的过滤器 更加善于捕捉你的数据的 统计学特征的过滤器 除了垂直和水平边界 同样能够学习去检测45度的边界 70度 或73度 无论什么角度 通过将这个数字设成参数 从数据中自动学习得到 我们发现神经网络可以 学习底层特征得很好 比如边界 甚至比计算机视觉研究人员 所精心选择的更加稳定 但是这些计算仍旧是卷积运算 这使得反向传播可以学习 任何所需的3乘3的过滤器 并应用于整个图片的任何位置 这里 这里 从而得到所需要检测的特征 无论是垂直边界 水平边界 倾斜的边界 甚至是其他一些 还没有名字的过滤器
总之 将这9个数字当成参数去学习 是计算机视觉里的一个有用的想法 在本课程本周稍后的课程里 我们会讲到具体的细节 你将会学习如何通过反向传播 来学习这9个数字 但首先 我们先讲讲 基本的卷积运算的一些细节和变化 在接下来的两个视频里 我想与大家 讨论如何使用补白(padding) 和不同的步幅 这两个是卷积神经网络的 卷积底层架构 非常重要的组成部分 让我们继续下一期教程