我的GeneFace++部署与运行之旅

文章目录

    • 引言
    • 项目背景
      • 概述
      • 重要性分析
      • 结论
    • 环境准备
      • 1. 安装CUDA
      • 2. 安装Python依赖
      • 3. 准备3DMM模型(BFM2009)及其他数据
    • 运行官方 Demo
    • 训练自己的视频
      • 数据准备
      • 训练
      • 推理测试
    • 遇到的问题与解决方案
      • 问题一:cuda 安装完发现版本不对
      • 问题二:Data Preprocessing Error | bg.jpg not found
      • 问题三:运行较长语音时,程序被 kill
      • 问题四:视频人物的眼睛没睁开
      • 问题五:RuntimeError: Error(s) in loading state_dict for RADNeRFTorsowithSR
    • 知识点
      • 知识点一:HuBERT
        • 基本概念
        • 技术细节
        • 应用领域
        • 优势
        • 研究进展
      • 知识点二:Mel 频谱 和 F0 基频
        • Mel 频谱(Mel-spectrogram)
        • F0(基频)
        • 应用
      • 知识点三:2D landmarks
      • 知识点四:Fit 3DMM
        • 关键步骤
        • 应用

引言

在这个数字化时代,虚拟与现实的界限逐渐模糊,数字人技术以其独特的魅力和广泛应用前景,成为创新与探索的前沿领域。我有幸在个人兴趣与职业发展的双重驱动下,深入这一领域,探索其无限可能。

个人与职业的交汇点:

我的数字人之旅始于对人工智能和计算机图形学的深厚兴趣。而公司对这一新兴技术的战略布局,为我提供了一个实践和研究的绝佳平台。公司期望我能够深入探讨数字人技术,以期在未来的市场竞争中占据有利地位。

选择GeneFace++:

在众多数字人项目中,GeneFace++以其卓越的嘴型同步技术、逼真的视频生成效果和高效的系统性能脱颖而出。它不仅满足了我对技术深度的追求,也符合公司对创新应用的期待。

博客:知识的沉淀与分享:

撰写这篇博客的初衷,是希望将我在部署GeneFace++项目过程中的所学所感,沉淀成文,为自我成长留下印记。同时,我更希望能够将这份知识的力量传递给每一位对此领域抱有热情的网友。

共同成长的愿景:

我相信,通过分享我的经验和见解,可以激发更多人对数字人技术的兴趣,促进知识的交流与思想的碰撞。我期待与志同道合的朋友们一起,在这个充满挑战与机遇的领域中共同成长,探索未知。

结语:

让我们一起启程,穿梭于虚拟与现实之间,用代码编织梦想,用技术点亮未来。我诚邀您加入这场数字人的探索之旅,共同见证和创造这一领域的辉煌。

项目背景

概述

名称: GeneFace++
技术基础: 基于PyTorch的深度学习框架
核心功能: 实现实时音频驱动的3D面部动画合成
github地址: https://github.com/yerfor/GeneFacePlusPlus/tree/main

GeneFace++项目通过先进的人工智能技术,实现了一种高效、逼真的虚拟人视频合成方法。它能够根据输入的音频信号,自动生成与语音同步的嘴型和面部表情,为虚拟角色赋予更加自然和生动的表现力。

重要性分析

  • 技术先进性: GeneFace++采用了最新的深度学习算法,能够处理复杂的面部动作和表情,提供高质量的视频合成结果。
  • 开源社区支持: 作为一个开源项目,GeneFace++得到了广泛的社区支持,不断有新的功能和改进被添加到项目中。
  • 应用广泛性: 它在电影制作、游戏开发、虚拟现实、社交媒体、教育培训等多个领域都有潜在的应用价值。
  • 创新推动力: GeneFace++推动了虚拟人技术的创新,为数字娱乐和人机交互开辟了新的可能性。
  • 教育和研究价值: 该项目为学术界和教育界提供了一个实践深度学习和计算机视觉技术的平台。
  • 个性化定制: 用户可以根据自己的需求对GeneFace++进行定制和扩展,创造出独特的虚拟角色。

结论

GeneFace++项目在虚拟人视频合成领域的重要性不言而喻。它不仅提供了一种高效、逼真的视频合成解决方案,还促进了相关技术的普及和创新。随着技术的不断发展和社区的积极参与,GeneFace++有望在未来的虚拟人技术领域发挥更大的作用,为用户带来更加丰富和多样化的交互体验。

