Face2face:非深度学习时代如何进行实时的三维人脸重建

本文主要基于开源项目Face2face[1](中间会提及到face3d[2]和eos[3]),对采用传统优化方法从二维图片拟合3DMM的三维人脸重建算法整体流程做一个介绍。由于项目作者没有给出参考文献,笔者是从代码推论出来的整个算法,如有错误,欢迎指正。


一.算法流程

如图一所示,整个算法包含三个步骤,其中人脸关键点检测,用于获取二维图像上人脸的语义点,连同图片本身作为拟合问题的真值,而估计相机变换和估计身份、表情、纹理和光照系数则是拟合问题待求解的参数。

图1.算法流程

二.具体步骤

1.人脸关键点检测

项目中采用了dlibopenpose进行提取。非重点,这里就略过了。

2.估计相机变换参数

根据上述检测到的2D人脸关键点和当前估计的3DMM人脸的3D关键点,采用黄金标准算法来估计相机变换参数,包括旋转、平移和尺度(对应项目代码位于face2face/optimize/camera.py)

当采用射影摄像机时,算法如下(见[4] P 123 P{123} P123

图2.射影相机模型相机变换矩阵求解

当采用仿射摄像机时,算法如下(见[4] P 126 P_{126} P126

图3.仿射相机模型相机变换矩阵求解

sfm中估计基础矩阵或者本质矩阵的方法一样,这两种不同的相机模型下求解变换矩阵时也需要进行图像点和空间点归一化(见[4] P 122 P_{122} P122

图4.二维关键点的归一化

3.估计身份、表情、纹理和光照参数

构建目标函数

采用了投影2d关键点损失 E l a n d E_{land} Eland、像素损失 E p i x e l E_{pixel} Epixel和正则化损失 E i d / e x p / t e x r e g E_{id/exp/tex_{reg}} Eid/exp/texreg

E t o t a l = w 1 E l a n d + w 2 E p i x e l + w 3 E i d r e g + w 4 E e x p r e g + w 5 E t e x r e g E_{total}=w_1E_{land}+w_2E_{pixel}+w_3E_{id_{reg}}+w_4E_{exp_{reg}}+w_5E_{tex_{reg}} Etotal=w1Eland+w2Epixel+w3Eidreg+w4Eexpreg+w5Etexreg

E l a n d = ∣ ∣ L 2 d p r e ( α i d , α e x p ) − L 2 d ∣ ∣ 2 2 E_{land}=||L2d_{pre}(α_{id},α_{exp})-L2d||^2_2 Eland=∣∣L2dpre(αid,αexp)L2d22

E p i x e l = ∣ ∣ I p r e ( α i d , α e x p , α t e x , α s h ) − I ∣ ∣ 2 2 E_{pixel}=||I_{pre}(α_{id},α_{exp},α_{tex},α_{sh})-I||^2_2 Epixel=∣∣Ipre(αid,αexp,αtex,αsh)I22

E i d r e g = ∣ ∣ α i d ∣ ∣ 2 2 / i d e v a l E_{id_{reg}}=||α_{id}||^2_2/id_{eval} Eidreg=∣∣αid22/ideval

E e x p r e g = ∣ ∣ α e x p ∣ ∣ 2 2 / e x p e v a l E_{exp_{reg}}=||α_{exp}||^2_2/exp_{eval} Eexpreg=∣∣αexp22/expeval

E t e x r e g = ∣ ∣ α t e x ∣ ∣ 2 2 / t e x e v a l E_{tex_{reg}}=||α_{tex}||_2^2/tex_{eval} Etexreg=∣∣αtex22/texeval

式中, α i d α_{id} αid 为形状估计参数, α e x p α_{exp} αexp 为表情估计参数, α t e x α_{tex} αtex 为纹理估计参数, α s h α_{sh} αsh球谐基底的估计权重参数, e x p e v a l exp_{eval} expeval3DMM模型形状基底的特征值, 为3DMM模型表情基底的特征值, t e x e v a l tex_{eval} texeval为3DMM模型纹理基底的特征值。

求解方法

属于非线性最小二乘问题,可推导出该目标函数对于各 α \alpha α系数的jacobi矩阵(见·face2face/optimize/image.py里面denseJointJacobian函数·),然后采用高斯牛顿法迭代求解即可。

注意点

1)以上是单帧图像的估计,Face2face项目中首先是用3帧左右估计id, tex,exp,cam,sh等参数,然后固定id和tex,对剩余帧进行exp,cam,sh的跟踪。

2)Face2face[1]在得到3DMM的几何模型和每个几何点的RGB颜色后,直接采用了opengl的渲染管线来得到预测出的图像(见face2face/utils/opengl.py里面的具体实现)。(当固定住像素和三角形的对应关系后,此步骤是可微分的)

3)face3d[2]里面手写了光栅化(从NDC空间到屏幕空间)这部分的代码,感兴趣的可以自行查看(见face3d/mesh_numpy/render.py)。

