←上一篇 ↓↑ 下一篇→
1.1 计算机视觉 回到目录 1.3 更多边缘检测内容

边缘检测示例 (Edge Detection Example)

卷积运算是卷积神经网络最基本的组成部分,使用边缘检测作为入门样例。在这个视频中,你会看到卷积是如何进行运算的。


在之前的视频中,我说过神经网络的前几层是如何检测边缘的,然后,后面的层有可能检测到物体的部分区域,更靠后的一些层可能检测到完整的物体,这个例子中就是人脸。在这个视频中,你会看到如何在一张图片中进行边缘检测。


让我们举个例子,给了这样一张图片,让电脑去搞清楚这张照片里有什么物体,你可能做的第一件事是检测图片中的垂直边缘。比如说,在这张图片中的栏杆就对应垂直线,与此同时,这些行人的轮廓线某种程度上也是垂线,这些线是垂直边缘检测器的输出。同样,你可能也想检测水平边缘,比如说这些栏杆就是很明显的水平线,它们也能被检测到,结果在这。所以如何在图像中检测这些边缘?

看一个例子,这是一个6×6的灰度图像。因为是灰度图像,所以它是6×6×1的矩阵,而不是6×6×3的,因为没有RGB三通道。为了检测图像中的垂直边缘,你可以构造一个3×3矩阵。在共用习惯中,在卷积神经网络的术语中,它被称为过滤器。我要构造一个3×3的过滤器,像这样 [10−110−110−1]\left[\begin{matrix} 1 & 0 & -1\\ 1 & 0 & -1 \\ 1 & 0 & -1\end{matrix}\right]⎣⎡​111​000​−1−1−1​⎦⎤​ 。在论文它有时候会被称为核,而不是过滤器,但在这个视频中,我将使用过滤器这个术语。对这个6×6的图像进行卷积运算,卷积运算用“∗*∗”来表示,用3×3的过滤器对其进行卷积。


关于符号表示,有一些问题,在数学中“∗*∗”就是卷积的标准标志,但是在Python中,这个标识常常被用来表示乘法或者元素乘法。所以这个“∗*∗”有多层含义,它是一个重载符号,在这个视频中,当“∗*∗”表示卷积的时候我会特别说明。


这个卷积运算的输出将会是一个4×4的矩阵,你可以将它看成一个4×4的图像。下面来说明是如何计算得到这个4×4矩阵的。为了计算第一个元素,在4×4左上角的那个元素,使用3×3的过滤器,将其覆盖在输入图像,如下图所示。然后进行元素乘法(element-wise products)运算,所以 [3∗10∗01∗(1)1∗15∗08∗(−1)2∗17∗02∗(−1)]=[30−110−820−2]\left[\begin{matrix} 3*1 & 0*0 & 1*(1) \\ 1*1 & 5*0 & 8*(-1) \\ 2*1 & 7*0 & 2*(-1)\end{matrix}\right]=\left[\begin{matrix} 3 & 0 & -1\\ 1 & 0 & -8 \\ 2 & 0 & -2 \end{matrix}\right]⎣⎡​3∗11∗12∗1​0∗05∗07∗0​1∗(1)8∗(−1)2∗(−1)​⎦⎤​=⎣⎡​312​000​−1−8−2​⎦⎤​ ,然后将该矩阵每个元素相加得到最左上角的元素,即 3+1+2+0+0+0+(−1)+(−8)+(−2)=−53+1+2+0+0+0+(-1)+(-8)+(-2)=-53+1+2+0+0+0+(−1)+(−8)+(−2)=−5 。


把这9个数加起来得到-5,当然,你可以把这9个数按任何顺序相加,我只是先写了第一列,然后第二列,第三列。

接下来,为了弄明白第二个元素是什么,你要把蓝色的方块,向右移动一步,像这样,把这些绿色的标记去掉:


继续做同样的元素乘法,然后加起来,所以是 0∗1+5∗1+7∗1+1∗0+8∗0+2∗0+2∗(−1)+9∗(−1)+5∗(−1)=−40*1+5*1+7*1+1*0+8*0+2*0+2*(-1)+9*(-1)+5*(-1)=-40∗1+5∗1+7∗1+1∗0+8∗0+2∗0+2∗(−1)+9∗(−1)+5∗(−1)=−4 。


接下来也是一样,继续右移一步,把9个数的点积加起来得到0。


