3DMM模型

目录

    • BFM
      • BFM_2009
        • 01_MorphableModel.mat
        • exp_pca.bin
        • topology_info.npy
        • exp_info.npy

BFM

BFM_2009

01_MorphableModel.mat
from scipy.io import loadmat
original_BFM = loadmat("01_MorphableModel.mat")
# dict_keys: ['__header__', '__version__', '__globals__',
#			 'tl',
#			 'shapeMU', 'shapePC', 'shapeEV',
#			 'texMU', 'texPC', 'texEV',
# 			 'segbin', 'segMM', 'segMB']

这个mat文件是通过MATLAB创建的,所有的index都是从1开始,需要特别注意。这个文件里主要存了3DMM mesh的几何(shape)和纹理(tex)相关的PCA参数。
__header__ \text{\_\_header\_\_} __header__: MATLAB 5.0 MAT-file, Platform: GLNX86, Created on: Wed Jul 23 15:09:28 2008
__version__ \text{\_\_version\_\_} __version__: 1.0
__globals__ \text{\_\_globals\_\_} __globals__: []
tl \text{tl} tl: [106466, 3],106466个面片,每个面片的顶点序号。
shapeMU \text{shapeMU} shapeMU:这个字段存的是mean shape。维度 [160470, 1], 53490个3D顶点reshape成了[160470, 1]的维度,数值范围[-114062.2, 131943.88],实际使用时,一般会除以1e5,将单位统一到分米。
shapePC \text{shapePC} shapePC: 这个字段存的是 principle shape components,shape的主成分基。维度[160470, 199],基的维度为199维。数值范围[-0.041886166,0.046161193]。
shapeEV \text{shapeEV} shapeEV: 这个字段存的是shape eigen value,表征shape每个主成分分量的标准差。维度[199, 1], 数值范围[3750.5396, 884336.25]。
texMU \text{texMU} texMU: mean texture,维度[160470, 1],数值范围[14.414997, 239.3551]。
texPC \text{texPC} texPC: principle texture components,维度[160470, 199],数值范围[-0.050797794, 0.055871148]。
texEV \text{texEV} texEV: texture eigen value,维度[199, 1],数值范围[127.32297, 4103.179]。
segbin \text{segbin} segbin:维度[53490, 4],以one-hot的形式定义了每个3D点所属的语义类别,如下图所示总计分为4类。
segMM \text{segMM} segMM: 维度[53490, 53490],稀疏矩阵。
segMB \text{segMB} segMB: 维度[53490, 213960],稀疏矩阵。

shape或者texture的计算公式为:

obj = mu + pc * (coef * ev)

shape还会叠加上表情系数带来的顶点偏移量。因此更具化的计算过程如下:

texture = tex_mu + tex_pc * (tex_coef * tex_ev)
shape = shape_mu + shape_pc * (tex_coef * shape_ev) + exp_pc * (exp_coef * exp_ev)
shape /= 1e5

原生的BFM2009只有shape和texture,没有提供表情相关的PCA参数。表情相关的PCA参数用的是下述的exp_pca.bin

exp_pca.bin

原始的BFM2009模型包含53490个顶点。
CNN-based Real-time Dense Face Reconstruction with Inverse-rendered Photo-realistic Face Images中提供的表情基包含了53215个顶点。真的是说来话长,这里的53215个顶点是借鉴了Face Alignment Across Large Poses: A 3D Solution这篇论文的处理方式,删掉了inner mouth vertices,具体从原始的53490个顶点中取了哪53215个点构成新的mesh,可以看model_info[‘trimIndex’]字段。那又为什么要删掉口腔内部顶点呢?

D3DFaceRecon又在53215的基础上沿着face landmarks裁剪,新的mesh包含35709个顶点。

topology_info.npy
topology = np.load("topology_info.npy", allow_pickle=True).item()
# dict_keys: ['tris', 'vert_tris', 'sub_inds']

