APP下载

基于神经网络的三维人脸重建

2019-06-04查道安江志君

安徽工程大学学报 2019年2期
关键词:人脸预处理神经网络

查道安,江志君

(铜陵学院 电气工程学院,安徽 铜陵 244000)

1 问题概述及相关研究

1.1 问题概述

在模型训练过程中,输入是一个视频流或者多帧图片数据。假设人脸正对相机且没有其他干扰场景。虽然在数据采集过程中这一点很难保证,但是在数据预处理时会通过为人脸设置一个最大允许的偏转角度来过滤掉有问题的帧。另外要求相机的位置固定,光线和背景都假设稳定。

模型输出是每一帧生成一个三维的网格,网格的数据点数目设置为5 453。三维点云的数目本身可以通过调整网络参数来调节,根据网络结构和其他因素设置此数目。一般来说,数据点太少不足以展示细节特征,数据点太多又会导致参数过多从而增加难度。

1.2 相关研究

目前,通过多张人脸图片进行3D人脸重建[1],可以生成高精确度的3D人脸模型,但是需要大量的图片。而基于单张图片[2-3](Single View)进行3D人脸重建更加困难,大致可以分为以下几类[4-5]:

统计形状表示(Statistical Shape Representations),如广泛采用的3DMM方法,采用许多对齐的3D人脸形状来进行3D人脸重建。这类方法不能生成具有个体特征的人脸,而且只能在特定的条件下用于人脸识别。近期的方法中,有采用CNN的方法来调节3DMM人脸参数[6]。但是,研究发现缺乏足够的训练数据是人脸识别中的一大问题。基于3DMM人脸模型的采样来生成训练人脸图片,生成的人脸图片容易产生过拟合问题。因此,只能训练一个浅层残差网络。

场景假设方法[7](Scene Assumption Methods),为了获取正确的人脸重建模型,一类研究对输入图片的场景和角度进行估计。一些方法采用光源、脸部反射、脸部对称性等信息来进行估计。但是,这类估计在现实中并不适用。

基于实例的方法(Example Based Methods),按照输入图片来调整模板3D人脸。这类方法可以用于人脸识别中生成看不见的一面。

标点拟合方法[8](Landmark Fitting Methods),这类重建方法首先检测面部识别点,然后将识别点比对到3D模型上面。

2 数据预处理

2.1 数据采集

本次实验的所有数据均采集于RealSense,人脸面对摄像头做出多种不同的表情,由摄像头采集出视频信息,所得到的数据以oni文件格式存储,oni格式文件是OpenNI导出的格式数据。然后需要将原始文件转化成帧图片数据,这个可以使用OpenNI2的SDK读取并转化出来。

2.2 真实值获取

由于此次研究中要使用有监督学习,所以需要预先获得每张图片的真实值三维模型,在这里依靠动态表情模型,在基础模型上做变换得到匹配图片中人脸表情的模型。项目中需要剔除背景,因此需要完成人脸识别,然后截取图片。图片中人脸的识别直接使用OpenCV中成熟的库函数即可实现。所建立的模型是为了作为神经网络的真实值,所以目标是准确性,对它的处理速度没有硬性要求。建模方法是通过估计一系列表情系数,作用到表情向量上得到一个针对图片中人脸表情的三维模型。使用3D混合模型来提供适用于实时跟踪的紧致表示,从初始的粗糙估计开始,随着追踪过程的进行逐步优化动态表情模型。

动态表情模型[9]就是一个模型向量B=[b0,b1,…,bn],每个模型对应一个表情,第一个表情b0就是中性表情,一个新的表情就可表示为:

F(x)=b0+ΔBx,ΔB=[b1-b0,b2-b0,…,bn-b0],x=[x1,x2,…,xn],

为了捕捉不同人脸的几何特征,在一个很大几何的人脸模型基础上,使用PCA的降维表示来提取主要特征。同时为了更好得从模板表情到特定人脸表情的迁移,还需要一项空间系数。最终中性表情可以表示为b0=m+Py+Ez0,其中m+Py是PCA项,Ez0是空间系数项。可以认为模板模型中从中性表情到其他表情的变换与动态模型中的变换是一致的,最终可以表示动态模型中的任一表情:

Bi=Ti*b0+Ezi=Ti*(m+Py+Ez0)+Ezi,

