bfm 人脸模型
3dmm 的公式:
S
=
S
‾
+
A
i
d
α
i
d
+
A
exp
α
exp
\mathbf{S}=\overline{\mathbf{S}}+\mathbf{A}_{i d} \boldsymbol{\alpha}_{i d}+\mathbf{A}_{\exp } \boldsymbol{\alpha}_{\exp }
S=S+Aidαid+Aexpαexp
其中
A
i
d
\mathbf{A}_{i d}
Aid 为shape base.
A
exp
\mathbf{A}_{\exp }
Aexp为表情参数, bfm模型只提供了形状和纹理,
s
(
α
)
=
μ
s
+
U
s
diag
(
σ
s
)
α
t
(
β
)
=
μ
t
+
U
t
diag
(
σ
t
)
β
\begin{array}{l} \mathbf{s}(\alpha)=\boldsymbol{\mu}_{s}+\mathbf{U}_{s} \operatorname{diag}\left(\boldsymbol{\sigma}_{s}\right) \alpha \\ \mathbf{t}(\beta)=\boldsymbol{\mu}_{t}+\mathbf{U}_{t} \operatorname{diag}\left(\boldsymbol{\sigma}_{t}\right) \beta \end{array}
s(α)=μs+Usdiag(σs)αt(β)=μt+Utdiag(σt)β
其中
s
=
(
x
1
,
y
1
,
z
1
,
…
x
m
,
y
m
,
z
m
)
T
t
=
(
r
1
,
g
1
,
b
1
,
…
r
m
,
g
m
,
b
m
)
T
\begin{array}{l} \mathbf{s}=\left(x_{1}, y_{1}, z_{1}, \ldots x_{m}, y_{m}, z_{m}\right)^{T} \\ \mathbf{t}=\left(r_{1}, g_{1}, b_{1}, \ldots r_{m}, g_{m}, b_{m}\right)^{T} \end{array}
s=(x1,y1,z1,…xm,ym,zm)Tt=(r1,g1,b1,…rm,gm,bm)T
分别为坐标和颜色向量.
可以看出BFM还缺少表情向量, 所以要实现一个完整的3dmm还需要从其他项目中copy表情向量. 比如项目3dmm-fitting-pytorch.
这里使用的是Exp_Pca.bin文件里的表情系数, 这个表情系数是从 Facewarehouse 数据集中提取的,为29维,形状参数为199维.
另外, 针对bfm模型要注意下面几点:
- 标准的bfm模型包含顶点个数为53490个.
- 表情系数(来自Exp_Pca.bin)只针对53215个顶点有参数
- 不含脖子的模型顶点个数为35709个.
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]
论文1的结构:
人脸三维顶点的构建:
f:缩放系数
Pr:正交投影矩阵
所以网络要学习的参数有:
注意,3ddfa的代码对起做了部分修改,3ddfa代码直接回归了62个参数:
[f, pitch, yaw, roll,t2d]这6个参数被一个4*3=12的矩阵替换了,也就是说网络直接回归出一个相似性变换矩阵,inference阶段将这个矩阵分解成我们需要的pitch, yaw, roll等元素.
α
i
d
\alpha_{id}
αid这个系数,bfm本来为199维度,这里只取了前20维,
α
e
x
p
\alpha_{exp}
αexp这个系数Facewarehouse中获取,原始系数维度为99,这里只取前40维.所以网络总计回归元素数量为:12+40+10 = 62.
论文2在1的基础上做了一下改进:
1.使用四元数替代论文1中回归欧拉角度,避免了万向节死锁问题
2.将Pose Adaptive Feature(PAF)作为一个输入(与图片concate一起)
3.提出了OWPDC(将参数的优先级考虑到loss中)
4.更详细分析了损失函数和输入feature的关系.
论文3的改进
相对论文2,3做了以下3方面改进:
- 使用了更优的meta-joint优化策略,动态选择最合适的损失函数
- 在线生成短视频训练网络,减小landmark的抖动
- 添加2d landmark辅助分支,提高landmark回归精度.
这篇论文不再将PNCC和PAC这种feature作为网络输入,反璞归真,仅仅使用RGB图作为输入.
代码
3ddfa项目:
作者提到:
VDC finetuned from WPDC loss is better than WPDC loss, while there is no such experiment in the original paper.
看起来再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/