继续移得到8,验证一下: 2∗1+9∗1+5∗1+7∗0+3∗0+1∗0+4∗(−1)+1∗(−1)+3∗(−1)=82*1+9*1+5*1+7*0+3*0+1*0+4*(-1)+1*(-1)+3*(-1)=82∗1+9∗1+5∗1+7∗0+3∗0+1∗0+4∗(−1)+1∗(−1)+3∗(−1)=8 。


接下来为了得到下一行的元素,现在把蓝色块下移,现在蓝色块在这个位置:


重复进行元素乘法,然后加起来。通过这样做得到-10。再将其右移得到-2,接着是2,3。以此类推,这样计算完矩阵中的其他元素。


为了说得更清楚一点,这个-16是通过底部右下角的3×3区域得到的。

因此6×6矩阵和3×3矩阵进行卷积运算得到4×4矩阵。这些图片和过滤器是不同维度的矩阵,但左边矩阵容易被理解为一张图片,中间的这个被理解为过滤器,右边的图片我们可以理解为另一张图片。这个就是垂直边缘检测器,下一页中你就会明白。

在往下讲之前,多说一句,如果你要使用编程语言实现这个运算,不同的编程语言有不同的函数,而不是用“∗*∗”来表示卷积。所以在编程练习中,你会使用一个叫conv_forward的函数。如果在tensorflow下,这个函数叫tf.conv2d。在其他深度学习框架中,在后面的课程中,你将会看到Keras这个框架,在这个框架下用Conv2D实现卷积运算。所有的编程框架都有一些函数来实现卷积运算。


为什么这个可以做垂直边缘检测呢?让我们来看另外一个例子。为了讲清楚,我会用一个简单的例子。这是一个简单的6×6图像,左边的一半是10,右边一般是0。如果你把它当成一个图片,左边那部分看起来是白色的,像素值10是比较亮的像素值,右边像素值比较暗,我使用灰色来表示0,尽管它也可以被画成黑的。图片里,有一个特别明显的垂直边缘在图像中间,这条垂直线是从黑到白的过渡线,或者从白色到深色。


所以,当你用一个3×3过滤器进行卷积运算的时候,这个3×3的过滤器可视化为下面这个样子,在左边有明亮的像素,然后有一个过渡,0在中间,然后右边是深色的。卷积运算后,你得到的是右边的矩阵。如果你愿意,可以通过数学运算去验证。举例来说,最左上角的元素0,就是由这个3×3块(绿色方框标记)经过元素乘积运算再求和得到的,
10∗1+10∗1+10∗1+10∗0+10∗0+10∗0+10∗(−1)+10∗(−1)+10∗(−1)=010*1+10*1+10*1+10*0+10*0+10*0+10*(-1)+10*(-1)+10*(-1)=010∗1+10∗1+10∗1+10∗0+10∗0+10∗0+10∗(−1)+10∗(−1)+10∗(−1)=0 。相反这个30是由这个(红色方框标记)得到的, 10∗1+10∗1+10∗1+10∗0+10∗0+10∗0+0∗(−1)+0∗(−1)+0∗(−1)=3010*1+10*1+10*1+10*0+10*0+10*0+0*(-1)+0*(-1)+0*(-1)=3010∗1+10∗1+10∗1+10∗0+10∗0+10∗0+0∗(−1)+0∗(−1)+0∗(−1)=30 。


如果把最右边的矩阵当成图像,它是这个样子。在中间有段亮一点的区域,对应检查到这个6×6图像中间的垂直边缘。这里的维数似乎有点不正确,检测到的边缘太粗了。因为在这个例子中,图片太小了。如果你用一个1000×1000的图像,而不是6×6的图片,你会发现其会很好地检测出图像中的垂直边缘。在这个例子中,在输出图像中间的亮处,表示在图像中间有一个特别明显的垂直边缘。从垂直边缘检测中可以得到的启发是,因为我们使用3×3的矩阵(过滤器),所以垂直边缘是一个3×3的区域,左边是明亮的像素,中间的并不需要考虑,右边是深色像素。在这个6×6图像的中间部分,明亮的像素在左边,深色的像素在右边,就被视为一个垂直边缘,卷积运算提供了一个方便的方法来发现图像中的垂直边缘。

所以你已经了解卷积是怎么工作的,在下一个视频中,你将会看到如何使用卷积运算作为卷积神经网络的基本模块的。

课程板书





