zoukankan      html  css  js  c++  java
  • 卷积神经网络之卷积操作,使用卷积运算实现图片边缘特征检测

    上期我们讲解了卷积神经网络的基本结构,相信你们已经有一个大概的概念了,这期具体讲解卷积神经网络中最基本组成部分-卷积操作,使用边缘检测做为入门样例,接下来让你们看到卷积是如何进行运算的。

    人脸检测

    卷积神经网络之卷积操作,使用卷积运算实现图片边缘特征检测

     

    神经网络的前几层只能检测边缘边缘,比如:人脸的鼻子旁边的垂直线,后面的几层检测目标物体的部分区域,比如:人脸的鼻子、眼睛等,更靠后面的层就可以检测到完整的目标物体,比如:人脸。神经网络正是这样将一张图中的人脸分部来检测和提取特征从而识别出人脸,就像我们完成一项工作,将所有事情先分为一小步,完成这一步之后再进行下一步。

    边缘检测

    现在我们就以边缘检测来说明卷积运算是如何进行操作的

    卷积神经网络之卷积操作,使用卷积运算实现图片边缘特征检测

     

    如上图所示这样的一张灰度图像来说,当我们给我们的网络模型输入这样一张图片时,首先会检测图中的用红色标出的垂直边缘特征,比如:行人的轮廓线,而这些垂直线-特征,是由我们的垂直边缘检测器的输出,也就是卷积之后的输出。同样的对于用绿色标记出的水平边缘特征,图中的栏杆,是由水平边缘检测器的输出。

    那么如何检测在上图图像像中这些垂直、水平边缘特征呢?这里就涉及到一个矩阵,这个矩阵就是我们线性代数中的矩阵,专门用来检测这样的边缘和水平特征,也就是上面所说的边缘检测器,在卷积神经网络中的术语叫做过滤器filter,也被叫做卷积核-kernel,过滤器是进行卷积运算的一个重要工具。

    总结:边缘检测器叫做过滤器,也可以叫做卷积核,更常用的更加形象的叫法是卷边缘检测器和卷积核。

    卷积操作

    这里以垂直边缘检测器,为例来进行讲解,中间的这个就是垂直边缘过滤器,一个3*3的矩阵,用来检测图像中的垂直边缘特征。

    卷积神经网络之卷积操作,使用卷积运算实现图片边缘特征检测

     

    我们知道图像是由一个个像素点构成,像素点的取值为0~255,0代表黑色,255代表白色,中间的是过渡的灰度级,这里我们把上面的输入的灰度图像具体为一个一个像素点来表示,也就是左边的6*6的矩阵,假设大小为6*6,中间的是卷积核,最右边的是卷积运算之后得到的结果,可以看到卷积之后得到的结果是4*4的矩阵,这说明图像在计算机进行中是以矩阵的形式 - 也就是Python中的数组numpy的形式来进行运算的。

    那么具体的运算过程是怎么样的呢?为什么中间的这个3*3的矩阵,能够检测垂直边缘特征呢?

    卷积运算

    卷积神经网络之卷积操作,使用卷积运算实现图片边缘特征检测

     

    我们可以看到,右边卷积后的结果矩阵左上角元素 -5 = 3*1 + 1*1 + 2*1 + 0*0 + 5*0 + 7*0 +1*-1 + 8 *-1 + 2*-1 ,可以知道卷积操作的本质是:将这个3*3的边缘过滤器覆盖在输入图像上,然后进行对应元素相乘,将乘积之后的结果再相加,就得到了卷积结果矩阵的第一个元素,就这样依次运算得到我们的最终卷积结果矩阵,也就是卷积之后的图片。

    卷积神经网络之卷积操作,使用卷积运算实现图片边缘特征检测

     

    最后的这个-16是通过输入图像底部右下角的这个黄色的3*3进行过滤器卷积运算之后得到的结果。

    垂直边缘检测器

    为什么中间的这个3*3的矩阵可以做垂直边缘检测器呢?这里举例一个更加简单形象的例子。

    卷积神经网络之卷积操作,使用卷积运算实现图片边缘特征检测

     

    左边是一个简单的6*6的图像,右边的一半是像素值为10,右边一半像素值为0,这在图片中的效果就是,图片的左边看起来是白色的,因为10更接近255,那么图片的右边看起来是灰色的,右边像素值比较暗,我使用灰色来表示 0,尽管它也可以被画成黑的,但是这里为了举例,就画灰色的。有一个特别明显的垂直边缘在图像中间,蓝色垂直分割线,从白色到深色的分割线,这也就是我们的垂直边缘特征。

    卷积神经网络之卷积操作,使用卷积运算实现图片边缘特征检测

     

    灰度级图像的灰度级分布

    那么对于我们的垂直边缘检测器而言,如上图,左边是明亮的像素,中间的是一个过渡,0是灰色,然后右边是深色的,经过卷积运算之后,得到的结果则是一个4*4的矩阵,当做图像来说就是,左边是灰色,中间是白色,右边是灰色,中间的这个白色就是亮一点的区域,可以看成是由亮向暗过渡,就是我们6*6的原图中间的蓝色垂直边缘,这是一个十分明显的垂直边缘,也就是原图中由亮到暗的过渡,这样我们就把图片的垂直边缘特征提取出来了。

    如果将图片进行了翻转,还能检测出来吗?

    卷积神经网络之卷积操作,使用卷积运算实现图片边缘特征检测

     

    原图它的颜色被翻转了,变成了左边比较暗,右边比较亮。现 在亮度为 10 的点跑到了右边,为 0 的点则跑到了左边。我们用用相同的锤之边缘过滤器进行卷积,最后得到的卷积结果矩阵图中间元素会是-30,而不是 30。如果你将矩阵转换为图片,就会是该矩阵下面 图片的样子。现在中间的过渡部分被翻转了,之前的 30 翻转成了-30,表明是由暗向亮过渡, 而不是由亮向暗过渡。

    那么如何检测水平边缘特征呢?水平边缘过滤器又是什么样子呢?

    水平边缘检测器

    我们看一个更加复杂的例子,假设原图是像素点值不是那么绝对对称那么是怎么,难想到我们的水平边缘检测器长下面中间的这个样子,它的上边相对较亮,下边相对较暗比较暗,中间是过渡的灰色。可以看做将垂直边缘检测器,九十度向右翻转得到。

    卷积神经网络之卷积操作,使用卷积运算实现图片边缘特征检测

     

    对于左边的这个原图中的绿色区域,它的上部是相对比较亮,向上的箭头,它的像素值为10,它的下部是相对较暗,像素值为0。卷积后的结果是右图的绿色的30,可以看到它的上部是较暗的,较亮的,说明这是由暗到亮的过渡,中间是有一条水平分割线的,这条分割线就是我们的水平边缘特征。

    哪有的是呈现角度的边缘特征呢?不一定都是水平和垂直特征,这又应该怎么进行检测呢?

    比如下面的这张美女图片,帽子的边缘特征呈现角度,对于这样的复杂边缘特征该如何进行检测呢?

    卷积神经网络之卷积操作,使用卷积运算实现图片边缘特征检测

     

    事实上,上面提到的3*3的过滤器,也就是3*3的矩阵中的9个元素,在神经网络中事实上是9个参数,也就带参数的过滤器,我们可以任意组合,直至能够很好的检测到边缘特征。

    下面是Sobel算子的过滤器参数,分别实现水平、垂直、45度、135度图像边缘检测,可以看到参数都不一样,这种就叫做sobel过滤器,还有许许多多的检测器,也就是过滤器,其实还有180度边缘检测、270边缘检测等,只是卷积核,也就是过滤器参数的不同而已。

    卷积神经网络之卷积操作,使用卷积运算实现图片边缘特征检测

     

    下图和上图是分别使用Sobel算子实现45度、135度角边缘检测效果

    卷积神经网络之卷积操作,使用卷积运算实现图片边缘特征检测

     

    我们可以看到,45度和135度的边缘检测器效果更好。

    最终总结

    1.边缘检测器包括水平边缘检测、垂直边缘检测器等,检测器可以看做是一个由参数构成的矩阵,参数值不同,过滤器就不同,所检测到的效果就不同。

    2.卷积运算操作其实就是将这种带参数的过滤器在我们输入的图像上进行覆盖,然后对应元素相乘,然后相加。

    3.想要实现上述Sobel算子实现边缘检测、垂直边缘检测、45度、135度边缘检测的代码同学,https://blog.csdn.net/hellozex/article/details/80854112

    卷积神经网络之卷积操作,使用卷积运算实现图片边缘特征检测

     

    这期的卷积神经网络的卷积运算操作、以及如何使用卷积运算检测边缘特征就到这里了,下期讲解卷积神经网络中的另外一个基本模块,池化操作。

    更多有关python、深度和计算机编程的精彩内容,可以关注我的微信公众号:

  • 相关阅读:
    【DWT笔记】基于小波变换的降噪技术
    【DWT笔记】傅里叶变换与小波变换
    Matlab命令——目录操作(windows&Linux)
    【DCT笔记】DCT变换、DCT反变换、分块DCT变换
    JSOI2018 防御网络
    NOI2018 屠龙勇士
    CRT&EXCRT学习笔记
    CF662C Binary Table
    HNOI2017 礼物
    ZJOI2014 力
  • 原文地址:https://www.cnblogs.com/xiamuzi/p/13470963.html
Copyright © 2011-2022 走看看