这个npy文件定义了顶点数为34650,面片数为68746的 mesh \text{mesh} mesh拓扑结构。
tris \text{tris} tris: [68746, 3],每个面片由3个顶点组成,这个字段存储了68746个面片的每个面片的顶点序号。
vert_tris \text{vert\_tris} vert_tris: [34650, 8], 每个顶点会连接8个三角面片,这字段存储了34650个顶点的每个顶点连接的面片序号,面片从0开始编号。
sub_inds \text{sub\_inds} sub_inds: [34650,], 顶点序号从0开始,排到了53423,但实际只使用了34650个顶点,这个字段存储了这34650个顶点的序号。

这里有个问题, sub_inds \text{sub\_inds} sub_inds最大序号是53423,合计53424个点,01_MorphableModel中定义的mesh是53490个点。少掉的具体是哪66个点?

exp_info.npy
exp_info = np.load("exp_info.npy", allow_pickle=True).item()
# dict_keys: ['mu_exp', 'base_exp', 'sig_exp']

mu_exp \text{mu\_exp} mu_exp:表情均值,维度[103950,],34650个3D点reshape成了[103950,]维度,数值范围[-607.75006, 725.0776]。
base_exp \text{base\_exp} base_exp:表情基,维度[79, 103950], 表情基维度为79维,数值范围[-0.028425552, 0.07618008]。
sig_exp \text{sig\_exp} sig_exp:表情基的方差,维度[79,],数值范围[1587.7286, 285403.94]。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/196782.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视频剪辑转码:mp4批量转成wmv视频,高效转换格式

在视频编辑和处理的领域,转换格式是一项常见的任务。在某些编辑和发布工作中,可能需要使用WMV格式。提前将素材转换为WMV可以节省在编辑过程中的时间和精力。从MP4到WMV的批量转换,不仅能使视频素材在不同的平台和设备上得到更好的兼容性&…

LoadBalancer将服务暴露到外部实现负载均衡Openelb-layer2模式配置介绍

目录 一.openelb简介 二.主要介绍layer2模式 1.简介 2.原理 3.部署 (1)先在集群master上开启kube-proxy的strictARP (2)应用下载openelb.yaml(需要修改镜像地址) (3)编写yam…

defer 用法

目录 1、资源释放 2、异常捕获 3、参数的预计算 4、defer 返回值的陷阱 1、资源释放 下面是一个简单的读取文件的程序,os.Open 打开文件资源描述符,在读取文件后,需要释放资源。但是在错误的时候,程序就直接返回那么&#xf…

密集书库是什么意思?图书馆密集书库的书可以借出吗

密集书库是一种用于存储大量书籍和资料的高密度储存设施。它通常包括一系列钢制书架和可移动的储存架,使得书籍可以被紧密地排列和存储,以最大程度地利用存储空间。同时,密集书库还有各种自动化系统,如自动化取书系统、气候控制系…

安卓apk抓包(apk抓不到包怎么办)

起因 手机(模拟器)有时候抓不到apk的包,需要借助Postern设置一个代理,把模拟器的流量代理到物理机的burp上。 解决方案 使用Postern代理,把apk的流量代理到burp。 Postern是一个用于代理和网络流量路由的工具&#xf…

Linux coredump异常处理

什么是coredump异常调试 Linux coredump功能是当Linux下应用程序异常时,Linux内核默认的一种异常信号处理机制,内核会把异常信息与进程内存转储成coredump文件,程序员通过gdb工具可以离线分析应用程序异常时的情况。 1)配置 core 文件生成的目录,其中 %e 表示程序文件名,…

Linux Namespace技术

对应到容器技术,为了隔离不同类型的资源,Linux 内核里面实现了以下几种不同类型的 namespace。 UTS,对应的宏为 CLONE_NEWUTS,表示不同的 namespace 可以配置不同的 hostname。User,对应的宏为 CLONE_NEWUSER&#xf…

骨传导耳机会影响听力么?盘点骨传导耳机的好处与坏处都有哪些?

先说结论,使用骨传导耳机是不会影响听力的!并且由于骨传导耳机的特殊传声原理,相比于传统的入耳式耳机,骨传导耳机拥有更多的优点,下面带大家了解一下骨传导耳机的优点和缺点都有哪些。 一、骨传导耳机的优点是什么&a…

