1.简述
本文以深度学习的人脸识别算法为基础,重点研究了四个方面的内容:人脸检测和人脸识别涉及的深度算法的相关设计和优化工作;基于Tensorflow平台的模型设计、训练、优化工作;模型和考勤日志的记录和保存;人脸识别考勤门禁系统的GUI界面设计和相关代码实现。介绍了常用的6大训练模型框架,常用的6个深度学习网络,以及软件的GUI实现做了基础的阐述和比较。介绍了人脸识别系统的设计实现,基于tensorflow的算法实现和优化,考勤系统的模块和GUI设计优化工作。其中对实际使用时的HOG+VGG算法做了详细的算法解析和代码解析,同时针对功能模块设计和GUI设计也做了详尽的说明和代码示例。
2.系统功能框图
图1 人脸识别系统结构框图
3.人脸检测算法的选择
本文中作者分别针对(图匹配法、特征脸法、人工神经网络法、柔性形状模型法、HOG算法、LAB算法)6种算法进行了分析测试,经过综合对比选定了HOG算法。
3.1 HOG算法
HOG(Histogram of Oriented Gradient, 方向梯度直方图)主要应用在计算机视觉和图像处理等领域种的物体检测。该算法对图像局部区域的HOG进行计算和统计,以构建图像的HOG特征。算法的实现主要分为三个步骤,首先将图像分成多个小细胞单元,然后统计细胞单元中每个像素点的梯度或计算细胞单元的边缘方向直方图,最后将所计算得到的直方图整合起来构成最终的HOG特征描述器
算法的优化提升:将得到的局部直方图在图像的block内,即就细胞单元来说更大范围,再对图像进行对比度归一化处理。具体的处理方法为:首先计算出图像的每个直方图在这个block中的密度,然后代入计算得到的密度对该block中的所有细胞单元做归一化操作。局部直方图归一化后,对环境光照变化和局部阴影等环境有更优的识别效果。
HOG有很多优点:1)空间领域不变性,HOG算法的主要计算是在图像的局部单元上操作,所以HOG算法对图像几何形变和光学形变两个空间领域的重要参数都能保持很好的空间不变性;2)鲁棒性较好,HOG特征在经过空域采样和方向采样及局部光学归一化处理等操作后,依旧可以对保持直立的目标实现检测。3)人体检测效果好,在人体检测方面,由于HOG算法运算时主要关注人体轮廓,对人体的亮度和衣服颜色不做过多参考,这种算法架构使得它在人体检测方面有优异的效果。在人体跟踪方面,由于HOG关注轮廓和边界 的特点,使得它可以更好得表述检测物体的具体形状、轮廓信息,特别在局部细节的轮廓信息描述,并不会特别受到物体旋转和平移带来的影响,所以HOG在人体跟踪方面有优异的效果。 4)局部表征性好,由于HOG算法更多关注轮廓和边缘的特点,使图像本身受光照、颜色等其他为边缘性信息的影响比较小,颜色的特征被削弱后又使得整体数据的维度发生了降低,同时HOG算法的计算都发生在cell单元上,提取的又是图片的直方图信息,使其对图像局部有非常好的表征。
HOG特征提取算法的具体操作:1)灰度化处理,将检测目标转化称三维灰度图像(x, y, z(灰度));2)归一化处理,将输入图像通过Gamma校正法完成颜色空间归一化处理, 同时对图像的对比度进行调节,归一化操作可以弱化局部的阴影、环境光照和噪音干扰对图像处理的影响;3)梯度计算,为了尽量完善目标轮廓并减弱环境光照影响,算法对图像每个像素都计算相应的梯度;4)cell的梯度统计,将所得到的图像划分成数个小cell,即多个细胞单元,针对所有cell分别计算它们的梯度直方图,得到该图像所有的cell的特征描述符;5) block特征统计,将每几个cell组成一个block(例如2*2个cell/block),将一个block 内所有cell的特征descriptor整合起来便得到该block的HOG特征descriptor;6)得到HOG特征,最终的检测目标图像HOG特征descriptor,即将5)中计算的block特征扩展到全局的 block,并将所有特征descriptor整合到一起,最后的结果该图像的HOG特征。
图2 HOG算法流程图
3.2 其它5中算法
1)图匹配算法:主要实现对图像的动态匹配。通常使用点格阵列的方式来表示图匹配法的模板,作用在人脸上就是基于人脸特征信号向量的点阵栅格。但图匹配的方法,在图像形变严重、图像的尺寸变化、人的面部表情复杂时会受到很大干扰,所以在实际场景应用中,经常要配合小波变化来减小干扰。
2)特征脸法:是将图像降维变化成特征向量,待检测的图片向量和训练过的特征向量模型相比较得到检测结果。由于光线,旋转角度和面部表情等诸多变化因素,实际使用的特征脸法要在训练数据库和算法细节做相应调整,以达到更理想的效果。
3)人工神经网络算法:有很好的分类性能,如隐马尔科夫模型,隐马尔科夫模型是一种基于概率计算的神经网络,在语音识别和生物科学中被广泛应用,隐马尔科夫模型结合特征脸扩展的二维检测算法更是在人脸识别中取得了不错的效果。
4)柔性形状模型法:针对不断变化的人脸形状,对局部特征加入旋转、偏移和形变等变量的模板,主要由两阶段组成,首先对人脸进行建模和灰度计算,同时得到整个脸的灰度分布,然后依照模板进行人脸轮廓匹配、灰度分布匹配和局部轮廓匹配,最终得到匹配结果。
5)LAB算法:主要是将Haar特征按照LBP特征的方式进行提取。简单的说,就是求图像内黑色矩形与白色矩阵的像素差值,如果黑色矩形大则该区域特征为1,否则特征为0。
4. CNN模型架构及选择
4.1 LeNet-5网络
CNN的初代模型,LeNet-5共有7层,不包含输入,每层都包含可训练参数;网络的每一层都包含多个Feature Map,每个Feature Map都要通过卷积滤波器提取到输入的一种特征并保留下来。
图3 LeNet5结构图
网络结构Conv1-Sigmoid2-Conv3-Sigmoid4-Conv5-FullConnect6。模型的主要特点是使用反向传播算法进行训练,网络具有局部连接、参数共享等特性。
4.2 AlexNet 网络
AlexNet网络是现代深度CNN的里程碑式成就, AlexNet整合并首次在CNN中成功应用了ReLU、Dropout和LRN 等Trick。
图4 AlexNet网络的结构图
AlexNet网络模型中包含有连接6亿3000万个,参数6000万个和神经元65万个,拥有3个卷积加最大池化层,2个单独卷积层,最后还有3个全连接层。
4.3 VGGNET 网络
VGGNet 的研发过程着重探索研究深度卷积神经网络中卷积的深度、大小与它性能之间的关系,在不断的尝试各种类型大小的卷积核、池化层和全连接层在各种网络深度下的表现后,最终成功地构筑了这个16~19层深的卷积神经网络--VGGNET。VGGNet相比ALexNet 网络结构上网络深度变得更深,卷积和池化层也相应增多,整体的预测错误率也大幅下降。
同时VGGNet网络可以很轻松的迁移到其他图片类处理应用中,具有极好的拓展性。VGGNet拥有5段卷积,每一段内有2~3个卷积层,同时每段尾部会连接一个最大池化层用来缩小图片尺寸。
图5 VGGNet网络结构图
VGGNet网络是由5段卷积和3段全连接组成的,其中每段卷积由2~3个卷积运算和一个max pooling层组成,其中卷积提取上一层特征,max pooling缩小传递图像尺度。5段卷积层的数学上操作是一样的,但段内的卷积核数量逐层增多从第一层的64、128、256、512,到最后一层的512。其中段内的卷积经常有多个3´3 卷积层叠加在一起,这种做法可以提升网络的感知野(比如两个3*3卷积相当于一个5*5卷积的感知大小,三个3*3相当于一个7*7),减少参数量,更能实现更大程度的非线性变化,增加网络的学习能力。
4.4 InceptionNet 网络
InceptionNet模型比VGGNet的深度更深,但参数更少,这是由于InceptionNet在结构的末尾去除了全连接层,替换成了全局平均池化层(1*1卷积网络),达到参数减少,训练速度增快,弱化过拟合发生的三个效果。 InceptionNet在网络设计上借鉴了NIN(即Network In Network)结构,即整个网络是有多个小网络重复堆叠而成。
图6 InceptionNet网络中Inception Module结构图
从结构图中可以看到 Inception Module由四个分支组成,第一个分支中仅有一个1*1的卷积;第二分支中是一个1*1的卷积连接一个3*3的卷积;第三个分支中是1*1的卷积连接5*5的卷积,第四个分支是3*3的最大值池化连接一个1*1的卷积。模型中的特征提取主要在二、三分支,但最重要的结构是1*1的卷积,这个结构在四个分支中存在,其中1*1的网络可以实现跨通道组织消息,提升网络的表达能力,同时还可以对输出通道进行升降维度的操作。
4.5 ResNet 网络
ResNet设计思路是为了解决深度学习网络的“退化”问题,即为追求模型更强的学习能力和更高的准确率,而加深模型的深度。
图7 ResNet网络结构图
ResNet为了解决退化问题,引入了图像处理中的残差向量编码算法,定义了Residual 结构,结构的原理是将原本要学习的函数 H(x)通过一个identity mapping(恒等映射)转换成 F(x)+x,H(x)于 F(x)+x是除了表达结构外完全相同的。
4.6 DenseNet 网络
DenseNet是为了解决随着网络深度的加深,梯度消失问题会愈加严重的问题。为了解决这个问题,DenseNet的解决办法沿用了create short paths from early layers to later layers 的思路,即在保证网络中layer和layer之间信息的最大程度传输前提下,将所有layers直接连接起来。
图8 DenseNet 网络结构图
DenseNet网络中,得益于dense block的设计,网络更窄,参数更少,输出的feature map的数量也很小,同时后面的所有层相当于直接跟input和loss相连,使得梯度消失的问题得到很大减轻。
4.7 CNN 模型的选择
本文作者一共对以上的六种具有代表性的网络结构进行了描述和对比,且作者针对上述的六种代表性CNN网络结构进行测试分析:1)样本分类在2~3个时,LeNet和AlexNet已经完全可以达到理想的准确率;2)样本分类在10个左右时,VGGNetA~B即可满足性能需求;3)样本分类在 50 以内,VGGNetC~D,InceptionNet即可满足性能需求;4)当样本分类更多,样本更大时,选择网络ResNet或DenseNet才能达到更好的效果,但同时计算开销、训练时间和模型大小也呈指数级增长。 综合以上测试结果,即满足性能需求又不造成性能浪费,选择VGGNET 作为CNN网络结构。
5. VGGNET模型的设计和Tensorflow实现
作者采用了VGG的网络来进行深度学习网络训练。
图9 VGG网络模型传递示例
下面是每一层的像素值的计算:
图10 VGG模型结构示意图
通过模型结构图可以看到VGG的模型结构是5层卷积+maxpool 和三层全连接。其中 Activation函数采用Relu操作,全连接和dropout结合使用,并且没有忽略AlexNet网络中的LRN操作,以下为代码实现。
def VggLayer():
W1 = weightVariable([3,3,3,16]) # 卷积核大小(3,3), 输入通道(3), 输出通道(32)
b1 = biasVariable([16])
conv1 = tf.nn.relu(conv2d(x, W1) + b1, name= "conv1")
pool1 = maxPool(conv1)
print('CNN Layer1')
W2 = weightVariable([3,3,16,32])
b2 = biasVariable([32])
conv2 = tf.nn.relu(conv2d(conv1, W2) + b2, name="conv2")
pool2 = maxPool(conv2)
print('CNN Layer2')
W3_1 = weightVariable([3,3,32,64])
b3_1 = biasVariable([64])
conv3_1 = tf.nn.relu(conv2d(pool2, W3_1) + b3_1, name="conv3_1")
W3_2 = weightVariable([3,3,64,64])
b3_2 = biasVariable([64])
conv3_2 = tf.nn.relu(conv2d(conv3_1, W3_2) + b3_2, name="conv3_2")
pool3 = maxPool(conv3_2)
print('CNN Layer3')
W4_1 = weightVariable([3,3,64,128])
b4_1 = biasVariable([128])
conv4_1 = tf.nn.relu(conv2d(pool3, W4_1) + b4_1, name="conv4_1")
W4_2 = weightVariable([3,3,128,128])
b4_2 = biasVariable([128])
conv4_1 = tf.nn.relu(conv2d(conv4_1, W4_2) + b4_2, name="conv4_2")
pool4 = maxPool(conv4_1)
print('CNN Layer4')
W5_1 = weightVariable([3,3,128,128])
b5_1 = biasVariable([128])
conv5_1 = tf.nn.relu(conv2d(pool4, W5_1) + b5_1, name="conv5_1")
W5_2 = weightVariable([3,3,128,128])
b5_2 = biasVariable([128])
conv5_2 = tf.nn.relu(conv2d(conv5_1, W5_2) + b5_2, name="conv5_2")
print('CNN Layer5')
Wf_1 = weightVariable([4*4*128, 512])
bf = biasVariable([512])
drop3_flat = tf.reshape(conv5_2, [-1, 4*4*128])
dense = tf.nn.relu(tf.matmul(drop3_flat, Wf_1) + bf, name="dense1")
dropf = dropout(dense, keep_prob_75)
#打印进程
print('CNN Layerall')
Wout = weightVariable([512,2])
bout = weightVariable([2])
out = tf.add(tf.matmul(dropf, Wout), bout, name="output")
print('CNN Layer out')
return out
6. 数据库的选择
模型保存和训练图片的存取,主要采用两种模型hdf5和lmdb,hdf5是一种小型的数据库,方便对大型矩阵进行存储,在tensorflow和keras的模型训练中应用较多,而lmdb 作为一种模型存储结构,非常使用了大吞吐量的读操作,在caffee框架下应用非常广泛,同时也非常适用于其他框架。采用hdf5作为模型存储的框架应用,采用lmdb作为训练图片的存储数据库。
7. 总结
本文作者所设计的人脸识别系统还存在以下几个问题:
1)模型计算在低端CPU上,运算速度受限;
2)模型阶段性训练会长期消耗CPU的部分资源;
3)数据库的支持库和组件及占用体积比较大;
4)移动端部署实施由于依赖库和组件较多,复杂度较高。
改进:
- 考虑前向网络的简化,以优化CPU上的卷积和矩阵运算消耗;
- 优化数据库的格式和部署方式;
- 减少支持库和组件的支持,缩减对应的算法依赖项;
- 优化依赖库,实现tensorflow的移动端部署优化。
内容取自下述文献
李骏驰.基于人脸识别的公司考勤门禁系统的设计[D].电子科技大学,2018.