图像识别是一种利用计算机对图像进行处理、分析和理解,以识别各种不同模式的目标和对象的技术,是计算机视觉领域的一个主要研究方向,在以图像为主体的智能化数据采集与处理中具有十分重要
的作用和影响。目前图像识别技术在图像搜索、商品推荐、用户行为分析以及人脸识别等互联网应用产品中,,同时在智能机器 人、无人自动驾驶和无人机等高新科技产业以及生物学、医学和地质学等众多学科领域具有广阔的应用前景。早期的图像识别系统一般都是针对某个特定的识别任务,且数据的规模不大,泛化能力较差,难以在实际应用问题当中实现精准的识别效果。
1 卷积神经网络
80年代中期,Fukushima等基于感受野概念提出的神经认知机,可以看作是卷积神经网络(Convolution neural networks,CNNs)的第一次实现,也是第一个基于神经元之间的局部连接性和层次结构组织的人工神经网络。\
1 概念
卷积神经网络是一种为了处理二维输入数据而特殊设计的多层人工神经网络,网络中的每层都由多个二维平面组成,而每个平面由多个独立的神经元组成,相邻两层的神经元之间互相连接,而处于同一层的神经元之间没有连接。CNNs采用了权值共享网络结构使之更类似于生物神经网络,同时模型的容量可以通过改变网络的深度和广度来调整,对自然图像也具有很强的假设(统计的平稳性和像素的局部相关性)。因此,与每层具有相当大小的全连接网络相比,CNNs能够有效降低网络模型的学习复杂度,具有更少的网络连接数和权值参数,从而更容易训练。
2 网络结构
INPUT(输入层)-CONV(卷积层)-RELU(激活函数)-POOL(池化层)-FC(全连接层)-OUTPUT(输出层)
上图展现的是一个简单的卷积神经网络模型,该网络模型有两个卷积层和两个子采样层交替组成。
3 卷积特征提取cov2d
对于大尺寸的图像识别问题,首先从图像中随机选取一小块局域作为训练样本,从该小块样本中学习到一些特征,然后将这些特征作为滤波器,与原始整个图像作卷积运算,从而得到原始图像中任一位置上的不同特征的激活值。局部感知:人的大脑识别图片的过程中,并不是一下子整张图同时识别,而是对于图片中的每一个特征首先局部感知,然后更高层次对局部进行综合操作,从而得到全局信息。也就是你看人一样,不是一下把整张脸看完,而是看鼻子,眼睛嘴巴等,才有了整体的认知。
输入图像是32*32*3,3是它的深度3(即R、G、B),卷积层是一个5*5*3的filter(感受野),这里注意:感受野的深度必须和输入图像的深度相同。通过一个filter与输入图像的卷积可以得到一个28*28*1的特征图,上图是用了两个filter得到了两个特征图;我们通常会使用多层卷积层来得到更深层次的特征图。
计算过程:
W:矩阵宽,H:矩阵高,F:卷积核宽和高,P:padding(需要填充的0的个数),N:卷积核的个数,S:步长
width:卷积后输出矩阵的宽,height:卷积后输出矩阵的高
width = (W - F + 2P)/ S + 1
height = (H - F + 2P) / S + 1
当conv2d(), max_pool()中的padding=‘SAME’时,width=W,height=H,当padding=‘valid’时,P=0
输出图像大小:(width,height,N)
filter:相当于CNN中的卷积核,它要求是一个Tensor,具有[filter_height, filter_width, in_channels, out_channels]这样的shape,具体含义是[卷积核的高度,卷积核的宽度,图像通道数,卷积核个数],要求类型与参数input相同,有一个地方需要注意,第三维in_channels,就是参数input的第四维。
4 激活函数
所谓激活,实际上是对卷积层的输出结果做一次非线性映射。
如果不用激励函数(其实就相当于激励函数是f(x)=x),这种情况下,每一层的输出都是上一层输入的线性函数。容易得出,无论有多少神经网络层,输出都是输入的线性组合,与没有隐藏层的效果是一样的,这就是最原始的感知机了。通俗地讲,激活函数的作用就是将多个线性输入转换为非线性的关系。如果不使用激励函数,神经网络的每层都只是做线性变换,即使是多层输入叠加后也还是线性变换。通过使用激励函数引入非线性因素后,使神经网络的表示能力更强了。比如:
relu函数:tf.nn.relu(features, name=None)
Sigmoid函数 tf.sigmoid(x, name=None)
tanh函数,反正切函数 tf.tanh(x, name=None)
Softplus tf.nn.softplus(features, name=None)
Relu6函数 tf.nn.relu6(features, name=None)
1.5 池化层pooling
池化(Pooling):也称为欠采样或下采样。主要用于特征降维,压缩数据和参数的数量,减小过拟合,同时提高模型的容错性。用池化层减少图像空间的大小,在每一个图层维度上独自完成,保持图像的纵深不变,主要有:
Max Pooling:最大池化;max-pooling,能减小因卷积层参数误差造成估计均值偏移的误差,更多的保留纹理信息。
Average Pooling:平均池化 ;mean-pooling,能减小因邻域大小受限造成的估计值方差增大的误差,更多的保留图像的背景信息,对输入的特征图进行压缩,一方面使特征图变小,简化网络计算复杂度;一方面进行特征压缩,提取主要特征
计算:池化后的大小
width = (W - F)/ S + 1
height = (H - F) / S + 1
1.6 全连接层
经过前面若干次卷积+激励+池化后,终于来到了输出层,模型会将学到的一个高质量的特征图片全连接层。全连接层主要对特征进行重新拟合,减少特征信息的丢失;输出层主要准备做好最后目标结果的输出。全连接层在整个卷积神经网络中起到”分类器”作用,其实在全连接层之前,如果神经元数目过大,学习能力强,有可能出现过拟合。因此,可以引入dropout操作,来随机删除神经网络中的部分神经元,来解决此问题。还可以进行局部归一化(LRN)、数据增强等操作,来增加鲁棒性。
当来到了全连接层之后,可以理解为一个简单的多分类神经网络(如:BP神经网络),通过softmax函数得到最终的输出。整个模型训练完毕。
2 图像分类
图像分类问题是通过对图像的分析,将图像划归为若干个类别中的某一种,主要强调对图像整体的语义进行判定。
3 物体检测
与图像分类比起来,物体检测是计算机视觉领域中一个更加复杂的问题,因为一张图像中可能含有属于不同类别的多个物体,需要它们均进行定位并识别其种类。因此,在物体检测中要取得好的效果也比物体分类更具有挑战性,运用于物体检测的深度学习模型也会更加复杂。
4 姿态估计
姿态估计是时下最为重要的计算机视觉挑战性问题之一,原因在于它可以被很快地应用到人物追踪、动作识别以及视频相关的视频分析上,比如视频监控和视频搜索等实际应用面非常广。姿态估计的主要任务就是,给定一张图,图中会有一个人,你需要给出这个人的姿态动作是什么样的。
5 图像分割
图像分割是这样一类问题:对于一张图来说,图上可能有多个物体、多个人物甚至多层背景,希望能做到对于原图上的每个像素点,能预测它是属于哪个部分的(人、动物、背景……)。图像分割作为许多计算机视觉应用研究的第一步十分关键。
6 人脸识别
人脸识别是图像识别领域一个非常重要的研究方向,由于人脸图像具有易采集的特性,因此受到了许多行业的关注,具有非常广阔的应用前景和巨大的商业市场。人脸识别技术主要包括人脸检测、人脸特征提取和人脸识别3个过程。人脸检测是从输入图像或视频流中检测并提 取人脸图像,并进 一 步给出人脸的位置、大小以及各个主要面部器官的位置信息。