郭建柱.
[更新]
2022.5.14
:推荐一个人脸分析的Python实现:face_pose_augmentation。2020.8.30
:ECCV-20的预训练模型和代码在3DDFA_V2上公开,版权由郭建柱和CBSR组解释。2020.8.2
:更新该项目的简单c++端口。2020.7.3
: 扩展工作Towards Fast, Accuracy and Stable 3D Dense Face Alignment被ECCV 2020接受。更多详情请参阅我的页面。2019.9.15
:一些更新,详细信息请参阅提交。2019.6.17
: 添加 zjjMaiMai 贡献的视频演示。2019.5.2
:使用 PyTorch v1.1.0 评估 CPU 的推理速度,请参阅此处和 speed_cpu.py。2019.4.27
:一个简单的渲染管道,以约 25 毫秒/帧(720p)的速度运行,有关更多详细信息,请参阅rendering.py。2019.4.24
: 提供obama的demo构建,更多详情请参见demo@obama/readme.md。2019.3.28
:一些更新。2018.12.23
:添加几个功能:深度图像估计、PNCC、PAF 功能和 obj 序列化。有关更多详细信息,请参阅dump_depth
、 dump_pncc
、 dump_paf
、 dump_obj
选项。2018.12.2
:支持无地标人脸裁剪,请参阅dlib_landmark
选项。2018.12.1
:完善代码并添加姿态估计功能,请参阅 utils/estimate_pose.py 了解更多详细信息。2018.11.17
: 优化代码并将 3d 顶点映射到原始图像空间。2018.11.11
:更新端到端推理管道:根据一张任意图像推断/序列化 3D 人脸形状和 68 个地标,请参阅下面的 readme.md 了解更多详细信息。2018.10.4
: 在可视化中添加Matlab面网格渲染演示。2018.9.9
: 在 benchmark 中添加面部裁剪的预处理。[托多]
该仓库包含论文的 pytorch 改进版本:全姿势范围内的面部对齐:3D 整体解决方案。添加了原始论文之外的几项工作,包括实时训练、训练策略。因此,这个 repo 是原始作品的改进版本。目前,该仓库发布了MobileNet-V1结构的预训练第一阶段pytorch模型、预处理的训练和测试数据集以及代码库。请注意,在 GeForce GTX TITAN X 上,每个图像的推理时间约为 0.27 毫秒(输入批次为 128 个图像作为输入批次)。
本项目将在业余时间持续更新,欢迎提出任何有意义的问题和 PR。
ALFW-2000 数据集上的几个结果(从模型Phase1_wpdc_vdc.pth.tar推断)如下所示。
# installation structions
sudo pip3 install torch torchvision # for cpu version. more option to see https://pytorch.org
sudo pip3 install numpy scipy matplotlib
sudo pip3 install dlib==19.5.0 # 19.15+ version may cause conflict with pytorch in Linux, this may take several minutes. If 19.5 version raises errors, you may try 19.15+ version.
sudo pip3 install opencv-python
sudo pip3 install cython
另外,我强烈建议使用Python3.6+而不是旧版本,因为它有更好的设计。
克隆此存储库(这可能需要一些时间,因为它有点大)
git clone https://github.com/cleardusk/3DDFA.git # or [email protected]:cleardusk/3DDFA.git
cd 3DDFA
然后,在Google Drive或百度云中下载dliblandmark预训练模型,并将其放入models
目录中。 (为了减小此存储库的大小,我删除了一些包括此模型在内的大尺寸二进制文件,因此您应该下载它:))
构建 cython 模块(只需一行即可构建)
cd utils/cython
python3 setup.py build_ext -i
这是为了加速深度估计和 PNCC 渲染,因为 Python 在 for 循环中太慢。
使用任意图像作为输入运行main.py
python3 main.py -f samples/test1.jpg
如果您可以在终端中看到这些输出,则说明运行成功。
Dump tp samples/test1_0.ply
Save 68 3d landmarks to samples/test1_0.txt
Dump obj with sampled texture to samples/test1_0.obj
Dump tp samples/test1_1.ply
Save 68 3d landmarks to samples/test1_1.txt
Dump obj with sampled texture to samples/test1_1.obj
Dump to samples/test1_pose.jpg
Dump to samples/test1_depth.png
Dump to samples/test1_pncc.png
Save visualization result to samples/test1_3DDFA.jpg
由于test1.jpg
有两个面,因此预测有两个.ply
和.obj
文件(可以通过 Meshlab 或 Microsoft 3D Builder 渲染)。深度、PNCC、PAF 和位姿估计均默认设置为 true。请运行python3 main.py -h
或查看代码以了解更多详细信息。
68个地标可视化结果samples/test1_3DDFA.jpg
和姿态估计结果samples/test1_pose.jpg
如下所示:
附加示例
python3 ./main.py -f samples/emma_input.jpg --bbox_init=two --dlib_bbox=false
就跑
python3 speed_cpu.py
在我的 MBP(13 英寸 MacBook Pro 上的 i5-8259U CPU @ 2.30GHz)上,基于PyTorch v1.1.0 ,具有单个输入,运行输出为:
Inference speed: 14.50±0.11 ms
当输入批量大小为128时,MobileNet-V1的总推理时间约为34.7ms。平均速度约为0.27ms/pic 。
训练脚本位于training
目录中。相关资源如下表。
数据 | 下载链接 | 描述 |
---|---|---|
火车配置 | 百度云或Google Drive, 217M | 包含 3DMM 参数和训练数据集文件列表的目录 |
train_aug_120x120.zip | 百度云或Google Drive,2.15G | 增强训练数据集的裁剪图像 |
测试数据.zip | 百度云或Google Drive,151M | AFLW 和 ALFW-2000-3D 测试集的裁剪图像 |
准备好训练数据集和配置文件后,进入training
目录并运行 bash 脚本进行训练。 train_wpdc.sh
、 train_vdc.sh
和train_pdc.sh
是训练脚本的示例。配置好训练集和测试集后,只需运行它们进行训练即可。以train_wpdc.sh
为例,如下:
#!/usr/bin/env bash
LOG_ALIAS=$1
LOG_DIR="logs"
mkdir -p ${LOG_DIR}
LOG_FILE="${LOG_DIR}/${LOG_ALIAS}_`date +'%Y-%m-%d_%H:%M.%S'`.log"
#echo $LOG_FILE
./train.py --arch="mobilenet_1"
--start-epoch=1
--loss=wpdc
--snapshot="snapshot/phase1_wpdc"
--param-fp-train='../train.configs/param_all_norm.pkl'
--param-fp-val='../train.configs/param_all_norm_val.pkl'
--warmup=5
--opt-style=resample
--resample-num=132
--batch-size=512
--base-lr=0.02
--epochs=50
--milestones=30,40
--print-freq=50
--devices-id=0,1
--workers=8
--filelists-train="../train.configs/train_aug_120x120.list.train"
--filelists-val="../train.configs/train_aug_120x120.list.val"
--root="/path/to//train_aug_120x120"
--log-file="${LOG_FILE}"
具体的训练参数都在bash脚本中呈现,包括学习率、小批量大小、epochs等。
首先,您应该在 test.data.zip 中下载裁剪后的测试集 ALFW 和 ALFW-2000-3D,然后解压缩并将其放在根目录中。接下来,通过提供经过训练的模型路径来运行基准代码。我已经在models
目录中提供了五个预训练模型(如下表所示)。这些模型在第一阶段使用不同的损失进行训练。由于MobileNet-V1结构的高效率,模型大小约为13M。
python3 ./benchmark.py -c models/phase1_wpdc_vdc.pth.tar
预训练模型的性能如下所示。在第一阶段,不同损耗的有效性顺序为:WPDC > VDC > PDC。而使用VDC来微调WPDC的策略取得了最好的结果。
模型 | AFLW (21 分) | AFLW 2000-3D(68 分) | 下载链接 |
---|---|---|---|
Phase1_pdc.pth.tar | 6.956±0.981 | 5.644±1.323 | 百度云或Google Drive |
Phase1_vdc.pth.tar | 6.717±0.924 | 5.030±1.044 | 百度云或Google Drive |
Phase1_wpdc.pth.tar | 6.348±0.929 | 4.759±0.996 | 百度云或Google Drive |
Phase1_wpdc_vdc.pth.tar | 5.401±0.754 | 4.252±0.976 | 在这个仓库中。 |
相信我,这个 repo 的框架可以在不增加任何计算预算的情况下实现比 PRNet 更好的性能。相关工作正在审核中,代码将在接受后发布。
人脸边界框初始化
原始论文表明,使用检测到的边界框而不是地面实况框会导致一点性能下降。因此,当前的面部裁剪方法是最稳健的。定量结果如下表所示。
人脸重建
不可见区域的纹理由于自遮挡而扭曲,因此不可见面部区域可能会显得奇怪(有点可怕)。
关于形状和表达式参数裁剪
参数裁剪加速了训练和重建,但降低了准确性,尤其是闭眼等细节。下面是一张图像,参数尺寸为 40+10、60+29 和 199+29(原始图像)。与形状相比,当涉及情感时,表情剪切对重建精度的影响更大。因此,您可以在速度/参数大小和精度之间进行权衡。剪裁权衡的建议是 60+29。
感谢您对此存储库的兴趣。如果您的工作或研究受益于此存储库,请为其加注星标?
欢迎关注我的3D人脸相关作品:MeGlass和Face Anti-Spoofing。
如果您的工作受益于此存储库,请引用下面的三个围脖。
@misc{3ddfa_cleardusk,
author = {Guo, Jianzhu and Zhu, Xiangyu and Lei, Zhen},
title = {3DDFA},
howpublished = {url{https://github.com/cleardusk/3DDFA}},
year = {2018}
}
@inproceedings{guo2020towards,
title= {Towards Fast, Accurate and Stable 3D Dense Face Alignment},
author= {Guo, Jianzhu and Zhu, Xiangyu and Yang, Yang and Yang, Fan and Lei, Zhen and Li, Stan Z},
booktitle= {Proceedings of the European Conference on Computer Vision (ECCV)},
year= {2020}
}
@article{zhu2017face,
title= {Face alignment in full pose range: A 3d total solution},
author= {Zhu, Xiangyu and Liu, Xiaoming and Lei, Zhen and Li, Stan Z},
journal= {IEEE transactions on pattern analysis and machine intelligence},
year= {2017},
publisher= {IEEE}
}
郭建珠[主页,Google Scholar]: [email protected]或[email protected] 。