Installation
Setup with Conda
# create a new environment
conda create --name insightKface python=3.7 # or over
conda activate insightKface
#install the appropriate cuda version of pytorch(https://pytorch.org/)
#example:
conda install pytorch torchvision torchaudio cudatoolkit=11.1 -c pytorch -c conda-forge
# install requirements
pip install -r requirements.txt
Data prepration
K-FACE Database
K-FACE AI-hub.
Detail configuration about K-FACE is provided in the paper below.
K-FACE: A Large-Scale KIST Face Database in Consideration with Unconstrained Environments
K-FACE sample images
Structure of the K-FACE database
Configuration of K-FACE
Detection & Alignment on K-FACE
"""
###################################################################
K-Face : Korean Facial Image AI Dataset
url : http://www.aihub.or.kr/aidata/73
Directory structure : High-ID-Accessories-Lux-Emotion
ID example : '19062421' ... '19101513' len 400
Accessories example : 'S001', 'S002' .. 'S006' len 6
Lux example : 'L1', 'L2' .. 'L30' len 30
Emotion example : 'E01', 'E02', 'E03' len 3
###################################################################
"""
# example
cd detection
python align_kfaces.py --ori_data_path '/data/FACE/KFACE/High' --detected_data_path 'kface_retina_align_112x112'
Training and test datasets on K-FACE
Train ID | Accessories | Lux | Expression | Pose | #Image | Variance |
---|---|---|---|---|---|---|
T1 | A1 | 1000 | E1 | C4-10 | 2,590 | Very Low |
T2 | A1-2 | 400-1000 | E1 | C4-10 | 46,620 | Low |
T3 | A1-A4 | 200-1000 | E1-2 | C4-13 | 654,160 | Middle |
T4 | A1-A6 | 40-1000 | E1-3 | C1-20 | 3,862,800 | High |
Test ID | Accessories | Lux | Expression | Pose | #Pairs | Variance |
Q1 | A1 | 1000 | E1 | C4-10 | 1,000 | Very Low |
Q2 | A1-2 | 400-1000 | E1 | C4-10 | 100,000 | Low |
Q3 | A1-4 | 200-1000 | E1-2 | C4-13 | 100,000 | Middle |
Q4 | A1-6 | 40-1000 | E1-3 | C1-20 | 100,000 | High |
MS1M-RetinaFace (MS1M-R)
MS1M-RetinaFace download link:
#Preprocess 'train.rec' and 'train.idx' to 'jpg'
# example
cd detection
python rec2image.py --include '/data/FACE/ms1m-retinaface-t1/' --output 'MS1M-RetinaFace'
Inference
After downloading the pretrained model, run test.py
.
Pretrained Model
For all experiments, ResNet-34 was chosen as the baseline backbone.
The model was trained on KFACE
Head&Loss | Q1 | Q2 | Q3 | Q4 |
---|---|---|---|---|
ArcFace (s=16, m=0.25) | 98.30 | 94.77 | 87.87 | 85.41 |
SN-pair (s=64) | 99.20 | 95.01 | 91.84 | 89.74 |
MixFace (e=1e-22, m=0.25) | 100 | 96.37 | 92.36 | 89.80 |
Note:
- For ArcFace, We tested (s,m)={(16,0.5), (32,0.25), (64,0.25), (32,0.5), (64,0.5)}, but the model was not trained properly So, we apply (s,m)=(16,0.25).
cd recognition
# example
python test.py --weights 'kface.mixface.1e-22m0.25.best.pt' --dataset 'kface' --data_cfg 'data/KFACE/kface.T4.yaml'
The model was trained on MS1M-R
Head&Loss | Q2 | Q3 | Q4 | LFW | CFP-FP | AgeDB-30 |
---|---|---|---|---|---|---|
ArcFace (s=64, m=0.5) | 98.71 | 86.60 | 82.03 | 99.80 | 98.41 | 98.80 |
SN-pair (s=64) | 92.85 | 76.36 | 70.08 | 99.55 | 96.20 | 95.46 |
MixFace (e=1e-22, m=0.5) | 97.36 | 82.89 | 76.95 | 99.68 | 97.74 | 97.25 |
cd recognition
# example
python test.py --weights 'face.mixface.1e-22m0.5.best.pt' --dataset 'face' --data_cfg 'data/face.all.yaml'
The model was trained on MS1M-R+T4
Head&Loss | Q2 | Q3 | Q4 | LFW | CFP-FP | AgeDB-30 |
---|---|---|---|---|---|---|
ArcFace (s=8, m=0.25) | 76.58 | 73.13 | 71.38 | 99.46 | 96.75 | 93.83 |
SN-pair (s=64) | 98.37 | 94.98 | 93.33 | 99.45 | 94.90 | 93.45 |
MixFace (e=1e-22, m=0.5) | 99.27 | 96.85 | 94.79 | 99.53 | 96.32 | 95.56 |
Note:
- For ArcFace, we tested (s,m)={(8, 0.5), (16, 0.25), (16,0.5), (32,0.25), (64,0.25), (32,0.5), (64,0.5)}, but the model was not trained properly So, we apply (s,m)=(8,0.25).
cd recognition
# example
python test.py --weights 'merge.mixface.1e-22m0.5.best.pt' --dataset 'merge' --data_cfg 'data/merge.yaml'
Training
Multi-GPU DataParallel Mode
Example script for training on KFACE
cd recognition
# example
python train.py --dataset 'kface' --head 'mixface' --data_cfg 'data/KFACE/kface.T4.yaml' --hyp 'data/face.hyp.yaml' --head_cfg 'models/head.kface.cfg.yaml' --name 'example' --device 0,1
Multi-GPU DistributedDataParallel Mode
Example script for training on KFACE
cd recognition
# example
python -m torch.distributed.launch --nproc_per_node 2 train.py --dataset 'kface' --head 'mixface' --data_cfg 'data/KFACE/kface.T4.yaml' --hyp 'data/face.hyp.yaml' --head_cfg 'models/head.kface.cfg.yaml' --name 'example' --device 0,1
Note:
- For MS1M-R, change args
--dataset face
,--data_cfg data/face.all.yaml
, and--head_cfg model/head.face.cfg.yaml
. - For MS1M-R+T4, change args
--dataset merge
,--data_cfg data/merge.yaml
, and--head_cfg model/head.merge.cfg.yaml
. - The args
--nodrop
should be used if you train with the metric loss(e.g., SN-pair, N-pair, etc.) on MS1M-R or MS1M-R+T4. - The args
--double
should be used if you train with the metric loss(e.g., SN-pair, N-pair, etc.) or MixFace on MS1M-R or MS1M-R+T4. - DistributedDataParallel is only available to classification loss(e.g., arcface, cosface, etc.)
Reference code
Thanks for these source codes porviding me with knowledges to complete this repository.