计算机视觉
计算机视觉(Computer Vision)包含很多不同类别的问题,如图片分类、目标检测、图片风格迁移等等。
图片分类:比如给出下图中64×64的图片,让计算机去分辨出这是一只猫。
目标检测:比如在一个无人驾驶项目中,你不一定非得识别出图片中物体是车辆,但需要计算出其他车辆的位置,以确保自己能够避开它们,所以在目标检测项目,首先需要计算出图中有哪些物体,比如汽车,还有图中的其他东西,再将它们模拟成一个个盒子。
风格迁移:比如一张图片,你想将这张图片转换成另外一种风格。你有一张满意的图片和一张风格图片,而你可以用神经网络将它们融合在一起。
但在应用计算机视觉时要面临一个挑战,就是输入的数据可能会非常大,举个例子,在过去,一般操作的都是64×64的小图片,实际上他的数据量是64×64×3,可以得知数据量为12288,所以我们特征向量维度为12888.但如果你操作更大的图片,比如一张1000×1000的图片,它有1M那么大,特征向量的维度达到了1000×1000×3,所以将会是三百万的特征向量,所以在第一个隐藏层你可能会有1000个隐藏单元。有权值组成的矩阵W[1],如果是全连接的话,这个矩阵的大小将是1000×3百万,将有30亿个参数,难以获取足够的数据去处理包含30亿参数的神经网络,巨大的内存需求也不太能接受。
边缘检测示例
卷积运算是卷积神经网络的基本组成部分。下面以边缘检测的例子来介绍卷积运算。
神经网络前几层进行边缘检测,后面几层检测到部分物体,更靠后的层检测可能检测到完整的物体。
所谓边缘检测,在下面的图中,分别通过垂直边缘检测和水平边缘检测得到不同的结果:
假设对于一个 6×6 大小的灰度图片(以数字表示),为了检测图像中的垂直边缘构造一个 3×3 的矩阵,在卷积神经网络中被称为 filter(卷积核) 进行卷积运算,以“∗”符号表示。(在数学中“ * ”就是卷积的标准表示方式)图片和垂直边缘检测器分别如左和中矩阵所示:
filter 不断地和其大小相同的部分做对应元素的乘法运算并求和,最终得到的数字相当于新图片的一个像素值,如右矩阵所示,最终得到一个 4×4 大小的图片。
边缘检测原理
以一个有一条垂直边缘线的简单图片来说明。通过垂直边缘 filter 我们得到的最终结果图片可以明显地将边缘和非边缘区分出来:
卷积运算提供了一个很方便的方法来发现图像中的垂直边缘
边缘检测细节
正边:由亮到暗
负边:由暗到亮
第二幅图片得到的中间是-30而不向是30,中间过度部分被翻转了,表明这是由暗向亮过度 。
多种边缘检测
垂直和水平边缘检测
一些其他的滤波器
对于复杂的图片,我们可以直接将filter中的数字直接看作是需要学习的参数,其可以学习到对于图片检测相比上面filter更好的更复杂的filter,如相对于水平和垂直检测器,我们训练的 filter 参数也许可以知道不同角度的边缘。
通过卷积运算,在卷积神经网络中通过反向传播算法,可以学习到相应于目标结果的filter,将其应用于整个图片,输出其提取到的所有有用的特征。
卷积和互相关:
在数学定义上,矩阵的卷积(convolution)操作为首先将卷积核同时在水平和垂直方向上进行翻转,构成一个卷积核的镜像,然后使用该镜像再和前面的矩阵进行移动相乘求和操作。如下面例子所示:
在深度学习中,我们称为的卷积运算实则没有卷积核变换为镜像的这一步操作,因为在权重学习的角度,变换是没有必要的。深度学习的卷积操作在数学上准确度来说称为互相关(cross-correlation)。
Padding
没有Padding操作是会有两个缺点
- 每次卷积操作图像会缩小
就前面的例子来说,6×6 大小的图片,经过 3×3 大小的 filter,缩小成了 4×4 大小
图片:n×n –> (n−f+1)×(n−f+1) - 角落和边缘位置的像素进行卷积运算的次数少,可能会丢失有用信息。
其中,n表示图片的长或宽的大小,f表示filter的长或宽的大小。
为了解决上述两个问题,我们在进行卷积运算前填充这幅图片,包围角落和边缘的像素,使得通过filter的卷积运算后,图片大小不变,也不会丢失角落和边沿的信息。
以p表示 Padding 的值,则输入n×n大小的图片,最终得到的图片大小为 (n+2p−f+1)×(n+2p−f+1),为使图片大小保持不变,需根据filter的大小调整p的值。
Valid / Same 卷积:
- Valid:no padding;(n×n –> (n−f+1)×(n−f+1))
- Same:padding,输出与输入图片大小相同,(p=(f−1)/2)。在计算机视觉中,一般来说padding的值为奇数(因为filter一般为奇数,1.如果filter是偶数,那么只能使用一些不对称 2.使用奇数维filter才会有一个中心点,在计算机视觉里如果有一个中心像素点会更方便,便于指出过滤器位置)
卷积步长
卷积的步长是构建卷积神经网络的一个基本的操作。 如前面的例子中,我们使用的 stride=1,每次的卷积运算以1个步长进行移动。下面是 stride=2 时对图片进行卷积的结果:
以s表示stride的大小,那么在进行卷积运算后,图片的变化为:n×n –> ⌊n+2p−fs+1⌋×⌊n+2p−fs+1⌋。
注意,在当padding stride≠1时,若移动的窗口落在图片外面时,则不要再进行相乘的操作,丢弃边缘的数值信息,所以输出图片的最终维度为向下取整。
立体卷积
为了检测图像的边缘或者一些其他的特征对于灰色图像中,卷积核和图像均是二维的。而应用于彩色图像中,因为图片有R、G、B三个颜色通道,所以此时的卷积核应为三维卷积核。
如果彩色图像大小为6×6,那么它就是6×6×3,这里3指的是 有3个颜色通道,可以把它想象成3个6×6的图像的堆叠,不是把它和原来的3×3做卷积而是和一个3维的滤波器,对应红绿蓝三个通道。图像的第一个6代表图像的高,第二个代表宽,第3个是通道数目,同样滤波器也有高、宽、通道。图像的通道数必须和滤波器的通道数匹配 。6×6×6的图像卷积3×3×3的滤波器,输出为一个4×4×1的图像。
研究一下背后的细节:
如果你想检测图像红色通道的边缘,那么你可以将第一个过滤器设为1 1 1,-1 -1 -1和之前样,绿色通道和蓝色通道全为0。然后把这三个过滤器叠加起来,形成一个3×3×3的滤波器。那么这就是一个检测边界垂直边界的过滤器,但只对红色通道有用。或者如果你不关心垂直边界在哪个颜色通道里,那么你可以用这样的过滤器三通道都是1 1 1,-1 -1 -1,用来检测任意通道的边界。参数的选择不同,你就可以得到不同的特征检测器,按照计算机视觉的惯例,当你的输入有特定的高,宽和通道数时,你的过滤器可以有不同的高,不同的宽,但是必须一样的通道数。理论上,我们的过滤器只关注红色通道或者只关注绿色或者蓝色通道是可行的。
多核卷积
同时检测垂直边缘和水平边缘,还有45度倾斜的边缘或者70度边缘,即你想同时用多个滤波器时改怎么做?
单个卷积核应用于图片时,提取图片特定的特征,不同的卷积核提取不同的特征。如两个大小均为3×3×3 的卷积核分别提取图片的垂直边缘和水平边缘。
由图可知,最终提取到彩色图片的垂直特征图和水平特征图,得到有2个通道的4×4大小的特征图片
总结一下维度:
图片:n×n×nc ∗ f×f×nc —>(n−f+1)×(n−f+1)×n′c
其中,nc 表示通道的数量,n′c表示下一层的通道数,同时也等于本层卷积核的个数。
单层卷积神经网络
和普通的神经网络单层前向传播的过程类似,卷积神经网络也是一个先由输入和权重及偏置做线性运算,然后得到的结果输入一个激活函数中,得到最终的输出:
z[1]=w[1]a[0]+b[1]
a[1]=g(z[1])
这里的a[0]就是输入X,也就是图片。这些过滤器用w[1]表示,在卷积过程中我们对这27个数进行操作,实际是272,因为我们是两个过滤器。我们取这些数做乘法,实际执行了一个线性函数,得到一个44矩阵,他的作用类似于w[1]a[0]。不同点是在卷积神经网络中,权重和输入进行的是卷积运算。
示例中我们有两个滤波器,也就是有两个特征,因此最终我们才会得到4×4×2的输出,如果我们用10个,那么我们将得到4×4×10的输出图像。
计算参数个数
在一个卷积层中,如果我们有10个 3×3×3 大小的卷积核,那么加上每个卷积核对应的偏置,则对于一个卷积层,我们共有的参数个数为:
(3×3×3+1)×10=280
请注意一点,不论输入的图片有多大,参数始终都是280个,这就是卷积神经网络的一个特征叫做“避免过拟合”
描述卷积神经网络标记总结:
如果l表示一个卷积层
简单卷积网络示例
卷积网络层的类型:
- 卷积层(Convolution),Conv;
- 池化层(Pooling),Pool;
- 全连接层(Fully connected):Fc;
池化层
最大池化(MAX Pooling)
最大池化是对前一层得到的特征图进行池化减小,仅由当前小区域内的最大值来代表最终池化后的值。
在最大池化中,有一组超参数需要进行调整,其中,f 表示池化的大小,s表示步长。
平均池化与最大池化唯一不同的是其选取的是小区域内的均值来代表该区域内的值。
- 池化前:n×n;
- 池化后:⌊n+2p−fs+1⌋×⌊n+2p−fs+1⌋。
平均池化
平均池化与最大池化唯一不同的是其选取的是小区域内的均值来代表该区域内的值。
常用的参数值是f=2,s=2,其效果相当于高度和宽度缩减一半,最大池化很少用到padding,需要注意的一点是,池化过程中没有需要学习的参数。最大池化只是计算神经网络某一层的静态属性。
卷积神经网络示例
这里以 LeNet-5 为例,给出一个完整的卷积神经网络。
构建深度卷积的模式:
- 随着网络的深入,提取的特征图片大小将会逐渐减小,但同时通道数量应随之增加;
- Conv——Pool——Conv——Pool——Fc——Fc——Fc——softmax。
卷积神经网络的参数
- 池化层没有参数
- 卷积层参数相对较少
- 随着神经网络的加深,激活值会逐渐变小,如果激活值下降太快,也会影响网络性能
关于设置超参数,常规做法是不要自己设置超参数,而是查看文献中别人采用了哪些超参数,选一个在别人任务中效果很好的架构。
为什么使用卷积
和全连接层相比,卷积层的两个优势是:参数共享和稀疏链接。
- 参数共享:一个特征检测器(filter)对图片的一部分有用的同时也有可能对图片的另外一部分有用。
- 连接的稀疏性:在每一层中,每个输出值只取决于少量的输入。
与普通的全连接神经网络相比,卷积神经网络的参数更少。如图中的例子,卷积神经网络仅有6×(5×5+1)=156个参数,而普通的全连接网络有3072×4704≈14M个参数。
卷积网络参数这么少的就是以下两个原因
- 参数共享:一个特征检测器(filter)对图片的一部分有用的同时也有可能对图片的另外一部分有用。
- 连接的稀疏性:在每一层中,每个输出值只取决于少量的输入。
卷积神经网络善于捕捉平移不变,通过观察可以发现,向右移动两个像素,图片中猫依然清晰可见,因为移动几个像素,这张图片依然具有相似的特征。
训练神经网络
我们将训练集输入到卷积神经网络中,对网络进行训练。利用梯度下降(Adam、momentum等优化算法)最小化代价函数来寻找网络最优的参数。
完成了第三门课了
网友评论