注:本文基于Windows系统,PyTorch运行平台为cpu。

一、准备工作

1.1 下载代码

地址:https://github.com/YadiraF/DECA
可以直接下载代码压缩包(DECA-master.zip),并解压文件,为了方便说明,本文把根目录记为DECA。

1.2 下载FLAME2020

FLAME2020是德国马普研究所(马克斯·普朗克学会)做的FLAME model (Faces Learned with an Articulated Model and Expressions),其官网地址:https://flame.is.tue.mpg.de/,先要email注册账号,很快邮箱会收到一个确认邮件,点击确认链接后就注册成功了。最后登录官网后在Download页面下载(如下图);也可以直接下载:https://download.is.tue.mpg.de/download.php?domain=flame&sfile=FLAME2020.zip&resume=1。

下载后的文件FLAME2020.zip直接解压,把其中的generic_model.pkl拷贝到DECA\data下。

1.3 下载DECA model

下载地址是:https://drive.google.com/file/d/1rp8kdyLPvErw2dTmqtjISRVvQLj6Yzje/view,也可在此下载。
注意:deca_model.tar不是压缩文件,直接放到DECA\data下使用。

1.4 下载FLAME_albedo_from_BFM.npz

注:这个是选用,可不用下载。
FLAME_albedo_from_BFM.npz可从https://github.com/TimoBolkart/BFM_to_FLAME按照README方法获取,也可在此下载。

二、安装环境

2.1 安装requirements.txt里面依赖包

使用PyTorch是的LTS(1.8.2)CPU版,所以Python版本是3.8,其它包版本如下:

Python==3.8
PyTorch==1.8.2
torchvision==0.9.2
numpy==1.23
scipy==1.4.1
chumpy==0.70
scikit-image==0.15
opencv-python==4.1.2.30
pyyaml==5.1.1
face-alignment==1.3.5
yacs==0.1.8
kornia==0.4.1

2.2 安装PyTorch3D

因为这里使用CPU平台,所以要使用PyTorch3D。Windows系统安装PyTorch3D比较麻烦,首先要下载源码。这里使用PyTorch3D==0.70,下载地址:https://codeload.github.com/facebookresearch/pytorch3d/zip/refs/tags/v0.7.0,完成后解压。
根据README说明,首先安装如下包:

fvcore==0.1.5.post20220512
iopath==0.1.10

然后IDE中setup.py设置Run Configuration Parameters为“install”执行(如下),执行过程中有警告,可以忽略。

python setup.py install

执行完成后,可用如下代码测试一下安装是否成功:

import pytorch3dprint(pytorch3d.__version__)

三、修改代码

3.1 修改FaceAlignment运行平台

因为运行在CPU上,源代码FaceAlignment默认运行平台是CUDA,所以做如下修改:

  1. DECA\decalib\datasets\detectors.py:Line-20
class FAN(object):def __init__(self, device=None): # ←def __init__(self, device=None)import face_alignment# ↓self.model = face_alignment.FaceAlignment(face_alignment.LandmarksType._2D, flip_input=False)if device is None:self.model = face_alignment.FaceAlignment(face_alignment.LandmarksType._2D, flip_input=False)else:self.model = face_alignment.FaceAlignment(face_alignment.LandmarksType._2D,flip_input=False, device=device)
  1. DECA\decalib\datasets\datasets.py:Line-49
 # ↓def __init__(self, testpath, iscrop=True, crop_size=224, scale=1.25, face_detector='fan', #              sample_step=10):def __init__(self, testpath, iscrop=True, crop_size=224, scale=1.25, face_detector='fan', sample_step=10, device=None):'''testpath: folder, imagepath_list, image path, video path'''if isinstance(testpath, list):self.imagepath_list = testpathelif os.path.isdir(testpath): self.imagepath_list = glob(testpath + '/*.jpg') +  glob(testpath + '/*.png') + glob(testpath + '/*.bmp')elif os.path.isfile(testpath) and (testpath[-3:] in ['jpg', 'png', 'bmp']):self.imagepath_list = [testpath]elif os.path.isfile(testpath) and (testpath[-3:] in ['mp4', 'csv', 'vid', 'ebm']):self.imagepath_list = video2sequence(testpath, sample_step)else:print(f'please check the test path: {testpath}')exit()# print('total {} images'.format(len(self.imagepath_list)))self.imagepath_list = sorted(self.imagepath_list)self.crop_size = crop_sizeself.scale = scaleself.iscrop = iscropself.resolution_inp = crop_sizeif face_detector == 'fan':# ↓self.face_detector = detectors.FAN()if device is None:self.face_detector = detectors.FAN()else:self.face_detector = detectors.FAN(device)
  1. DECA\demos\demo_reconstruct.py:Line-40
    # ↓testdata = datasets.TestData(args.inputpath, iscrop=args.iscrop, face_detector=args.detector,#                              sample_step=args.sample_step)testdata = datasets.TestData(args.inputpath, iscrop=args.iscrop, face_detector=args.detector, sample_step=args.sample_step, device=device)
  1. DECA\demosdemo_transfer.py:Line-35
    # ↓testdata = datasets.TestData(args.image_path, iscrop=args.iscrop, face_detector=args.detector)testdata = datasets.TestData(args.image_path, iscrop=args.iscrop, face_detector=args.detector, device=device)# ↓expdata = datasets.TestData(args.exp_path, iscrop=args.iscrop, face_detector=args.detector)expdata = datasets.TestData(args.exp_path, iscrop=args.iscrop, face_detector=args.detector, device=device)
  1. DECA\demos\demo_teaser.py:Line-39
    # ↓testdata = datasets.TestData(args.inputpath, iscrop=args.iscrop, face_detector=args.detector)testdata = datasets.TestData(args.inputpath, iscrop=args.iscrop, face_detector=args.detector, device=device)# ↓expdata = datasets.TestData(args.exp_path, iscrop=args.iscrop, face_detector=args.detector)expdata = datasets.TestData(args.exp_path, iscrop=args.iscrop, face_detector=args.detector, device=device)

