DECA: Detailed Expression Capture and Animation(SIGGRAPH2021)环境配置 与 集成扩展示例

关于 DECA 项目

DECA (Detailed Expression Capture and Animation) 是在 SIGGRAPH 2021 发布的一项研究项目,主要用于详细捕获面部特征和表情并实现参数化建模和动画化。

项目的主要资源和相关信息如下:

本文将介绍笔者在自己环境下对 DECA 项目的复现及环境配置方法。


环境配置

系统环境

建议在 Linux 环境下进行配置

  • 系统版本:笔者使用 WSL 2 + Ubuntu 22.04.3 LTS

Conda 环境

Miniconda 安装

在 WSL 的 Ubuntu 环境中安装 Miniconda

  1. 下载Miniconda安装脚本:
    wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
  2. 赋予脚本执行权限:
    chmod +x Miniconda3-latest-Linux-x86_64.sh
  3. 运行安装脚本:
    ./Miniconda3-latest-Linux-x86_64.sh

DECA 的 Python 环境配置

  1. 进入 DECA 项目的目录:
    .cd <DECA 项目路径>
  2. 配置 Conda 的清华源以加快镜像下载(可跳过):
    conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  3. 创建并激活 DECA 的 Conda 环境:
    conda create -n deca-env python=3.7
    conda activate deca-env
  4. 配置 pip 的清华源(可跳过):
    pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
  5. 安装 DECA 所需的依赖:
    pip install -r requirements.txt

模型准备

在 DECA 项目目录下的 /data 文件夹中放置以下模型文件:

  1. FLAME2020 模型:下载,解压得到三个 pkl 文件,并放置到 /data 目录
  2. DECA 模型:下载,并直接放置到 /data 目录
  3. FLAME_albedo模型:下载,并直接放置到 /data 目录

测试配置环境

Demo 测试运行

在 DECA 项目目录下,运行以下命令以测试 DECA 的重建功能

python demos/demo_reconstruct.py -i TestSamples/examples --saveDepth True --saveObj True

常见问题及可能解决方案

1. ImportError: libGL.so.1

报错信息

Traceback (most recent call last):
  File "demos/demo_reconstruct.py", line 17, in <module>
    import cv2
  File "/root/miniconda3/envs/deca-env/lib/python3.7/site-packages/cv2/__init__.py", line 181, in <module>
    bootstrap()
  File "/root/miniconda3/envs/deca-env/lib/python3.7/site-packages/cv2/__init__.py", line 153, in bootstrap
    native_module = importlib.import_module("cv2")
  File "/root/miniconda3/envs/deca-env/lib/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
ImportError: libGL.so.1: cannot open shared object file: No such file or directory

报错分析:

OpenCV 在运行时需要 libGL.so.1,这是一个动态库文件,但系统中未安装它所属的包。

解决方案:

安装必要的库:

sudo apt install -y libgl1-mesa-glx libglib2.0-0

2. AttributeError: _2D

报错信息

Traceback (most recent call last):
  File "demos/demo_reconstruct.py", line 131, in <module>
    main(parser.parse_args())
  File "demos/demo_reconstruct.py", line 40, in main
    testdata = datasets.TestData(args.inputpath, iscrop=args.iscrop, face_detector=args.detector, sample_step=args.sample_step)
  File "/mnt/<你的 DECA 项目路径>/DECA/decalib/datasets/datasets.py", line 71, in __init__
    self.face_detector = detectors.FAN()
  File "/mnt/<你的 DECA 项目路径>/DECA/decalib/datasets/detectors.py", line 22, in __init__
    self.model = face_alignment.FaceAlignment(face_alignment.LandmarksType._2D, flip_input=False)
  File "/root/miniconda3/envs/deca-env/lib/python3.7/enum.py", line 354, in __getattr__
    raise AttributeError(name) from None
AttributeError: _2D

报错分析:

face_alignment 模块的版本不兼容,缺少 _2D 属性。

解决方案:

  1. 降级 face_alignment 到兼容版本
    pip uninstall face_alignment
    pip install face_alignment==1.1.1
  2. 或在安装 DECA 依赖前,修改 requirements.txt 文件,将以下内容(12行):
    face-alignment
    改为:
    face-alignment==1.1.1

3. PyTorch CUDA 不支持

报错信息

/root/miniconda3/envs/deca-env/lib/python3.7/site-packages/torch/cuda/__init__.py:125: UserWarning:
NVIDIA GeForce RTX 3070 Laptop GPU with CUDA capability sm_86 is not compatible with the current PyTorch installation.
The current PyTorch install supports CUDA capabilities sm_37 sm_50 sm_60 sm_70 sm_75.
If you want to use the NVIDIA GeForce RTX 3070 Laptop GPU GPU with PyTorch, please check the instructions at https://pytorch.org/get-started/locally/

  warnings.warn(incompatible_device_warn.format(device_name, capability, " ".join(arch_list), device_name))

