BFM模型介绍及可视化实现(C++)
BFM模型基本介绍
Basel Face Model是一个开源的人脸数据库,其基本原理是3DMM,因此其便是在PCA的基础上进行存储的。
目前有两个版本的数据库(2009和2017)。
官方网站:
01_MorphableModel.mat(数据主体)
BFM模型由53490个顶点构成,其shape/texture的数据长度为160470(53490*3),因为其排列方式如下:
shape: x_1, y_1, z_1, x_2, y_2, z_2, ..., x_{53490}, y_{53490}, z_{53490}
texture: r_1, g_1, b_1, r_2, g_2, b_2, ..., r_{53490}, g_{53490}, b_{53490}
.h5文件与.mat文件对应关系
[注] .h5文件中的tl数量与.mat数量不同,主成分方差的值也不同,且shape的值是.mat中shape值的0.001倍(见/shape/representer/length-unit
)。
Matlab脚本
建议阅读script_gen_random_head.m
文件,该脚本实现了如何生成随机脸,从中我们可以学习到BFM模型的使用方法。
2009与2017版本区别
2009年版本数据集:
- 提供数据格式:mat(
01_MorphableModel.mat
)和h5(model2009-publicmm1-bfm.h5
); - 提供一系列Matlab脚本,有生成随机脸等功能;
- 提供多种特征点(
PublicMM1/11_feature_points
); - 提供segment的mask(
PublicMM1/09_mask
); - 提供对称点的对应关系(
PublicMM1/13_symmetry_indices
); - 提供属性(
PublicMM1/04_attributes.mat
) - 不提供表情;
2017年版本数据集:
- 提供数据格式:h5(原版(
model2017-1_bfm_nomouth.h5
)和裁剪过的版本(model2017-1_face12_nomouth.h5
)); - 不提供Matlab脚本(本身也无mat格式数据);
- 提供单种特征点(
metadata/landmarks/text
); - 不提供segment、对称点的对应关系和属性;
- 提供表情(
expression
);
基本原理
目标shape或者texture都可以通过如下式子得到:
obj = average + pc * (coeficient .* pcVariance)
其中系数(coeficient
)是变量,其余均是数据库里的常量,其是一个199维(对应199个PC)的向量。
C++实现BFM模型可视工具
数据读取
我们可以读取.mat文件或者.h文件,因为读取.mat文件需要使用Matlab的库文件,我们暂时不考虑。
读取.h5格式文件
.h5文件无法直接通过文本工具打开,需要下载专门的可视工具,此处我使用了HDFView。