add soft link

This commit is contained in:
GuoxiaWang
2021-10-15 13:18:06 +08:00
parent fbfd8d1a11
commit 22cbd2931e
2 changed files with 230 additions and 229 deletions

View File

@@ -1,229 +0,0 @@
[简体中文](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.
<div align="center">
<img src="https://raw.githubusercontent.com/littletomatodonkey/insight-face-paddle/main/demo/friends/output/friends2.jpg" width = "800" />
</div>
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).

View File

@@ -0,0 +1 @@
README_en.md

View File

@@ -0,0 +1,229 @@
[简体中文](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.
<div align="center">
<img src="https://raw.githubusercontent.com/littletomatodonkey/insight-face-paddle/main/demo/friends/output/friends2.jpg" width = "800" />
</div>
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).