算法最终能够优化出相机参数R和t,模型系数x,PCA参数y以及变形系数z,然后存储在Parameter.txt文件中。Parameter文件中存储的就是人脸系数和表情系数,已有的Core Face Ware House中以矩阵形式存储了50个人脸以及47个表情(含中性表情),一共存储了11 510个三维点的信息,只要读入Parameter文件,将矩阵乘以Parameter的第一行的人系数参数可得到特定的人,再乘以Parameter第二行的表情系数就能得到特定的表情。

两组原始数据和重建的真实值如图1、图2所示。可将上面一行看做输入,下面一行是神经网络的真实值。

图1 modeling 1图2 modeling 2

2.3 图片预处理

采集得到的数据图片都是同时具有彩色和深度信息的,再加上相机采集的时候背景信息无法保持空白,所以需要对图片做一些预处理,以获得更有效地输入,这些操作包括:

截取图片中人脸的部分以去除不必要的背景,这一点由于在之前得到模型的算法中已经对人脸进行了识别,很容易完成;将截取后的图片都统一采样到240*320的分辨率上,作为网络的统一输入大小;将所有图片变成黑白,减少无谓的信息量,因为这里的关注点在于人脸的结构特征,而这一点彩色图片并不比灰度图片更有优势;做数据增强,包括旋转、平移等简单变换以及亮度、对比度的改变,本次项目里针对不同的初始数据量(2 500和5 000)做了不同数目的数据增强,只要最终保证总的数据量大约有20 000张图片即可。

2.4 点云预处理

虽然采集的数据量是2 500张或者5 000张,但是其中会有一些异常值,这些错误数据体现在人脸上的偏角过大,与算法的要求不符,会对网络模型产生错误影响。所以需要过滤掉人脸偏角过大的图片和点云模型,根据之前的预处理算法,还得到了每张图片的Pose.txt文件,可将所有数据扫描一遍,根据它们的y方向和z方向的偏角来决定人脸是否足够正,如果偏角过大,则舍弃。

另外预处理所得到的三维模型是完整的头部模型,但是这里输入输出只针对正脸,所以三维点云中有大部分数据都可以去掉。通过软件Open Flipper对基础模型进行切割,把有用的正面部分切割出来,将切割线信息保存到Selection.ini文件中。模板模型如图3、图4所示。图4模型中的划线为切割线,划线是手动描绘出的,考虑到图片中的人脸也只是出现了正面的一部分,比如耳朵、头顶均是未知的,所以截取的范围比较小。图3展示了原始的完整三维模型,图4中的手绘线就是所做的Selection操作。

图3 template.obj 图4 selection

再使用openmesh操作每一个网格文件,应用selection.ini取出正面部分,舍弃背面部分。这里实现的方法是为每一个顶点赋予一个新的属性,名为cut。selection.ini文件中记录的点的cut属性值为0,从某个非划分点出发,运用DFS算法逐步扩张,终止条件就是碰到划分点,所有能遇到的点的cut属性值均设为1,而所有不能遇到的点的cut属性值均设为-1。然后按照cut属性值读出网格,就可以得到正面和背面的网格数据。

切割完成之后只要在obj文件的尾部添加上face的信息即可获得完整模型。图片与三维模型的预处理结果如图5所示。图5中第一列为原始三维模型,第二列为selection出来的正面点云,第三列为加上face信息后的正面三维模型,可以将其作为神经网络的输入进行训练。

图5 图片与三维模型的预处理结果

3 神经网络模型

算法思想、标准化的图片可以输入到神经网络中,神经网络结构如表1所示。

网络的前半部分是一系列的卷积(conv)以及池化(pool)操作,负责提取人脸图片中的结构化信息,越靠后的卷积层能提取出更加高级的信息。这一部分的网络参数的初始化使用了PReLU技术[10],在普通的ReLU的基础上添加一个参数乘子,而这个乘子的大小与当前layer的参数数目有关。

表1 神经网络结构

后半部分中第一个全连接层通过计算原始数据的一个200维的PCA来初始化三维点云,然后在此基础上进行深度微调以求达到较为理想的效果。此神经网络的核心就在于从图片中提取一个200维的特征向量,然后作用到PCA矩阵上,得到16 539维的一维向量,即三维点坐标。

PCA的维度对最终结果会产生很大影响,若维度太小,那么会导致模型主要结构特征缺失,无法有效地重建;如果维度太大,那么PCA本身就已经能很好地表达特征信息,那么神经网络的改进作用将被削弱。目标是前期会通过一定量的预计算过程,但是直接的网络上的运算会很快而且效果明显,可以达到实时的效果。

