3D人脸重建

提出问题

以上图为例,输入的人脸带有复杂光照以及表情,这些“杂质”会对后续avatar的渲染以及驱动造成困扰,本文的卖点即不对输入做任何限制,依靠算法自动处理这些杂质,生成干净的形状与纹理,即所谓的normalized avatar。

从引用来看,该团队在这个方向已有前作,发表在2019的ToG:《Deep face normalization》,前作分步解决透视畸变、光照归一化、pose矫正和表情中和,在本文中叙述了前作的不足:

  1. 把各个步骤分开用image-to-image translation的思路串行来做,原图信息会不断损失。
  2. 前作使用的是线性3dmm,细节表达力较差。

同样方向的还有AvatarMe和AvatarMe++系列,遗憾的是本文没有针对albedo的生成质量跟他们做横向对比分析。

解决方案

论文中的大框架图

作者的框架并不复杂,具体分为两个步骤,令人不解的是第一个stage叫inference,第二个叫refinement,为了不妨碍理解,第一步我就帮他改成叫coarse stage了,即由粗到细的过程。

stage 1 - coarse stage

第一阶段包含级联的三个网络,输入图片先经过FaceNet,得到表达id的高维特征,再经过Id Regressor,预测出Stylegan的latent code,再通过Synthesis Network把这个latent code生成相应的shape和texture。

熟悉GAN Inversion的话,这个框架应该不陌生,只不过这里为了生成3d信息,作者用3d扫描数据训了一个3d版的stylegan2,shape也用uv space表达,映射过程见PRNet。

训好3d版的stylegan2再通过迭代法做Inversion,把扫描数据的latent code拿到,即拿到了(2d图片 - latent code of 3d stylegan)的成对数据,用这些数据便可训练Id Regressor。

stage-1已经搭建出了一个从单图预测3d带纹理形状的过程,为了训练3d生成器,作者从3D Scan Store和Triplegangers里收集了总共431个ID的扫描数据,这个数据量显然不足以训出非常强的模型。

为了提高模型表达能力,同时解决本文提出的核心问题(去除光照、生成中立表情),作者自己又通过算法合成了一批数据(persudo GT),称之为Normalized Face Dataset

Normalized Face Dataset

拓展数据集中的示例

这套方案也很朴素,拿到一张网图,通过预训练好的原版stylegan进行2d人脸编辑,把这张图变成正面、中立表情、光照均匀的效果。其实从给出的示例来看,这一步去得不是很干净,比如最右边一列明显还有微笑带来的法令纹、镜面高光等。

拿到这批干净的2d数据之后,我们可以跑训好的stage1,把这些数据的3d信息预测出来,这里纹理的处理有些小tricks,首先用前作的方法又做了一次光照normalization(猜测是为了干掉残留的镜面高光),然后把2d像素值直接映射到uv space作为albedo map。

但是刚刚说到,stage1的数据量少,网络能力一般,得到的3d信息不怎么准,于是又拿来另一个线性3dmm的模型(Face2Face)通过迭代优化fitting,得到更准的shape和texture。

we first run our inference pipeline to generate the 3D geometry and take it as the initialization for the Face2Face optimization.

原文提到可以通过stage1得到的shape为迭代过程做初始化,这个操作一笔带过了,猜测是拿这个shape先估一套3dmm的参数;总之,有了更准的shape和texture之后,我们就可以来finetune第一步的两个网络了。

这个finetune过程原文也是一笔带过。。猜测还是分开finetune的,对于生成器还是用原来的方法训练,但是Id Regressor可以用没有经过normalized的数据(带光照、带表情),预测normalized后的shape和texture,这样Id Regressor就实现了从原图预测normalized stylegan vector的功能。

结束finetune过程后,才结束了stage-1的训练过程,接下来就是stage-2的迭代优化过程。

stage 2 - refinement stage

这里引用了一篇文章,认为人脸识别网络学出来的embedding space不靠谱:

A small perturbation of the latent code may not affect the identity feature training at all. On the other hand, such a small error in the identity code may cause greater inconsistency in our inference pipeline after passing R and G.

说实在没太看明白作者想表达什么,但人脸识别的embedding不靠谱是正常的,比如同样一个id,pose改一下、光照改一下,出来的embedding距离可能很大。

网络结构方面很好理解,固定好的生成器,根据输入2d图片与可微渲染的图片计算loss,反向传播更新latent code,跟线性3dmm的fitting过程差不多,值得一提的是这里引入了一个正则项w regularization,约束更新后的w和stage-1预测的w不要距离太远。

