分别为坐标和颜色向量.
可以看出BFM还缺少表情向量, 所以要实现一个完整的3dmm还需要从其他项目中copy表情向量. 比如项目3dmm-fitting-pytorch.
这里使用的是Exp_Pca.bin文件里的表情系数, 这个表情系数是从 Facewarehouse 数据集中提取的,为29维,形状参数为199维.
另外, 针对bfm模型要注意下面几点:
3ddfa中直接将1,2取交集,最终生成53215个有表情的人脸. 3dmm-fitting-pytorch项目中则通过BFM/BFM_front_idx.mat来获取人脸顶点, 共35709个.
人头坐标系:
不同论文的NME, 分别在AFLW2000-3D(68点)和AFLW(21点)数据集的结果:
1.Face Alignment Across Large Poses: A 3D Solution [4.94, 5.32]
2.Face Alignment in Full Pose Range:A 3D Total Solution [3.79, 4.55]
3.Towards Fast, Accurate and Stable 3D Dense Face Alignment [3.5, 4.3]
人脸三维顶点的构建:
f:缩放系数
Pr:正交投影矩阵
所以网络要学习的参数有:
注意,3ddfa的代码对起做了部分修改,3ddfa代码直接回归了62个参数:
[f, pitch, yaw, roll,t2d]这6个参数被一个4*3=12的矩阵替换了,也就是说网络直接回归出一个相似性变换矩阵,inference阶段将这个矩阵分解成我们需要的pitch, yaw, roll等元素. α i d 这 个 系 数 , b f m 本 来 为 199 维 度 , 这 里 只 取 了 前 20 维 , α e x p alpha_{id} 这个系数,bfm本来为199维度,这里只取了前20维, alpha_{exp} αid这个系数,bfm本来为199维度,这里只取了前20维,αexp
这个系数Facewarehouse中获取,原始系数维度为99,这里只取前40维.所以网络总计回归元素数量为:12+40+10 = 62.
论文2在1的基础上做了一下改进:1.使用四元数替代论文1中回归欧拉角度,避免了万向节死锁问题
2.将Pose Adaptive Feature(PAF)作为一个输入(与图片concate一起)
3.提出了OWPDC(将参数的优先级考虑到loss中)
4.更详细分析了损失函数和输入feature的关系.
相对论文2,3做了以下3方面改进:
这篇论文不再将PNCC和PAC这种feature作为网络输入,反璞归真,仅仅使用RGB图作为输入.
代码3ddfa项目:
作者提到:
VDC 从 WPDC 损失中调整的比 WPDC 损失更好,而原始论文中没有这样的实验。
看起来再wpdc训练好了再用vdc来finetune才能得到最好的结果.
人脸模型:
参考:
A 3D Face Model for Pose and Illumination Invariant FaceRecognition
https://faces.dmi.unibas.ch/bfm/index.php?nav=1-1-0&id=details
https://github.com/Juyong/3DFace
https://github.com/ascust/3DMM-Fitting-Pytorch/