写在前面

  • 为了保证整个示例项目更加直观,方便理解,在展示一些函数的源码时会使用numpy版本进行展示,而在示例程序中并未使用numpy版本的库,在Cython版本与numpy版本出现差异的原码前会有标注,希望读者留意。
  • 3DMM实例程序的jupyter版本后续会更新,完全免费,欢迎大家下载

准备工作

3DMM的例程里面需要用到BFM模型,这些数据需要自行下载,下面是下载教程:

准备 BFM 数据

1.下载原始BFM模型

网站: https://faces.dmi.unibas.ch/bfm/main.php?nav=1-2&id=downloads
将上面的框全部打勾后在下方填上自己的姓名机构和接受数据的邮箱再填一下验证码就可以了。
然后填写的邮箱会收到这样一封邮件:

会给你一个用户名和密码,用户名就是邮箱,密码是随机的,复制这俩然后打开上面的链接,填写信息之后就可以下载了。
下载好的文件解压缩,在里面找到01_MorphabelModel.mat

然后在face3d/examples/Data/BFM目录下新建一个文件夹raw,再将01_MorphabelModel.mat复制到raw/

2.从 3DDFA和 HFPE下载额外的 BFM 信息

网站: http://www.cbsr.ia.ac.cn/users/xiangyuzhu/projects/3DDFA/main.htm
打开后在这里

下载图中的[Face Profiling] 和 [3DDFA]

另一个网站: http://www.cbsr.ia.ac.cn/users/xiangyuzhu/projects/HPEN/main.htm
打开后找到Downloads:

下载第一个[HPEN]

将下载好的三个压缩包解压,分别在里面找到如下文件:
model_info.mat
Model_Expression.mat
Model_face_contour_trimed.mat
Model_tri_mouth.mat
Modelplus_nose_hole.mat
Modelplus_parallel.mat
vertex_code.mat

然后在face3d/examples/Data/BFM目录下新建一个文件夹3ddfa
将上述文件拷贝进去。

3.从3DMMasSTN下载UV

网站: https://github.com/anilbas/3DMMasSTN/blob/master/util/BFM_UV.mat
点击download下载后解压,在face3d/examples/Data/BFM目录下新建一个文件夹stn,再将BFM_UV.mat复制到stn/

4.生成模型数据
在BFM目录下创建Out文件夹
在 Matlab 中打开文件generate.m并运行,我用的MATLAB R2018a,这个.m文件有不少地方有问题,修正后得到Out文件夹里面的三个输出,Out输出我会放在这,但是其他部分因为隐私条款暂不提供,请自行下载调试(可以找作者私聊)。

此外,修改后的generate.m代码如下:

% addpath(genpath(pwd))
% --> model%% load raw BFM models
load('raw/01_MorphableModel.mat');%% load 3ddfa data
% 1. load bfm information. trim
load('3ddfa/model_info.mat');
trimIndex_f = [3*trimIndex-2, 3*trimIndex-1, 3*trimIndex]';
trimIndex_f = trimIndex_f(:);model.shapeMU = shapeMU(trimIndex_f,:);
model.shapePC = shapePC(trimIndex_f, :);
model.shapeEV = shapeEV;
model.texMU = texMU(trimIndex_f, :);
model.texPC = texPC(trimIndex_f, :);
model.texEV = texEV;
model.tri = tri;
model.kpt_ind = keypoints;model_info.kpt_ind = keypoints;
model_info.trimIndex = trimIndex;
model_info.symlist = symlist;
model_info.symlist_tri = symlist_tri;
%segbin: nose eyes mouth rest
model_info.segbin = segbin(trimIndex, :)';
model_info.segbin_tri = segbin_tri';% 2. load expression
load('3ddfa/Model_Expression.mat');
model.expMU = mu_exp;
model.expPC = w_exp;
model.expEV = sigma_exp;% 3. load mouth tri
load('3ddfa/Model_tri_mouth.mat');
model.tri_mouth = tri_mouth;
model_info.tri_mouth = tri_mouth;% 4. face contour
load('3ddfa/Model_face_contour_trimed.mat');
model_info.face_contour = face_contour;
model_info.face_contour_line = face_contour_line;
model_info.face_contour_front = face_contour_front;
model_info.face_contour_front_line = face_contour_front_line;% 5. nose hole
load('3ddfa/Modelplus_nose_hole.mat');
model_info.nose_hole = nose_hole;
model_info.nose_hole_right = nose_hole_right;
model_info.nose_hole_left = nose_hole_left;% 6. parallel for key points
load('3ddfa/Modelplus_parallel.mat')
model_info.parallel = parallel;
model_info.parallel_face_contour = parallel_face_contour;% 7. pncc
copyfile('C:\Users\����\Desktop\BFM\3ddfa\vertex_code.mat', 'Out/pncc_code.mat') %这里用的是绝对路径,请自行更改%% load 3DMMasSTN UV coords
load('stn/BFM_UV.mat');
uv_coords = UV(trimIndex, :)';% modify bad vers
bad_ind = [10032, 10155, 10280];
round1 = [10033, 10158 ];
round2 = [10534, 10157, 10661];
round3 = [10916, 10286];
uv_coords(:, bad_ind(1)) = mean(uv_coords(:, round1), 2);
uv_coords(:, bad_ind(2)) = mean(uv_coords(:, round2), 2);
uv_coords(:, bad_ind(3)) = mean(uv_coords(:, round3), 2);model_info.uv_coords = uv_coords';
UV = model_info.uv_coords;% modify tri mouth
tm_inner = model.tri_mouth;
tm_inner_add =[6420 6542 6664;  %% add inner mouth triangles6420 6294 6167;6167 6297 6420;6167 6297 6296;6167 6296 6295;6167 6295 6039;6168 6295 6039];
ind_bad = 38;
all_ind = 1:size(tm_inner, 2);
tm_inner = tm_inner(:, setdiff(all_ind, bad_ind));
tm_inner = [tm_inner tm_inner_add'];
model_info.tri_mouth = tm_inner;
model.tri_mouth = tm_inner;% save
clearvars -except model model_info UVsave 'C:\Users\����\Desktop\BFM\Out\BFM.mat' model %这里用的是绝对路径,请自行更改
save 'C:\Users\����\Desktop\BFM\Out\BFM_info.mat' model_info %这里用的是绝对路径,请自行更改
save 'C:\Users\����\Desktop\BFM\Out\BFM_UV.mat' UV %这里用的是绝对路径,请自行更改
% copyfile('3ddfa/pncc_code.mat', 'Out/pncc_code.mat')

至此,准备工作完成。可以运行2_3dmm.py得到下面三个图像输出结果:


由于这部分是作者要研究的核心部分,所以将分片进行,下面将从原理出发逐步分析源码,期待大家关注。

Face3D学习笔记(3)3DMM示例源码解析【上】准备工作相关推荐

  1. Laravel 学习笔记之 Query Builder 源码解析(下)

    说明:本文主要学习下Query Builder编译Fluent Api为SQL的细节和执行SQL的过程.实际上,上一篇聊到了\Illuminate\Database\Query\Builder这个非常 ...

  2. Shiro学习笔记(三)源码解析

    Shiro作为轻量级的权限框架,Shiro的认证流程是怎样的一个过程. 如果没有对Shiro进行了解的话,建议先对Shiro学习笔记(一)学习一下Shiro基本的组 成. 1,几大重要组件解析 1.1 ...

  3. Kubernetes学习笔记之Calico Startup源码解析

    女主宣言 我们目前生产k8s和calico使用ansible二进制部署在私有机房,没有使用官方的calico/node容器部署,并且因为没有使用network policy只部署了confd/bird ...

  4. Android学习笔记-常用的一些源码,防止忘记了

    Android学习笔记-常用的一些源码,防止忘记了... 设置拨打电话 StringdialUri="tell:"+m_currentTelNumble; IntentcallIn ...

  5. Nginx学习笔记(五) 源码分析内存模块内存对齐

    Nginx源码分析&内存模块 今天总结了下C语言的内存分配问题,那么就看看Nginx的内存分配相关模型的具体实现.还有内存对齐的内容~~不懂的可以看看~~ src/os/unix/Ngx_al ...

  6. Netty学习笔记(一)Netty客户端源码分析

    最近在学些BIO,NIO相关的知识,也学习了下Netty和它的源码,做个记录,方便以后继续学习,如果有错误的地方欢迎指正 如果不了解BIO,NIO这些基础知识,可以看下我的如下博客 IO中的阻塞.非阻 ...

  7. php getid3,PHP getID3类的使用方法学习笔记【附getID3源码下载】

    本文实例讲述了PHP getID3类的使用方法.分享给大家供大家参考,具体如下: 网上描述: getID3()这个PHP脚本能够从MP3或其它媒体文件中提取有用的信息如:ID3标签,bitrate,播 ...

  8. [Java Path Finder][JPF学习笔记][4]将JPF源码导入Eclipse

    这篇日志很简单,考虑到有些师弟在学习JPF,这里总结些经验. 在Eclipse中新建"Java Project",在新建的Project的src图标上点击右键--"Imp ...

  9. 【Redis学习笔记】2018-05-30 Redis源码学习之Ziplist、Server

    作者:施洪宝 顺风车运营研发团队 一. 压缩列表 压缩列表是Redis的关键数据结构之一.目前已经有大量的相关资料,下面几个链接都已经对Ziplist进行了详细的介绍. http://origin.r ...

  10. ActiveMQ学习笔记(8)——导入ActiveMQ源码到Eclipse

    2019独角兽企业重金招聘Python工程师标准>>> 一.准备 Eclipse Luna 版本,本身已经支持Git和Maven. 安装了apache-maven,我使用的是3.1. ...

最新文章

  1. 转MQTT SERVER 性能测试报告
  2. weblogic从入门到飞起(部署应用、日志)(六)
  3. ElasticSearch、kibana、head、ik分词器在Windows下的安装
  4. 基于百度万年历定制化 1
  5. 苹果微信html音乐播放,iphone 微信网页自动播放音频解决办法
  6. 学校计算机协会面试自我介绍,个人社团面试自我介绍范文三篇
  7. Microsoft Excel 教程:如何在 Excel 中创建图表?
  8. OpenGL入门教程之 深入理解
  9. echart 热搜词云(字符云)的制作以及遇到颜色不会随即变得bug
  10. Truncated Power Method for Sparse Eigenvalue Problems
  11. SAINT:一个基于transformer的知识跟踪模型
  12. 【转】为什么程序猿996多猝屎,而企业家007却不会?
  13. 学习编程(c语言)的经历以及对未来的期望
  14. python中保留字的含义_Python中的变量之保留字与标识符
  15. USTCOJ 1240 黑屋 非位运算版
  16. 传奇服务器如何查账号密码,传奇服务端版本中如何查找礼包领取兑换密码的方法!...
  17. 补零与离散傅里叶变换的分辨率
  18. mysql udb_UDB高可用数据库内核深度优化
  19. c++day06 多态的使用
  20. vivo Pad好不好 vivo Pad值不值得买

热门文章

  1. 硬盘分区 整G整数法(从1g到200g最精确的整数分区)
  2. Linux配置jdk环境变量(详细版)
  3. 利用VB2005制作颜色渐变的进度条
  4. OpenCore引导配置说明第六版
  5. android 开机优化(类和资源预加载优化)
  6. 尽量干净地卸载360
  7. php清空session值_php注销session变量和销毁session详细分析
  8. 如何在Android平台GB28181接入终端实现语音广播和语音对讲
  9. 三款按键可视化软件——在你的电脑屏幕上显示按键
  10. 软件测试简历没有项目经验怎么写?