[简体中文](README_cn.md) | English # Arcface-Paddle ## 1. Introduction `Arcface-Paddle` is an open source deep face detection and recognition toolkit, powered by PaddlePaddle. `Arcface-Paddle` provides three related pretrained models now, include `BlazeFace` for face detection, `ArcFace` and `MobileFace` for face recognition. - This tutorial is mainly about face recognition. - For face detection task, please refer to: [Face detection tuturial](../../detection/blazeface_paddle/README_en.md). - For Whl package inference using PaddleInference, please refer to [whl package inference](https://github.com/littletomatodonkey/insight-face-paddle). Note: Many thanks to [GuoQuanhao](https://github.com/GuoQuanhao) for the reproduction of the [Arcface basline using PaddlePaddle](https://github.com/GuoQuanhao/arcface-Paddle). ## 2. Environment Preparation Please refer to [Installation](./install_en.md) to setup environment at first. ## 3. Data Preparation ### 3.1 Download Dataset Download the dataset from [insightface datasets](https://github.com/deepinsight/insightface/tree/master/recognition/_datasets_). * MS1M_v2: MS1M-ArcFace * MS1M_v3: MS1M-RetinaFace ### 3.2 Extract MXNet Dataset to images ```shell python tools/mx_recordio_2_images.py --root_dir ms1m-retinaface-t1/ --output_dir MS1M_v3/ ``` After finishing unzipping the dataset, the folder structure is as follows. ``` MS1M_v3 |_ images | |_ 00000001.jpg | |_ ... | |_ 05179510.jpg |_ label.txt |_ agedb_30.bin |_ cfp_ff.bin |_ cfp_fp.bin |_ lfw.bin ``` Label file format is as follows. ``` # delimiter: "\t" # the following the content of label.txt images/00000001.jpg 0 ... ``` If you want to use customed dataset, you can arrange your data according to the above format. ## 4. How to Training ### 4.1 Single Node, Single GPU ```bash export CUDA_VISIBLE_DEVICES=1 python tools/train.py \ --config_file configs/ms1mv2_mobileface.py \ --embedding_size 128 \ --sample_ratio 1.0 \ --loss ArcFace \ --batch_size 512 \ --dataset MS1M_v2 \ --num_classes 85742 \ --data_dir MS1M_v2/ \ --label_file MS1M_v2/label.txt \ --fp16 False ``` ### 4.2 Single Node, 8 GPUs: #### Static Mode ```bash sh scripts/train_static.sh ``` #### Dynamic Mode ```bash sh scripts/train_dynamic.sh ``` During training, you can view loss changes in real time through `VisualDL`, For more information, please refer to [VisualDL](https://github.com/PaddlePaddle/VisualDL/). ## 5. Model Evaluation The model evaluation process can be started as follows. #### Static Mode ```bash sh scripts/validation_static.sh ``` #### Dynamic Mode ```bash sh scripts/validation_dynamic.sh ``` ## 6. Export Model PaddlePaddle supports inference using prediction engines. Firstly, you should export inference model. #### Static Mode ```bash sh scripts/export_static.sh ``` #### Dynamic Mode ```bash sh scripts/export_dynamic.sh ``` We also support export to onnx model, you only need to set `--export_type onnx`. ## 7. Model Inference The model inference process supports paddle save inference model and onnx model. ```bash sh scripts/inference.sh ``` ## 8. Model Performance ### 8.1 Performance of Lighting Model **Configuration:** * CPU: Intel(R) Xeon(R) Gold 6184 CPU @ 2.40GHz * GPU: a single NVIDIA Tesla V100 * Precison: FP32 * BatchSize: 64/512 * SampleRatio: 1.0 * Embedding Size: 128 * MS1MV2 | Model structure | lfw | cfp_fp | agedb30 | CPU time cost | GPU time cost | Inference model | | ------------------------- | ------ | ------- | ------- | -------| -------- |---- | | MobileFace-Paddle | 0.9952 | 0.9280 | 0.9612 | 4.3ms | 2.3ms | [download link](https://paddle-model-ecology.bj.bcebos.com/model/insight-face/mobileface_v1.0_infer.tar) | | MobileFace-mxnet | 0.9950 | 0.8894 | 0.9591 | 7.3ms | 4.7ms | - | * Note: MobileFace-Paddle training using MobileFaceNet_128 ### 8.2 Accuracy on Verification Datasets **Configuration:** * GPU: 8 NVIDIA Tesla V100 32G * Precison: Pure FP16 * BatchSize: 128/1024 | Mode | Datasets | backbone | Ratio | agedb30 | cfp_fp | lfw | log | checkpoint | | ------- | :------: | :------- | ----- | :------ | :----- | :--- | :--- | :--- | | Static | MS1MV3 | r50 | 0.1 | 0.98317 | 0.98943| 0.99850 | [log](https://github.com/PaddlePaddle/PLSC/blob/master/experiments/arcface_paddle/logs/static/ms1mv3_r50_static_128_fp16_0.1/training.log) | [checkpoint](https://paddle-model-ecology.bj.bcebos.com/model/insight-face/distributed/ms1mv3_r50_static_128_fp16_0.1_epoch_24.tgz) | | Static | MS1MV3 | r50 | 1.0 | 0.98283 | 0.98843| 0.99850 | [log](https://github.com/PaddlePaddle/PLSC/blob/master/experiments/arcface_paddle/logs/static/ms1mv3_r50_static_128_fp16_1.0/training.log) | [checkpoint](https://paddle-model-ecology.bj.bcebos.com/model/insight-face/distributed/ms1mv3_r50_static_128_fp16_1.0_epoch_24.tgz) | | Dynamic | MS1MV3 | r50 | 0.1 | 0.98333 | 0.98900| 0.99833 | [log](https://github.com/PaddlePaddle/PLSC/blob/master/experiments/arcface_paddle/logs/dynamic/ms1mv3_r50_dynamic_128_fp16_0.1/training.log) | [checkpoint](https://paddle-model-ecology.bj.bcebos.com/model/insight-face/distributed/ms1mv3_r50_dynamic_128_fp16_0.1_eopch_24.tgz) | | Dynamic | MS1MV3 | r50 | 1.0 | 0.98317 | 0.98900| 0.99833 | [log](https://github.com/PaddlePaddle/PLSC/blob/master/experiments/arcface_paddle/logs/dynamic/ms1mv3_r50_dynamic_128_fp16_1.0/training.log) | [checkpoint](https://paddle-model-ecology.bj.bcebos.com/model/insight-face/distributed/ms1mv3_r50_dynamic_128_fp16_1.0_eopch_24.tgz) | ### 8.3 Maximum Number of Identities **Configuration:** * GPU: 8 NVIDIA Tesla V100 32G (32510MiB) * BatchSize: 64/512 * SampleRatio: 0.1 | Mode | Precision | Res50 | Res100 | | ------------------------- | --------- | -------- | -------- | | Framework1 (static) | AMP | 42000000 (31792MiB)| 39000000 (31938MiB)| | Framework2 (dynamic) | AMP | 30000000 (31702MiB)| 29000000 (32286MiB)| | Paddle (static) | Pure FP16 | 60000000 (32018MiB)| 60000000 (32018MiB)| | Paddle (dynamic) | Pure FP16 | 59000000 (31970MiB)| 59000000 (31970MiB)| **Note:** config environment variable by ``export FLAGS_allocator_strategy=naive_best_fit`` ### 8.4 Throughtput **Configuration:** * BatchSize: 128/1024 * SampleRatio: 0.1 * Datasets: MS1MV3 * V100: Driver Version: 450.80.02, CUDA Version: 11.0 * A100: Driver Version: 460.32.03, CUDA Version: 11.2 ![insightface_throughtput](https://github.com/PaddlePaddle/PLSC/blob/master/experiments/arcface_paddle/images/insightface_throughtput.png) For more experimental results see [PLSC](https://github.com/PaddlePaddle/PLSC), which is an open source Paddle Large Scale Classification Tools powered by PaddlePaddle. It supports 60 million classes on single node 8 NVIDIA V100 (32G). ## 9. Inference Combined with Face Detection Model Firstly, use the following commands to download the index gallery, demo image and font file for visualization. ```bash # Index library for the recognition process wget https://raw.githubusercontent.com/littletomatodonkey/insight-face-paddle/main/demo/friends/index.bin # Demo image wget https://raw.githubusercontent.com/littletomatodonkey/insight-face-paddle/main/demo/friends/query/friends2.jpg # Font file for visualization wget https://raw.githubusercontent.com/littletomatodonkey/insight-face-paddle/main/SourceHanSansCN-Medium.otf ``` Use the following command to run the whole face recognition demo. ```shell # detection + recogniotion process python3.7 test_recognition.py --det --rec --index=index.bin --input=friends2.jpg --output="./output" ``` The final result is save in folder `output/`, which is shown as follows.
For more details about parameter explanations, index gallery construction and whl package inference, please refer to [Whl package inference tutorial](https://github.com/littletomatodonkey/insight-face-paddle).