zoukankan      html  css  js  c++  java
  • face3d: 3D人脸处理Python开源工具

    简介

    3D 人脸是非常有趣的研究领域。face3D 是一个基于 Python 的开源项目(https://github.com/YadiraF/face3d),实现了 3D 人脸研究的众多功能。它可以处理网格数据,用形变模型生成 3D 人脸,从单张二维人脸图片和关键点重建三维图像,渲染不同光照条件的人脸。

    face3D 非常轻量化,最开始完全是基于 Numpy 写的。但有些函数(比如光栅化)不能用向量化进行优化,在 Python 中非常慢。这部分函数作者改用 C++ 编写,没有调用 OpenCV、Eigen 等大型的库,再用 Cpython 编译以供 Python 调用。

    项目作者考虑到初学者刚开始学习时应该聚焦在算法本身,同时让研究人员能够快速修改和验证他们的想法,Numpy 版本也被保留下来。此外,作者也尽量在每个函数中添加了引用的公式,以方便初学者学习基础知识、理解代码。更多的 3D 人脸研究信息,包括论文和代码,也可以在项目Github中找到。

    结构

    克隆项目仓库后,可以看到有examplesface3d两个文件夹。

    example文件夹提供了不同例子,包括代码、图像数据。

    face3D 中有mesh、mesh_numpy 和 morphable_model 3个文件夹,mesh 是网格处理的主要部分,mesh_numpy 是 mesh 的纯 Numpy 版本,morphable_model 提供了 3DMM 方法的实现。3DMM 是非常流行的3D人脸生成和重建的一个方法,具体可以参考《Regressing Robust and Discriminative 3D Morphable Models with a very Deep Neural Network》这篇论文。

    开始使用

    环境要求

    • Python 2 或 3
    • Python包:
      • numpy
      • skimage
      • scipy
      • matplotlib
      • Cython

    开始使用

    1. 克隆仓库:
    git clone https://github.com/YadiraF/face3d
    cd face3d
    
    1. 如果不是使用numpy版,需要编译c++文件:
    cd face3d/mesh/cython
    python setup.py build_ext -i
    
    1. 如果要使用3DMM模型,需要准备 BFM 文件,可参考 https://github.com/YadiraF/face3d/blob/master/examples/Data/BFM/readme.md

    接下来,就可以尝试一些例子。

    例子

    进入example文件夹,直接运行一些例子:

    3DMM

    直接输入python 2_3dmm.py就能看到3dmm的运行示例。

    3DMM生成的随机例子:

    使用了68个关键点生成的例子:

    变换

    python 3_transform.py

    修复相机位置并使用正交投影;然后变换人脸(缩放,改变pitch、yaw、roll 姿态角):

    修复obj position并使用透视投影 (fovy = 30);然后移动相机位置并旋转相机(从远到近,向下和向上,向左和向右,旋转相机):

    Image map

    python 4_light.py

    渲染图像像素中的不同属性,深度、pncc和uv坐标:

    uv map

    python 7_uv_map.py

    在uv坐标中渲染不同的属性,颜色(纹理贴图)、位置(2D面部图像和相应的位置图):

    结语

    尝试完一些例子,如果要进行更深入的研究,建议按顺序阅读例子的代码,然后阅读 mesh_numpy 的代码和原理。

  • 相关阅读:
    Python采用struct处理二进制
    OVS处理upcall流程分析
    mybatis在CRUD
    leetcode先刷_Valid Sudoku
    [TS] Implement a doubly linked list in TypeScript
    [TS] Implement a singly linked list in TypeScript
    [Python] The get() method on Python dicts and its "default" arg
    [Javascript AST] 4. Continue: Report ESLint error
    [RxJS] Learn How To Use RxJS 5.5 Beta 2
    [NPM] Update published npm packages using np
  • 原文地址:https://www.cnblogs.com/shiyanhe/p/13080804.html
Copyright © 2011-2022 走看看