环境准备

文档链接:GeneFace++ 安装指南
部署的主机信息:

  • 火山引擎云主机:GPU计算型g1vc |ecs.g1vc.xlarge |6vCPU |26GiB|V100,ubuntu22.04

1. 安装CUDA

  • CUDA版本:推荐安装CUDA 11.7,项目已在A100/V100 GPU上进行验证。
  • CUDA路径:确保CUDA路径指向正确版本,例如 /usr/local/cuda-11.7
  • 兼容性:不支持CUDA 12或更高版本。
# cuda 版本可以在这里查看 https://developer.nvidia.com/cuda-toolkit-archive
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.0-1_all.deb
sudo dpkg -i cuda-keyring*.deb
sudo apt-get update
sudo apt-get -y install cuda=11.7.1-1
# 查看安装是否成功
ls /usr/local | grep cuda

2. 安装Python依赖

  • 安装conda
  • 创建 Python3.9 环境:conda create -n geneface python=3.9
  • 环境激活:使用Conda创建名为geneface的新环境,并激活该环境。
  • FFmpeg安装:安装带有libx264编解码器的FFmpeg,用于将图像转换为视频。
  • PyTorch安装:推荐安装PyTorch 2.0.1与CUDA 11.7,避免使用2.1以上版本以防止torch-ngp错误。
  • PyTorch3D安装:从源代码安装PyTorch3D,可能需要较长时间。
  • MMCV安装:安装Cython和OpenMIM,然后使用mim安装MMCV。
  • 其他依赖:安装音频相关的库和项目所需的其他Python包。
# 安装 conda
wget https://repo.anaconda.com/archive/Anaconda3-2024.02-1-Linux-x86_64.sh
chmod +x Anaconda3-2024.02-1-Linux-x86_64.sh
./Anaconda3-2024.02-1-Linux-x86_64.sh
# 拉取项目 apt install git
git clone https://github.com/yerfor/GeneFacePlusPlus.git 
# 进入 Python3.9 的环境 
cd <GeneFaceRoot>
source <CondaRoot>/bin/activate
conda create -n geneface python=3.9
conda activate geneface
# FFmpeg安装
conda install conda-forge::ffmpeg # ffmpeg with libx264 codec to turn images to video# 我们推荐安装torch2.0.1+cuda11.7. 已经发现 torch=2.1+cuda12.1 会导致 torch-ngp 错误
conda install pytorch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 pytorch-cuda=11.7 -c pytorch -c nvidia# 从源代码安装,需要比较长的时间 (如果遇到各种time-out问题,建议使用代理)
pip install "git+https://github.com/facebookresearch/pytorch3d.git@stable"# MMCV安装
pip install cython
pip install openmim==0.3.9
mim install mmcv==2.1.0 # 使用mim来加速mmcv安装# 其他依赖项
sudo apt-get install libasound2-dev portaudio19-dev
pip install -r docs/prepare_env/requirements.txt -v# 构建torch-ngp
bash docs/prepare_env/install_ext.sh 

3. 准备3DMM模型(BFM2009)及其他数据

你可以从这里下载或 。 解压缩后, BFM 文件夹中将包含8个文件。 移动这些文件到 /deep_3drecon/BFM/。该文件夹结构应该如下:

  • 模型下载:从提供的 Google Drive 或BaiduYun Disk (密码 r8ux)下载BFM2009模型。
  • 文件放置:将下载并解压的文件移动到<GeneFaceRoot>/deep_3drecon/BFM/目录下。
    文件夹结构示例
deep_3drecon/BFM/
├── 01_MorphableModel.mat
├── BFM_exp_idx.mat
├── BFM_front_idx.mat
├── BFM_model_front.mat
├── Exp_Pca.bin
├── facemodel_info.mat
├── index_mp468_from_mesh35709.npy
├── mediapipe_in_bfm53201.npy
└── std_exp.txt

以上是结合自身部署过程和官方教程进行整理的,如出现问题请先查阅 github 的教程

运行官方 Demo

