三维人脸重建:精读3dmm.py
文章目录
- 代码解析
- 1. 载入模型
- 2. 生成mesh, 也就是一些点,三角形的集合
- 3. 坐标变换
- 4. 使用68个关键点做fit
- 转载请注明出处
这个代码的主要内容就是根据一些随机的参数从3d模型渲染到2d图片
然后从图片再变换回去
代码解析
1. 载入模型
bfm = MorphabelModel('Data/BFM/Out/BFM.mat')# 这里面初始化的参数有:
def __init__(self, model_path, model_type = 'BFM'):super( MorphabelModel, self).__init__()if model_type=='BFM':self.model = load.load_BFM(model_path)# fixed attributesself.nver = self.model['shapePC'].shape[0]/3 # 顶点的个数self.ntri = self.model['tri'].shape[0] # 三角形的个数self.n_shape_para = self.model['shapePC'].shape[1] # 199self.n_exp_para = self.model['expPC'].shape[1] # 29self.n_tex_para = self.model['texMU'].shape[1] # 1self.kpt_ind = self.model['kpt_ind'] # 关键点索引self.triangles = self.model['tri']self.full_triangles = np.vstack((self.model['tri'], self.model['tri_mouth'])) # 按行堆叠, 例如两个(1, 3)成为(2, 3)
2. 生成mesh, 也就是一些点,三角形的集合
sp = bfm.get_shape_para('random')
ep = bfm.get_exp_para('random')
# 上面就是生成一些随机的形状与表情参数vertices = bfm.generate_vertices(sp, ep)
# 模型所有不包含颜色后加和的点tp = bfm.get_tex_para('random')
colors = bfm.generate_colors(tp)
colors = np.minimum(np.maximum(colors, 0), 1)
- 看看这个generate_vertices, 输入形状系数和表情系数,返回顶点, 大小是(nver, 3)
def generate_vertices(self, shape_para, exp_para):'''Args:shape_para: (n_shape_para, 1)exp_para: (n_exp_para, 1) Returns:vertices: (nver, 3)'''vertices = self.model['shapeMU'] + self.model['shapePC'].dot(shape_para) +self.model['expPC'].dot(exp_para)# 这个求解的过程就是均值加上系数乘PCA降维后的基向量vertices = np.reshape(vertices, [int(3), int(len(vertices)/3)], 'F').Treturn vertices
- 这个generated_colors是根据纹理系数生成颜色, 其实这里并没有对
纹理也就是颜色做后续的fit, 只不过是用一个随机数乘了原来的系数
# 输入纹理系数, 返回颜色def generate_colors(self, tex_para):'''Args:tex_para: (n_tex_para, 1) 这个其实是1,1Returns:colors: (nver, 3)'''colors = self.model['texMU'] + self.model['texPC'].dot(tex_para*self.model['texEV'])
# 这里是个随机的数乘原来的texEV
'''
texEV是纹理正交空间的系数, 大小是199*1
'''colors = np.reshape(colors, [int(3), int(len(colors)/3)], 'F').T/255. return colors
3. 坐标变换
- 指定了s, R, t等缩放旋转位移参数, 然后把3D的点变到2D
s = 8e-04
angles = [0, 0, 0]
t = [0, 0, 0]
transformed_vertices = bfm.transform(vertices, s, angles, t)
projected_vertices = transformed_vertices.copy()
'''
这里应该就对应相机坐标系的变换, 相机坐标系和两个投影变换不要混了
'''
# using stantard camera & orth projection
h = w = 256; c = 3# 这个是变换到图片坐标系上,x,y加上图片的一半, y轴反转
image_vertices = mesh.transform.to_image(projected_vertices, h, w)# 这个在之前的精度中讲过, 就是利用重心坐标对颜色进行插值
'''
这个的返回值是image: [h, w, 3] , 三个通道是一样的
'''
image = mesh.render.render_colors(image_vertices, bfm.triangles, colors, h, w)
4. 使用68个关键点做fit
x = projected_vertices[bfm.kpt_ind, :2] # 这个是相机坐标系下的人脸关键点X_ind = bfm.kpt_ind # index of keypoints in 3DMM. fixed. # fit 根据二维点来解出对应的3d参数叫fit
fitted_sp, fitted_ep, fitted_s, fitted_angles, fitted_t = bfm.fit(x, X_ind, max_iter = 3)
- 这里的fit算法里面有个黄金标准算法, 网上没有讲的很深入的, 同时现在大多数是用深度学习的方法fit了, 这个先占坑
这里的fit结果有5个参数, 分别是形状, 表情, s, R, t
三维人脸重建:精读3dmm.py相关推荐
- VR来了,3D人脸重建跟上《三维人脸重建-3DMM》
之前我们写过了<三维人脸重建入门>,接下来,自然就是入门之后的事情.当然了,不管是一个什么项目,方法永远不会是唯一的. 一 引言 To my best of knowledge,如之前所说 ...
- 【每周CV论文推荐】 初学深度学习单张图像三维人脸重建需要读的文章
欢迎来到<每周CV论文推荐>.在这个专栏里,还是本着有三AI一贯的原则,专注于让大家能够系统性完成学习,所以我们推荐的文章也必定是同一主题的. 基于图像的人脸三维重建在人脸分析与娱乐领域里 ...
- 「每周CV论文推荐」 初学深度学习单图三维人脸重建需要读的文章
基于图像的人脸三维重建在人脸分析与娱乐领域里有巨大的应用场景,本文来介绍初学深度学习单张图像人脸三维重建必须要读的文章. 作者&编辑 | 言有三 1 3DMM与数据集 虽然这里推荐的是深度学习 ...
- 【蜂口 | AI人工智能】三维人脸重建——龙鹏 深度学习与人脸图像应用连载(十)
本次我们的分享是三维人脸重建问题,我们将从以下几个方面给大家进行分享: 首先,我们对三维人脸重建做一个通用的介绍,并对它的常见的方进行比较详细的介绍. 其次,我们对当前的三维人脸重建中最常用的一个模型 ...
- 微软三维人脸重建论文总结——《Accurate 3D Face Reconstruction with Weakly-Supervised Learning》
原作:https://arxiv.org/abs/1903.08527 研究机构:微软研究院 写在前面 想象一下,通过二维的人脸图片,生成高度还原的三维人脸模型.真是异想天开,可是人工智能要做的不就是 ...
- 图形处理(十三)基于可变形模板的三维人脸重建-学习笔记
基于可变形模板的三维人脸重建-学习笔记 原文地址:http://blog.csdn.net/hjimce/article/details/50331423 作者:hjimce 一.数据库处理: 我们通 ...
- 【蜂口 | AI人工智能】三维人脸重建——龙鹏 深度学习与人脸图像应用连载(十)...
本次我们的分享是三维人脸重建问题, 我们将从以下几个方面给大家进行分享: 首先,我们对三维人脸重建做一个通用的介绍,并 对它的常见的方进行 比较详细的介绍. 其次,我们对当前的三维人脸重建中最常用的一 ...
- 人脸论文解读系列——三维人脸重建(一)
基于区域最佳匹配融合的三维人脸重建 <3D Face Reconstruction with Region Based Best Fit Blending Using Mobile Phone ...
- 三维人脸重建 (一)
文章目录 3DMM是什么 传统3DMM方法 PCA降维 模型求解问题分析 具体参数(s,R,t2d,α,β)({s, R, t_{2d}}, \alpha, \beta)(s,R,t2d,α,β)的 ...
- C++运行三维人脸重建 VRN
流程: 定义数据池: 1.残差块 struct 残差块 //标准残差块 {BN层数据 * bn0;层数据 * conv1;BN层数据 * bn1;层数据 * conv2;BN层数据 * bn2;层数据 ...
最新文章
- UVa12096.The SetStack Computer
- JAVA中循环删除list中元素的方法总结
- 如何从值中删除数组中的项目?
- Oracle感慨(转)
- W32.Downedup.B顽固病毒——查杀记
- 【攻防世界011】Windows_Reverse1
- EZNEW.NET开发框架100%重磅开源
- 基于FPGA的前向纠错算法
- ECS Windows系统使用自带监视器查看IIS并发连接数
- 【对讲机的那点事】维修对讲机你会拆卸电路板上的集成电路块吗?
- Android应用分析进阶教程之一- 初识JEBAPI
- crontab导致磁盘空间满问题的解决
- 诺顿5月17日病毒库误报,导致系统文件被删除
- 视频教程-SAP快速入门-其他
- maven常用打包命令
- 局域网共享打印机教程
- 12款自动生成器,无聊人士自娱自乐专用
- 腾讯云云服务器IE浏览器初始使用常见问题
- Cannot save setting
- 【mysql报错】Data truncation: Data too long for column ‘XXX‘ at row 1
热门文章
- VMware Workstation Pro v16.1.0虚拟机下载安装过程
- 海迅2016破解版下载
- 网上银行“安全登录控件”分析(zt)
- 【Python成长之路】共享平台
- 从头开始vue创建项目_从头开始创建Windows 7主题包
- 中国姓氏数据库 java_中国姓的数据库(sql版),下你妹CSDN,又不是你的资源要你妹积分!...
- php com adodb,php COM 连接ADODB.Connection数据库
- 史上最牛最全android开发知识汇总
- linux 种子文件怎么打开,torrent是什么文件?用什么打开?
- 安捷伦频谱仪的使用方法图解_频谱分析仪的基本使用方法(转载)