4)光照模型-spherical harmonic

这里补充说下球谐光照模型,简单来说球谐为我们提供了一组在球面上的正交基底,类似于欧式空间的傅里叶基底,并且只需要取前9个基底就能很好的模拟我们的光照环境[6]:

上式中 ( x , y , z ) (x,y,z) (x,y,z)为点的法线,并且在看实现代码[1]、[2]时发现,在三维人脸重建领域通常会忽略式中基底前面的系数:

最终一个点的颜色的计算公式为 I ( p , n ) = λ ( p ) E ( n ) I(p,n)=λ(p)E(n) I(p,n)=λ(p)E(n) p p p为三维点, n n n为点 p p p的法线, E ( n ) E(n) E(n)为根据法线 n n n计算得到的基底与 α s h α_{sh} αsh的乘积, λ λ λ是albedo也就是原始点的颜色,对应代码如下:

因为光照计算中涉及到法线,表明其对于身份系数有贡献,所以可以加入到优化项中来。

三.其它

对于侧脸的情况,目测[1]、[2]的重建效果都不会很好,而eos[3]、[9]在实现的过程中对于轮廓点进行了特殊处理,其基本流程如下:

  1. 使用非轮廓点及其对应3d关键点,采用黄金标准算法估计姿态;
  2. 施加了上述估计的姿态之后,同样利用非轮廓点及其对应3d关键点,采用NNLS算法估计表情参数(注:该算法无法加表情参数约束);
  3. 对可见轮廓点一侧,对相应的3d关键点施加姿态之后,查找最近2d轮廓点;

    而对不可见轮廓点一侧,根据[10]中介绍的法线方向变化和raycast可见性检查计算得到3d轮廓点,然后查找最近2d轮廓点。注意这里2d轮廓点和3d轮廓点不是一对一的关系,会存在一个2d轮廓点对应多个3d轮廓点的情况;

    将轮廓点与非轮廓点合并到一起后,先采用采用黄金标准算法估计姿态,然后采用[11]中算法估计形状参数(解析解),最后采用NNLS算法估计表情参数(解析解)。注意整个步骤是迭代求解,因为需要更新轮廓点的对应。

注:笔者做实际项目时将这些方法的更新轮廓点方法加入到了损失项中,计算速度很慢,而且提升效果有限;另外还有个对于轮廓点的处理还有个叫landmark marching的方法,效果应该都差不多

四.参考

[1]https://github.com/kimoktm/Face2face

[2]https://github.com/YadiraF/face3d

[3]https://github.com/patrikhuber/eos

[4]计算机视觉中的多视图几何-中文版,安大出版社,2002.8

[5]Face Recognition from a Single Training Image under Arbitrary Unknown Lighting Using Spherical Harmonics

[6]Inverse Rendering of Faces with a 3D Morphable Model

[7]3D Morphable Face Models - Past, Present and Future