3.2 修改Model载入参数

DECA\decalib\deca.py:Line-89

            # ↓checkpoint = torch.load(model_path)checkpoint = torch.load(model_path, map_location=self.device)

3.3 添加extract_tex

extract_tex可根据需要设置为True或False。
DECA\decalib\utils\config.py:Line-43

cfg.model.use_tex = True
# ↓增加extract_tex设置
cfg.model.extract_tex = True

四、运行Demo

4.1 人脸重建(3D Face Reconstruction)

运行参数如下,如果没有下载FLAME_albedo_from_BFM.npz,“–useTex True”要删掉。

python demos\demo_reconstruct.py --inputpath TestSamples\examples --savefolder TestSamples\examples\results
--saveDepth True --saveObj True --device cpu --rasterizer_type pytorch3d --useTex True

或者在PyCharm等IDE执行,在demo_reconstruct.py的Run Configuration Parameters设置如下:

--inputpath ..\TestSamples\examples
--savefolder ..\TestSamples\examples\results
--saveDepth True
--saveObj True
--device cpu
--rasterizer_type pytorch3d
--useTex True

说明:inputpath是输入图片路径,savefolder保存结果路径。CPU执行耗时约为两分钟。部分结果如下:

4.2 表情迁移(Expression Transfer)

python demos\demo_transfer.py --image_path TestSamples\examples\xxx.jpg --exp_path TestSamples\exp\7.jpg
--savefolder TestSamples\examples\results --device cpu --rasterizer_type pytorch3d

或者在PyCharm等IDE执行,在demo_transfer.py的Run Configuration Parameters设置如下:

--image_path ..\TestSamples\examples\xxx.jpg
--exp_path ..\TestSamples\exp\7.jpg
--savefolder ..\TestSamples\examples\results
--device cpu
--rasterizer_type pytorch3d

说明:image_path是输入图片地址,exp_path是要迁移的表情图片,savefolder保存结果路径。CPU执行耗时约为1分钟。结果如下:

4.3 姿态和表情动画(Reposing and Animatio)

python demos\demo_teaser.py --inputpath TestSamples\examples\xxx.jpg --exp_path TestSamples\exp
--savefolder TestSamples\teaser\results --device cpu --rasterizer_type pytorch3d

或者在PyCharm等IDE执行,在demo_teaser.py的Run Configuration Parameters设置如下:

--inputpath ..\TestSamples\examples\xxx.jpg
--exp_path ..\TestSamples\exp
--savefolder ..\TestSamples\teaser\results
--device cpu
--rasterizer_type pytorch3d

说明:inputpath是输入图片地址,exp_path是要迁移的表情文件夹,savefolder保存结果路径。CPU执行耗时约为23分钟。结果如下:

五、常见错误

5.1 找不到指定的模块

报错信息如下:

ImportError: DLL load failed while importing win32file: 找不到指定的模块

这是IDE工具在使用Anaconda虚拟环境的时候经常会出现的DLL加载失败,解决办法在Run Configuration➤Environment Variables设置如下参数:

CONDA_DLL_SEARCH_MODIFICATION_ENABLE = 1

PyCharm设置如下图:

5.2 UserWarning: Mtl file does not exist

报错信息如下:

X:\Anaconda\envs\xxx\lib\site-packages\pytorch3d-0.7.0-py3.8-win-amd64.egg\pytorch3d\io\obj_io.py:533:
UserWarning: Mtl file does not exist: X:\xxx\template.mtl  warnings.warn(f"Mtl file does not exist: {f}")

