如何用 InsightFace DML-CSR 在 CelebAMask-HQ 上训练人脸解析模型?
【免费下载链接】insightfaceState-of-the-art 2D and 3D Face Analysis Project项目地址: https://gitcode.com/GitHub_Trending/in/insightface
InsightFace 仓库的 parsing/dml_csr 目录包含 CVPR 2022 论文Decoupled Multi-task Learning with Cyclical Self-Regulation for Face Parsing的官方训练代码。README 声明运行环境为 PyTorch 1.7.1 + Python 3.6.2。下面的操作路径全部取自 parsing/dml_csr/README.md 与训练、测试代码的实际内容:配好 CelebAMask-HQ 数据 → 放置 ResNet-101 预训练权重 → 启动多 GPU 训练 → 用 mIoU/f1 和test.py验证结果。
1. 准备环境
README 的安装部分只有一条命令:
pip install -r requirements.txt实际执行时需要注意两点:
- 当前
parsing/dml_csr/目录下没有独立的requirements.txt,整个仓库唯一的 requirements.txt 在根目录,只包含Cython>=0.29.28、cmake>=3.22.3、numpy>=1.22.3三项,远不覆盖训练依赖。 - 直接看 train.py 和 test.py 的导入,训练代码还依赖
inplace_abn(InPlaceABN/InPlaceABNSync)、tensorboardX、cv2(OpenCV)等。
因此需要按 README 声明的 PyTorch 1.7.1 + Python 3.6.2 组合自行安装第三方库;上面的命令可以理解为最小兜底,装完仍会缺依赖。
2. 准备 CelebAMask-HQ 数据
README 的 Data 一节列出了 Helen、LaPa、CelebAMask-HQ 三个数据集的下载地址(见 parsing/dml_csr/README.md,本文不复述外部链接)。本任务只需要 CelebAMask-HQ。
数据集类真正读取的目录结构在 dataset/datasets.py 的文档字符串中给出:
CelebAMask-HQ/ ├── train/ │ ├── images/ # 0.jpg, 1.jpg ... │ ├── labels/ # 0.png, 1.png ... │ └── edges/ # 0.png, 1.png ... ├── test/ ├── train_list.txt └── test_list.txt两个必须核对的细节:
- 数据集类从
{dataset}_list.txt读取样本列表(datasets.py),dataset取train/test。每行格式为images/0.jpg labels/0.png,即图像路径与解析掩码路径以空白分隔。 - 训练时除图像、标签外还会加载
edges/下的边缘掩码(见 datasets.py 的__getitem__)。README 说边缘生成代码在generate_edge.py中提供,但该文件目前不在仓库内,边缘掩码需要自行随数据集准备或另行生成。
3. 放置 ResNet-101 预训练权重
从零训练时,主干网络用 ImageNet 预训练的 ResNet-101 权重初始化。train.py 第 47 行硬编码了文件名:
RESTORE_FROM = 'resnet101-imagenet.pth'README 说明该权重需从提供的网盘地址下载(百度盘链接为空,Google Drive 链接可用,具体地址见 README 的 Usage 一节)并放入 snapshot 文件夹。由于代码按工作目录的相对路径加载该文件,把resnet101-imagenet.pth放在运行训练命令的工作目录(即parsing/dml_csr/)即可。
4. 启动多 GPU 训练
README 只给出一种多 GPU 分布式训练命令(README 说明 InplaceABN 需要 PyTorch 的分布式数据并行):
GPU=4,5,6,7 Node=4 dataset=./datasets/CelebAMask-HQ/ snapshot=./work_dirs/ CUDA_VISIBLE_DEVICES="$GPU" python -m torch.distributed.launch --nproc_per_node="$Node" --master_port=295002 train.py --data-dir "$dataset" --random-mirror --random-scale \ --gpu "$GPU" --batch-size 7 --input-size 473,473 --snapshot-dir "$snapshot" --num-classes 19 --epochs 200 --schp-start 150在parsing/dml_csr/目录下运行(相对导入与权重文件都以此为基准)。四个变量需要按机器情况替换:
| 变量 | 说明 |
|---|---|
GPU | GPU 设备号列表,同时传给CUDA_VISIBLE_DEVICES与--gpu |
Node | 启动的进程数,需与 GPU 数量一致 |
dataset | 第 2 步准备的 CelebAMask-HQ 目录 |
snapshot | 模型快照、日志、TensorBoard 文件的保存目录 |
关键参数及取值依据:
--num-classes 19:CelebAMask-HQ 为 19 类(含背景)。train.py 该参数默认 11、test.py 默认 20,默认值互不一致,必须按 README 显式传 19。--random-mirror --random-scale:训练期随机翻转与随机缩放增广。--input-size 473,473:模型输入尺寸,训练与测试保持一致。--epochs 200 --schp-start 150:共 200 个 epoch,从第 150 个 epoch 起进入周期性自校正(SCHP)阶段——代码在每--cycle-epochs(默认 10)个 epoch 对主模型做滑动平均生成 SCHP 模型、重新估计 BN,并额外评估保存 SCHP 检查点(见 train.py)。--batch-size 7:分布式模式下每 GPU 的 batch。- 损失由
Criterion的解析、边缘与一致性项构成,权重由--lambda-s/--lambda-e/--lambda-c控制,默认 1 / 1 / 0.1(见 train.py 与 loss/criterion.py)。
README 只验证了分布式启动方式。train.py 本身存在非分布式分支(单卡时用SingleGPU包装模型,见 train.py),只有一张卡时可以省略torch.distributed.launch前缀直接运行python train.py ...,其余参数不变;该路径不是 README 给出的命令,属于可选尝试。
5. 判断训练进度与产物
训练每--eval_epochs(默认 1)个 epoch 在 test 集上评估一次,并向 snapshot 目录下的output.log写入一行(格式见 train.py):
mIoU = {...}, and f1 = {...} of epoch = 19, util now, best_f1 = ...这是代码中的日志模板,括号内的数值取决于实际训练,不是固定预期。同时产生以下文件:
checkpoint_{epoch}.pth:每个评估 epoch 保存;best.pth:对数据目录名不含 "Helen" 的情况(即 CelebAMask-HQ),当f1['Mean_F1']超过历史最佳时更新;schp_{n}_checkpoint.pth:SCHP 周期完成时额外保存;- TensorBoard 事件文件(learning_rate、loss、mIoU、f1 曲线)写入 snapshot 目录的时间戳子目录。
训练中的观察方式就是output.log中 mIoU/f1 是否随 epoch 上升,训练结束后的最终产物是最新的best.pth。
6. 用 test.py 评估模型
tests.py 可加载检查点并在 test 集上评估。README 给出的测试命令为:
python test.py --data-dir "$dataset" --out-dir "$out_dir" --restore-from "$snapshot" --gpu "$GPU" --batch-size 7 --input-size 473,473 --dataset test --num-classes 19其中$dataset、$GPU沿用训练时定义的值,$snapshot换成训练保存的目录或官方预训练模型文件,$out_dir需自行定义(例如./test_out/)。README 同时提供了官方预训练模型的下载地址,下载后可用--restore-from直接评估。
test.py 的两个行为值得注意:--gpu的值会直接写入CUDA_VISIBLE_DEVICES,权重固定加载到cuda:0;评估完成后向 stdout 打印mIoU和f1两个字典,并把每张图像的解析掩码写到{out_dir}/test/parsing/{图像名}.png。
7. 已知限制
按当前仓库状态复现时,有四点必须先知道:
- 边缘生成脚本缺失:README 提到的
generate_edge.py不在仓库中,训练必需的edges/目录需自行准备。 - 依赖清单不完整:根目录
requirements.txt覆盖不了训练依赖,inplace_abn、tensorboardX等需按环境说明自行安装。 - train.py 现存缺陷:验证集构建引用了参数解析器中未定义的
args.model_type(train.py),数据加载器使用了未导入的data.DataLoader(train.py)。README 命令是预期用法,实际运行前需要在自己的代码副本中处理这两处。 - 类别数默认值不一致:train.py 默认 11、test.py 默认 20,CelebAMask-HQ 上训练与测试都必须显式传
--num-classes 19,否则与 README 口径不符。
【免费下载链接】insightfaceState-of-the-art 2D and 3D Face Analysis Project项目地址: https://gitcode.com/GitHub_Trending/in/insightface
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考