[8]Hypochondria:有关opengl各种空间变换

[9]https://github.com/Yinghao-Li/3DMM-fitting

[10]Fitting a 3D Morphable Model to Edges: A Comparison Between Hard and Soft Correspondences

[11]Inverse Rendering of Faces with a 3D Morphable Model

最后,创作不易,如果对您有一点点帮助,希望可以给笔者点点关注、给个免费的赞or收藏or小心心,谢谢。

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

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

相关文章

单片机基础模块学习——定时器

1.利用stc-isp生成代码 选择定时器计算器,将频率改为12mhz,单位为毫秒,定时长度为1 复制下面代码 void Timer0Init(void) //1毫秒12.000MHz {AUXR | 0x80; //定时器时钟1T模式TMOD & 0xF0; //设置定时器模式TL0 0x20; //设置定时初值TH0 0xD…

《Linux服务与安全管理》| 邮件服务器安装和配置

《Linux服务与安全管理》| 邮件服务器安装和配置 目录 《Linux服务与安全管理》| 邮件服务器安装和配置 1.在Server01上安装dns、postfix、dovecot和telnet,并启动 2.在Server01上配置DNS服务器,设置MX资源记录 3.在server1上…

【机器学习实战入门】使用OpenCV进行性别和年龄检测

Gender and Age Detection Python 项目 首先,向您介绍用于此高级 Python 项目的性别和年龄检测中的术语: 什么是计算机视觉? 计算机视觉是一门让计算机能够像人类一样观察和识别数字图像和视频的学科。它面临的挑战大多源于对生物视觉有限的了解。计算机视觉涉及获取、处…

Git下载安装

目录 Win下载安装 Mac下载安装 Git忽略文件IdeaWebstorm 缓冲区大小问题 Win 下载 官网:https://git-scm.com/ 安装 下载完成后得到安装文件直接双击安装 第一步:使用许可声明 第二步:选择安装目录 第三步:选择安装组件 …

2024 年度学习总结

目录 1. 前言 2. csdn 对于我的意义 3. 写博客的初衷 3.1 现在的想法 4. 写博客的意义 5. 关于生活和博客创作 5.1 写博客较于纸质笔记的优势 6. 致 2025 1. 前言 不知不觉, 来到 csdn 已经快一年了, 在这一年中, 我通过 csdn 学习到了很多知识, 结识了很多的良师益友…

STM32补充——FLASH

目录 1.内部FLASH构成(F1) 2.FLASH读写过程(F1) 2.1内存的读取 2.2闪存的写入 2.3FLASH接口寄存器(写入 & 擦除相关) 3.FLASH相关HAL库函数简介(F1/F4/F7/H7) 4.编程实战 …

PyTorch使用教程(8)-一文了解torchvision

一、什么是torchvision torchvision提供了丰富的功能,主要包括数据集、模型、转换工具和实用方法四大模块。数据集模块内置了多种广泛使用的图像和视频数据集,如ImageNet、CIFAR-10、MNIST等,方便开发者进行训练和评估。模型模块封装了大量经…

python学opencv|读取图像(三十九 )阈值处理Otsu方法

【1】引言 前序学习了5种阈值处理方法,包括(反)阈值处理、(反)零值处理和截断处理,还学习了一种自适应处理方法,相关文章链接为: python学opencv|读取图像(三十三)阈值处理-灰度图像-CSDN博客 python学o…

(一)相机标定——四大坐标系的介绍、对应转换、畸变原理以及OpenCV完整代码实战(C++版)

一、四大坐标系介绍 1,世界坐标系 从这个世界(world)的视角来看物体 世界坐标系是3D空间坐标,每个点的位置用 ( X w , Y w , Z w ) (X_w,Y_w,Z_w) (Xw​,Yw​,Zw​)表示 2,相机坐标系 相机本身具有一个坐标系&…

从CRUD到高级功能:EF Core在.NET Core中全面应用(三)