kubectl获取ConfigMap导出YAML时如何忽略某些字段

前言: 当我们在使用Kubernetes时,常常需要通过kubectl命令行工具来管理资源。有时我们也想将某个资源的配置导出为YAML文件,这样做有助于版本控制和资源的迁移。然而,默认情况下,使用kubectl get命令导出资源配置会包…

PTA 7-224 sdut-C语言实验-排序问题

输入10个整数,将它们从小到大排序后输出,并给出现在每个元素在原来序列中的位置。 输入格式: 输入数据有一行,包含10个整数,用空格分开。 输出格式: 输出数据有两行,第一行为排序后的序列,第二行为排序…

JVM:双亲委派(未完结)

类加载 定义 一个java文件从编写代码到最终运行,必须要经历编译和类加载的过程,如下图(图源自b站视频up主“跟着Mic学架构”)。 编译就是把.java文件变成.class文件。类加载就是把.class文件加载到JVM内存中,得到一…

电子取证--windows下的volatility分析与讲解

1.volatility的安装 提示:我用的是2.6版本(windows),如果直接下载的出现问题,用迅雷就可以解决 下载地址:Volatility 2.volatility的使用 1.进入终端,查看镜像的系统信息: volati…

2312skia,10构建

介绍 Skia图形库可来绘画文本,几何图形和图像: 带透视的3x3矩阵*抗锯齿,透明度,滤镜*着色器,传输模式,掩码过滤,路径特效,子像素文本 Skia的设备后端目前包括: 光栅*OpenGL*PDF*XPS*SVG*及(用来录制,然后回放到另一个Canvas中的)图片 构建 确保已先按说明下载Skia Skia用GN…

Huawei FusionSphere FusionCompte FusionManager

什么是FusionSphere FusionSphere 解决方案不独立发布软件,由各配套部件发布,请参 《FusionSphere_V100R005C10U1_版本配套表_01》。 目前我们主要讨论FusionManager和FusionCompute两个组件。 什么是FusionCompte FusionCompute是华为提供的虚拟化软…

初识动态规划算法(题目加解析)

文章目录 什么是动态规划正文力扣题第 N 个泰波那契数三步问题使用最小花费爬楼梯 总结 什么是动态规划 线性动态规划:是可以用一个dp表来存储内容,并且找到规律存储,按照规律存储。让第i个位置的值等于题目要求的答案 >dp表:dp表就是用一…

SpringBoot——嵌入式 Servlet容器

一、如何定制和修改Servlet容器的相关配置 前言: SpringBoot在Web环境下,默认使用的是Tomact作为嵌入式的Servlet容器; 【1】修改和server相关的配置(ServerProperties实现了EmbeddedServletContainerCustomizer)例如…

Python 中 ConnectionRefusedError: [Errno 111] Connection Refused 错误

此错误表明客户端无法连接到服务器脚本系统上的端口。 既然能ping通服务器,应该不会吧。 这可能是由多种原因引起的,例如到目的地的路由不正确。 第二种可能性是您的客户端和服务器之间有防火墙,它可能在服务器上,也可能在客户端…

欢迎回到 C++ - 现代 C++(心得-壹)

原文链接欢迎回到 C - 现代 C | Microsoft Learn 这里先是讲了现代c的优势,其相对于其他编程语言有快速、高效。 相对于其他语言,该语言更加灵活,跨平台(硬件平台)性也很强,可以直接访问硬件,虽…

第三方UI组件库的样式修改

一、场景: 一般来说,我们在使用第三方UI组件库(如:vant,element-plus等)时,UI组件库自带的样式不能满足用户的个性化需求时,就需要我们开发人员自己动手对组件库的局部样式进行修改。…

Robot Grasp[Code with paper]

题目/摘要重点 Deep Object Pose Estimation for Semantic Robotic Grasping of Household Objects 使用合成数据为机器人训练深度神经网络 操纵有望获得几乎无限数量的预标记 训练数据。合成数据一直在弥合所谓的现实差距,因此 在合成数据上训练的网络在暴露于现…