报错分析:

当前安装的 PyTorch 版本与 GPU 的 CUDA 版本不兼容。

由于笔者的环境是 NVIDIA GeForce RTX 3070 GPU 使用的是 sm_86 架构,与当前的 PyTorch 1.6.0 只支持 sm_37sm_50sm_60sm_70sm_75 的 CUDA 架构不兼容。

解决方案:

  1. 卸载当前的 PyTorch 和 torchvision:
    pip uninstall torch torchvision
  2. 安装兼容(与 CUDA 11.7 匹配)的版本:
    pip install torch torchvision --index-url https://download.pytorch.org/whl/cu117

4. Command ‘which c++’ returned non-zero exit status 1

报错信息

Traceback (most recent call last):
  File "demos/demo_reconstruct.py", line 131, in <module>
    main(parser.parse_args())
  File "demos/demo_reconstruct.py", line 46, in main
    deca = DECA(config = deca_cfg, device=device)
  File "/mnt/<你的 DECA 项目路径>/DECA/decalib/deca.py", line 50, in __init__
    self._setup_renderer(self.cfg.model)
  File "/mnt/<你的 DECA 项目路径>/DECA/decalib/deca.py", line 53, in _setup_renderer
    set_rasterizer(self.cfg.rasterizer_type)
  File "/mnt/<你的 DECA 项目路径>/DECA/decalib/utils/renderer.py", line 41, in set_rasterizer
    extra_cuda_cflags = ['-std=c++14', '-ccbin=$$(which gcc-7)']) # cuda10.2 is not compatible with gcc9. Specify gcc 7
  File "/root/miniconda3/envs/deca-env/lib/python3.7/site-packages/torch/utils/cpp_extension.py", line 1296, in load
    keep_intermediates=keep_intermediates)
  File "/root/miniconda3/envs/deca-env/lib/python3.7/site-packages/torch/utils/cpp_extension.py", line 1518, in _jit_compile
    is_standalone=is_standalone)
  File "/root/miniconda3/envs/deca-env/lib/python3.7/site-packages/torch/utils/cpp_extension.py", line 1597, in _write_ninja_file_and_build_library
    get_compiler_abi_compatibility_and_version(compiler)
  File "/root/miniconda3/envs/deca-env/lib/python3.7/site-packages/torch/utils/cpp_extension.py", line 336, in get_compiler_abi_compatibility_and_version
    if not check_compiler_ok_for_platform(compiler):
  File "/root/miniconda3/envs/deca-env/lib/python3.7/site-packages/torch/utils/cpp_extension.py", line 290, in check_compiler_ok_for_platform
    which = subprocess.check_output(['which', compiler], stderr=subprocess.STDOUT)
  File "/root/miniconda3/envs/deca-env/lib/python3.7/subprocess.py", line 411, in check_output
    **kwargs).stdout
  File "/root/miniconda3/envs/deca-env/lib/python3.7/subprocess.py", line 512, in run
    output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command '['which', 'c++']' returned non-zero exit status 1.

报错分析:

应用时无法找到 c++ 编译器,可能是由于系统没有安装此类编译器或者路径设置有误。

由于笔者的 Ubuntu 环境不支持 gcc 7 所以只能修改配置使用 gcc 9

解决方案:

进入 <你的 DECA 项目路径>/DECA/decalibs/utils/renderer.py

  1. 确认 gcc-9c++ 是否存在:
    which gcc-9
    which c++
  2. 如果 gcc-9 存在但 c++ 不存在,创建连接:
    sudo ln -s $(which gcc-9) /usr/bin/c++
  3. 安装缺失的 gcc 或 g++:
    sudo apt install gcc-9 g++-9
  4. 修改 renderer.py 文件: 将下列代码(41行):
    extra_cuda_cflags = ['-std=c++14', '-ccbin=$$(which gcc-7)']) # cuda10.2 is not compatible with gcc9. Specify gcc 7
    修改为:
    extra_cuda_cflags = ['-std=c++14', '-ccbin=$$(which gcc-9)']) # Use gcc-9

5. 未安装 nvidia-cuda-toolkit

报错信息