这里的PSPNet是作者自己训的一个parsing网络,用来把渲染后的脸部融合到初始的背景中,另外还训练了一个ResNet50用来估计相机位姿,总共有7维,translation与rotation各3维,再加上1维代表焦距。

实现细节 && 实验

训练方面,一张24G的显卡,训一个3d stylegan2用了13天,结构上去掉了原始stylegan noise的部分,推理时第一个stage耗时0.13s,第二个stage跑200步迭代共耗时45s。

实验 - 用文中的网络提升线性3dmm的重建效果

第一行是原始Face2Face 迭代fitting的效果,第二行是加上了作者第一个stage预测出的shape进行初始化再fitting的效果,但还是没讲清楚这个初始化初始化了啥东东。

实验 - 用normlized dataset进行finetune的提升

这里展示的是Id regression的比较,作者也放了生成器finetune前后的比较,结论差不多就以这个为例,第一行是纯扫描数据学出来的模型,第二行是拓展数据学出来的模型,提升还是非常明显的,扫描数据学出来几乎没有细节,但这个贴图融合的质量很差,右下角可以明显看出来人脸额头上有一道边。

实验 - refinement stage的提升

下图是论文里给的结果,就这个分辨率看不太出来这200步网络优化了啥,但是纵向对比可以看出coarse stage的效果已经不错。

实验 - 重建效果的consistency

这里呼应的是refinement stage的motivation,也就是人脸识别网络的embedding不靠谱,这张图展示了不同条件下的小金生成的结果,其实是比较接近的。但我比较好奇没有经过refinement stage出来的效果对比。

实验 - 对比前作

右边两列是作者的前作,在2d上先对图片做光照表情的处理,处理完再生成avatar,可以看出来处理完之后的id损失很大,仔细想想,在latent space上处理光照表情确实会比原图上处理更聪明一些。

思考

整个工作比较工程化,更本质的问题可能是如何训一个高质量的3d stylegan,可惜没有在这个方向深入更多,有了效果之后往落地上弄,除了这个其他都是比较常见的流程,但也可以理解,毕竟是创业公司团队,能够贡献可落地的方案也很伟大。

美中不足的是写作方面比较弱一些,看篇幅也能看出来,第三章讲方法的部分,去掉图片只占不到两页的篇幅,好在给出了足够多的好的效果。

另外有一些选择比较令人困惑,一是既然diss了人脸识别模型的embedding不好,那为啥不自己训一个从图像到stylegan code的encoder呢?

另外采用了线性3dmm优化拓展数据集的shape,为啥不继续用非线性3dmm优化,文中也diss过线性3dmm表达能力不足,那么哪怕非线性出来了一个非常棒的shape,线性的3dmm也不一定能表达出来吧。

 

3D人脸重建

3D人脸重建是指将2D人脸图像转换为3D人脸模型的过程,可以应用于虚拟现实、人脸识别、面部表情分析等领域。下面是一个简单的3D人脸重建流程: 1. 采集人脸数据:使用3D扫描仪或者多角度拍摄等方式采集人脸数据。 2. 人脸对齐:将人脸数据进行对齐,使得不同角度的人脸数据能够拼接在一起。 3. 特征点提取:使用人脸关键点检测算法,提取人脸的关键点信息。 4. 三角剖分:将人脸模型进行三角剖分,得到人脸模型的面信息。 5. 纹理映射:将2D人脸图像映射到3D人脸模型上,得到3D人脸模型的纹理信息。 6. 优化重建结果:使用光照估计、纹理平滑等算法重建结果进行优化。 Python中可以使用一些开源框架来实现3D人脸重建,比如OpenCV、Dlib、Face3D等。其中Face3D是一个用于3D人脸重建的Python库,它提供了人脸对齐、关键点检测、三角剖分、纹理映射等功能。以下是一个使用Face3D进行3D人脸重建的Python代码: ```python from face3d import mesh from face3d.morphable_model import MorphabelModel # 加载3D人脸模型 model = MorphabelModel('model.mat') # 读取人脸图像并进行人脸对齐和关键点检测 img = mesh.load_image('face.jpg') pos = model.get_landmarks(img) # 三角剖分 vertices = model.predict_vertices(pos) faces = model.faces # 纹理映射 texture = mesh.texture_mapping(img, vertices, model.uv_coords, model.triangles) # 可视化3D人脸模型 mesh.render_texture(vertices, faces, texture) ``` 这段代码使用Face3D库加载了一个3D人脸模型,并且使用人脸图像进行了人脸对齐和关键点检测。然后,使用模型预测顶点坐标和面信息,并且使用纹理映射将2D人脸图像映射到3D人脸模型上。最后,使用mesh.render_texture函数可视化3D人脸模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值