目录 IQueryable使用 原生SQL使用 实体状态跟踪 全局查询筛选器 并发控制使用 IQueryable使用 在EFCore中IQueryable是一个接口用于表示可查询的集合,它继承自IEnumerable但具有一些关键的区别,使得它在处理数据库查询时非常有用,普通集…

STM32之CubeMX图形化工具开发介绍(十七)

STM32F407 系列文章 - STM32CubeMX(十七) 目录 前言 一、CubeMX 二、下载安装 1.下载 2.安装 3.图解步骤 三、用户界面 1.项目配置 2.项目生成 3.项目文件解释 4.新建工程 5.查看原工程 四、FAQ 总结 前言 STMCube源自意法半导体&#xf…

idea中远程调试中配置的参数说明

Ⅰ 远程调试中配置的端口号与服务本身端口号区别 一、远程调试中配置端口号的作用 在 IDEA 中进行远程调试时配置的端口号主要用于建立开发工具(如 IDEA)和远程服务之间的调试连接。当你启动远程调试时,IDEA 会监听这个配置的端口号&#xf…

gitlab使用多数据库

1. 说明 默认情况下,GitLab 使用一个单一的应用数据库,称为主数据库。为了扩展 GitLab,您可以将 GitLab 配置为使用多个应用数据库。 设置多个数据库后,GitLab 将使用第二个应用数据库用于 CI/CD 功能,称为 CI 数据库…

【博客之星2024】技术创作与成长的全景回顾与突破 —— “千里之行,始于足下“

《热爱生命》 汪国真 我不去想是否能够成功 既然选择了远方 便只顾风雨兼程 我不去想能否赢得爱情 既然钟情于玫瑰 就勇敢地吐露真诚 我不去想身后会不会袭来寒风冷雨 既然目标是地平线 留给世界的只能是背影 我不去想未来是平坦还是泥泞 只要热爱生命 一切,都在意料…

leetcode刷题记录(七十二)——146. LRU 缓存

(一)问题描述 146. LRU 缓存 - 力扣(LeetCode)146. LRU 缓存 - 请你设计并实现一个满足 LRU (最近最少使用) 缓存 [https://baike.baidu.com/item/LRU] 约束的数据结构。实现 LRUCache 类: * LRUCache(int capacity)…

两份PDF文档,如何比对差异,快速定位不同之处?

PDF文档比对是通过专门的工具或软件,自动检测两个PDF文件之间的差异,并以可视化的方式展示出来。这些差异可能包括文本内容的修改、图像的变化、表格数据的调整、格式的改变等。比对工具通常会标记出新增、删除或修改的部分,帮助用户快速定位…

TongESB7.1.0.0如何使用dockercompose运行镜像(by lqw)

文章目录 安装准备安装 安装准备 1.安装好docker和dockercompose: docker、docker-compose安装教程,很详细 2.上传好安装相关文件 安装 使用以下命令导入管理端镜像和运行时镜像 docker load -i tongesb_manage_7100.tar docker load -i tongesb_se…

Java基于SSM框架的社区团购系统小程序设计与实现(附源码,文档,部署)

Java基于SSM框架的社区团购系统小程序设计与实现 博主介绍:✌程序猿徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 &#x1f4…

【Linux】gawk编辑器二

一、变量 gawk编程语言支持两种变量:内建变量和自定义变量。 1、内建变量 gawk使用内建变量来引用一些特殊的功能。 字段和记录分隔符变量 数据字段变量 此变量允许使用美元符号($)和字段在记录中的位置值来引用对应的字段。要引用记录…

【Linux】Linux入门(三)权限

目录 前提权限概念whoami指令 Linux权限管理文件访问者的分类(人)file指令权限信息权限的表示方法 chmod指令 更改权限chown指令 修改文件,文件夹所属用户和用户组 权限掩码umask(权限掩码) 粘滞位 前提 请先看下面这…