Traceback (most recent call last):
  File "demos/demo_reconstruct.py", line 131, in <module>
    main(parser.parse_args())
  File "demos/demo_reconstruct.py", line 46, in main
    deca = DECA(config = deca_cfg, device=device)
  File "/mnt/<你的 DECA 项目路径>/DECA/decalib/deca.py", line 50, in __init__
    self._setup_renderer(self.cfg.model)
  File "/mnt/<你的 DECA 项目路径>/DECA/decalib/deca.py", line 53, in _setup_renderer
    set_rasterizer(self.cfg.rasterizer_type)
  File "/mnt/<你的 DECA 项目路径>/DECA/decalib/utils/renderer.py", line 41, in set_rasterizer
    extra_cuda_cflags = ['-std=c++14', '-ccbin=$$(which gcc-9)']) # cuda10.2 is not compatible with gcc9. Specify gcc 7
  File "/root/miniconda3/envs/deca-env/lib/python3.7/site-packages/torch/utils/cpp_extension.py", line 1296, in load
    keep_intermediates=keep_intermediates)
  File "/root/miniconda3/envs/deca-env/lib/python3.7/site-packages/torch/utils/cpp_extension.py", line 1518, in _jit_compile
    is_standalone=is_standalone)
  File "/root/miniconda3/envs/deca-env/lib/python3.7/site-packages/torch/utils/cpp_extension.py", line 1604, in _write_ninja_file_and_build_library
    is_standalone)
  File "/root/miniconda3/envs/deca-env/lib/python3.7/site-packages/torch/utils/cpp_extension.py", line 1708, in _prepare_ldflags
    extra_ldflags.append(f'-L{_join_cuda_home("lib64")}')
  File "/root/miniconda3/envs/deca-env/lib/python3.7/site-packages/torch/utils/cpp_extension.py", line 2230, in _join_cuda_home
    raise EnvironmentError('CUDA_HOME environment variable is not set. '
OSError: CUDA_HOME environment variable is not set. Please set it to your CUDA install root.

报错分析:

该错误表明系统中未安装 CUDA 编译工具 nvcc,导致环境变量 CUDA_HOME 未设置,从而无法找到 CUDA 安装路径,影响 PyTorch CUDA 扩展的编译。

解决方案:

  1. 确认 nvcc 是否存在:
    nvcc --version
  2. 如果不存在,安装 CUDA 工具包:
    sudo apt install nvidia-cuda-toolkit
  3. 确认 nvcc 安装成功:
    nvcc --version

运行成功结果

在 DECA 项目目录下,运行以下命令以测试 DECA 的重建功能

python demos/demo_reconstruct.py -i TestSamples/examples --saveDepth True --saveObj True

如果命令行输出类似以下内容

creating the FLAME Decoder
trained model found. load /mnt/e/0_Work/0_GameDev/FINAL/DECA/data/deca_model.tar
100%|███████████████████████████████████████████████| 9/9 [00:25<00:00,  2.83s/it]
-- please check the results in TestSamples/examples/results

恭喜你,你已经成功配置好了 DECA 的运行环境,可以到 DECA/TestSamples/examples/results 文件夹下查看重建好的示例。

默认生成结果结构如下(如使用一张图片 testImage.png):

TestSamples/
└── examples/
    ├── testImage.png
    └── results/
        ├── testImage_vis_original_size.png
        ├── testImage_vis.png
        └── testImage/
            ├── testImage.mtl
            ├── testImage.obj
            ├── testImage.png
            ├── testImage_depth.jpg
            ├── testImage_detail.obj
            └── testImage_normals.png
  • TestSamples/examples/: 初始输入图片的存放位置,例如 testImage.png
  • TestSamples/examples/results/: 运行后生成的重建结果存放位置。
    • testImage_vis_original_size.png: 可视化的原始大小图片。
    • testImage_vis.png: 缩放后的可视化图片。
    • testImage/: 包含与输入图片名称对应的多个文件,用于描述 3D 重建的细节。
      • testImage.mtl: 材质文件。
      • testImage.obj: 3D 模型文件。
      • testImage.png: albedo贴图。
      • testImage_depth.jpg: 深度图。
      • testImage_detail.obj: 带有细节的 3D 模型文件。
      • testImage_normals.png: 法线图。

集成扩展示例

混合现实具身脸部动画项目 Step 2:脸部建模与参数化描述(基于 DECA 和 FLAME)

关于混合现实具身脸部动画项目

混合现实具身脸部动画(Mixed Reality Embodied Facial Animation, MREFA)项目旨在利用 Unity AR/VR SDK 和 DA Lab 提供的的燧光AR眼镜,开发一套基于混合现实的机器人脸部动态表情动画系统

项目技术部分技术概述

  • Step 2:脸部建模与参数化描述:使用 DECA 提取脸部的参数化描述,确保生成的 FLAME(https://flame.is.tue.mpg.de/) 模型的逼真性与兼容性。

Step 2:脸部建模与参数化描述

在 Step 2 中,我们的主要目标是通过 DECA 项目从输入图片中提取 FLAME 模型的参数化描述(包括 shape、expression、pose、texture)。这一过程确保生成的脸部模型能够准确反映输入图片中的表情特征,为后续动画驱动提供基础。

对 DECA 的集成与扩展实现

我们基于 DECA 提供的开源项目实现进行定制化开发,以满足该项目的需求。

  • Github:https://github.com/LovelyFoxes/MREFA-step2-based-on-DECA
  • 主要更改点:
    1. decalib 的基础上,参考了 demos 目录下的示例脚本,编写了新的脚本 mrefa/deca_flame_params.py,用于批量处理图片并提取 FLAME 模型参数。
    2. 使用 FastAPI 实现了基于 HTTP 的接口(app.py),持从上传的图片中直接提取参数,为后续集成不同阶段的开发环境提供统一的访问方式。

示例代码

以下是 FastAPI 接口的核心代码:

import torch
from fastapi import FastAPI, File, UploadFile
from pydantic import BaseModel
import numpy as np
from PIL import Image
import tempfile

from decalib.deca import DECA
from decalib.datasets import datasets
from decalib.utils.config import cfg as deca_cfg

app = FastAPI()

# Initialize DECA model
device = "cuda"
deca_cfg.model.use_tex = True
deca_cfg.rasterizer_type = "standard"
deca = DECA(config=deca_cfg, device=device)

# Response model for FLAME parameters
class FlameParams(BaseModel):
    shape: list
    expression: list
    pose: list
    tex: list

@app.post("/deca-flame-params/", response_model=FlameParams)
async def deca_flame_params(file: UploadFile = File(...)):
    """
    API endpoint to process an image and return FLAME parameters.

    Args:
        file (UploadFile): Uploaded image file.

    Returns:
        FlameParams: JSON containing shape, expression, and pose parameters.
    """
    # Load and preprocess image
    input_image = Image.open(file.file).convert("RGB")
    with tempfile.NamedTemporaryFile(suffix=".png") as tmp:
        input_image.save(tmp.name)
        testdata = datasets.TestData(tmp.name, iscrop=True, face_detector='fan')
        data = testdata[0]
        input_tensor = data['image'].to(device)[None, ...]

        # Process image with DECA
        with torch.no_grad():
            codedict = deca.encode(input_tensor)

    # Extract parameters
    shape = codedict['shape'].cpu().numpy().tolist()
    expression = codedict['exp'].cpu().numpy().tolist()
    pose = codedict['pose'].cpu().numpy().tolist()
    tex = codedict['tex'].cpu().numpy().tolist()

    # Return as JSON
    return {"shape": shape, "expression": expression, "pose": pose, "tex": tex}

通过该代码,我们能够从图片中提取脸部的形状(shape)、表情(expression)、姿态(pose)和纹理(texture)参数,并以 JSON 格式返回。

环境配置与运行方式

  1. DECA 环境:基于文章环境配置章节配置即可。
  2. 集成环境:配置 FastAPI 环境:
    pip install fastapi uvicorn python-multipart
  3. 运行服务:使用以下命令启动 FastAPI 服务:
    uvicorn app:app --host 0.0.0.0 --port 8002
  4. 调用示例:通过 POST 请求,上传一张图片至 /deca-flame-params/ 端点,即可获取返回的参数。

常见问题及可能解决方案

1. WSL 部署服务端口在主机中的 localhost 无法访问

问题分析:

WSL 默认采用 NAT 模式,这种模式下服务端口无法直接映射到主机的 localhost,因此主机无法访问 WSL 内部的服务。为解决此问题,需要将 WSL 网络模式更改为 Mirrored 模式。

解决方案:

  1. 创建 .wslconfig 文件
    • 打开文件资源管理器,进入路径 C:/Users/<你的用户名>/
    • 在该目录下创建一个名为 .wslconfig 的文件(如果文件名不可见,请确保启用了显示文件扩展名)。
    • 编辑 .wslconfig 文件,输入以下内容:
      [wsl2]
      [experimental]
      autoMemoryReclaim=gradual
      networkingMode=mirrored
      dnsTunneling=true
      firewall=true
      autoProxy=true
  2. 重置 Windows 网络栈
    • 打开管理员权限的命令提示符或 PowerShell,依次运行以下命令:
      netsh winsock reset
      netsh int ip reset all
  3. 重启电脑
    • 重启计算机以确保配置生效。
  4. 验证端口映射
    • 启动 WSL,并在 WSL 内运行需要的服务(例如一个简单的 HTTP 服务)。
    • 在 Windows 主机上通过 localhost:<端口号> 尝试访问 WSL 中的服务。
    • 如果一切配置正确,主机应该能够正常访问 WSL 服务。

注意事项

  • 修改 .wslconfig 文件需要小心避免语法错误,确保每个选项都正确输入。
  • 重置网络栈可能会导致一些网络配置(如静态 IP 或 VPN 设置)被重置,请提前备份重要的网络配置。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
下一篇