3dmm_cnn
3dmm_cnn 是一款基于深度神经网络的开源工具,旨在从单张二维人脸图像中直接重建高精度的三维人脸模型(包含形状与纹理)。它主要解决了传统三维人脸建模依赖昂贵迭代优化、计算速度慢且在复杂光照或姿态下鲁棒性不足的问题。
该工具的核心亮点在于采用端到端的深度学习架构,无需繁琐的内层循环优化即可快速回归三维参数,显著提升了处理效率。其在无约束条件下(如 LFW、YTF 等权威基准测试)表现优异,生成的三维模型参数不仅稳健,还具备出色的判别力,能直接助力人脸识别任务达到接近最先进的性能水平。此外,项目还附带了基于关键点检测进行头部姿态与表情拟合的功能代码。
3dmm_cnn 特别适合计算机视觉领域的研究人员、算法开发者以及对三维人脸重建有深度需求的技术团队使用。由于涉及 Caffe、Dlib、OpenCV 等底层库的配置与编译,且主要在 Linux 环境下运行,它要求使用者具备一定的编程基础和深度学习框架操作经验,不太适合零技术背景的普通用户直接上手。
使用场景
某安防科技公司的算法团队正在开发一套基于单张监控截图的嫌疑人三维重建系统,旨在为刑侦分析提供可多角度旋转观察的高精度人脸模型。
没有 3dmm_cnn 时
- 重建流程繁琐缓慢:传统方法依赖昂贵的迭代优化和内层循环来回归面部形状,处理单张图片往往需要数分钟,无法满足实时或批量分析需求。
- 复杂环境适应性差:在监控常见的非受控场景(如侧脸、光照不均、低分辨率)下,现有模型极易失效,难以提取鲁棒的三维特征。
- 识别区分度不足:生成的三维形态模型(3DMM)参数缺乏判别力,导致不同人员的面部特征混淆,无法直接用于高精度的身份比对。
- 纹理与形状分离处理:通常需要分步估算几何形状和表面纹理,流程割裂且容易累积误差,导致最终模型细节丢失严重。
使用 3dmm_cnn 后
- 端到端极速推理:利用 3dmm_cnn 的超深神经网络架构,直接从图像像素端到端输出三维形状和纹理,无需迭代优化,将单图处理时间缩短至毫秒级。
- 无约束场景高鲁棒性:该工具专为 LFW、YTF 等挑战性基准设计,即使在侧姿、遮挡或光照复杂的监控截图中,也能稳定回归出准确的面部参数。
- 特征判别力显著提升:提取的 3DMM 参数被证实具有极强的区分度,可直接支撑接近最先进水平的人脸识别性能,大幅降低误识率。
- 一体化高精度输出:输入一张二维图片即可直接生成包含完整几何与纹理信息的标准 PLY 文件,并附带头部姿态与表情估计,数据完整性极大提升。
3dmm_cnn 通过深度学习将原本耗时且脆弱的三维人脸重建过程,转化为在非受控环境下依然快速、精准且具备高识别价值的自动化流程。
运行环境要求
- Linux
未说明 (依赖 Caffe 框架,通常建议 NVIDIA GPU,但 README 未明确指定型号或显存)
未说明

快速开始
使用 我们的超深度神经网络 从单张图像进行 3D 面部建模的 Python 代码
新: 请参阅我们的后续项目,关于 深度姿态与 3D 表情拟合。
本页面包含端到端演示代码,可直接从无约束的 2D 面部图像中估计 3D 面部形状和纹理。对于给定的输入图像,它会生成一个标准的 PLY 格式文件,包含面部的形状和纹理信息。该代码配合我们论文 [1] 中描述的深度网络使用。在本次发布中,我们还包含了基于关键点的姿态和表情拟合的示例代码。
此版本是持续进行的人脸识别与建模项目的一部分。有关更新和更多数据,请参阅 此页面。