使用caffe来实现神经网络的结构搭建。输入图片为240*320,batch size为50;输出的标量数为16 359,即5 453个三维点;PCA的维度为200;初始的learning rate为1e-12;为了简便,使用的优化方法是随机梯度下降;神经网络的loss函数定义为运算值与真实值之间的差的平方和,即

Loss(x)=Σ(groundtruth-y(x))2,

caffe训练的epoch数目为50,但是从后面的结果来看,程序在第20个epoch左右就已经收敛了,再进行迭代运算并不能使结果变得更好。

4 实验结果与分析

实验结果的截图如图6所示。左边为人脸图片,右边为重建出来的三维模型。从实验结果可以看出该算法可以较为准确地重建出人脸的三维模型。结果可能不是特别光滑,但是对于人脸的细节特征表现得很好,原有的ground truth效果更加光滑,但是却缺失一些细节。下面是测试时的时间记录,共有6个测试用例,每个测试用例用三行来描述。第一行是文件名,第二行是文件大小,第三行表示运行时间和结果的loss,最后是平均运行时间。

图6 实验结果截图

1074C_gray_image.jpg

shape:(240,320)

time:0.003533 s loss:29138.6015625

1075C_gray_image.jpg

shape:(240,320)

time:0.00353 s loss:23904.109375

1076D_gray_image.jpg

shape:(240,320)

time:0.003308 s loss:21336.0703125

1077G_gray_image.jpg

shape:(240,320)

time:0.003291 s loss:26257.6171875

1080D_gray_image.jpg

shape:(240,320)

time:0.003395 s loss:284726.640625

1083_gray_image.jpg

shape:(240,320)

time:0.003375 s loss:24022.21875

average test time:0.00339262 s

loss随迭代次数增加的变化如图7所示。这里的数据并没有做归一化,所以loss数值很大,但是均摊到每个点上其实很小。图7中横坐标是caffe中的epoch,纵坐标是loss值的大小,每一种颜色值代表在当前epoch中迭代到特定的次数。

每一个epoch中随着迭代次数的增加,loss的变化规律如图8所示。

图7 loss随迭代次数增加的变化 图8 loss的变化规律

5 结论

从表1中可以看出,随着epoch的增加,所有loss都在下降,SGD优化算法虽然简单,却也是实用的算法。但是考虑在某一个特定的epoch中,loss并不是简单随着迭代次数的增加而增加,很多时候loss都会产生波动,或者维持稳定没有很大改善。这里如果使用更为复杂的优化算法比如ADAM,可能会更快更有效地收敛。

另外,由于PCA可以提取主要特征,只要前期可以把不同人脸的数据都作为输入,并计算出一个混合的PCA值,它就可以容纳不同的人脸的区别,从而通过这一网络实现不同的人脸重建任务。

对于深度学习而言,真实值的效果好坏直接影响到学习到的模型的优劣,因此如果数据开始处理阶段生成的模型就有问题的话,那对学习效果的影响非常大。对于一个几分钟甚至十几分钟的视频流来说,一共要截取几千帧数据并加以处理,很多帧数据得到的3D模型的正确性无法得到保证,虽然大部分模型可以与图片中的人脸相匹配,但仍然有部分模型与图片不一致,可能是延迟,也可能是其他原因。但按照该算法,一个模型的错误并不是只会影响到它所对应的这一张图片的结果。由于在最开始使用了PCA来降维,然后将其作为网络中全连接层的初始化,神经网络的作用是在此初始的粗糙结果上做微小的调整,得到精细的结果。当部分模型不一致的时候,它会对PCA产生影响,从而使某一类图片上的人脸表情在推导3D模型的时候往错误的方向偏移,得到不准确的结果。这里所实现的工作是利用了图片中的特征信息,拿它去乘PCA矩阵从而得到16 539个标量。虽然现在只能实现重建模型这一种任务,但是基于这种特征提取+PCA初始化+网络优化的模式可以去做更多的事情,如果能提取到更多的特征,就能实现比如特征点检测、可见性检测[11]等更多的任务,得到更精确的人脸模型,这是此算法值得思考的地方。

猜你喜欢

人脸预处理神经网络
有特点的人脸
神经网络抑制无线通信干扰探究
三国漫——人脸解锁
基于预处理MUSIC算法的分布式阵列DOA估计
浅谈PLC在预处理生产线自动化改造中的应用
基于神经网络的拉矫机控制模型建立
复数神经网络在基于WiFi的室内LBS应用
络合萃取法预处理H酸废水
基于自适应预处理的改进CPF-GMRES算法
基于支持向量机回归和RBF神经网络的PID整定