李玥瑶,周金治,王杨
(西南科技大学 信息工程学院,四川 绵阳 621010)
随着科学技术的蓬勃发展,人脸识别与我们的生产生活关系越来越密切,被广泛运用到生活中的方方面面。涉及到了安保、通行、泛娱乐、公安、司法、自助服务设备等多个领域,甚至我们随身携带的手机也都开始普遍使用人脸识别进行解锁、支付等。通过深度学习平台用Python语言来实现人脸识别是近几年学习人脸识别较为普遍的方式,且已经有许多人研究过基于CNN的人脸识别,但是关于戴上口罩遮挡面部这种情况的人脸识别还是较少的。在新冠肺炎肆虐的当下,使我们佩戴口罩进出公共场合成为必须,但因为佩戴口罩对于人脸识别的精度有一定的影响,取下口罩进行人脸识别又有可能感染新冠肺炎等问题的存在。因此,设计了一款能够高精度识别人脸的戴口罩人脸识别系统。该系统在作者、老师、同学的配合下,已经完成了符合基本精度要求的系统。在能够准确完成所需人脸识别的同时也有效地保证了人民在疫情期间出入公共场所的安全。
在进行图像处理的CNN模型中,如图1所示,最左边的图片就是CNN的输入层,一般代表了输入若干个像素矩阵。接着是卷积层(Convolution Layer),它使用ReLU激活函数,接下来连接着的是池化层(Pooling Layer),它不使用激活函数。最常见的CNN模型是由卷积层-池化层反复堆叠,多次组合出现在隐藏层,其出现的次数根据模型需要而定,我们在图1中展示了两次组合结构。在若干卷积层—池化层后连接着的是全连接层(Fully Connected Layer,FC),使用Softmax激活函数进行图像识别的分类。
图1 卷积神经网络结构
1.1.1 卷积层
卷积层的使用能够提取或检测出原始图片的特定特征,通过设计卷积核进行卷积运算,自动提取图像特征构成特征图(feature map),既能很好地保留图像在空间几何上的特性,又能达到分类的效果。在CNN中的卷积和严格数学意义上的微积分中的卷积稍有不同,我们假设是对图像进行卷积,利用卷积核按照设定的步长,在输入图像的矩阵上进行上下左右移动,将输入图像的部分矩阵与卷积核矩阵对应的位置相乘,然后相加得到的输出矩阵就是卷积的结果。
举个例子如下,我们假设原始图片为一张黑白图片,0表示白色,1表示黑色,(0,1)区间的值表示灰色,图片的输入是一个二维4×4的图像。设计两个不同的2×2的卷积核,滑动步长均为1,卷积核每次向右滑动一个单位进行卷积。以第一个卷积核为例,卷积的计算过程如图2所示,最终得到了一个3×3的输出矩阵,因此feature map的尺寸计算公式为:[(原始图片尺寸-卷积核尺寸)/步长]+1。
图2 卷积的计算过程
两个卷积核的卷积结果如图3所示,观察两个feature map可知,经过第一个卷积核的feature map1第三列的绝对值最大,说明在原始图片上相应的位置有垂直方向的特征,经过第二个卷积核的feature map2第三列为0,第二行的绝对值最大,说明在原始图片上相应的位置有水平方向的特征。因此,卷积核就类似于图像特征的提取器,只要设计好卷积核的尺寸、数量和滑动步长就可以很好地提取图像特征完成分类。在通常情况下,靠近输入层设计的卷积核数量较少,这时提取出的一般是图片的共性特征,越往后,设计的卷积核数目会越来越多,是为了更加细致地提取特征,也就能够越容易地进行分类。
图3 4×4的图像与两个2×2的卷积核操作结果
对于卷积后的输出,一般会添加ReLU激活函数,表达式为:
通过ReLU激活函数将输出张量中小于0的位置对应的数值都置为0。
1.1.2 池化层
池化层的作用是压缩矩阵,假如是一个2×2的池化,那么就可以将三维矩阵中每个2×2的元素压缩为一个元素,假如是一个3×3的池化,那么就可以将三维矩阵中每个3×3的元素压缩为一个元素,通过这种特征降维的方式使图片压缩,参数减少。常见的池化方式有两个:最大池化(Max pooling)和平均池化(Average pooling)。
通过上一层2×2的卷积核的卷积操作,我们已经将4×4的原始图像变为一个3×3的新图像,假设现在池化层采用Max pooling,池化大小为2×2,步长为1,取每个2×2的元素窗口中的最大值,就可以组成一个新的2×2的feature map,池化过程如图4所示。
图4 Max pooling过程
Average pooling的池化过程相同,只是取的是池化窗口中所有值的平均值。
1.1.3 全连接层
经过几轮的卷积层—池化层之后,在CNN模型中通常会连接1到2个全连接层,给出最后的分类结果,并且会采用Softmax激活函数,得到当前输入样本中属于不同类的概率分布情况。
CNN经过堆叠的卷积层—池化层、全连接层和Softmax层得到分类结果这一过程,在本质上可以看作是输入到输出的映射关系,我们只要利用已知的模式对网络进行训练,它就可以大量学习这种输入和输出间的映射关系,而不需要任何复杂精确的数学表达式。其训练过程主要分为前向传播和反向传播。
1.2.1 前向传播
前向传播首先从数据集中取出一个作为样本,输入网络,经过逐层变换传到输出层,得到实际输出。
从输入层到卷积层的前向传播是CNN前向传播的第一步,采用的是局部连接、参数共享、卷积操作的方式进行计算。以图像识别为例,如果样本输入的都是二维的黑白图片,那么输入层就是一个矩阵,矩阵的值等于图片各像素位置的值,对应的卷积核也是一个矩阵;如果样本输入的是一个有RGB的彩色图片,这时输入层就是三个矩阵,分别对应、、的三个矩阵或者一个张量,次时对应的卷积核就是一个张量即三个矩阵。当然,无论维度多大,理论推导公式都可写为:
其中,表示输入层,表示卷积核,表示卷积层神经元的激活函数,一般为ReLU激活函数,*表示卷积,表示偏倚。
全连接层是普通的深度神经网络的模型,可以写为:
1.2.2 反向传播
在CNN的反向传播中将输出向量中的元素与目标向量中的元素进行比较,计算出实际输出与理想输出间的误差,依次计算出各权值的调整量和阀值的调整量,然后调整权值和阀值,判断指标是否满足精度要求,不断反复更新优化。
通过网络爬取人脸数据集或者通过手机来拍摄人脸等方式,生成自制人脸数据集,并把自定义的人脸数据集分为训练数据集和测试数据集。
2.1.1 网络图片的爬取
通过浏览器采用网络爬虫的方式来爬取所需的人脸数据集,网络爬虫是一种按照一定规则自动抓取互联网信息的程序或者脚本。爬虫的本质是模拟浏览器打开网页,获取网页中我们想要的那部分数据。一共通过网络爬虫爬取了五位明星的图片,每次爬取完成后都储存在用关键词命名的文件夹中,统一格式,方便数据集的制作。
2.1.2 自拍人脸数据集的获取
数据集中需要自己的人脸数据,主要通过手机来拍摄自己不同姿态的人脸照片。这些图像均是彩色的,在相同背景上以180度之间的各种姿势拍摄。由于手机自拍出来的照片与网络爬取的图片像素相差太大,所以对自拍照片进行了一定的处理。将所有的自拍照片的像素修改为480×640,格式修改为JPG格式,同样用关键词命名放入同一个文件夹内,这样方便数据集的制作。
2.1.3 数据集的统计
数据集中包含有五位明星的人脸图片和自拍的人脸图片,总计732张图片,其中带有口罩的图像有365张,不戴口罩的图像有367张。按照9:1的比例进行划分,90%用于训练,10%用于测试。
在所有的图像上,我们使用了三个主题手动注释所有面孔,每个图像都由两个主题注释,由第三个主题进行交叉验证,如图5所示。第一个主题是脸部位置,每一个面部的位置都用矩形进行注释,如果由于模糊、严重变形等无法识别眼睛从而很难检测到面部,或者其边框的边长小于32像素的情况,都会被标记为“忽略”,带有“忽略”标签的面部一旦被检测到,就不会被视为真。第二个主题是眼睛,对于每张图像中的脸,都手动标记了眼中心的坐标,并将眼睛、眉毛区域用矩形注释。第三个主题是口罩的位置,图像中所有被口罩遮挡的位置都用矩形注释。
图5 面部属性的定义
2.3.1 准备PaddlePaddle平台
打开百度PaddlePaddle平台,在我的项目列表中找到需要调试的戴口罩人脸识别系统,启动环境选择免费的基础版。在设置完运行环境后,就可以编译、调试源程序的代码,程序的编译和调试都可在百度PaddlePaddle平台线上进行,方便快捷。
完成了代码的基础调试后,压缩自制数据集并上传至平台,将制作好的自制数据集直接添加进自己的项目中,然后通过代码解压到程序当中进行戴口罩人脸识别的训练。
2.3.2 配置CNN网络
在程序中我们级联了三个卷积层—池化层,尾部级联两个全连接层以及Softmax为激活函数的层,搭建出一个完整的CNN模型,如图6所示。
图6 搭建的CNN模型
通过对自制数据集进行20轮训练,将每一次训练的ACC和Cost都直观地展现出来。训练完后与测试集进行对比不断的优化,最后保存训练模型。
由表1中的数据可以看到ACC随着训练的轮数增加而不断的提高,逐渐稳定在0.95以上,代表训练出来的模型符合我们的要求。损失值则随着训练轮数的增加在不断的降低,损失值降低到0.25左右,也同时达到了我们期望的数值。可以得出结论:训练出来的模型具备了高精度识别戴口罩人脸的要求,因此,识别可以达到理想的效果。
表1 训练20轮的Cost和ACC
预测主要分为四步:第一步配置好运行环境,第二步放入准备好的自制数据集,第三步通过数据显示ACC和Cost以图片方式加载出训练出来的模型,把要预测的图片放到训练模型里进行预测,第四步输出预测的结果。
可以从图6中打印出来的数据看到,这些数据都经过了归一化、居中等处理。对于佩戴口罩和未佩戴口罩的人脸都在模型预测中成功预测出准确的名字,可以证明高精度的戴口罩人脸识别成功。
图6 模型预测
本课题选择支持Python的PaddlePaddle深度学习平台,设计了一款基于CNN的戴口罩人脸识别系统。并详细介绍了CNN,包括CNN的基本结构、CNN的训练过程和戴口罩人脸识别系统的设计,包括数据集的准备和构建、运用百度PaddlePaddle平台进行模型配置和评估等。经过测试,本系统对佩戴口罩和未佩戴口罩的人脸都在模型预测中成功预测出准确的名字,识别精准度基本稳定在0.95以上,实现了设计目的。