GeneFace++ github 教程

  • 步骤1:下载预处理好的May的数据集 trainval_dataset.npy (Google Drive 或 BaiduYun Disk 提取码: 98n4), 放置在data/binary/videos/May/trainval_dataset.npy路径下。
  • 步骤2:下载预训练好的通用的audio-to-motino模型 audio2motion_vae.zip (Google Drive 或 BaiduYun Disk 提取码: 98n4) 和专用于May的motion-to-video模型 motion2video_nerf.zip (Google Drive 或 BaiduYun Disk 提取码: 98n4), 解压到./checkpoints/目录下。
  • 步骤3:激活geneface的Python环境
cd <GeneFaceRoot>
conda activate geneface
export PYTHONPATH=./
  • 步骤4: 然后执行:
python inference/genefacepp_infer.py --a2m_ckpt=checkpoints/audio2motion_vae --head_ckpt= --torso_ckpt=checkpoints/motion2video_nerf/may_torso --drv_aud=data/raw/val_wavs/MacronSpeech.wav --out_name=may_demo.mp4
  • 或者可以使用我们提供的Gradio WebUI:
python inference/app_genefacepp.py --a2m_ckpt=checkpoints/audio2motion_vae --head_ckpt= --torso_ckpt=checkpoints/motion2video_nerf/may_torso

Gradio WebUI

使用官方自带的音频文件生成的视频
[视频待审核]
使用自己上传的音频文件生成的视频
[视频待审核]

训练自己的视频

数据准备

准备一个视频(头部无遮挡、晃动不要过大),视频分辨率不要小于 512X512,将视频放置到 /data/raw/videos/ 目录下

步骤 0 将视频Crop到512x512分辨率,25FPS,确保每一帧都有目标人脸

cd <GeneFaceRoot>
# VIDIO_ID 为视频的名称,最好是英文且简单明了
export VIDEO_ID=
# crop=512:512:284:224,  284,224 为视频 Crop 开始裁剪的起始位置,具体需要根据视频中人脸的位置进行调整
ffmpeg -i data/raw/videos/${VIDEO_ID}.mp4 -filter:v "fps=25,crop=512:512:284:224" -qmin 1 -q:v 1 data/raw/videos/${VIDEO_ID}_512.mp4
mv data/raw/videos/${VIDEO_ID}.mp4 data/raw/videos/${VIDEO_ID}_to_rm.mp4
mv data/raw/videos/${VIDEO_ID}_512.mp4 data/raw/videos/${VIDEO_ID}.mp4

步骤1: 提取音频特征, 如mel, f0, hubuert

export CUDA_VISIBLE_DEVICES=0
export PYTHONPATH=./
export VIDEO_ID=
# 新建视频处理文件存放位置
mkdir -p data/processed/videos/${VIDEO_ID}
# 将视频中的音频提取出来
ffmpeg -i data/raw/videos/${VIDEO_ID}.mp4 -f wav -ar 16000 data/processed/videos/${VIDEO_ID}/aud.wav 
# 生成 aud_hubert.np 文件
python data_gen/utils/process_audio/extract_hubert.py --video_id=${VIDEO_ID}
# 生成 aud_mel_f0.npy 文件
python data_gen/utils/process_audio/extract_mel_f0.py --video_id=${VIDEO_ID}

步骤2. 提取图片

export PYTHONPATH=./
export VIDEO_ID=
export CUDA_VISIBLE_DEVICES=0
# 创建图片提取目录
mkdir -p data/processed/videos/${VIDEO_ID}/gt_imgs
# 提取图片并保存至 ${VIDEO_ID}/gt_imgs 中
ffmpeg -i data/raw/videos/${VIDEO_ID}.mp4 -vf fps=25,scale=w=512:h=512 -qmin 1 -q:v 1 -start_number 0 data/processed/videos/${VIDEO_ID}/gt_imgs/%08d.jpg
# 提取图片中的元素,生成 bg_imgs  com_imgs inpaint_torso_imgs  person_imgs  torso_imgs bg.jpg head_imgs segmaps 文件
# 若运行是出现卡主了,就使用单线程执行,再命令后面加 --force_single_process 参数
python data_gen/utils/process_video/extract_segment_imgs.py --ds_name=nerf --vid_dir=data/raw/videos/${VIDEO_ID}.mp4 

步骤3. 提取lm2d_mediapipe, Fit 3DMM

