原文链接:https://blog.csdn.net/zb1165048017/article/details/104204035
前言
之前有款换脸软件不是叫么,分析了一下,它的实现原理绝对是3D人脸重建,而非方法,找了一篇3D重建的论文和源码看看。这里对源码中的部分函数做了自己的理解和改写。
国际惯例,参考博客:
什么是uv贴图/p>
PRNet论文
PRNet代码
本博客主要是对PRNet的输出进行理解。
理论简介
这篇博客比较系统的介绍了3D人脸重建的方法,就我个人浅显的理解,分为两个流派:1.通过算法估算3DMM的参数,3DMM的思想是有一个平均脸,基于这个平均脸进行变形,就能得到任意的人脸,算法就需要计算这个变形所需要的参数;2. 直接摆脱平均脸的约束,直接使用神经 络去估算人脸的3D参数。
就是属于第二种流派,输入一张图片,直接使用神经 络输出一张称为的UV位置映射图。本博客就是为了对这个输出进行充分理解。先简短说一下,他的维度是
任何的3D人脸重建,包括3DMM,都需要得到顶点图和纹理图,这个在图形学里面很常见,比如我们看到的游戏角色就包括骨骼信息和纹理信息。
代码理解
首先引入必要的库:
这里有个额外的predictor库,是PRNet的 络结构,直接去这里下载。
还有一个文件夹需要下载,戳这里,这里面定义了UV图的人脸关键点信息,预定义的人脸顶点信息,三角 格信息。下面会分析他俩的作用。
人脸裁剪
因为源码使用检测人脸关键点,其实目的是找到人脸框,然后裁剪人脸。由于在上安装有点难度,而前面的换脸博客刚好玩过用检测人脸关键点。检测人脸框的代码如下:
可视化看看:
络推断
载入 络结构
直接把裁剪后的图片输入到 络中,推导位置映射图
因为这个结果是裁剪过的图的重建,所以在重新调整一下,缩放到之前的图大小:
这里不太好可视化,只看看这个深度信息,也就是第三个通道:
记住,所有的人脸texture都满足这个布局,所有器官一定出现在上图的对应位置。至于怎么获取,后面会介绍。
前面说了, 络输出的UV位置映射图,前面两个
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!