想象一下在将来,咱们在远程通话的时候,经过全息投影可让你感受到说话的人就在你面前。而如今,一种基于计算机视觉的相似应用已经产生了。python
在过去的十年里,许多计算机视觉研究方向的重要团部队在 3D 人脸重建以及人脸对齐方面取得了不少使人兴奋的进展。其中最主要的是将卷积神经网络做为一种人工神经网络应用于这方面。然而,因为用于映射的人脸 3D 模型的不完善,重建后的空间具备局限性,这就致使大部分人脸 3D 重建放方法的效果并不理想。git
上图是 PRN 的结构,绿色的矩形表示残差块,蓝色的矩形表示转置卷积层github
在最近的一篇论文中,Yao Feng 团队提出一种端到端的方法——位置映射地图网络 (PRN),该方法将稠密对齐和重建 3D 形状联合起来解决。在人脸 3D 对齐和重建方面,该方法在多个数据库上都远超以前的方法。数据库
更详细地说,他们设计了一种 UV 位置映射(https://en.wikipedia.org/wiki/UV_mapping ),它是一种记录了全部面部点云三维坐标的二维图像,在每一个 UV 多边形中都保留了语义信息。而后使用一种加权损失训练一个简单的编码 - 解码网络,这个网络从单张 2D 面部图像获得 UV 位置映射。微信
上图是该方法的部分结果,奇数行是人脸对齐结果 (仅显示 68 点),偶数行是 3d 重建结果
网络
这篇论文的贡献主要在这些方面:app
首次使用端到端的方式解决了人脸对齐和三维人脸重建的问题,该方法不受低维空间的限制。框架
为了直接获得 3D 人脸结构和稠密对齐,咱们开发了一种名为 UV 位置面的表示方法,它记录了 3D 人脸的位置信息,并提供与 UV 空间上每一个点所对应的语义信息。性能
在训练阶段,咱们提出了一种权重 mask,它为位置图上每一个点分配不一样的权重,并计算权重损失。实验代表,这种设计有助于提高网络的性能。测试
最后,咱们提供了一种轻量级的框架可以达到 100fps,这个框架能够直接从单张 2D 人脸图像得到人脸的 3D 重建结果。
在 AFLW2000-3D 数据库和 Florence 数据库上,相比于目前最好的方法,该方法在 3D 人脸重建和稠密面部对齐上都相对得到了 25% 提高。
该方法的代码使用 Tensorflow 的 python 接口完成。该项目的官方网址为:https://github.com/YadiraF/PRNet 。若是你想测试一下人脸重建的效果,你须要安装如下环境:
Python 2.7(包括 numpy,skimage,scipy 库)
Tensorflow 版本需大于等于 1.4
dlib(用于人脸检测,若是可以提供人脸的边界框则不须要安装该扩展)
opencv2(用于显示测试结果)
训练好的模型能够在这里下载:百度网盘(https://pan.baidu.com/s/10vuV7m00OHLcsihaC-Adsw ),谷歌网盘(https://drive.google.com/file/d/1UoE-XuW1SDLUjZmJPkIZ1MLxvQFgmTFH/view?usp=sharing ),目前这个代码仍在开发过程当中,该团队将会不断完善并在将来提供更多灵活的功能。
用于人脸对齐:对于可见和非可见的面部关键点均可以进行稠密对齐 (68 点)。
3D 人脸重建:经过单张图片得到人脸 3D 模型关键点以及对应的颜色。结果能够保存为以.obj 为后缀的 mesh data,在 Meshlab 或者微软的 3D Builder 中能够直接加载。固然,不可见区域的纹理会由于自遮挡而产生变形。
3D 姿态估计:不一样于只用 68 个关键点进行面部姿态检测,使用 3D 模型中的全部关键点 (超过四万个) 能够得到更准确的姿态预测结果。
深度图像:
纹理编辑:能够进行数据加强,对于输入的人脸图像,能够更改其特定区域的纹理,例如眼睛:
换脸:使用另外一我的的脸部替换某个特定图像中的面部,并能够适应该图像中人脸的姿式。
克隆项目
使用百度网盘或谷歌网盘下载训练好的 PRN 模型,将他们存入路径 Data/net-data
运行测试代码
使用本身的图像测试
运行 python demo.py --help 能够得到更多帮助信息。
论文原文:
https://arxiv.org/pdf/1803.07835.pdf
英文原文:
3D Face Reconstruction with Position Map Regression Networks
https://heartbeat.fritz.ai/3d-face-reconstruction-with-position-map-regression-networks-