在计算机视觉中使用的比较多的就是卷积神经网络
卷积运算是卷积神经网络最基本的组成部分
边缘检测相对比较容易理解,就把它作为卷积运算的入门样例
在人脸识别中:
神经网络的前几层有可能是检测边缘的
后面的层有可能检测到物体的部分区域
更靠后的一些层可能检测到完整的物体
这个例子中就是人脸
给了上面这样一张图片,让电脑去搞清楚这张照片里有什么物体
可能做的第一件事是检测图片中的垂直边缘
比如说,在这张图片中的栏杆就对应垂直线
与此同时,这些行人的轮廓线某种程度上也是垂线
这些线是垂直边缘检测器的输出
同样,可能也想检测水平边缘
比如说这些栏杆就是很明显的水平线
看一个例子,这是一个6×6的灰度图像
因为是灰度图像,所以它是6×6×1的矩阵
而不是6×6×3的,因为没有RGB三通道
为了检测图像中的垂直边缘,可以构造一个3×3矩阵
在共用习惯中,在卷积神经网络的术语中,它被称为过滤器
构造一个3×3的过滤器,像这样
在论文它有时候会被称为 核,而不是过滤器
对这个6×6的图像进行卷积运算,卷积运算用 “ * ” 来表示
用3×3的过滤器对其进行卷积
这个卷积运算的输出将会是一个4×4的矩阵,可以将它看成一个4×4的图像
为了计算第一个元素,在4×4左上角的那个元素,使用3×3的过滤器,将其覆盖在输入图像
然后进行元素乘法(element-wise products)运算,所以
然后将该矩阵每个元素相加得到最左上角的元素
即3+1+2+0+0+0+(-1)+(-8)+(-2)=-5
一步一步向右移动,到达边缘时,移动下一行
重新从左向右移动,得到下图
为了更清楚一点,这个 -16 是通过底部右下角的3×3区域得到的
来看另外一个例子,了解垂直边缘检测是怎么做到的
这是一个简单的 6×6 图像,左边的一半是10,右边一般是0
如果把它当成一个图片,左边像素值10是比较亮的像素值,右边像素值0比较暗
有一个特别明显的垂直边缘在图像中间
这条垂直线是从黑到白的过渡线,或者从白色到深色
这里的维数似乎有点不正确,检测到的边缘太粗了
因为在这个例子中,图片太小了
如果用一个1000×1000的图像,而不是6×6的图片
会发现其会很好地检测出图像中的垂直边缘
在这个例子中,在输出图像中间的亮处
表示在图像中间有一个特别明显的垂直边缘
从垂直边缘检测中可以得到的启发是,因为使用3×3的矩阵(过滤器)
所以垂直边缘是一个3×3的区域
左边是明亮的像素,中间的并不需要考虑,右边是深色像素
在这个6×6图像的中间部分,明亮的像素在左边,深色的像素在右边
就被视为一个垂直边缘
卷积运算提供了一个方便的方法来发现图像中的垂直边缘
相似的,水平边缘过滤器也是一个3×3的区域,它的上边相对较亮,而下方相对较暗
总而言之,通过使用不同的过滤器,可以找出垂直的或是水平的边缘
在历史上,在计算机视觉的文献中,曾公平地争论过怎样的数字组合才是最好的
所以还可以使用Sobel的过滤器:
还有一种叫做Scharr的过滤器:
它的优点在于增加了中间一行元素的权重,这使得结果的鲁棒性会更高一些
它有着和之前完全不同的特性,实际也是一种垂直边缘检测
如果将其翻转90度,就能得到对应水平边缘检测
当真正想去检测出复杂图像的边缘
不一定要去使用那些研究者们所选择的这九个数字,但可以从中获益匪浅
把这矩阵中的9个数字当成9个参数,并且在之后可以学习使用反向传播算法
其目标就是去理解这9个参数
将矩阵的所有数字都设置为参数,通过数据反馈,让神经网络自动去学习它们
会发现神经网络可以学习一些低级的特征,例如这些边缘的特征
尽管比起那些研究者们要更费劲一些
但确实可以动手写出这些东西
不过构成这些计算的基础依然是卷积运算
使得反向传播算法能够让神经网络学习任何它所需要的3×3的过滤器
并在整幅图片上去应用它
去输出这些,任何它所检测到的特征
不管是垂直的边缘,水平的边缘,还有其他奇怪角度的边缘
所以这种将这9个数字当成参数的思想,已经成为计算机视觉中最为有效的思想之一
参考:
《神经网络和深度学习》视频课程
相关推荐:
深度学习笔记(20) 端到端学习
深度学习笔记(19) 多任务学习
深度学习笔记(18) 迁移学习
深度学习笔记(17) 误差分析(二)
深度学习笔记(16) 误差分析(一)
谢谢!