PyTorch face recognition training/evaluation framework with configurable backbones and margin-based heads.
- 中文版文档: README_zh.md
- Training, validation (pairs), and checkpointing
- Evaluation on
.binpair datasets (e.g., LFW / CFP-FP / AgeDB-30) - YAML-driven configuration
- TensorBoard logging (optional)
- Resume training from latest run directory
train.py: training entrypointtest.py: evaluation entrypoint (pairs verification)engine/trainer.py: training loop + validation + checkpointingevaluator.py: pair verification metrics (10-fold accuracy, TAR@FAR, AUC)predictor.py: two-image similarity inference helper
models/backbones/: feature extractorsheads/: margin-based classification headsmodel_factory.py:build_model(config)factory
data/dataset.py:FaceEmoreDataset(RecordIO) +BinPairDataset(.bin)transforms.py: train/val transforms
utils/checkpoint.py: save/load checkpointslogger.py: file logger + TensorBoardmetrics.py: verification metricscommon.py: reproducibility seed helper
config/: example configs
Python 3.9+ is recommended.
pip install -r requirements.txtNotes:
mxnetis required to read InsightFace RecordIO training data (train.rec/train.idx).scikit-learnis required for ROC/AUC/TAR@FAR metrics.
Your dataset root (set by data.root in YAML) should contain:
train.rectrain.idxproperty(comma-separated, at least:num_classes,height,width)
Example:
data:
root: /data/faces_emorePut verification bins under the same dataset root:
lfw.bincfp_fp.binagedb_30.bin
Select which one to evaluate via:
eval:
bin_file: "lfw.bin"python train.py --config config/train_resnet50.yaml --device cudaResume from the latest run directory under checkpoint.save_dir:
python train.py --config config/train_resnet50.yaml --resumeKey fields used by the trainer:
seed: random seed (default: 42)device: runtime override supported via--device(cudaorcpu)model.backbone: backbone name (resnet50orfastcontextface)model.embedding_size: embedding dimension (e.g., 512)head.type: head type (arcface/cosface/adaface)head.num_classes: class count (must match training dataset classes)data.root: dataset root directorydata.batch_size,data.num_workers,data.img_sizetraining.epochs,training.optimizer,training.lr,training.weight_decay,training.momentumtraining.scheduler:multisteporcosinetraining.warmup_epochstraining.amp: enable automatic mixed precision on CUDA (default: true)training.grad_clip_norm: gradient clipping norm (default: 5.0)training.resume: enable resume logic (also can be set by--resume)checkpoint.save_dir: checkpoint root directorylogging.log_dir: log directory (files + tensorboard)eval.bin_file,eval.test_batch_size,eval.eval_freq
Evaluate a trained checkpoint against the .bin pair dataset:
python test.py \
--config config/train_resnet50.yaml \
--checkpoint checkpoints/resnet50/<RUN_TIMESTAMP>/best.pth \
--name resnet50_adafaceArtifacts:
- Log file in
logs/... - A summary text file
test_result_<name>_<timestamp>.txt
engine/predictor.py provides a simple API to compute cosine similarity between two images:
from engine.predictor import Predictor
pred = Predictor(
config_path="config/train_resnet50.yaml",
checkpoint_path="checkpoints/resnet50/<RUN_TIMESTAMP>/best.pth",
use_cpu=False,
)
score = pred.predict("a.jpg", "b.jpg")
print(score)Training seeds are set by seed in YAML. Deterministic mode can be controlled by:
deterministic: trueWhen deterministic=true, cuDNN benchmarking is disabled to improve reproducibility.