特性
- 端到端代码,可直接从图像像素值中用于 3D 形状和纹理估计
- 专为 无约束条件下的人脸图像 设计并测试,包括具有挑战性的 LFW、YTF 和 IJB-A 基准数据集
- 使用我们的网络提取的 3D 面部形状和纹理参数被 首次证明具有判别性和鲁棒性,在这些基准上采用 3DMM 表示法实现了接近最先进水平的人脸识别性能
- 无需昂贵的迭代优化内循环 来回归形状。因此,3DMM 拟合速度极快
- 额外的代码可用于 从检测到的面部关键点估计头部姿态和表情,并利用回归得到的 3D 面部模型
依赖项
库要求
- Dlib Python 和 C++ 库
- OpenCV Python 和 C++ 库
- Caffe(需版本 1.0.0-rc3 或以上)
- Numpy
- Python 2.7
该代码仅在 Linux 系统上进行了测试。在 Linux 上,您可以使用默认的 Python 版本,并通过包管理器或 Anaconda Python 安装所有所需的软件包。而安装 Caffe、Dlib 和 libhdf5 则需要更多的工作量。
自动安装依赖项
请参考 seva100 在 wiki 上提供的这个实用脚本。
数据要求
在运行代码之前,请确保所需的所有数据都位于以下指定文件夹中:
- 下载我们的 CNN,并将 CNN 模型(3 个文件:
3dmm_cnn_resnet_101.caffemodel、deploy_network.prototxt、mean.binaryproto)移动到CNN文件夹。 - 下载 Basel 面部模型,将
01_MorphableModel.mat移动到3DMM_model文件夹。 - 获取 3DDFA 表情模型,运行其代码生成
Model_Expression.mat,并将其移动到3DMM_model文件夹。 - 进入
3DMM_model文件夹,运行脚本python trimBaselFace.py。这将输出两个文件BaselFaceModel_mod.mat和BaselFaceModel_mod.h5。 - 下载 Dlib 面部预测模型,将
.dat文件移动到dlib_model文件夹。
安装(姿态与表情拟合代码)
- 安装 cmake:
apt-get install cmake
- 安装 OpenCV(建议 2.4.6 或更高版本):
(http://docs.opencv.org/doc/tutorials/introduction/linux_install/linux_install.html)
- 安装 libboost(建议 1.5 或更高版本):
apt-get install libboost-all-dev
- 安装 OpenGL、freeglut 和 glew:
sudo apt-get install freeglut3-dev
sudo apt-get install libglew-dev
- 安装 libhdf5-dev 库:
sudo apt-get install libhdf5-dev
- 安装 Dlib C++ 库。Dlib 应编译为共享对象。请检查其 CMakeList.txt 中的注释。
(http://dlib.net/)
- 更新
CMakeLists.txt中的 Dlib 目录路径(DLIB_INCLUDE_DIR和DLIB_LIB_DIR)。 - 创建构建目录(临时)。编译并安装到 bin 文件夹:
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=../bin ..
make
make install
这段代码应在 bin 文件夹中生成 TestVisualization。
使用方法
对一组输入图像进行 3DMM 拟合
- 进入
demoCode文件夹。演示脚本可通过命令行使用,语法如下:
$ 用法:python testBatchModel.py <inputList> <outputDir> <needCrop> <useLM>
其中参数说明如下:
<inputList>是一个文本文件,每行包含一张输入图像的路径。<outputDir>是输出目录的路径,PLY 文件将存储于此。<needCrop>指示是否需要对图像进行裁剪(1)或不裁剪(0)。默认为 1。如果您的输入图像尺寸相等(正方形),且带有类似 CASIA 的 [2] 边界框,则可以将<needCrop>设置为 0。否则,必须设置为 1。<useLM>是一个选项,用于决定是否使用检测到的关键点来细化边界框(1)或不细化(0)。默认为 1。
<inputList> 示例:
data/1.jpg data/2.jpg ....
- 演示代码应产生类似如下的输出:
user@system:~/Desktop/3dmm_release$ python testBatchModel.py input.txt out/
> 准备图像 data/1.jpg:
> 检测到 1 张人脸
> 准备图像 data/2.jpg:
> 检测到 1 张人脸
> 加载 CNN 模型以回归 3D 形状和纹理!
> 加载 Basel 面部模型以生成 3D 输出!
> 处理图像:tmp_ims/2.png 2.png 1/2
> 写入 3D 文件:out//2.ply
> 处理图像:tmp_ims/1.png 1.png 2/2
> 写入 3D 文件:out//1.ply
最终的 3D 形状和纹理可以使用标准的现成 3D(PLY 文件)可视化软件进行显示,例如 MeshLab。使用 MeshLab,输出可能如下所示:
user@system:~/Desktop/3dmm_release$ meshlab out/1.ply
user@system:~/Desktop/3dmm_release$ meshlab out/2.ply
这将产生类似以下的效果:

基于单张输入图像的3D人脸建模 + 姿态与表情估计
- 进入
demoCode文件夹。演示脚本可以通过命令行使用,语法如下:
$ 用法:python testModel_PoseExpr.py <outputDir> <save3D>
其中参数说明如下:
<outputDir>是输出目录的路径,3DMM(以及 ply)文件将存储在此目录中。<save3D>是一个选项,用于决定是否保存 ply 文件(1 表示保存,0 表示不保存)。默认值为 1。
- 程序会弹出一个对话框,用于选择输入图像。随后程序将利用 CNN 模型估计 3DMM 参数,并进一步估计姿态和表情,最后通过 C++ 程序可视化结果。
示例:
user@system:~/Desktop/3dmm_release$ python testModel_PoseExpr.py out/
(选择 `Anders_Fogh_Rasmussen_0004.jpg`)
> 准备图像 /home/anh/Downloads/PoseExprFromLM-master/demoCode/data/Anders_Fogh_Rasmussen_0004.jpg:
检测到的人脸数量:1
> CNN 模型已加载,用于回归 3D 形状和纹理!
> 巴塞尔人脸模型已加载,用于生成 3D 输出!
*****************************************
** Caffe 加载 : 1.007 秒
** 图像裁剪 : 0.069 秒
** 3D 建模 : 1.145 秒
*****************************************
> 正在写入 3D 文件:out/Anders_Fogh_Rasmussen_0004.ply
> 姿态与表情估计
加载 ../3DMM_model/BaselFaceModel_mod.h5
** 姿态+表情拟合:0.153 秒
** 可视化 :0.052 秒
*****************************************
弹出窗口应类似于以下所示:

引用
如果您觉得这项工作有用,请使用以下 BibTeX 格式引用我们的论文 [1]:
@inproceedings{tran2017regressing,
title={Regressing Robust and Discriminative 3D Morphable Models with a very Deep Neural Network},
author={Tran, Anh Tuan and Hassner, Tal and Masi, Iacopo and Medioni, Gerard},
booktitle={Computer Vision and Pattern Recognition (CVPR)},
year={2017}
}
故障排除
问题:旧版 Caffe 引擎
"F0210 10:49:17.604714 24046 net.cpp:797] Check failed:
target_blobs.size() == source_layer.blobs_size() (5 vs. 3) 不兼容的 blob 数量,层为 bn_conv1"
解决方案:安装 Caffe 1.0.0-rc3 或更高版本。
有关 Caffe 版本的更多信息,请参阅 https://github.com/BVLC/caffe/releases
从 Python 检查 Caffe 版本的方法如下:
In [3]: import caffe
In [4]: caffe.__version__
Out[4]: '1.0.0-rc3'
参考文献
[1] A. Tran, T. Hassner, I. Masi, G. Medioni, “使用非常深的神经网络回归鲁棒且具有判别性的 3D 形变模型”,arXiv 预印本,2016 年
[2] Dong Yi, Zhen Lei, Shengcai Liao 和 Stan Z. Li,“从零开始学习人脸表示”。arXiv 预印本 arXiv:1411.7923,2014 年。
更改记录
- 2017 年 1 月,首次发布
许可与免责声明
请参阅 此处的 LICENSE
联系方式
如有任何问题,请发送邮件至 anhttran@usc.edu、hassner@isi.edu 和 iacopoma@usc.edu,或在下方通过 GitHub 留言(需登录)。
常见问题
相似工具推荐
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
ML-For-Beginners
ML-For-Beginners 是由微软推出的一套系统化机器学习入门课程,旨在帮助零基础用户轻松掌握经典机器学习知识。这套课程将学习路径规划为 12 周,包含 26 节精炼课程和 52 道配套测验,内容涵盖从基础概念到实际应用的完整流程,有效解决了初学者面对庞大知识体系时无从下手、缺乏结构化指导的痛点。 无论是希望转型的开发者、需要补充算法背景的研究人员,还是对人工智能充满好奇的普通爱好者,都能从中受益。课程不仅提供了清晰的理论讲解,还强调动手实践,让用户在循序渐进中建立扎实的技能基础。其独特的亮点在于强大的多语言支持,通过自动化机制提供了包括简体中文在内的 50 多种语言版本,极大地降低了全球不同背景用户的学习门槛。此外,项目采用开源协作模式,社区活跃且内容持续更新,确保学习者能获取前沿且准确的技术资讯。如果你正寻找一条清晰、友好且专业的机器学习入门之路,ML-For-Beginners 将是理想的起点。
ragflow
RAGFlow 是一款领先的开源检索增强生成(RAG)引擎,旨在为大语言模型构建更精准、可靠的上下文层。它巧妙地将前沿的 RAG 技术与智能体(Agent)能力相结合,不仅支持从各类文档中高效提取知识,还能让模型基于这些知识进行逻辑推理和任务执行。 在大模型应用中,幻觉问题和知识滞后是常见痛点。RAGFlow 通过深度解析复杂文档结构(如表格、图表及混合排版),显著提升了信息检索的准确度,从而有效减少模型“胡编乱造”的现象,确保回答既有据可依又具备时效性。其内置的智能体机制更进一步,使系统不仅能回答问题,还能自主规划步骤解决复杂问题。 这款工具特别适合开发者、企业技术团队以及 AI 研究人员使用。无论是希望快速搭建私有知识库问答系统,还是致力于探索大模型在垂直领域落地的创新者,都能从中受益。RAGFlow 提供了可视化的工作流编排界面和灵活的 API 接口,既降低了非算法背景用户的上手门槛,也满足了专业开发者对系统深度定制的需求。作为基于 Apache 2.0 协议开源的项目,它正成为连接通用大模型与行业专有知识之间的重要桥梁。
PaddleOCR
PaddleOCR 是一款基于百度飞桨框架开发的高性能开源光学字符识别工具包。它的核心能力是将图片、PDF 等文档中的文字提取出来,转换成计算机可读取的结构化数据,让机器真正“看懂”图文内容。 面对海量纸质或电子文档,PaddleOCR 解决了人工录入效率低、数字化成本高的问题。尤其在人工智能领域,它扮演着连接图像与大型语言模型(LLM)的桥梁角色,能将视觉信息直接转化为文本输入,助力智能问答、文档分析等应用场景落地。 PaddleOCR 适合开发者、算法研究人员以及有文档自动化需求的普通用户。其技术优势十分明显:不仅支持全球 100 多种语言的识别,还能在 Windows、Linux、macOS 等多个系统上运行,并灵活适配 CPU、GPU、NPU 等各类硬件。作为一个轻量级且社区活跃的开源项目,PaddleOCR 既能满足快速集成的需求,也能支撑前沿的视觉语言研究,是处理文字识别任务的理想选择。
tesseract
Tesseract 是一款历史悠久且备受推崇的开源光学字符识别(OCR)引擎,最初由惠普实验室开发,后由 Google 维护,目前由全球社区共同贡献。它的核心功能是将图片中的文字转化为可编辑、可搜索的文本数据,有效解决了从扫描件、照片或 PDF 文档中提取文字信息的难题,是数字化归档和信息自动化的重要基础工具。 在技术层面,Tesseract 展现了强大的适应能力。从版本 4 开始,它引入了基于长短期记忆网络(LSTM)的神经网络 OCR 引擎,显著提升了行识别的准确率;同时,为了兼顾旧有需求,它依然支持传统的字符模式识别引擎。Tesseract 原生支持 UTF-8 编码,开箱即用即可识别超过 100 种语言,并兼容 PNG、JPEG、TIFF 等多种常见图像格式。输出方面,它灵活支持纯文本、hOCR、PDF、TSV 等多种格式,方便后续数据处理。 Tesseract 主要面向开发者、研究人员以及需要构建文档处理流程的企业用户。由于它本身是一个命令行工具和库(libtesseract),不包含图形用户界面(GUI),因此最适合具备一定编程能力的技术人员集成到自动化脚本或应用程序中