Fast Face Classification (F²C)—— An Efficient Training Approach for Very Large Scale Face Recognition (CVPR2022)
Kai Wang*, Shuo Wang*, Panpan Zhang, Zhipeng Zhou, Zheng Zhu, Xiaobo Wang, Xiaojiang Peng,
Baigui Sun, Hao Li
Yang You
National University of Singapore, Alibaba DAMO Academy, Tsinghua University, Institute of Automation, Chinese Academy of Sciences, Shenzhen Technology University
Kai Wang and Shuo Wang are equally-contributted authors
Abstract Training on ultra-large-scale datasets is time-consuming and takes up a lot of hardware resource. Therefore so we design a dul-data loaders and dynamic class pool to deal with large-scale face classification. For more details, please refer to our paper
Pipeline
As FFC contains LRU module, so you may use lru_python_impl.py or instead compile the code under lru_c directory.
If you choose lru_python_impl.py, you should rename lru_python_impl.py to lru_utils.py. As lru is not the bottleneck of the training procedure, so feel free to use python implementation, though the C++ implementation is 5~10 times faster than python version.
Command to build LRU
cd lru_c
mkdir build
cd build
cmake ..
make
cd ../../ && ln -s lru_c/build/lru_utils.so .
You can compare this two implementation using lru_c/python/compare_time.py
-
Training dataset
-
Test dataset
- SLLFW
- CPLFW: Baidu or Google Drive
- CALFW: Baidu or Google Drive
- CFP: Baidu or Google Drive
- AgeDB: Baidu or Google Drive
- YTF
- IJBC
- MegaFace
-
Data preprocess
We use 5 landmarks(Left eye center, right eye center, nose, left mouth corner and right mouth corner) to crop face as what ArcFace does. You can find code here.
In main.py, you should provide the path to your training db at line 152-153.
args.source_lmdb = ['/path to msceleb.lmdb']
args.source_file = ['/path to kv file']
We choose lmdb as the format of our training db. Each element in source_file
is the path to a text file, each line of which represents lmdb_key label
pairs.
You may refer to LFS
for more details.
Now you can modify train_ffc.sh. Before running the training, you should set the port number and queue_size.
queue_size
is a trade-off term that controls the performance and the speed. Larger queue_size
means higher performance at the cost of time and GPU resource.
It can be any positive integer. The common setting is 1%, 0.1%, 0.001 % of the total identities.
The difference between r50 and ir50 is that r50 requires 224 × 224 images as input while ir50 requires 112 × 112 as what does by ArcFace. The network ir50 comes from ArcFace.
We provide the whole test script under evaluation_code directory. Each script requires the directory to the images and test pair files.
@inproceedings{FFC2022,
title={An Efficient Training Approach for Very Large Scale Face Recognition},
author={Kai Wang, Shuo Wang, Panpan Zhang, Zhipeng Zhou, Zheng Zhu, Xiaobo Wang, Xiaojiang Peng, Baigui Sun, Hao Li and Yang You},
booktitle={CVPR},
year={2022}
}
Tips
Code in evaluation_code/test_megaface.py
is much faster than official version. It's also applicable to extremely large-scale testing.