export PYTHONPATH=./
export VIDEO_ID=
# 生成 lms_2d.npy 文件, data/processed/videos/${VIDEO_ID}/lms_2d.npy
python data_gen/utils/process_video/extract_lm2d.py --ds_name=nerf --vid_dir=data/raw/videos/${VIDEO_ID}.mp4
# 生成 debug_fit_3dmm.mp4 文件, data/processed/videos/${VIDEO_ID}/debug_fit_3dmm.mp4
python data_gen/utils/process_video/fit_3dmm_landmark.py --ds_name=nerf --vid_dir=data/raw/videos/${VIDEO_ID}.mp4 --reset  --debug --id_mode=global

步骤4. Binarize(将数据打包)

export PYTHONPATH=./
export VIDEO_ID=
python data_gen/runs/binarizer_nerf.py --video_id=${VIDEO_ID}

训练

步骤1. 获取Audio2Motion模型
你可以从Google Drive 或 BaiduYun Disk (密码 9cqp) 下载预训练的Audio2Motion模型,并将模型放在 checkpoints/audio2motion_vae里。
理论在在运行 Demo 时就已经下载了

步骤2. 复制训练配置

cp -r egs/datasets/May egs/datasets/${VIDEO_ID}
# 检查配置文件,并将配置文件中的 video_id 替换成 ${VIDEO_ID},配置文件的中出现的目录路径也替换成 ${VIDEO_ID} 的目录

在这里插入图片描述

步骤3. Train Motion2Video Renderer

# 数据主备完成后会产生数据集: data/binary/videos/${VIDEO_ID}/trainval_dataset.npy 
# 训练 Head NeRF 模型
# 模型与tensorboard会被保存在 `checkpoints/<exp_name>`
CUDA_VISIBLE_DEVICES=0 python tasks/run.py --config=egs/datasets/${VIDEO_ID}/lm3d_radnerf_sr.yaml --exp_name=motion2video_nerf/${VIDEO_ID}_head --reset# 训练 Torso NeRF 模型
CUDA_VISIBLE_DEVICES=0 python tasks/run.py --config=egs/datasets/${VIDEO_ID}/lm3d_radnerf_torso_sr.yaml --exp_name=motion2video_nerf/${VIDEO_ID}_torso --hparams=head_model_dir=checkpoints/motion2video_nerf/${VIDEO_ID}_head --reset

推理测试

CUDA_VISIBLE_DEVICES=0 python inference/app_genefacepp.py --a2m_ckpt=checkpoints/audio2motion_vae --head_ckpt= --torso_ckpt=motion2video_nerf/${VIDEO_ID}_torso

遇到的问题与解决方案

问题一:cuda 安装完发现版本不对

原因:若不指定 cuda 安装版本默认会安装最新版本,此时需要卸载 cuda 后,指定版本重新安装

apt-get --purge remove cuda
apt-get -y install cuda=11.7.1-1

问题二:Data Preprocessing Error | bg.jpg not found

https://github.com/yerfor/GeneFacePlusPlus/issues/189
大概率是提取图片步骤没有执行成功(程序卡住或者报错了)

# 重跑
python data_gen/utils/process_video/extract_segment_imgs.py --ds_name=nerf --vid_dir=data/raw/videos/${VIDEO_ID}.mp4 --force_single_process

问题三:运行较长语音时,程序被 kill

大概率是内存爆了,试试勾选低内存模式
在这里插入图片描述

问题四:视频人物的眼睛没睁开

https://github.com/yerfor/GeneFacePlusPlus/issues/47

修改配置文件中的 eye_blink_dim 为 4

  • /egs/datasets/${VEDIO_ID}/lm3d_radnerf_torso.yaml
  • /egs/datasets/${VEDIO_ID}/lm3d_radnerf_sr.yaml

问题五:RuntimeError: Error(s) in loading state_dict for RADNeRFTorsowithSR

https://github.com/yerfor/GeneFacePlusPlus/issues/129

