文章目录
1. 图片识别问题简介以及经典数据集
1.1 图片识别问题简介
视觉是人类认识世界非常重要的一种知觉。对于人来说,通过视觉来识别手写体数字、识别图片中的物体或者找出图片中人脸的轮廓都是非常简单的任务。但是这对于计算机来说不是一件简单的事情。
图片识别问题希望借助计算机中的程序来处理、分析和理解图片中的内容,使得计算机可以从图片中识别各种不同模式的目标和对象。比如前面的MNIST联系就是通过计算机来识别图片中的手写体数字。
1.2 经典数据集
MNIST数据集:TensorFlow入门数据集
CIFAR :CIFAR数据集是一个影响力很大的图像分类数据集。分为CIFAR-10和CIFAR-100两个问题,它们都是图像字典项目(Visual Dictionary)中800万张图片中的一个子集。CIFAR数据集中的图片是32*32的彩色图片。
ImageNet:
无论是MNIST还是CIFAR数据集,相比真实环境有两个最大的问题:
- 现实生活中的图片分辨率要远高于32*32,而且图像的分辨率也不会是固定的。
- 现实生活中的物体类别很多,无论是10中还是100种都远远不够,而且一张图片中不会只出现一个种类的物体。
为了更加贴近真实环境下的图像识别问题,由斯坦福大学的李飞飞教授带头整理的ImageNet很大程度地解决了这两个问题。
ImageNet是一个基于WordNet的大型图像数据库。
目标:抽取一个32323的图片的特征,再将提取的特征喂入到全连接网络。
- 卷积可以认为是一种有效提取图像特征的方法。
- 一般会用一个正方形的卷积核,遍历图片上的每个像素点。图片内的每个像素点,乘以卷积核上相对应的点的权重,求和,在加上偏置。
1. 单通道图片求卷积
1.1 基本的图片求卷积
现在对于一个551的图片,用一个331的卷积核求卷积。
如图所示,计算机会将一张551图片转换为一个55的矩阵,矩阵中的每个值代表其像素点的灰度。现在用一个33的矩阵对其求卷积。
每次求卷积的过程为拿着卷积核在原始图片举证上求卷积。如图中所示,就是
1
∗
(
−
1
)
+
0
∗
0
+
2
∗
1
+
5
∗
1
+
4
∗
0
+
2
∗
1
+
3
∗
(
−
1
)
+
4
∗
0
+
5
∗
1
+
1
=
1
1*(-1)+0*0+2*1+5*1+4*0+2*1+3*(-1)+4*0+5*1+1=1
1∗(−1)+0∗0+2∗1+5∗1+4∗0+2∗1+3∗(−1)+4∗0+5∗1+1=1
其总体大概过程如图
图片来源于
可以看我们是拿卷积核在原始图片上“滑动”求卷积。
在这里,影响输出矩阵的规格的因素有,原始图片大小,卷积核大小,滑动的步长。
一张图片经过一次卷积操作输出的边长 = ( 输入图片的边长 - 卷积核 + 1 ) /步长(向上取整)
比如上图中,输出边长 = ( 5 - 3 +1 ) / 1 = 3
1.2 填充的图片求卷积
有时候,需要在图片的周围进行填充(有全零填充和其他填充),如下图所示:
那么输出的边长就等于 = 输入长度 / 步长 = 5 / 1 = 5(向上取整)
在TensorFlow中,用参数padding = ‘SAME’(填充) 或者 padding = ‘VALID’(未填充) 表示
总的来说,卷积是讲一个矩阵进行信息提取(特征抽取)的作用。参数为卷积核参数3 * 3 = 9个
1.3 TensorFlow计算卷积
tf.nn.conv2d(
输入描述: 一次喂入图片数, 图片分辨率(两位),通道数
输出描述: 卷积核分辨率(两位), 通道数,核的个数
核滑动步长,第一个和第四个固定为1。第二三个分别为行步长和列步长。
pading = ‘VALID’
)
# eg
tf.nn.conv2d(
[batch, 5, 5, 1],
[3, 3, 1, 16],
[1, 1, 1, 1],
padding = 'VALID'
)
2. 三通道图片求卷积
在一般情况下,我们遇到的图片都是彩色图片。在计算机中,他们都是三通道图片(三基色原理,RGB红绿蓝)。
所以我们的图片矩阵变成了5 * 5 * 3。此时我们的卷积核变成了3 * 3 * 3 。
# eg
tf.nn.conv2d(
[batch, 5, 5, 3],
[3, 3, 3, 16],
[1, 1, 1, 1],
padding = 'SAME'
)
3. 池化层
池化的作用:
- 减少特征的数量
- 最大值池化可以提取图片纹理,均值池化可保留背景特征
4. 小结
从计算的角度来看:卷积操作就是矩阵操作。
4.1 输入图片为正方形,卷积核为正方形,单卷积核,单通道
不填充
输
出
的
矩
阵
边
长
=
输
入
边
长
−
卷
积
核
边
长
+
1
步
长
输出的矩阵边长 =\frac{输入边长 - 卷积核边长 + 1}{步长}
输出的矩阵边长=步长输入边长−卷积核边长+1
填充
输
出
的
矩
阵
边
长
=
输
入
边
长
步
长
输出的矩阵边长 =\frac{输入边长 }{步长}
输出的矩阵边长=步长输入边长
在这里有个疑惑,比如卷积核边长为三,填充一层,也就是输入边长+2。输出边长满足上述两个公式。
假如卷积核边长为5。那么是填充一层还是两层?
4.2 输入图片为正方形,卷积核为正方形,单卷积核,三通道
边长与单通道类似
输出通道数可以为1,每个对应的通道数相乘后相加。
可以为3,每个对应的通道数相乘后,相互独立。
也可以为9,输入的每个通道数与卷积核的通道数相乘,再相加。
4.3 输入图片为正方形,卷积核为正方形,多卷积核,多通道
边长与单通道类似
输出通道数
= 卷积核个数,每个对应的通道数相乘后相加。
= 卷积核个数3, 每个对应的通道数相乘后,相互独立。
= 卷积核个数9,输入的每个通道数与卷积核的通道数相乘,再相加。