←上一篇 ↓↑ 下一篇→
1.1 计算机视觉 回到目录 1.3 更多边缘检测内容

1.2 边缘检测示例-深度学习第四课《卷积神经网络》-Stanford吴恩达教授相关推荐

  1. 深度学习第四课——卷积神经网络(week 1)

    目录 一.前言 1.1 卷积 1.2 其他滤波器 1.3 Padding 1.3.1 解释 1.3.2 填充多少像素的选择 1.4 卷积步长 1.5 三维卷积 1.6 单层卷积网络 1.7 深度卷积神 ...

  2. 2.19 总结-深度学习-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 2.18 Logistic 损失函数的解释 回到目录 3.1 神经网络概览 文章目录 总结 习题 第 11 题 第 12 题 第 13 题 第 14 题 第 15 题 第 1 ...

  3. 1.8 简单卷积网络示例-深度学习第四课《卷积神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 1.7 单层卷积网络 回到目录 1.9 池化层 简单卷积网络示例 (A Simple Convolution Network Example) 上节课,我们讲了如何为卷积网络 ...

  4. 4.11 一维到三维推广-深度学习第四课《卷积神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 4.10 风格代价函数 回到目录 4.12 总结 一维到三维推广 (1D and 3D Generalizations of Models) 你已经学习了许多关于卷积神经网络 ...

  5. 4.1 什么是人脸识别-深度学习第四课《卷积神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 3.11 总结 回到目录 4.2 One-Shot 学习 什么是人脸识别 (What is face recognition?) 欢迎来到第四周,即这门课卷积神经网络课程的最 ...

  6. 大总结-深度学习全五课-Stanford吴恩达教授

    大总结 深度学习符号 此笔记中使用的数学符号参考自<深度学习>和 Deep learning specialization 常用的定义 原版符号定义中, x(i)x^{(i)}x(i) 与 ...

  7. 3.12 总结-深度学习-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 3.11 随机初始化 回到目录 4.1 深层神经网络 文章目录 总结 习题 第 21 题 第 22 题 第 23 题 第 24 题 第 25 题 第 26 题 第 27 题 ...

  8. 深度学习教程(6) | 神经网络优化算法(吴恩达·完整版)

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/35 本文地址:https://www.showmeai.tech/article-d ...

  9. 机器学习和深度学习到底怎么学?顶尖专家吴恩达告诉你

    机器学习和深度学习到底怎么学? 在外国版知乎上,有位网友问:新手如何学习机器学习?学习完MOOC的课程后有没有能力阅读研究论文或者真正的做出一点研究成果? 这个困惑很多人的问题吴恩达给出了详细的回答, ...

最新文章

  1. Visual Studio Code Go 插件文档翻译
  2. mysqldump 导出某几张表
  3. hdu 1500 Chopsticks
  4. session或者error引起的iframe嵌套问题的解决
  5. sql where子查询5中字句的使用顺序
  6. folders默认配置 shell_更改windows默认的User Shell Folders
  7. java.lang.reflect.InvocationTargetException 的惨痛教训
  8. php 5 在虚拟主机上安装,Apache多虚拟主机多版本PHP(5.2+5.3+5.4)共存运行配置全过程...
  9. Oracle - TRUNC, ROUND, CEIL, FLOOR
  10. 基于ARM的嵌入式Linux应用程序开发
  11. 非线性控制3.0——自适应模糊控制
  12. Excel如何从复杂文本中提取数字
  13. iOS中 断点下载详解 韩俊强的博客
  14. 弘辽科技:618年中大决战,拖词拖价法快速玩转淘宝直通车
  15. 华为路由交换RS 部分题库分享
  16. Netty学习二:Netty整体框架
  17. Swift 语法初探(1):Swift 与 Java 的小比较
  18. 阿里腾讯“互撕”升级,双方都豁出去了
  19. pymysql.err.OperationalError: (1130, “xxx‘ is not allowed to connect to this MySQL server“)
  20. 一名开发人员的奋斗历程

热门文章

  1. Maven实战读书笔记(六):Maven灵活构建
  2. 测试分析设计工程方法
  3. JDBC——入门知识【转】
  4. vdsm的SSL证书验证过程
  5. 安装两个硬盘时应如何跳线?
  6. powerDesiger uml class
  7. software enginer1
  8. UA MATH567 高维统计 专题0 为什么需要高维统计理论?——以线性判别分析为例
  9. es6 name属性
  10. opencv setTo()