这是PyTorch3D的警告信息,不影响执行结果,可忽略。

DECA(Detailed Expression Capture and Animation)入门之3D人脸重建Demo相关推荐

  1. 3D人脸重建之DECA

    论文:Learning an Animatable Detailed 3D Face Model from In-The-Wild Images Github:https://github.com/Y ...

  2. DECA的3D人脸重建(3D face reconstruction)

    DECA的3D人脸重建(3D face reconstruction) flyfish DECA 全称 Detailed Expression Capture and Animation 论文名字&l ...

  3. 单目3D人脸重建DECA

    #SIGGRAPH2021单目3D人脸重建,皱纹可以随着表情而产生自然变化,更加逼真. 代码已开源DECA: Learning an Animatable Detailed 3D Face Model ...

  4. DECA:基于单张静态图像,进行 3D 人脸建模

    作者|神经三羊 来源|HyperAI超神经 By 超神经 内容概要:本文罗列了 3D 人脸建模常用的 3 大方法,以及基于静态图像进行人脸建模的 3 个方法.文末分享了一个 DECA 教程. 关键词: ...

  5. 论文项目复现笔记----Emotion Driven Monocular Face Capture and Animation

    一.项目相关 项目代码网址:GitHub - radekd91/emoca: Official repository accompanying a CVPR 2022 paper EMOCA: Emo ...

  6. ADO.NET Entity Framework 入门示例向导(附Demo程序下载)

    ADO.NET Entity Framework 入门示例向导(附Demo程序下载) ADO.NET Entity Framework 是.Net Framework 3.5 SP1 引入的实体框架, ...

  7. TensorFlow入门:第一个机器学习Demo

    TensorFlow入门:第一个机器学习Demo 2017年12月13日 20:10:23 阅读数:8604 本文主要通过一个简单的 Demo 介绍 TensorFlow 初级 API 的使用方法,因 ...

  8. 视频教程-Layabox3D游戏开发入门-微信3D小游戏案例 -微信开发

    Layabox3D游戏开发入门-微信3D小游戏案例 有多年Unity程序开发经验,有策划和美术设计的经验.愿意在csdn这个平台和大家一起分享! 金龙 ¥29.00 立即订阅 扫码下载「CSDN程序员 ...

  9. 3dmax入门 | 学3d建模必备软件技能基础教学

    3dmax入门❗️学3d建模必备软件技能基础认知|||学3d建模基本都是从3dmax入手开始学习的 这篇笔记就来教零基础小白小伙伴们来认识3dmax 3ds max界面组成有以下几部分: 1.标题栏: ...

最新文章

  1. Linux获取系统当前时间(精确到毫秒)
  2. HashMap为何从头插入改为尾插入
  3. 智能水位检测系统proteus_基于单片机控制的智能检测系统Proteus仿真设计研究
  4. 反射中getDeclaredConstructors和getConstructors两个方法的区别,然后setAccessible什么时候用,作用是什么?
  5. 0x84bb0001 sqlserver_sqlserver 2000 远程连接 服务器的解决方案
  6. 学习汇编图文. 寄存器的特殊用法
  7. leecode - 入门 -- 双指针总结
  8. Chromium OS编译手记
  9. 不一样的摊余成本法债基—终篇
  10. nginx的工作原理及配置
  11. 欧姆龙plc解密实例_OMRON PLC的加密和解密方法
  12. 【ISO9126】软件质量模型的介绍(软件质量管理的六大特征和二十七个子特征)
  13. vue页面引用百度地图怎么让百度logo不显示
  14. ML之SHAP:机器学习可解释性之SHAP值之理解单样本单特征预测
  15. Hadoop-day07(MapReduce三个小案例)
  16. Python ------ return返回值等
  17. Springboot中使用freemarker动态生成word文档
  18. 【笔记】SSH服务:基本概述、相关命令“ssh、scp、sftp”、验证方式、场景实践、安全优化
  19. 桂 林 理 工 大 学实 验 报 告实验五 数组
  20. 主子式、顺序主子式、余子式、代数余子式

热门文章

  1. http://user.qzone.qq.com/18398259/infocenter?ptlang=2052
  2. Google插件Performance工具进行性能分析
  3. windows下软件推荐
  4. 微信小程序设置wxss背景图片
  5. 今天聊聊为什么说做外贸推广选谷歌比脸书好?
  6. Spring声明式事务@Transactional 注解参数详解
  7. 神经网络学习小记录14——slim常用函数与如何训练、保存模型
  8. 格式化硬盘时出现“由于i/o设备错误,无法运行此项请求”错误提示,如何解决?
  9. 初学者如何熟练的做出满意的一款游戏特效?
  10. 帮考网入选2014年最具口碑影响力在线教育机构