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]。
相关文章:

3DMM模型
目录 BFMBFM_200901_MorphableModel.matexp_pca.bintopology_info.npyexp_info.npy BFM BFM_2009 01_MorphableModel.mat from scipy.io import loadmat original_BFM loadmat("01_MorphableModel.mat") # dict_keys: [__header__, __version__, __globals__, # …...
Python 3 使用 write()、writelines() 函数写入文件
1 使用 write() 函数,将字符串(或字节串,仅适用写入二进制文件中)写入文件中。 with open(example.txt,w,encodingutf-8) as f:f.write(春夜喜雨\n)f.write(杜甫 [唐代]\n)f.write(好雨知时节,当春乃发生。\n)f.write(…...
鸿蒙(HarmonyOS)应用开发——管理组件状态
状态管理 在应用中,界面通常都是动态的。 #mermaid-svg-DrPNsglFkyLqn7Lw {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-DrPNsglFkyLqn7Lw .error-icon{fill:#552222;}#mermaid-svg-DrPNsglFkyLqn7Lw …...

倚天屠龙:Github Copilot vs Cursor
武林至尊,宝刀屠龙。号令天下,莫敢不从。倚天不出,谁与争锋! 作为开发人员吃饭的家伙,一款好的开发工具对开发人员的帮助是无法估量的。还记得在学校读书的时候,当时流行CS架构的RAD,Delphi和V…...

【web安全】RCE漏洞原理
前言 菜某的笔记总结,如有错误请指正。 RCE漏洞介绍 简而言之,就是代码中使用了可以把字符串当做代码执行的函数,但是又没有对用户的输入内容做到充分的过滤,导致可以被远程执行一些命令。 RCE漏洞的分类 RCE漏洞分为代码执行…...

EI论文复现:基于组合双向拍卖的共享储能机制研究程序代码!
本程序参考EI期刊论文《基于组合双向拍卖的共享储能机制研究》,文中的组合双向拍卖交易机制较为新颖,本质上属于博弈范畴,共享储能是目前的研究热点,牵涉到共享储能参与者的投标策略和收益函数,文中所提模型可为电力市…...
ThinkPHP 5 中,你可以使用定时任务调度器(TaskScheduler)来执行其他定时任务
在 ThinkPHP 5 中,你可以使用定时任务调度器(TaskScheduler)来执行其他定时任务。以下是一个示例代码,演示如何在一个定时任务中执行另一个定时任务: 首先,你需要创建一个继承自 think\console\Command 的…...

mysql:免费的GUI客户端工具推荐并介绍常用的操作
给大家推荐几个常用的 mysql 数据库客户端 sequel-pro sequel-ace 官网下载地址 免费 sequel-ace 可以理解为 Sequel Pro 的升级版,由于Sequel Pro官方不维护了,特别是对 MySQL 8.0 支持不好,所以现在由社区维护了新分支 sequel-ace&#x…...

[Unity数据管理]自定义菜单创建Unity内部数据表(ScriptableObject)
Unity 在开发的时候如果数据量比较大,或者一部分数据需要存在云端,那么就需要一些数据库 轻量型到大型的包括: 数组-内存存储读取 列表-内存存储读取 List<T> tList new List<T>(); XML-硬盘存储读取 JSON-硬盘存储读取 …...

使用JAVA语言写一个排队叫号的小程序
以下是一个简单的排队叫号的小程序,使用JAVA语言实现。 import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class NumberingSystem {public static void main(String[] args) {Queue<String> queue new LinkedList<…...

openGauss学习笔记-140 openGauss 数据库运维-例行维护-例行维护表
文章目录 openGauss学习笔记-140 openGauss 数据库运维-例行维护-例行维护表140.1 相关概念140.2 操作步骤140.3 维护建议 openGauss学习笔记-140 openGauss 数据库运维-例行维护-例行维护表 为了保证数据库的有效运行,数据库必须在插入/删除操作后,基于…...

ubuntu20.04使用LIO-SAM对热室空间进行重建
一、安装LIO-SAM 1.环境配置 默认已经安装过ros sudo apt-get install -y ros-Noetic-navigation sudo apt-get install -y ros-Noetic-robot-localization sudo apt-get install -y ros-Noetic-robot-state-publisher 安装 gtsam(如果是18.04的ubuntu直接按照官网配置&…...

如何选学生用的台灯?眼科专家都说好的学生台灯分享!
根据中国眼健康白皮书显示,我国儿童青少年近视总体发生率为53.6%,由此可见如今青少年学生近视的发病率非常高的,且越来越向低龄化发展,不少还在小学阶段的孩子也存在近视的现象。 而造成这个现象的主要原因就是长时间的用眼导致的…...

Linux4.8、环境变量续
个人主页:Lei宝啊 愿所有美好如期而遇 前言 如果对环境变量没有基本的理解,那么建议先看完这篇文章:环境变量https://blog.csdn.net/m0_74824254/article/details/134661113?spm1001.2014.3001.5501 环境变量与本地变量区别 使用export设…...
PTA 7-231 买文具
某小学要购置文具。批发市场中 A 牌的铅笔卖 5 元一支,C 牌的铅笔卖 2 元一支,D 牌的简易铅笔卖1元2只(捆绑销售,只能买偶数只)。 如果想用n元买n支笔,问有多少种买法?(题目保证 n …...

GPTs每日推荐--生化危机【典藏版】
今天给大家推荐一个游戏性质的GPTs,叫做生化危机典藏版,国内点击可玩。 开篇:玩家从末日中醒来。 选择:玩家会遇到各种资源、任务、剧情,需要自行选择相关的分支剧情,一旦选错,无法重选。 结局…...

jenkins-cicd基础操作
1.先决条件 1.首先我个人势在k8s集群中创建的jenkins,部署方法搭建 k8s部署jenkins-CSDN博客 2.安装指定插件. 1.Gitlab plugin 用于调用gitlab-api的插件 2.Kubernetes plugin jenkins与k8s进行交互的插件,可以用来自动化的构建和部署 3.Build Authorizatio…...

ctfhub技能树_web_信息泄露
目录 二、信息泄露 2.1、目录遍历 2.2、Phpinfo 2.3、备份文件下载 2.3.1、网站源码 2.3.2、bak文件 2.3.3、vim缓存 2.3.4、.DS_Store 2.4、Git泄露 2.4.1、log 2.4.2、stash 2.4.3、index 2.5、SVN泄露 2.6、HG泄露 二、信息泄露 2.1、目录遍历 注࿱…...
使用Docker本地部署chatgpt
GitHub上有一个开源的工程ChatGPT-Next-Web,这个工程已经封装好了UI以及和OpenAI的API之间的交互,你要做的事情就是把他部署到本地,并配置好你的OpenAI的sk,然后就可以使用了。那么接下来的文章里,我会手把手教你如何C…...
SpringBoot 集成Netty、WebSocket,5分钟搭建聊天通信系统
文章目录 前言Netty简介使用Netty开发WebSocket应用程序开始项目一、添加依赖二、自定义处理器三、初始化通道加载器四、配置启动器五、添加启动监听器六、启动项目七、演示效果1. 客户端1看到其他客户端上线2. 客户端3收到客户端1发送的消息3. 客户端1收到客户端2下线前言 在…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...

Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...

Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...

认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...