data_minning / docs /PROJECT_README.md
Hnu-22-yudi's picture
Add files using upload-large-folder tool
11d0468 verified
|
Raw
History Blame Contribute Delete
9.1 kB
# 深度学习人脸识别实践作业
本项目按 `design/大作业.pptx` 完成人脸验证大作业:读取作业给定 LFW 6000 对,使用 CASIA-WebFace 训练人脸特征模型,并输出准确率、ROC、混淆矩阵、训练记录和报告。
主结果不使用他人的人脸识别预训练权重。当前最终权重由本机从 `pretrained=None``IR-ResNet18` 开始,在可下载 CASIA-WebFace 镜像上训练,并用我们自己的 IR-ResNet18 checkpoint 做 hard-example self-distillation 微调得到。
进阶实验前的可复现基线见 `baseline.md`。该 baseline 使用第 21 轮本地 scratch InceptionResnetV1 权重、MTCNN `margin=0`,LFW 10 折准确率为 84.8500%。课程要求进阶见 `advanced.md`,使用从头训练的 `IR-ResNet18 + ArcFace`,LFW 10 折准确率为 94.1167%。自选进阶见 `self_advanced.md`,最终 LFW 10 折准确率为 94.7167%。
## 环境
工作目录固定为 `/home/data1/data_mining`。已创建 conda 环境:
```bash
conda activate data_mining
```
复现环境:
```bash
bash setup_env.sh
conda activate data_mining
```
关键配置:
- GPU:NVIDIA RTX PRO 6000 Blackwell Workstation Edition,约 96GB 显存
- PyTorch:`torch==2.11.0+cu128`
- torchvision:`0.26.0+cu128`
- Python:3.10
- `facenet-pytorch==2.6.0 --no-deps`
说明:早期尝试过旧版 CUDA wheel,但 `torch 2.2.2+cu121` 不支持 Blackwell `sm_120`;当前环境使用 cu128 GPU 版并已通过 CUDA 张量运算测试。
## 数据
### CASIA-WebFace 训练集
PPT 标称 CASIA-WebFace 为 10,575 个身份、494,414 张图像。官方数据集需要申请,当前环境使用 Hugging Face 镜像 [`SaffalPoosh/casia_web_face`](https://huggingface.co/datasets/SaffalPoosh/casia_web_face) 的 20 个 parquet 分片:
- 本地目录:`data/raw/casia_webface_parquet`
- 可下载镜像总量:490,592 张
- 镜像身份类别:10,572 类,label 范围覆盖 0..10571
- 图像格式:parquet 内 PNG bytes,RGB,112x112 对齐图
差额说明:镜像比 PPT 官方数字少 3,822 张和 3 个身份标签,推测来自镜像清洗或转换;本项目已训练当前可下载镜像的全部 490,592 张。
下载命令:
```bash
python src/download_casia_webface.py
```
### LFW 测试集
- 测试对文件:`design/lfw_test_pair.txt`
- 图像目录:`data/raw/lfw-deepfunneled`
- 图像数量:13,233
- 测试对数量:6,000,其中同人 3,000 对、异人 3,000 对
- 唯一测试图片:7,701 张
官方 UMass LFW 地址在当前环境 DNS 解析失败,scikit-learn/Figshare 镜像返回 403,因此使用 Hugging Face 镜像 [`DerrickUnleashed/LFW`](https://huggingface.co/datasets/DerrickUnleashed/LFW) 的 `lfw-deepfunneled.zip`。测试协议仍使用作业提供的 6000 对文件。
下载命令:
```bash
python src/download_lfw.py
```
## 预处理
训练阶段按 PPT “数据预处理”要求实现:
- 从 parquet 解码 RGB 图片并构建 `DataLoader`
- `RandomResizedCrop(112, scale=(0.86, 1.0))`
- `RandomHorizontalFlip`
- `RandomRotation(10)`
- `ColorJitter`
- `fixed_image_standardization`
- 分片、row group、样本级随机打乱
测试阶段使用 MTCNN 人脸检测对齐,输出 112x112;最终设置为 `--mtcnn-margin 16`,比 `margin=0` 保留更多脸部边界,更接近 CASIA 镜像的 112x112 对齐分布。
## 模型与训练
Baseline 模型:
- Backbone:`InceptionResnetV1(pretrained=None, classify=False)`
- Head:ArcFace `ArcMarginProduct(512, 10572)`
- Loss:ArcFace logits + cross entropy
- Optimizer:SGD + momentum + Nesterov
- Scheduler:CosineAnnealingLR
- Mixed precision:`torch.amp.autocast` + `GradScaler`
- Batch size:512
- Workers:12
- Device:CUDA
课程进阶模型:
- Backbone:`IR-ResNet18(pretrained=None)`
- Head:ArcFace `ArcMarginProduct(512, 10572)`
- Loss/optimizer/scheduler/AMP:同 baseline
- Batch size:512
- Workers:12
- Device:CUDA
自选进阶模型:
- Backbone:`IR-ResNet18`
- Teacher:`models/advanced_ir18_arcface/epoch_020.pth`,由本项目本地训练得到
- Student:从同一 checkpoint 初始化
- Loss:hard-example weighted ArcFace CE + embedding self-distillation
- 推理结构:仍为单个 IR-ResNet18 backbone
Baseline 训练命令:
```bash
TORCH_HOME=/home/data1/data_mining/models/torch \
python src/train_casia_parquet_arcface.py \
--epochs 10 \
--batch-size 512 \
--num-workers 8 \
--output-dir models/scratch_casia_arcface \
--device cuda
TORCH_HOME=/home/data1/data_mining/models/torch \
python src/train_casia_parquet_arcface.py \
--epochs 10 \
--resume models/scratch_casia_arcface/latest.pth \
--batch-size 512 \
--num-workers 12 \
--output-dir models/scratch_casia_arcface \
--arc-margin 0.35 \
--lr 0.02 \
--device cuda
TORCH_HOME=/home/data1/data_mining/models/torch \
python src/train_casia_parquet_arcface.py \
--epochs 1 \
--resume models/scratch_casia_arcface/latest.pth \
--batch-size 512 \
--num-workers 12 \
--output-dir models/scratch_casia_arcface \
--arc-margin 0.35 \
--lr 0.002 \
--device cuda
```
第 21 轮训练日志明确记录:
```text
samples_seen: 490592
```
即当前 CASIA-WebFace 镜像的全部样本已在训练中被读取。第 22-26 轮用于 margin 调参探索,也均覆盖 490,592 张,但 LFW 最佳 checkpoint 为第 21 轮。
课程进阶训练命令:
```bash
TORCH_HOME=/home/data1/data_mining/models/torch \
python src/train_casia_parquet_arcface.py \
--backbone ir_resnet18 \
--epochs 20 \
--batch-size 512 \
--num-workers 12 \
--output-dir models/advanced_ir18_arcface \
--arc-margin 0.35 \
--lr 0.05 \
--device cuda
```
第 20 轮训练日志记录 `samples_seen: 490592`,同样覆盖当前可下载 CASIA-WebFace 镜像的全部样本。训练期间 RTX PRO 6000 利用率可到约 99%,显存约 20GB,功耗约 474W。
自选进阶训练命令:
```bash
TORCH_HOME=/home/data1/data_mining/models/torch \
python src/train_casia_hsd_arcface.py \
--epochs 5 \
--batch-size 512 \
--num-workers 12 \
--output-dir models/self_hsd_ir18_arcface \
--lr 0.003 \
--distill-weight 1.0 \
--hard-weight 1.0 \
--hard-gamma 2.0 \
--device cuda
```
自选进阶第 24 轮作为最佳 checkpoint,该轮 `samples_seen: 490592`,训练期间 GPU 利用率约 94%-99%,功耗约 484W-502W。
## 最终评测
自选进阶最终命令:
```bash
TORCH_HOME=/home/data1/data_mining/models/torch \
python src/evaluate_lfw.py \
--lfw-root data/raw/lfw-deepfunneled \
--pairs-file design/lfw_test_pair.txt \
--checkpoint models/self_hsd_ir18_arcface/epoch_024.pth \
--preprocess mtcnn \
--mtcnn-margin 16 \
--image-size 112 \
--batch-size 512 \
--num-workers 0 \
--device cuda \
--output-dir results/self_hsd_ir18_lfw_epoch24_margin16
```
评测协议:
- 对 7,701 张唯一图片提取 512 维 L2 归一化 embedding
- 对每对图片计算 cosine similarity
- 按作业 6000 对重组 10 折:每折 300 个同人对 + 300 个异人对
- 每折用其余 9 折选择阈值,在当前折测试
自选进阶最终结果:
| 指标 | 数值 |
| --- | ---: |
| LFW 10 折准确率 | 94.7167% ± 0.7819% |
| ROC AUC | 0.974148 |
| 全局最优阈值 | 0.270818 |
| 全局最优准确率 | 94.8000% |
| 10 折混淆矩阵 `[[TN, FP], [FN, TP]]` | `[[2921, 79], [238, 2762]]` |
| MTCNN 检测成功率 | 99.9870% |
输出文件:
- `results/self_hsd_ir18_lfw_epoch24_margin16/metrics.json`
- `results/self_hsd_ir18_lfw_epoch24_margin16/fold_metrics.csv`
- `results/self_hsd_ir18_lfw_epoch24_margin16/pair_scores.csv`
- `results/self_hsd_ir18_lfw_epoch24_margin16/roc_curve.png`
- `results/self_hsd_ir18_lfw_epoch24_margin16/confusion_matrix.png`
- `results/self_hsd_ir18_lfw_epoch24_margin16/score_histogram.png`
最佳本地权重:
- `models/self_hsd_ir18_arcface/epoch_024.pth`
- `models/self_hsd_ir18_arcface/best_lfw.pth` 指向第 24 轮
## 对照实验
这些结果不作为主结果,只用于验证工程选择:
| 实验 | LFW 10 折准确率 |
| --- | ---: |
| scratch epoch 10,MTCNN margin 0 | 83.4167% |
| baseline scratch epoch 21,MTCNN margin 0 | 84.8500% |
| baseline scratch epoch 21,MTCNN margin 16 | 86.4833% |
| scratch epoch 21,直接 resize 112 | 65.2333% |
| scratch epoch 22,MTCNN margin 0 | 84.7000% |
| scratch epoch 26,MTCNN margin 0 + flip TTA | 84.6833% |
| 课程进阶 IR-ResNet18 epoch 20,MTCNN margin 0 | 92.4333% |
| 课程进阶 IR-ResNet18 epoch 20,MTCNN margin 16 | 94.1167% |
| 自选进阶 HSD IR-ResNet18 epoch 24,MTCNN margin 0 | 93.4833% |
| 自选进阶 HSD IR-ResNet18 epoch 24,MTCNN margin 16 | 94.7167% |
| 外部 CASIA 预训练 FaceNet,MTCNN margin 0 | 95.8167% |
## 报告
- 项目报告:`reports/project_report.md`
- 实验总报告:`reports/final_experiment_report.md`
- Baseline 说明:`baseline.md`
- 课程进阶说明:`advanced.md`
- 自选进阶说明:`self_advanced.md`
- 汇报提纲:`reports/presentation_outline.md`
- 执行状态:`STATUS.md`
- 自我任务提示:`prompts/self_prompts.md`