卷积在图像处理中的应用
卷积运算1、卷积定义我们称 ( f*g )(n) 为 f,g 的卷积。● 其连续的定义为:● 其离散的定义为:这两个式子有一个共同的特征:观察上面两个式子你会知道,所谓卷积就是先对 g 函数进行翻转(一维)或者旋转(二维),相当于在数轴(一维)上把 g 函数从右边褶到左边去,这也就是褶积的“褶”的由来(小编认为“褶”比“卷”更准确)。然后再把 g 函数平移 n,在这个位置 f,g 两个函数的对应点
卷积运算
1、卷积定义
我们称 ( f*g )(n) 为 f,g 的卷积。
● 其连续的定义为:
● 其离散的定义为:
这两个式子有一个共同的特征:
如果遍历这些直线,就好比,把毛巾沿着角卷起来。
观察上面两个式子你会知道,所谓卷积就是先对 g 函数进行翻转(一维)或者旋转(二维),相当于在数轴(一维)上把 g 函数从右边褶到左边去
,这也就是褶积的“褶”的由来(小编认为“褶”比“卷”更准确)。
然后再把 g 函数平移 n,在这个位置 f,g 两个函数的对应点相乘,然后相加
,这个过程是卷积的“积”的过程。
2、卷积例子
(1)离散卷积:丢骰子
我有两枚骰子,把这两枚骰子都抛出去,求两枚骰子点数加起来为4的概率。
这里问题的关键是,两个骰子加起来要等于4,这正是卷积的应用场景。我们把骰子各个点数出现的概率表示出来:
那么,两枚骰子点数加起来为4的情况有:
因此,两枚骰子点数加起来为4的概率为:
符合卷积的定义,把它写成标准的形式就是:
(2)连续卷积:做馒头
卷积在图像处理上的应用
1、此卷积非数学卷积
机器学习里的卷积和数学上的卷积有些差别,数学上应该叫协相关
。
对图像大矩阵和滤波小矩阵对应位置元素相乘再求和的操作就叫卷积(Convolution)或协相关(Correlation)。
协相关(Correlation)和卷积(Convolution)很类似,两者唯一的差别就是卷积在计算前需要翻转卷积核,而协相关则不需要翻转
。
(1)相关算子
(2)卷积算子
2、卷积应用
在图像处理中,卷积操作指的是使用一个卷积核对图像中的每个像素进行一系列操作
。
卷积核(算子)是用来做图像处理时的矩阵,图像处理时也称为掩膜,是与原图像做运算的参数。卷积核通常是一个四方形的网格结构(例如3*3的矩阵或像素区域),该区域上每个方格都有一个权重值。
使用卷积进行计算时,需要将卷积核的中心放置在要计算的像素上,一次计算核中每个元素和其覆盖的图像像素值的乘积并求和,得到的结构就是该位置的新像素值
。如果对一幅图像进行卷积运算,可利用以数组为中心为参考点的3*3卷积核。首先将核的参考点定位于图像的第一个像素点,核的其余元素覆盖图像总其对应的局部像素点。对于每一个核点,我们可以得到这个点的值以及图像中对应图像点的值。将这些值相乘并求和,并将这个结果放在与输入图像参考点所对应的位置。通过在整个图像上扫描卷积核,对图像的每个点重复此操作。最终可以得到图像的卷积图像。
(1)卷积核/过滤器
● 卷积核也称为过滤器(filter)。 每个卷积核具有长、宽、深三个维度。
卷积核的长、宽都是人为指定的,长 * 宽也被称为卷积核的尺寸,常用的尺寸为 3X3,5X5 等。
在指定卷积核时,只需指定其长和宽两个参数
,这是因为通常卷积核的深度(也可以理解为通道数)与当前图像的深度(feather map的个数,比如:RGB三个通道就是三个feature map)相同
。● 卷积过程中,
输入层有多少个通道(输入的feature map个数),滤波器就要有多少个通道(卷积核的深度);但是滤波器的数量是任意的,滤波器的数量决定了卷积后输出的通道数
(即:输出的feature map 个数)。
在许多常用的体系结构中,随着计算所使用的网络越来越深,所使用的过滤器数量也越来越大(例如,第二个为64,第三个为128,依此类推)。
●每个过滤器(卷积核)实际上恰好是多个内核的集合,内核的数目也就是通道数
。
(2)特征图(feature map)
● 输入层:
在输入层,如果是灰度图片,那就只有一个feature map(一个通道);如果是彩色图片,一般就是3个feature map(红绿蓝三个通道)
。
● 其它层:层与层之间会有若干个卷积核(kernel)(也称为过滤器),上一层的feature map(通道)跟每个卷积核做卷积,都会产生下一层的一个feature map;有N个卷积核,下层就会产生N个feather map(即:N个输出通道)
。
卷积神经网络在图像处理的应用
1、普通神经网络处理图像的缺点
(1)理论上我们可以用常规的神经网络来进行图像分析,但在实际操作中,
从计算角度看,使用这种方法的成本非常高
。
举例来说,一个常规的神经网络,就算是处理一个非常小的图像,假设是 30 * 30 像素图像,仍需要900个数据输入和五十多万个参数。这样的处理加工对一个相对强大的机器来说还是可行的;但是,如果需要处理更大的图像,假设是500*500像素的图像,那么机器所需的数据输入和参数数量就会大大增加,增加到难以想象的地步。
(2) 除此之外,将神经网络用于“图像识别”还可能会导致另一个问题——
过度拟合
。
简单来说,过度拟合指的是系统训练的数据过于接近定制的数据模型的现象。这不仅会在大体上导致参数数量的增加(也就是进一步计算支出的增加),还将削弱“图像识别”在面临新数据时其他常规功能的正常发挥。
2、真正的解决方案——卷积
幸运的是,我们发现,只要在神经网络的结构方式上做一个小小的改变,就能使大图像的处理更具可操作性。改造后的神经网络被称作“卷积神经网络”,也叫 CNNs 或 ConvNets 。
神经网络的优势之一在于它的普遍适应性。但是,就像我们刚刚看到的,神经网络的这一优势在图像处理上实际上是一种不利因素。而“卷积神经网络”能够对此作出一种有意识的权衡——为了得到一个更可行的解决方案,我们牺牲了神经网络的其他普遍性功能,设计出了一个专门用于图像处理的网络。
在任何一张图像中,
接近度与相似度的关联性都是非常强的
。准确地说,“卷积神经网络”就是利用了这一原理。具体而言就是,在一张图像中的两个相邻像素,比图像中两个分开的像素更具有关联性
。但是,在一个常规的神经网络中,每个像素都被连接到了单独的神经元。这样一来,计算负担自然加重了,而加重的计算负担实际上是在削弱网络的准确程度。
卷积网络通过削减许多不必要的连接来解决这一问题
。运用科技术语来说就是,“卷积网络”按照关联程度筛选不必要的连接,进而使图像处理过程在计算上更具有可操作性。“卷积网络”有意地限制了连接,让一个神经元只接受来自之前图层的小分段的输入(假设是3×3或5×5像素),避免了过重的计算负担
。因此,每一个神经元只需要负责处理图像的一小部分
(这与我们人类大脑皮质层的工作原理十分相似——大脑中的每一个神经元只需要回应整体视觉领域中的一小部分)。
“卷积神经网络”究竟是如何筛选出不必要的连接的呢?
秘密就在于两个新添的新型图层——卷积层和汇聚层
。我们接下来将会通过一个实操案例:让网络判断照片中是否有“奶奶”这一对象,把“卷积神经网络”的操作进行分解,逐一描述。
第一步,“卷积层”。
(1)首先,我们会将奶奶的照片分解成一些3×3像素的、重叠着的拼接图块。
(2)然后,我们把每一个图块运行于一个简单的、单层的神经网络,保持权衡不变。这一操作会使我们的拼接图块变成一个图组。由于我们一开始就将原始图像分解成了小的图像(在这个案例中,我们是将其分解成了3×3像素的图像),所以,用于图像处理的神经网络也是比较好操作的。
(3)接下来,我们将会把这些输出值排列在图组中,用数字表示照片中各个区域的内容,数轴分别代表高度、宽度和颜色。那么,我们就得到了每一个图块的三维数值表达。(如果我们讨论的不是奶奶的照片,而是视频,那么我们就会得到一个四维的数值表达了。)第二步,“汇聚层”。
“汇聚层”是将这个三维(或是四维)图组的空间维度与采样函数结合起来,输出一个仅包含了图像中相对重要的部分的联合数组。这一联合数组不仅能使计算负担最小化,还能有效避免过度拟合的问题。
最后,我们会把从“汇聚层”中得出的采样数组作为常规的、全方位连接的神经网络来使用。
通过卷积和汇聚,我们大幅度地缩减了输入的数量,因此,我们这时候得到的数组大小是一个正常普通网络完全能够处理的,不仅如此,这一数组还能保留原始数据中最重要的部分
。这最后一步的输出结果将最终显示出系统有多少把握作出“照片中有奶奶”的判断。
3、CNN 提取图像特征
一个图像矩阵经过一个卷积核的卷积操作后,得到了另一个矩阵,这个矩阵叫做特征映射(feature map)。每一个卷积核都可以提取特定的特征,不同的卷积核提取不同的特征,举个例子,现在我们输入一张人脸的图像,使用某一卷积核提取到眼睛的特征,用另一个卷积核提取嘴巴的特征等等。而特征映射就是某张图像经过卷积运算得到的特征值矩阵。
特征提取—“X” or “O” 示例
在CNN中有这样一个问题,就是每次给你一张图,你需要判断它是否含有"X"或者"O"。并且假设必须两者选其一,不是"X"就是"O"。理想的情况就像下面这个样子:
那么如果图像如果经过变形、旋转等简单操作后,如何识别呢?这就好比老师教你1+1等于2,让你独立计算1+2等于几是一个道理,就像下面这些情况,我们同样希望计算机依然能够很快并且很准的识别出来:
这也就是CNN出现所要解决的问题。
如下图所示,像素值"1"代表白色,像素值"-1"代表黑色。对于CNN来说,它是一块一块地来进行比对。它拿来比对的这个“小块”我们称之为Features(特征)。在两幅图中大致相同的位置找到一些粗糙的特征进行匹配,CNN能够更好的看到两幅图的相似性。
对于字母"X"的例子中,那些由对角线和交叉线组成的features基本上能够识别出大多数"X"所具有的重要特征。
这些 features 很有可能就是匹配任何含有字母"X"的图中字母X的四个角和它的中心。那么具体到底是怎么匹配的呢?如下三个特征矩阵a,b,c:
观察下面几张图,a可以匹配到“X”的左上角和右下角,b可以匹配到中间交叉部位,而c可以匹配到“X”的右上角和左上角。
把上面三个小矩阵作为卷积核,每一个卷积核可以提取特定的特征
,现在给一张新的包含“X”的图像,CNN 并不能准确地知道这些 features 到底要匹配原图的哪些部分,所以它会在原图中每一个可能的位置进行尝试,即使用该卷积核在图像上进行滑动,每滑动一次就进行一次卷积操作,得到一个特征值
。
(下图中求平均是为了让所有特征值回归到-1到1之间)
最后将整张图卷积过后,得到这样的特征矩阵:
使用全部卷积核卷积过后,得到的结果是这样的:
仔细观察,可以发现,其中的值,越接近为1表示对应位置和卷积核代表的特征越接近,越是接近-1,表示对应位置和卷积核代表的反向特征越匹配,而值接近0的表示对应位置没有任何匹配或者说没有什么关联。
那么最后得到的特征矩阵就叫做 feature map 特征映射,通过特定的卷积核得到其对应的 feature map。在CNN中,我们称之为卷积层(convolution layer),卷积核在图像上不断滑动运算,就是卷积层所要做的事情。同时,在内积结果上取每一局部块的最大值就是最大池化层的操作。CNN 用卷积层和池化层实现了图片特征提取方法
。
4、反向传播算法 BP
CNN 利用卷积层和池化层提取图片的特征,其中的关键是卷积核表示图片中的局部特征。
而在现实中,使用卷积神经网络进行多分类获目标检测的时候,图像构成要比上面的X和O要复杂得多,我们并不知道哪个局部特征是有效的,即使我们选定局部特征,也会因为太过具体而失去反泛化性。还以人脸为例,我们使用一个卷积核检测眼睛位置,但是不同的人,眼睛大小、状态是不同的,如果卷积核太过具体化,卷积核代表一个睁开的眼睛特征,那如果一个图像中的眼睛是闭合的,就很大可能检测不出来,那么我们怎么应对这中问题呢,即如何确定卷积核的值呢?
这就引出了反向传播算法。什么是反向传播,以猜数字为例,B手中有一张数字牌让A猜,首先A将随意给出一个数字,B反馈给A是大了还是小了,然后A经过修改,再次给出一个数字,B再反馈给A是否正确以及大小关系,经过数次猜测和反馈,最后得到正确答案(当然,在实际的CNN中不可能存在百分之百的正确,只能是最大可能正确)。
所以反向传播,就是对比预测值和真实值,继而返回去修改网络参数的过程,一开始我们随机初始化卷积核的参数,然后以误差为指导通过反向传播算法,自适应地调整卷积核的值,从而最小化模型预测值和真实值之间的误差
。
举一个简单例子。绿色箭头代表前向传播,红色代表为反向传播过程,x、y是权重参数,L为误差,L对x、y的导数表示误差L的变化对x、y的影响程度,得到偏导数delta(x)后,x* = x-η*delta(x),其中η为学习率,从而实现权重的更新。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)