raise RuntimeError('Error(s) in loading state_dict for {}:\n\t{}'.format(
RuntimeError: Error(s) in loading state_dict for RADNeRFTorsowithSR:
size mismatch for blink_encoder.1.weight: copying a param with shape torch.Size([8, 32]) from checkpoint, the shape in current model is torch.Size([2, 32]).
size mismatch for blink_encoder.1.bias: copying a param with shape torch.Size([8]) from checkpoint, the shape in current model is torch.Size([2]).
Done

检查配置文件,参数是否一致,比如 eye_blink_dim 参数

  • /egs/datasets/${VEDIO_ID}/lm3d_radnerf_torso.yaml
  • /egs/datasets/${VEDIO_ID}/lm3d_radnerf_sr.yaml

知识点

知识点一:HuBERT

HuBERT(Hidden Unit BERT)是一种用于语音信号处理的预训练算法,它是由Facebook AI Research(FAIR)团队开发的一种自监督学习模型。HuBERT基于BERT(Bidirectional Encoder Representations from Transformers)模型,但针对音频数据进行了优化。以下是HuBERT的一些关键特点和优势:

基本概念
  • 自监督学习:HuBERT不需要标注数据,而是通过预测音频中的隐藏单元来学习语音表示。
  • 基于Transformer:HuBERT使用Transformer架构,这是NLP领域中非常成功的模型架构,通过自注意力机制来处理序列数据。
技术细节
  1. 波形编码:HuBERT将原始音频波形编码成一系列特征表示,这些特征随后被送入Transformer模型。
  2. 上下文预测:模型通过预测给定上下文中的隐藏单元来学习音频的表示,这有助于捕捉语音的语义信息。
  3. 双向表示:与BERT类似,HuBERT生成的是上下文相关的双向表示,这有助于更好地理解语音信号。
应用领域
  • 语音识别:HuBERT可以用于自动语音识别(ASR),提供高质量的语音到文本的转换。
  • 说话人识别:HuBERT的表示可以用于区分不同的说话人,适用于安全认证和个性化服务。
  • 情感分析:通过分析语音信号的情感内容,HuBERT可以用于情感识别和分析。
  • 语音合成:HuBERT的语音表示可以用于生成逼真的合成语音。
优势
  • 高效率:HuBERT能够快速学习语音的复杂特征,提供高效的训练和推理速度。
  • 泛化能力:由于自监督学习的特性,HuBERT具有良好的泛化能力,可以适应不同的语音数据和任务。
  • 端到端学习:HuBERT可以端到端地学习语音表示,无需复杂的特征工程。
研究进展

HuBERT自推出以来,已经在多个语音处理任务中取得了显著的成果,成为语音研究和工业应用中的一个有前景的方向。随着技术的不断发展,HuBERT及其变体可能会在未来的语音技术中扮演更加重要的角色。

HuBERT算法的提出,为语音信号处理领域带来了新的视角和强大的工具,推动了语音识别和相关技术的进步。

知识点二:Mel 频谱 和 F0 基频

在语音处理领域,"mel"和"F0"是两个重要的概念,它们通常用于语音分析和语音合成。

Mel 频谱(Mel-spectrogram)

Mel 频谱图是一种对声音信号进行频谱分析的方法,它基于人耳对不同频率声音的感知敏感度。Mel 频谱图的频率轴是按照 mel 刻度来划分的,这种刻度更接近人类对声音的感知。

  • Mel 刻度:Mel 刻度是一种非线性频率刻度,它将低频部分划分得更细,高频部分划分得更粗,以匹配人类听觉系统的特性。
  • Mel-spectrogram:Mel 频谱图通过将傅里叶变换后的频谱(通常是幅度谱)映射到 mel 刻度上,然后进行对数变换,最后取对数幅度的对数来生成。这样处理后,Mel 频谱图能够更有效地表示语音信号中的语义信息。
F0(基频)

F0 代表基频,它是声音信号中周期性波形的频率,可以理解为声音的音高。在语音中,F0的变化可以表达不同的语调、情感和语句的抑扬顿挫。

  • 测量 F0:可以通过测量声带振动的周期来确定 F0 的值。在语音信号处理中,F0 的检测是一个关键步骤,因为它对于语音合成和语音识别都非常重要。
  • F0 轮廓:在一段语音中,F0 随时间变化的曲线称为 F0 轮廓。通过分析 F0 轮廓,可以提取语句的语调信息和情感表达。
应用
  • 语音识别:Mel 频谱图和 F0 都可以用来改善自动语音识别系统的性能。Mel 频谱图提供了声音的频率信息,而 F0 有助于理解语句的语调。
  • 语音合成:在语音合成中,Mel 频谱图可以用来生成声音的频谱特征,而 F0 轮廓则用于控制合成语音的音高变化,使合成语音听起来更自然。
  • 音乐信息检索:在音乐领域,Mel 频谱图也用于分析音乐信号,而 F0 检测用于识别旋律线。

Mel 频谱图和 F0 是语音信号处理中的两个互补的工具,它们共同帮助我们更好地理解和生成人类语音。

知识点三:2D landmarks

2D 面部标记点(landmarks),也称为2D面部关键点,是面部特征的几何表示,通常用于计算机视觉和机器学习中的面部分析任务。以下是2D面部标记点的一些主要用途:

  1. 面部检测与定位:2D面部标记点可以用于在图像或视频中检测和定位面部的位置。

  2. 面部特征提取:通过识别面部的关键特征点,如眼角、鼻尖、嘴角等,可以提取面部的形态特征。

  3. 人脸对齐:在进行面部识别或面部分析之前,通常需要将面部图像对齐到一个标准姿态,2D面部标记点有助于实现这一点。

  4. 表情识别:面部标记点的变化可以用来识别和分析面部表情,从而推断情绪状态。

  5. 头部姿态估计:通过分析面部标记点的位置变化,可以估计头部的旋转角度和倾斜角度。

  6. 人脸识别:2D面部标记点有助于从图像中提取独特的面部特征,用于人脸识别系统。

  7. 人脸动画:在动画和娱乐行业,2D面部标记点可以用来驱动虚拟角色的面部动画。

  8. 增强现实(AR):在AR应用中,2D面部标记点可以用于实时追踪面部动作,增强用户的交互体验。

  9. 医疗应用:在某些医疗领域,2D面部标记点可以用于分析面部肌肉的运动,辅助诊断面部神经疾病。

  10. 社交媒体:在社交媒体平台,2D面部标记点技术可以用于创建有趣的面部滤镜和效果。

  11. 辅助技术:对于视觉障碍人士,2D面部标记点可以帮助开发辅助技术,如导航或识别面部表情。

2D 面部标记点的检测和分析是面部图像处理领域的基础技术之一,它们在多个领域都有广泛的应用。随着技术的发展,这些应用变得更加精细和复杂,为用户带来了更加丰富和个性化的体验。

知识点四:Fit 3DMM

"Fit 3DMM"通常指的是将一个3D形态模型(3D Morphable Model,简称3DMM)拟合到2D图像或者3D数据上的过程。3DMM是一种用于描述面部形状和外观变化的统计模型,它可以生成逼真的3D面部动画和表情。以下是拟合3DMM的一些关键步骤和应用:

关键步骤
  1. 面部检测:首先在2D图像中检测到面部的位置和大小。

  2. 2D关键点检测:在面部图像上检测出2D关键点,如眼睛、鼻子、嘴巴等特征点。

  3. 人脸对齐:使用2D关键点来对齐面部图像,确保面部特征与模型的标准姿态对齐。

  4. 3D关键点估计:根据2D关键点估计相应的3D关键点,这可能涉及到深度估计和一些先验知识。

  5. 模型拟合:将3DMM中的参数调整,以最小化模型预测的3D关键点与估计的3D关键点之间的误差。

  6. 纹理映射:将3DMM的纹理映射到拟合后的3D面部模型上,以生成逼真的外观。

  7. 优化:通过迭代优化过程,调整模型参数直到达到最佳的拟合效果。

应用
  1. 面部识别:通过拟合3DMM,可以提取出用于面部识别的特征。

  2. 面部动画:拟合后的3DMM可以用于生成动态的面部表情和嘴型动画。

  3. 虚拟现实(VR):在VR环境中,3DMM拟合可以用于创建用户的真实感虚拟形象。

  4. 增强现实(AR):在AR应用中,拟合3DMM可以用于实时面部追踪和面部效果的应用。

  5. 电影和游戏制作:在影视制作和电子游戏中,3DMM拟合可以用于生成逼真的3D角色面部。

  6. 面部重建:从单张2D图像重建3D面部模型,用于法律取证、历史人物重建等。

  7. 医疗应用:在整形外科和面部修复领域,3DMM拟合可以帮助医生进行手术规划和效果预测。

  8. 社交机器人:在社交机器人领域,3DMM拟合可以用于生成更加自然和逼真的面部表情。

拟合3DMM是一个复杂的过程,涉及到计算机视觉、机器学习、图形学等多个领域的技术。随着技术的进步,这一过程变得更加自动化和精确,为各种应用提供了强大的支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/46681.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言 底层逻辑详细阐述结构体 #结构体的声明 #结构体的初始化 #结构体成员访问 #结构体传参

文章目录 前言 一、结构体的基础知识 二、结构体的初始化 1、结构体类型声明&#xff1a; 2、结构体成员的类型 3、结构体变量的初始化&#xff1a; 三、结构体成员访问 四、结构体传参 总结 前言 基于自我理解的角度来讲结构体&#xff1b; 一、结构体的基础知识 结构是一些…

NSSCTF中24网安培训day2中web题目

[SWPUCTF 2021 新生赛]ez_unserialize 这道题目考察php反序列化的知识点 打开题目&#xff0c;发现没有提示&#xff0c;我们试着用御剑扫描目录文件&#xff0c;发现存在robots.txt的文件 接着访问这个文件&#xff0c;发现是一段php反序列化代码&#xff0c;我们需要进行序…

论文翻译:通过云计算对联网多智能体系统进行预测控制

通过云计算对联网多智能体系统进行预测控制 文章目录 通过云计算对联网多智能体系统进行预测控制摘要前言通过云计算实现联网的多智能体控制系统网络化多智能体系统的云预测控制器设计云预测控制系统的稳定性和一致性分析例子结论 摘要 本文研究了基于云计算的网络化多智能体预…

【常见开源库的二次开发】基于openssl的加密与解密——Base58比特币钱包地址——算法分析(三)

目录&#xff1a; 目录&#xff1a; 一、base58(58进制) 1.1 什么是base58&#xff1f; 1.2 辗转相除法 1.3 base58输出字节数&#xff1a; 二、源码分析&#xff1a; 2.1源代码&#xff1a; 2.2 算法思路介绍&#xff1a; 2.2.1 Base58编码过程&#xff1a; 2.1.2 Base58解码过…

Leetcode—146. LRU 缓存【中等】(shared_ptr、unordered_map、list)

2024每日刷题&#xff08;143&#xff09; Leetcode—146. LRU 缓存 先验知识 list & unordered_map 实现代码 struct Node{int key;int value;Node(int key, int value): key(key), value(value) {} };class LRUCache { public:LRUCache(int capacity): m_capacity(capa…

实战案例:用百度千帆大模型API开发智能五子棋

前随着人工智能技术的迅猛发展&#xff0c;各种智能应用层出不穷。五子棋作为一款经典的棋类游戏&#xff0c;拥有广泛的爱好者。将人工智能技术与五子棋结合&#xff0c;不仅能提升游戏的趣味性和挑战性&#xff0c;还能展现AI在复杂决策问题上的强大能力。在本篇文章中&#…

habase集群安装

解压到/opt/softs目录 tar -zxvf hbase-2.4.11-bin.tar.gz -C /opt/softs/ 改名 mv hbase-2.4.11/ hbase2.4.11 配置环境变量 修改/etc/profile vim /etc/profile 添加 #HBASE_HOME export HBASE_HOME/opt/softs/hbase2.4.11 export PATH$PATH:$HBASE_HOME/bin 修改其中的…

怎么把自己写的组件发布到npm官方仓库??

一.注册npm账号 npm官网 1.注册npm 账号 2.登陆 3.登陆成功 二.搭建一个vue 项目 具体步骤参考liu.z Z 博客 或者初始化一个vue项目 vue create XXX &#xff08;工程名字&#xff09;运行代码 npm run serve三.组件封装 1.在src文件下建一个package文件&#xff0…

借助 Aspose.Words,在 C# 中将 Word 转换为 JPG

有时我们需要将 Word 文档转换为图片&#xff0c;因为 DOC 或 DOCX 文件在不同设备上的显示可能会有所不同&#xff0c;但图像&#xff08;例如 JPG 格式&#xff09;在任何地方看起来都一样。 Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作…

【OrangePi AIpro】: 探索AI加成的开源硬件魅力

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 Orange Pi: 探索开源硬件的魅力引言Orange Pi概述OrangePi AIPro产品介绍试用体…

—张pdf怎么分割成多页,怎么把一个pdf分割

在数字化时代&#xff0c;pdf文件已经成为我们工作和生活中不可或缺的一部分。然而&#xff0c;有时候我们可能会遇到需要将一张pdf文件分割成多页的情况。无论是为了便于分享&#xff0c;还是为了满足特定的文档格式要求&#xff0c;这个任务都可能变得相当棘手。但别担心&…

zookeeper+kafka消息队列群集部署

一、消息队列 1.消息队列 消息是应用间传送的数据 消息队列是应用见的通信方式&#xff0c;消息发送后立即返回&#xff0c;由消息系统确保消息可靠传递。消息发布者只管把消息发布到 MQ 中而不用管谁来取&#xff0c;消息使用者只管从 MQ 中取消息而不管是谁发布的。这样发…

设计模式学习(二)工厂模式——抽象工厂模式+注册表

设计模式学习&#xff08;二&#xff09;工厂模式——抽象工厂模式注册表 前言使用简单工厂改进使用注册表改进参考文章 前言 在上一篇文章中我们提到了抽象工厂模式初版代码的一些缺点&#xff1a;①客户端违反开闭原则②提供方违反开闭原则。本文将针对这两点进行讨论 使用…

CSS-0_3 CSS和单位

文章目录 CSS的值和单位属性值长度单位CSS和绝对单位CSS和相对单位百分比em & rem视口 颜色单位 碎碎念 CSS的值和单位 我们知道&#xff0c;CSS是由属性和属性值所组成的表 随着CSS的发展&#xff0c;属性不说几千也有几百&#xff0c;我从来不支持去背诵所有的可能性。…

昇思25天学习打卡营第22天|基于MindSpore的红酒分类实验

基于MindSpore的红酒分类实验 K近邻算法实现红酒聚类 1、实验目的 了解KNN的基本概念&#xff1b;了解如何使用MindSpore进行KNN实验。 2、K近邻算法原理介绍 K近邻算法&#xff08;K-Nearest-Neighbor, KNN&#xff09;是一种用于分类和回归的非参数统计方法&#xff0c;…

WPF 手撸插件 一

1、本文主要使不适用第三方工具&#xff0c;纯手工的WPF主项目加载另一个WPF的项目&#xff0c;这里我们加载的是*.exe。 2、项目结构如下图。AbstractionLayer用于创建插件的接口。WPFIPluginDemo是主程序。WpfPlugin3是要加载的插件程序。 3、 AbstractionLayer中添加接口IP…

jvm常用密令、jvm性能优化、jvm性能检测、Java jstat密令使用、Java自带工具、Java jmap使用

1.jps是Java虚拟机的进程状态工具&#xff0c;用于列出正在运行的Java进程 jps命令的使用&#xff1a;cmd打开直接jps 1.1不带参数&#xff1a; jps 默认情况下&#xff0c;列出所有正在运行的 Java 进程的进程 ID 和主类名。 1.2 -l&#xff1a;显示完整的主类名或 JAR 文件…

计算机的错误计算(三十二)

摘要 在计算机的错误计算&#xff08;二十八&#xff09;与&#xff08;三十 一&#xff09;中&#xff0c;我们探讨了 Visual Studio 对 6个随机exp(x)函数的计算精度问题。根据网友的反馈&#xff0c;本节将展示 Python 对它们的输出&#xff1a;结果几乎与 Visual Studio …

MyBatis框架学习笔记(四):动态SQL语句、映射关系和缓存

1 动态 SQL 语句-更复杂的查询业务需求 1.1 动态 SQL-官方文档 &#xff08;1&#xff09;文档地址: mybatis – MyBatis 3 | 动态 SQL &#xff08;2&#xff09;为什么需要动态 SQL 动态 SQL 是 MyBatis 的强大特性之一 使用 JDBC 或其它类似的框架&#xff0c;根据不同条…

链接追踪系列-09.spring cloud项目整合elk显示业务日志

准备工作&#xff1a; 参看本系列之前篇&#xff1a;服务器安装elastic search 本机docker启动的kibana-tencent 使用本机安装的logstash。。。 本微服务实现的logstash配置如下&#xff1a; 使用腾讯云redis 启动本机mysql 启动本机docker 启动nacos,微服务依赖它作为…