[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-9833":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":16,"compositeScore":19,"rankGlobal":10,"rankLanguage":10,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":23,"hasPages":21,"topics":24,"createdAt":10,"pushedAt":10,"updatedAt":45,"readmeContent":46,"aiSummary":47,"trendingCount":16,"starSnapshotCount":16,"syncStatus":48,"lastSyncTime":49,"discoverSource":50},9833,"face.evoLVe","ZhaoJ9014\u002Fface.evoLVe","ZhaoJ9014","🔥🔥High-Performance Face Recognition Library on PaddlePaddle & PyTorch🔥🔥","",null,"Python",3588,762,105,96,0,1,5,30.65,"MIT License",false,"master",true,[25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44],"artificial-intelligence","computer-vision","convolutional-neural-network","data-augmentation","deep-learning","face-alignment","face-detection","face-landmark-detection","face-recognition","feature-extraction","fine-tuning","hard-negative-mining","imbalanced-learning","machine-learning","model-training","nus","pytorch","supervised-learning","tencent","transfer-learning","2026-06-12 02:02:13","# face.evoLVe: High-Performance Face Recognition Library based on PaddlePaddle & PyTorch\n* Evolve to be more comprehensive, effective and efficient for face related analytics \\& applications! ([WeChat News](https:\u002F\u002Fmp.weixin.qq.com\u002Fs\u002FV8VoyMqVvjblH358ozcWEg))\n* About the name:\n  * \"face\" means this repo is dedicated for face related analytics \\& applications.\n  * \"evolve\" means unleash your greatness to be better and better. \"LV\" are capitalized to acknowledge the nurturing of Learning and Vision ([LV](http:\u002F\u002Fwww.lv-nus.org)) group, Nation University of Singapore (NUS).\n* This work was done during Jian Zhao served as a short-term \"Texpert\" Research Scientist at Tencent FiT DeepSea AI Lab, Shenzhen, China.\n\n|Author|Jian Zhao|\n|:---:|:---:|\n|Homepage|https:\u002F\u002Fzhaoj9014.github.io|\n\n****\n## License\n\nThe code of [face.evoLVe](#Introduction) is released under the MIT License.\n\n****\n## News\n\n:white_check_mark: **`CLOSED 02 September 2021`**: ~~Baidu PaddlePaddle officially merged [face.evoLVe](#Introduction) to faciliate researches and applications on face-related analytics ([Official Announcement](https:\u002F\u002Fmp.weixin.qq.com\u002Fs\u002FJT_4pqRvSsAOhQln0GSH_g)).~~\n\n:white_check_mark: **`CLOSED 03 July 2021`**: ~~Provides training code for the paddlepaddle framework.~~\n\n:white_check_mark: **`CLOSED 04 July 2019`**: ~~We will share several publicly available datasets on face anti-spoofing\u002Fliveness detection to facilitate related research and analytics.~~\n\n:white_check_mark: **`CLOSED 07 June 2019`**: ~~We are training a better-performing [IR-152](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1512.03385.pdf) model on [MS-Celeb-1M_Align_112x112](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1607.08221.pdf), and will release the model soon.~~\n\n:white_check_mark: **`CLOSED 23 May 2019`**: ~~We share three publicly available datasets to facilitate research on heterogeneous face recognition and analytics. Please refer to Sec. [Data Zoo](#Data-Zoo) for details.~~\n\n:white_check_mark: **`CLOSED 23 Jan 2019`**: ~~We share the name lists and pair-wise overlapping lists of several widely-used face recognition datasets to help researchers\u002Fengineers quickly remove the overlapping parts between their own private datasets and the public datasets. Please refer to Sec. [Data Zoo](#Data-Zoo) for details.~~\n\n:white_check_mark: **`CLOSED 23 Jan 2019`**: ~~The current distributed training schema with multi-GPUs under PyTorch and other mainstream platforms parallels the backbone across multi-GPUs while relying on a single master to compute the final bottleneck (fully-connected\u002Fsoftmax) layer. This is not an issue for conventional face recognition with moderate number of identities. However, it struggles with large-scale face recognition, which requires recognizing millions of identities in the real world. The master can hardly hold the oversized final layer while the slaves still have redundant computation resource, leading to small-batch training or even failed training. To address this problem, we are developing a highly-elegant, effective and efficient distributed training schema with multi-GPUs under PyTorch, supporting not only the backbone, but also the head with the fully-connected (softmax) layer, to facilitate high-performance large-scale face recognition. We will added this support into our repo.~~\n\n:white_check_mark: **`CLOSED 22 Jan 2019`**: ~~We have released two feature extraction APIs for extracting features from pre-trained models, implemented with PyTorch build-in functions and OpenCV, respectively. Please check ```.\u002Futil\u002Fextract_feature_v1.py``` and ```.\u002Futil\u002Fextract_feature_v2.py```.~~\n\n:white_check_mark: **`CLOSED 22 Jan 2019`**: ~~We are fine-tuning our released [IR-50](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1512.03385.pdf) model on our private Asia face data, which will be released soon to facilitate high-performance Asia face recognition.~~\n\n:white_check_mark: **`CLOSED 21 Jan 2019`**: ~~We are training a better-performing [IR-50](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1512.03385.pdf) model on [MS-Celeb-1M_Align_112x112](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1607.08221.pdf), and will replace the current model soon.~~\n  \n****\n## Contents\n* [Introduction](#Introduction)\n* [Pre-Requisites](#Pre-Requisites)\n* [Usage](#Usage)\n* [Face Alignment](#Face-Alignment)\n* [Data Processing](#Data-Processing)\n* [Training and Validation](#Training-and-Validation)\n* [Data Zoo](#Data-Zoo)\n* [Model Zoo](#Model-Zoo)\n* [Achievement](#Achievement)\n* [Acknowledgement](#Acknowledgement)\n* [Donation](#Donation)\n* [Citation](#Citation)\n\n****\n## face.evoLVe for High-Performance Face Recognition\n\n### Introduction \n:information_desk_person:\n\n\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FZhaoJ9014\u002Fface.evoLVe\u002Fblob\u002Fmaster\u002Fdisp\u002FFig1.png\" width=\"450px\"\u002F>  \u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FZhaoJ9014\u002Fface.evoLVe\u002Fblob\u002Fmaster\u002Fdisp\u002FFig17.png\" width=\"400px\"\u002F>\n\n* This repo provides a comprehensive face recognition library for face related analytics \\& applications, including face alignment (detection, landmark localization, affine transformation, *etc.*), data processing (*e.g.*, augmentation, data balancing, normalization, *etc.*), various backbones (*e.g.*, [ResNet](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1512.03385.pdf), [IR](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1512.03385.pdf), [IR-SE](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1709.01507.pdf), ResNeXt, SE-ResNeXt, DenseNet, [LightCNN](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1511.02683.pdf), MobileNet, ShuffleNet, DPN, *etc.*), various losses (*e.g.*, Softmax, [Focal](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1708.02002.pdf), Center, [SphereFace](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1704.08063.pdf), [CosFace](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1801.09414.pdf), [AmSoftmax](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1801.05599.pdf), [ArcFace](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1801.07698.pdf), Triplet, *etc.*) and bags of tricks for improving performance (*e.g.*, training refinements, model tweaks, knowledge distillation, *etc.*).\n* The current distributed training schema with multi-GPUs under PyTorch and other mainstream platforms parallels the backbone across multi-GPUs while relying on a single master to compute the final bottleneck (fully-connected\u002Fsoftmax) layer. This is not an issue for conventional face recognition with moderate number of identities. However, it struggles with large-scale face recognition, which requires recognizing millions of identities in the real world. The master can hardly hold the oversized final layer while the slaves still have redundant computation resource, leading to small-batch training or even failed training. To address this problem, this repo provides a highly-elegant, effective and efficient distributed training schema with multi-GPUs under PyTorch, supporting not only the backbone, but also the head with the fully-connected (softmax) layer, to facilitate high-performance large-scale face recognition.\n* All data before \\& after alignment, source codes and trained models are provided.\n* This repo can help researchers\u002Fengineers develop high-performance deep face recognition models and algorithms quickly for practical use and deployment.\n\n****\n### Pre-Requisites \n:cake:\n\n* Linux or macOS\n* [Python 3.7](https:\u002F\u002Frepo.continuum.io\u002Farchive\u002FAnaconda3-2018.12-Linux-x86_64.sh) (for training \\& validation) and [Python 2.7](https:\u002F\u002Frepo.continuum.io\u002Farchive\u002FAnaconda2-2018.12-Linux-x86_64.sh) (for visualization w\u002F tensorboardX)\n* PyTorch 1.0 (for traininig \\& validation, install w\u002F `pip install torch torchvision`)\n* MXNet 1.3.1 (optional, for data processing, install w\u002F `pip install mxnet-cu90`)\n* TensorFlow 1.12 (optional, for visualization, install w\u002F `pip install tensorflow-gpu`)\n* tensorboardX 1.6 (optional, for visualization, install w\u002F `pip install tensorboardX`)\n* OpenCV 3.4.5 (install w\u002F `pip install opencv-python`)\n* bcolz 1.2.0 (install w\u002F `pip install bcolz`)\n\nWhile not required, for optimal performance it is **highly** recommended to run the code using a CUDA enabled GPU. We used 4-8 NVIDIA Tesla P40 in parallel.\n\n****\n### Usage \n:orange_book:\n\n* Clone the repo: `git clone https:\u002F\u002Fgithub.com\u002FZhaoJ9014\u002Fface.evoLVe.PyTorch.git`.\n* `mkdir data checkpoint log` at appropriate directory to store your train\u002Fval\u002Ftest data, checkpoints and training logs.\n* Prepare your train\u002Fval\u002Ftest data (refer to Sec. [Data Zoo](#Data-Zoo) for publicly available face related databases), and ensure each database folder has the following structure:\n  ```\n  .\u002Fdata\u002Fdb_name\u002F\n          -> id1\u002F\n              -> 1.jpg\n              -> ...\n          -> id2\u002F\n              -> 1.jpg\n              -> ...\n          -> ...\n              -> ...\n              -> ...\n  ```\n* Refer to the codes of corresponding sections for specific purposes.\n\n****\n### Face Alignment \n:triangular_ruler:\n\n\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FZhaoJ9014\u002Fface.evoLVe\u002Fblob\u002Fmaster\u002Fdisp\u002FFig2.png\" width=\"900px\"\u002F>\n\u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FZhaoJ9014\u002Fface.evoLVe\u002Fblob\u002Fmaster\u002Fdisp\u002FFig3.png\" width=\"500px\"\u002F>\n\n* This section is based on the work of [MTCNN](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1604.02878.pdf).\n* Folder: ```.\u002Falign```\n* Face detection, landmark localization APIs and visualization toy example with ipython notebook:\n  ```python \n  from PIL import Image\n  from detector import detect_faces\n  from visualization_utils import show_results\n\n  img = Image.open('some_img.jpg') # modify the image path to yours\n  bounding_boxes, landmarks = detect_faces(img) # detect bboxes and landmarks for all faces in the image\n  show_results(img, bounding_boxes, landmarks) # visualize the results\n  ``` \n* Face alignment API (perform face detection, landmark localization and alignment with affine transformations on a whole database folder ```source_root``` with the directory structure as demonstrated in Sec. [Usage](#Usage), and store the aligned results to a new folder ```dest_root``` with the same directory structure): \n  ```\n  python face_align.py -source_root [source_root] -dest_root [dest_root] -crop_size [crop_size]\n\n  # python face_align.py -source_root '.\u002Fdata\u002Ftest' -dest_root '.\u002Fdata\u002Ftest_Aligned' -crop_size 112\n  ```\n* For macOS users, there is no need to worry about ```*.DS_Store``` files which may ruin your data, since they will be automatically removed when you run the scripts.\n* Keynotes for customed use: 1) specify the arguments of ```source_root```, ```dest_root``` and ```crop_size``` to your own values when you run ```face_align.py```; 2) pass your customed ```min_face_size```, ```thresholds``` and ```nms_thresholds``` values to the ```detect_faces``` function of ```detector.py``` to match your practical requirements; 3) if you find the speed using face alignment API is a bit slow, you can call face resize API to firstly resize the image whose smaller size is larger than a threshold (specify the arguments of ```source_root```, ```dest_root``` and ```min_side``` to your own values) before calling the face alignment API:\n  ```\n  python face_resize.py\n  ```\n\n****\n### Data Processing \n:bar_chart:\n\n* Folder: ```.\u002Fbalance```\n* Remove low-shot data API (remove the low-shot classes with less than ```min_num``` samples in the training set ```root``` with the directory structure as demonstrated in Sec. [Usage](#Usage) for data balance and effective model training):\n  ```\n  python remove_lowshot.py -root [root] -min_num [min_num]\n\n  # python remove_lowshot.py -root '.\u002Fdata\u002Ftrain' -min_num 10\n  ```\n* Keynotes for customed use: specify the arguments of ```root``` and ```min_num``` to your own values when you run ```remove_lowshot.py```.\n* We prefer to include other data processing tricks, *e.g.*, augmentation (flip horizontally, scale hue\u002Fsatuation\u002Fbrightness with coefficients uniformly drawn from \\[0.6,1.4\\], add PCA noise with a coefficient sampled from a normal distribution N(0,0.1), *etc.*), weighted random sampling, normalization, *etc.* to the main training script in Sec. [Training and Validation](#Training-and-Validation) to be self-contained.\n\n****\n### Training and Validation \n:coffee:\n\n* Folder: ```.\u002F```\n* Configuration API (configurate your overall settings for training \\& validation) ```config.py```:\n  ```python\n  import torch\n\n  configurations = {\n      1: dict(\n          SEED = 1337, # random seed for reproduce results\n\n          DATA_ROOT = '\u002Fmedia\u002Fpc\u002F6T\u002Fjasonjzhao\u002Fdata\u002Ffaces_emore', # the parent root where your train\u002Fval\u002Ftest data are stored\n          MODEL_ROOT = '\u002Fmedia\u002Fpc\u002F6T\u002Fjasonjzhao\u002Fbuffer\u002Fmodel', # the root to buffer your checkpoints\n          LOG_ROOT = '\u002Fmedia\u002Fpc\u002F6T\u002Fjasonjzhao\u002Fbuffer\u002Flog', # the root to log your train\u002Fval status\n          BACKBONE_RESUME_ROOT = '.\u002F', # the root to resume training from a saved checkpoint\n          HEAD_RESUME_ROOT = '.\u002F', # the root to resume training from a saved checkpoint\n\n          BACKBONE_NAME = 'IR_SE_50', # support: ['ResNet_50', 'ResNet_101', 'ResNet_152', 'IR_50', 'IR_101', 'IR_152', 'IR_SE_50', 'IR_SE_101', 'IR_SE_152']\n          HEAD_NAME = 'ArcFace', # support:  ['Softmax', 'ArcFace', 'CosFace', 'SphereFace', 'Am_softmax']\n          LOSS_NAME = 'Focal', # support: ['Focal', 'Softmax']\n\n          INPUT_SIZE = [112, 112], # support: [112, 112] and [224, 224]\n          RGB_MEAN = [0.5, 0.5, 0.5], # for normalize inputs to [-1, 1]\n          RGB_STD = [0.5, 0.5, 0.5],\n          EMBEDDING_SIZE = 512, # feature dimension\n          BATCH_SIZE = 512,\n          DROP_LAST = True, # whether drop the last batch to ensure consistent batch_norm statistics\n          LR = 0.1, # initial LR\n          NUM_EPOCH = 125, # total epoch number (use the firt 1\u002F25 epochs to warm up)\n          WEIGHT_DECAY = 5e-4, # do not apply to batch_norm parameters\n          MOMENTUM = 0.9,\n          STAGES = [35, 65, 95], # epoch stages to decay learning rate\n\n          DEVICE = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\"),\n          MULTI_GPU = True, # flag to use multiple GPUs; if you choose to train with single GPU, you should first run \"export CUDA_VISILE_DEVICES=device_id\" to specify the GPU card you want to use\n          GPU_ID = [0, 1, 2, 3], # specify your GPU ids\n          PIN_MEMORY = True,\n          NUM_WORKERS = 0,\n  ),\n  }\n  ```\n* Train \\& validation API (all folks about training \\& validation, *i.e.*, import package, hyperparameters \\& data loaders, model & loss & optimizer, train & validation & save checkpoint) ```train.py```. Since [MS-Celeb-1M](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1607.08221.pdf) serves as an [ImageNet](https:\u002F\u002Fwww.researchgate.net\u002Fprofile\u002FLi_Jia_Li\u002Fpublication\u002F221361415_ImageNet_a_Large-Scale_Hierarchical_Image_Database\u002Flinks\u002F00b495388120dbc339000000\u002FImageNet-a-Large-Scale-Hierarchical-Image-Database.pdf) in the filed of face recognition, we pre-train the [face.evoLVe](#Introduction) models on [MS-Celeb-1M](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1607.08221.pdf) and perform validation on [LFW](https:\u002F\u002Fhal.inria.fr\u002Ffile\u002Findex\u002Fdocid\u002F321923\u002Ffilename\u002FHuang_long_eccv2008-lfw.pdf), [CFP_FF](http:\u002F\u002Fwww.cfpw.io\u002Fpaper.pdf), [CFP_FP](http:\u002F\u002Fwww.cfpw.io\u002Fpaper.pdf), [AgeDB](http:\u002F\u002Fopenaccess.thecvf.com\u002Fcontent_cvpr_2017_workshops\u002Fw33\u002Fpapers\u002FMoschoglou_AgeDB_The_First_CVPR_2017_paper.pdf), [CALFW](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1708.08197.pdf), [CPLFW](http:\u002F\u002Fwww.whdeng.cn\u002FCPLFW\u002FCross-Pose-LFW.pdf) and [Vggface2_FP](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1710.08092.pdf). Let's dive into details together step by step.\n  * Import necessary packages:\n    ```python\n    import torch\n    import torch.nn as nn\n    import torch.optim as optim\n    import torchvision.transforms as transforms\n    import torchvision.datasets as datasets\n\n    from config import configurations\n    from backbone.model_resnet import ResNet_50, ResNet_101, ResNet_152\n    from backbone.model_irse import IR_50, IR_101, IR_152, IR_SE_50, IR_SE_101, IR_SE_152\n    from head.metrics import ArcFace, CosFace, SphereFace, Am_softmax\n    from loss.focal import FocalLoss\n    from util.utils import make_weights_for_balanced_classes, get_val_data, separate_irse_bn_paras, separate_resnet_bn_paras, warm_up_lr, schedule_lr, perform_val, get_time, buffer_val, AverageMeter, accuracy\n\n    from tensorboardX import SummaryWriter\n    from tqdm import tqdm\n    import os\n    ```\n  * Initialize hyperparameters:\n    ```python\n    cfg = configurations[1]\n\n    SEED = cfg['SEED'] # random seed for reproduce results\n    torch.manual_seed(SEED)\n\n    DATA_ROOT = cfg['DATA_ROOT'] # the parent root where your train\u002Fval\u002Ftest data are stored\n    MODEL_ROOT = cfg['MODEL_ROOT'] # the root to buffer your checkpoints\n    LOG_ROOT = cfg['LOG_ROOT'] # the root to log your train\u002Fval status\n    BACKBONE_RESUME_ROOT = cfg['BACKBONE_RESUME_ROOT'] # the root to resume training from a saved checkpoint\n    HEAD_RESUME_ROOT = cfg['HEAD_RESUME_ROOT']  # the root to resume training from a saved checkpoint\n\n    BACKBONE_NAME = cfg['BACKBONE_NAME'] # support: ['ResNet_50', 'ResNet_101', 'ResNet_152', 'IR_50', 'IR_101', 'IR_152', 'IR_SE_50', 'IR_SE_101', 'IR_SE_152']\n    HEAD_NAME = cfg['HEAD_NAME'] # support:  ['Softmax', 'ArcFace', 'CosFace', 'SphereFace', 'Am_softmax']\n    LOSS_NAME = cfg['LOSS_NAME'] # support: ['Focal', 'Softmax']\n\n    INPUT_SIZE = cfg['INPUT_SIZE']\n    RGB_MEAN = cfg['RGB_MEAN'] # for normalize inputs\n    RGB_STD = cfg['RGB_STD']\n    EMBEDDING_SIZE = cfg['EMBEDDING_SIZE'] # feature dimension\n    BATCH_SIZE = cfg['BATCH_SIZE']\n    DROP_LAST = cfg['DROP_LAST'] # whether drop the last batch to ensure consistent batch_norm statistics\n    LR = cfg['LR'] # initial LR\n    NUM_EPOCH = cfg['NUM_EPOCH']\n    WEIGHT_DECAY = cfg['WEIGHT_DECAY']\n    MOMENTUM = cfg['MOMENTUM']\n    STAGES = cfg['STAGES'] # epoch stages to decay learning rate\n\n    DEVICE = cfg['DEVICE']\n    MULTI_GPU = cfg['MULTI_GPU'] # flag to use multiple GPUs\n    GPU_ID = cfg['GPU_ID'] # specify your GPU ids\n    PIN_MEMORY = cfg['PIN_MEMORY']\n    NUM_WORKERS = cfg['NUM_WORKERS']\n    print(\"=\" * 60)\n    print(\"Overall Configurations:\")\n    print(cfg)\n    print(\"=\" * 60)\n\n    writer = SummaryWriter(LOG_ROOT) # writer for buffering intermedium results\n    ```\n  * Train \\& validation data loaders:\n    ```python\n    train_transform = transforms.Compose([ # refer to https:\u002F\u002Fpytorch.org\u002Fdocs\u002Fstable\u002Ftorchvision\u002Ftransforms.html for more build-in online data augmentation\n        transforms.Resize([int(128 * INPUT_SIZE[0] \u002F 112), int(128 * INPUT_SIZE[0] \u002F 112)]), # smaller side resized\n        transforms.RandomCrop([INPUT_SIZE[0], INPUT_SIZE[1]]),\n        transforms.RandomHorizontalFlip(),\n        transforms.ToTensor(),\n        transforms.Normalize(mean = RGB_MEAN,\n                             std = RGB_STD),\n    ])\n\n    dataset_train = datasets.ImageFolder(os.path.join(DATA_ROOT, 'imgs'), train_transform)\n\n    # create a weighted random sampler to process imbalanced data\n    weights = make_weights_for_balanced_classes(dataset_train.imgs, len(dataset_train.classes))\n    weights = torch.DoubleTensor(weights)\n    sampler = torch.utils.data.sampler.WeightedRandomSampler(weights, len(weights))\n\n    train_loader = torch.utils.data.DataLoader(\n        dataset_train, batch_size = BATCH_SIZE, sampler = sampler, pin_memory = PIN_MEMORY,\n        num_workers = NUM_WORKERS, drop_last = DROP_LAST\n    )\n\n    NUM_CLASS = len(train_loader.dataset.classes)\n    print(\"Number of Training Classes: {}\".format(NUM_CLASS))\n\n    lfw, cfp_ff, cfp_fp, agedb, calfw, cplfw, vgg2_fp, lfw_issame, cfp_ff_issame, cfp_fp_issame, agedb_issame, calfw_issame, cplfw_issame, vgg2_fp_issame = get_val_data(DATA_ROOT)\n    ```\n  * Define and initialize model (backbone \\& head):\n    ```python\n    BACKBONE_DICT = {'ResNet_50': ResNet_50(INPUT_SIZE), \n                     'ResNet_101': ResNet_101(INPUT_SIZE), \n                     'ResNet_152': ResNet_152(INPUT_SIZE),\n                     'IR_50': IR_50(INPUT_SIZE), \n                     'IR_101': IR_101(INPUT_SIZE), \n                     'IR_152': IR_152(INPUT_SIZE),\n                     'IR_SE_50': IR_SE_50(INPUT_SIZE), \n                     'IR_SE_101': IR_SE_101(INPUT_SIZE), \n                     'IR_SE_152': IR_SE_152(INPUT_SIZE)}\n    BACKBONE = BACKBONE_DICT[BACKBONE_NAME]\n    print(\"=\" * 60)\n    print(BACKBONE)\n    print(\"{} Backbone Generated\".format(BACKBONE_NAME))\n    print(\"=\" * 60)\n\n    HEAD_DICT = {'ArcFace': ArcFace(in_features = EMBEDDING_SIZE, out_features = NUM_CLASS, device_id = GPU_ID),\n                 'CosFace': CosFace(in_features = EMBEDDING_SIZE, out_features = NUM_CLASS, device_id = GPU_ID),\n                 'SphereFace': SphereFace(in_features = EMBEDDING_SIZE, out_features = NUM_CLASS, device_id = GPU_ID),\n                 'Am_softmax': Am_softmax(in_features = EMBEDDING_SIZE, out_features = NUM_CLASS, device_id = GPU_ID)}\n    HEAD = HEAD_DICT[HEAD_NAME]\n    print(\"=\" * 60)\n    print(HEAD)\n    print(\"{} Head Generated\".format(HEAD_NAME))\n    print(\"=\" * 60)\n    ```\n  * Define and initialize loss function:\n    ```python\n    LOSS_DICT = {'Focal': FocalLoss(), \n                 'Softmax': nn.CrossEntropyLoss()}\n    LOSS = LOSS_DICT[LOSS_NAME]\n    print(\"=\" * 60)\n    print(LOSS)\n    print(\"{} Loss Generated\".format(LOSS_NAME))\n    print(\"=\" * 60)\n    ```\n  * Define and initialize optimizer:\n    ```python\n    if BACKBONE_NAME.find(\"IR\") >= 0:\n        backbone_paras_only_bn, backbone_paras_wo_bn = separate_irse_bn_paras(BACKBONE) # separate batch_norm parameters from others; do not do weight decay for batch_norm parameters to improve the generalizability\n        _, head_paras_wo_bn = separate_irse_bn_paras(HEAD)\n    else:\n        backbone_paras_only_bn, backbone_paras_wo_bn = separate_resnet_bn_paras(BACKBONE) # separate batch_norm parameters from others; do not do weight decay for batch_norm parameters to improve the generalizability\n        _, head_paras_wo_bn = separate_resnet_bn_paras(HEAD)\n    OPTIMIZER = optim.SGD([{'params': backbone_paras_wo_bn + head_paras_wo_bn, 'weight_decay': WEIGHT_DECAY}, {'params': backbone_paras_only_bn}], lr = LR, momentum = MOMENTUM)\n    print(\"=\" * 60)\n    print(OPTIMIZER)\n    print(\"Optimizer Generated\")\n    print(\"=\" * 60)\n    ```\n  * Whether resume from a checkpoint or not:\n    ```python\n    if BACKBONE_RESUME_ROOT and HEAD_RESUME_ROOT:\n        print(\"=\" * 60)\n        if os.path.isfile(BACKBONE_RESUME_ROOT) and os.path.isfile(HEAD_RESUME_ROOT):\n            print(\"Loading Backbone Checkpoint '{}'\".format(BACKBONE_RESUME_ROOT))\n            BACKBONE.load_state_dict(torch.load(BACKBONE_RESUME_ROOT))\n            print(\"Loading Head Checkpoint '{}'\".format(HEAD_RESUME_ROOT))\n            HEAD.load_state_dict(torch.load(HEAD_RESUME_ROOT))\n        else:\n            print(\"No Checkpoint Found at '{}' and '{}'. Please Have a Check or Continue to Train from Scratch\".format(BACKBONE_RESUME_ROOT, HEAD_RESUME_ROOT))\n        print(\"=\" * 60)\n    ```\n  * Whether use multi-GPU or not:\n    ```python\n    if MULTI_GPU:\n        # multi-GPU setting\n        BACKBONE = nn.DataParallel(BACKBONE, device_ids = GPU_ID)\n        BACKBONE = BACKBONE.to(DEVICE)\n    else:\n        # single-GPU setting\n        BACKBONE = BACKBONE.to(DEVICE)\n    ```\n  * Minor settings prior to training:\n    ```python\n    DISP_FREQ = len(train_loader) \u002F\u002F 100 # frequency to display training loss & acc\n\n    NUM_EPOCH_WARM_UP = NUM_EPOCH \u002F\u002F 25  # use the first 1\u002F25 epochs to warm up\n    NUM_BATCH_WARM_UP = len(train_loader) * NUM_EPOCH_WARM_UP  # use the first 1\u002F25 epochs to warm up\n    batch = 0  # batch index\n    ```\n  * Training \\& validation \\& save checkpoint (use the first 1\u002F25 epochs to warm up -- gradually increase LR to the initial value to ensure stable convergence):\n    ```python\n    for epoch in range(NUM_EPOCH): # start training process\n        \n        if epoch == STAGES[0]: # adjust LR for each training stage after warm up, you can also choose to adjust LR manually (with slight modification) once plaueau observed\n            schedule_lr(OPTIMIZER)\n        if epoch == STAGES[1]:\n            schedule_lr(OPTIMIZER)\n        if epoch == STAGES[2]:\n            schedule_lr(OPTIMIZER)\n\n        BACKBONE.train()  # set to training mode\n        HEAD.train()\n\n        losses = AverageMeter()\n        top1 = AverageMeter()\n        top5 = AverageMeter()\n\n        for inputs, labels in tqdm(iter(train_loader)):\n\n            if (epoch + 1 \u003C= NUM_EPOCH_WARM_UP) and (batch + 1 \u003C= NUM_BATCH_WARM_UP): # adjust LR for each training batch during warm up\n                warm_up_lr(batch + 1, NUM_BATCH_WARM_UP, LR, OPTIMIZER)\n\n            # compute output\n            inputs = inputs.to(DEVICE)\n            labels = labels.to(DEVICE).long()\n            features = BACKBONE(inputs)\n            outputs = HEAD(features, labels)\n            loss = LOSS(outputs, labels)\n\n            # measure accuracy and record loss\n            prec1, prec5 = accuracy(outputs.data, labels, topk = (1, 5))\n            losses.update(loss.data.item(), inputs.size(0))\n            top1.update(prec1.data.item(), inputs.size(0))\n            top5.update(prec5.data.item(), inputs.size(0))\n\n            # compute gradient and do SGD step\n            OPTIMIZER.zero_grad()\n            loss.backward()\n            OPTIMIZER.step()\n            \n            # dispaly training loss & acc every DISP_FREQ\n            if ((batch + 1) % DISP_FREQ == 0) and batch != 0:\n                print(\"=\" * 60)\n                print('Epoch {}\u002F{} Batch {}\u002F{}\\t'\n                      'Training Loss {loss.val:.4f} ({loss.avg:.4f})\\t'\n                      'Training Prec@1 {top1.val:.3f} ({top1.avg:.3f})\\t'\n                      'Training Prec@5 {top5.val:.3f} ({top5.avg:.3f})'.format(\n                    epoch + 1, NUM_EPOCH, batch + 1, len(train_loader) * NUM_EPOCH, loss = losses, top1 = top1, top5 = top5))\n                print(\"=\" * 60)\n\n            batch += 1 # batch index\n\n        # training statistics per epoch (buffer for visualization)\n        epoch_loss = losses.avg\n        epoch_acc = top1.avg\n        writer.add_scalar(\"Training_Loss\", epoch_loss, epoch + 1)\n        writer.add_scalar(\"Training_Accuracy\", epoch_acc, epoch + 1)\n        print(\"=\" * 60)\n        print('Epoch: {}\u002F{}\\t'\n              'Training Loss {loss.val:.4f} ({loss.avg:.4f})\\t'\n              'Training Prec@1 {top1.val:.3f} ({top1.avg:.3f})\\t'\n              'Training Prec@5 {top5.val:.3f} ({top5.avg:.3f})'.format(\n            epoch + 1, NUM_EPOCH, loss = losses, top1 = top1, top5 = top5))\n        print(\"=\" * 60)\n\n        # perform validation & save checkpoints per epoch\n        # validation statistics per epoch (buffer for visualization)\n        print(\"=\" * 60)\n        print(\"Perform Evaluation on LFW, CFP_FF, CFP_FP, AgeDB, CALFW, CPLFW and VGG2_FP, and Save Checkpoints...\")\n        accuracy_lfw, best_threshold_lfw, roc_curve_lfw = perform_val(MULTI_GPU, DEVICE, EMBEDDING_SIZE, BATCH_SIZE, BACKBONE, lfw, lfw_issame)\n        buffer_val(writer, \"LFW\", accuracy_lfw, best_threshold_lfw, roc_curve_lfw, epoch + 1)\n        accuracy_cfp_ff, best_threshold_cfp_ff, roc_curve_cfp_ff = perform_val(MULTI_GPU, DEVICE, EMBEDDING_SIZE, BATCH_SIZE, BACKBONE, cfp_ff, cfp_ff_issame)\n        buffer_val(writer, \"CFP_FF\", accuracy_cfp_ff, best_threshold_cfp_ff, roc_curve_cfp_ff, epoch + 1)\n        accuracy_cfp_fp, best_threshold_cfp_fp, roc_curve_cfp_fp = perform_val(MULTI_GPU, DEVICE, EMBEDDING_SIZE, BATCH_SIZE, BACKBONE, cfp_fp, cfp_fp_issame)\n        buffer_val(writer, \"CFP_FP\", accuracy_cfp_fp, best_threshold_cfp_fp, roc_curve_cfp_fp, epoch + 1)\n        accuracy_agedb, best_threshold_agedb, roc_curve_agedb = perform_val(MULTI_GPU, DEVICE, EMBEDDING_SIZE, BATCH_SIZE, BACKBONE, agedb, agedb_issame)\n        buffer_val(writer, \"AgeDB\", accuracy_agedb, best_threshold_agedb, roc_curve_agedb, epoch + 1)\n        accuracy_calfw, best_threshold_calfw, roc_curve_calfw = perform_val(MULTI_GPU, DEVICE, EMBEDDING_SIZE, BATCH_SIZE, BACKBONE, calfw, calfw_issame)\n        buffer_val(writer, \"CALFW\", accuracy_calfw, best_threshold_calfw, roc_curve_calfw, epoch + 1)\n        accuracy_cplfw, best_threshold_cplfw, roc_curve_cplfw = perform_val(MULTI_GPU, DEVICE, EMBEDDING_SIZE, BATCH_SIZE, BACKBONE, cplfw, cplfw_issame)\n        buffer_val(writer, \"CPLFW\", accuracy_cplfw, best_threshold_cplfw, roc_curve_cplfw, epoch + 1)\n        accuracy_vgg2_fp, best_threshold_vgg2_fp, roc_curve_vgg2_fp = perform_val(MULTI_GPU, DEVICE, EMBEDDING_SIZE, BATCH_SIZE, BACKBONE, vgg2_fp, vgg2_fp_issame)\n        buffer_val(writer, \"VGGFace2_FP\", accuracy_vgg2_fp, best_threshold_vgg2_fp, roc_curve_vgg2_fp, epoch + 1)\n        print(\"Epoch {}\u002F{}, Evaluation: LFW Acc: {}, CFP_FF Acc: {}, CFP_FP Acc: {}, AgeDB Acc: {}, CALFW Acc: {}, CPLFW Acc: {}, VGG2_FP Acc: {}\".format(epoch + 1, NUM_EPOCH, accuracy_lfw, accuracy_cfp_ff, accuracy_cfp_fp, accuracy_agedb, accuracy_calfw, accuracy_cplfw, accuracy_vgg2_fp))\n        print(\"=\" * 60)\n\n        # save checkpoints per epoch\n        if MULTI_GPU:\n            torch.save(BACKBONE.module.state_dict(), os.path.join(MODEL_ROOT, \"Backbone_{}_Epoch_{}_Batch_{}_Time_{}_checkpoint.pth\".format(BACKBONE_NAME, epoch + 1, batch, get_time())))\n            torch.save(HEAD.state_dict(), os.path.join(MODEL_ROOT, \"Head_{}_Epoch_{}_Batch_{}_Time_{}_checkpoint.pth\".format(HEAD_NAME, epoch + 1, batch, get_time())))\n        else:\n            torch.save(BACKBONE.state_dict(), os.path.join(MODEL_ROOT, \"Backbone_{}_Epoch_{}_Batch_{}_Time_{}_checkpoint.pth\".format(BACKBONE_NAME, epoch + 1, batch, get_time())))\n            torch.save(HEAD.state_dict(), os.path.join(MODEL_ROOT, \"Head_{}_Epoch_{}_Batch_{}_Time_{}_checkpoint.pth\".format(HEAD_NAME, epoch + 1, batch, get_time())))\n    ```\n* Now, you can start to play with [face.evoLVe](#Introduction) and run ```train.py```. User friendly information will popped out on your terminal:\n  * About overall configuration:\n  \n    \u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FZhaoJ9014\u002Fface.evoLVe\u002Fblob\u002Fmaster\u002Fdisp\u002FFig4.png\" width=\"900px\"\u002F>\n  \n  * About number of training classes:\n  \n    \u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FZhaoJ9014\u002Fface.evoLVe\u002Fblob\u002Fmaster\u002Fdisp\u002FFig5.png\" width=\"400px\"\u002F>\n  \n  * About backbone details:\n  \n    \u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FZhaoJ9014\u002Fface.evoLVe\u002Fblob\u002Fmaster\u002Fdisp\u002FFig6.png\" width=\"900px\"\u002F>\n  \n  * About head details:\n  \n    \u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FZhaoJ9014\u002Fface.evoLVe\u002Fblob\u002Fmaster\u002Fdisp\u002FFig7.png\" width=\"400px\"\u002F>\n  \n  * About loss details:\n  \n    \u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FZhaoJ9014\u002Fface.evoLVe\u002Fblob\u002Fmaster\u002Fdisp\u002FFig8.png\" width=\"400px\"\u002F>\n  \n  * About optimizer details:\n  \n    \u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FZhaoJ9014\u002Fface.evoLVe\u002Fblob\u002Fmaster\u002Fdisp\u002FFig9.png\" width=\"400px\"\u002F>\n    \n  * About resume training:\n  \n    \u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FZhaoJ9014\u002Fface.evoLVe\u002Fblob\u002Fmaster\u002Fdisp\u002FFig10.png\" width=\"400px\"\u002F>\n  \n  * About training status \\& statistics (when batch index reachs ```DISP_FREQ``` or at the end of each epoch):\n  \n    \u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FZhaoJ9014\u002Fface.evoLVe\u002Fblob\u002Fmaster\u002Fdisp\u002FFig11.png\" width=\"900px\"\u002F>\n  \n  * About validation statistics \\& save checkpoints (at the end of each epoch):\n  \n    \u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FZhaoJ9014\u002Fface.evoLVe\u002Fblob\u002Fmaster\u002Fdisp\u002FFig12.png\" width=\"900px\"\u002F>\n    \n* Monitor on-the-fly GPU occupancy with ```watch -d -n 0.01 nvidia-smi```.\n* Please refer to Sec. [Model Zoo](#Model-Zoo) for specific model weights and corresponding performance.\n* Feature extraction API (extract features from pre-trained models) ```.\u002Futil\u002Fextract_feature_v1.py``` (implemented with PyTorch build-in functions) and ```.\u002Futil\u002Fextract_feature_v2.py``` (implemented with OpenCV).\n* Visualize training \\& validation statistics with tensorboardX (see Sec. [Model Zoo](#Model-Zoo)):\n  ```\n  tensorboard --logdir \u002Fmedia\u002Fpc\u002F6T\u002Fjasonjzhao\u002Fbuffer\u002Flog\n  ```\n  \n****\n### Data Zoo \n:tiger:\n\n|Database|Version|\\#Identity|\\#Image|\\#Frame|\\#Video|Download Link|\n|:---:|:----:|:-----:|:-----:|:-----:|:-----:|:-----:|\n|[LFW](https:\u002F\u002Fhal.inria.fr\u002Ffile\u002Findex\u002Fdocid\u002F321923\u002Ffilename\u002FHuang_long_eccv2008-lfw.pdf)|Raw|5,749|13,233|-|-|[Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1JIgAXYqXrH-RbUvcsB3B6LXctLU9ijBA\u002Fview?usp=sharing), [Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1VzSI_xqiBw-uHKyRbi6zzw)|\n|[LFW](https:\u002F\u002Fhal.inria.fr\u002Ffile\u002Findex\u002Fdocid\u002F321923\u002Ffilename\u002FHuang_long_eccv2008-lfw.pdf)|Align_250x250|5,749|13,233|-|-|[Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F11h-QIrhuszY3PzT17Q5eXw8yrewgqX7m\u002Fview?usp=sharing), [Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1Ir8kAcQjBJA6A_pWPL9ozQ)|\n|[LFW](https:\u002F\u002Fhal.inria.fr\u002Ffile\u002Findex\u002Fdocid\u002F321923\u002Ffilename\u002FHuang_long_eccv2008-lfw.pdf)|Align_112x112|5,749|13,233|-|-|[Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1WO5Meh_yAau00Gm2Rz2Pc0SRldLQYigT\u002Fview?usp=sharing), [Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1Ew5JZ266bkg00jB5ICt78g)|\n|[CALFW](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1708.08197.pdf)|Raw|4,025|12,174|-|-|[Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1LcIDIfeZ027tbyUJDbaDt12ZoMVJuoMp\u002Fview?usp=sharing), [Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F17IzL_nGzedup1gcPuob0NQ)|\n|[CALFW](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1708.08197.pdf)|Align_112x112|4,025|12,174|-|-|[Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1kpmcDeDmPqUcI5uX0MCBzpP_8oQVojzW\u002Fview?usp=sharing), [Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1IxqyLFfHNQaj3ibjc7Vcvg)|\n|[CPLFW](http:\u002F\u002Fwww.whdeng.cn\u002FCPLFW\u002FCross-Pose-LFW.pdf)|Raw|3,884|11,652|-|-|[Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1WipxZ1QXs_Fi6Y5qEFDayEgos3rHDRnS\u002Fview?usp=sharing), [Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1gJuZZcm-2crTrqKI0sa5sA)|\n|[CPLFW](http:\u002F\u002Fwww.whdeng.cn\u002FCPLFW\u002FCross-Pose-LFW.pdf)|Align_112x112|3,884|11,652|-|-|[Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F14vPvDngGzsc94pQ4nRNfuBTxdv7YVn2Q\u002Fview?usp=sharing), [Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1uqK2LAEE91HYqllgsWcj9A)|\n|[CASIA-WebFace](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1411.7923.pdf)|Raw_v1|10,575|494,414|-|-|[Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1xh073sKX3IYp9xPm9S6F5Q)|\n|[CASIA-WebFace](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1411.7923.pdf)|Raw_v2|10,575|494,414|-|-|[Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F19R6Svdj5HbUA0y6aJv3P1WkIR5wXeCnO\u002Fview?usp=sharing), [Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1cZqsRxln-JmrA4xevLfjYQ)|\n|[CASIA-WebFace](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1411.7923.pdf)|Clean|10,575|455,594|-|-|[Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1wJC2aPA4AC0rI-tAL2BFs2M8vfcpX-w6\u002Fview?usp=sharing), [Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1x_VJlG9WV1OdrrJ7ARUZQw)|\n|[MS-Celeb-1M](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1607.08221.pdf)|Clean|100,000|5,084,127|-|-|[Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F18FxgfXgKwuYzY3DmWJXNJuY51TPmC9yH\u002Fview?usp=sharing)|\n|[MS-Celeb-1M](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1607.08221.pdf)|Align_112x112|85,742|5,822,653|-|-|[Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1X202mvYe5tiXFhOx82z4rPiPogXD435i\u002Fview?usp=sharing)|\n|[Vggface2](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1710.08092.pdf)|Clean|8,631|3,086,894|-|-|[Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1jdZw6ZmB7JRK6RS6QP3YEr2sufJ5ibtO\u002Fview?usp=sharing)|\n|[Vggface2_FP](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1710.08092.pdf)|Align_112x112|-|-|-|-|[Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1N7QEEQZPJ2s5Hs34urjseFwIoPVSmn4r\u002Fview?usp=sharing), [Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1STSgORPyRT-eyk5seUTcRA)|\n|[AgeDB](http:\u002F\u002Fopenaccess.thecvf.com\u002Fcontent_cvpr_2017_workshops\u002Fw33\u002Fpapers\u002FMoschoglou_AgeDB_The_First_CVPR_2017_paper.pdf)|Raw|570|16,488|-|-|[Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1FoZDyzTrs8r_oFM3Xqmi3iAHsnoirTRA\u002Fview?usp=sharing), [Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1-E_hkW-bXsXNYRiAhRPM7A)|\n|[AgeDB](http:\u002F\u002Fopenaccess.thecvf.com\u002Fcontent_cvpr_2017_workshops\u002Fw33\u002Fpapers\u002FMoschoglou_AgeDB_The_First_CVPR_2017_paper.pdf)|Align_112x112|570|16,488|-|-|[Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1AoZrZfym5ZhdTyKSxD0qxa7Xrp2Q1ftp\u002Fview?usp=sharing), [Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1ehwmQ4M7WpLylV83uUBxiA)|\n|[IJB-A](https:\u002F\u002Fwww.cv-foundation.org\u002Fopenaccess\u002Fcontent_cvpr_2015\u002Fpapers\u002FKlare_Pushing_the_Frontiers_2015_CVPR_paper.pdf)|Clean|500|5,396|20,369|2,085|[Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1WdQ62XJuvw0_K4MUP5nXOhv2RsEBVB1f\u002Fview?usp=sharing), [Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1iN68cdiPO0bTTN_hwmbe9w)|\n|[IJB-B](http:\u002F\u002Fopenaccess.thecvf.com\u002Fcontent_cvpr_2017_workshops\u002Fw6\u002Fpapers\u002FWhitelam_IARPA_Janus_Benchmark-B_CVPR_2017_paper.pdf)|Raw|1,845|21,798|55,026|7,011|[Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F15oibCHL3NX-q-QV8q_UAmbIr9e_M0n1R\u002Fview?usp=sharing)|\n|[CFP](http:\u002F\u002Fwww.cfpw.io\u002Fpaper.pdf)|Raw|500|7,000|-|-|[Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1tGNtqzWeUx3BYAxRHBbH1Wy7AmyFtZkU\u002Fview?usp=sharing), [Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F10Qq64LO_RWKD2cr_D32_6A)|\n|[CFP](http:\u002F\u002Fwww.cfpw.io\u002Fpaper.pdf)|Align_112x112|500|7,000|-|-|[Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1-sDn79lTegXRNhFuRnIRsgdU88cBfW6V\u002Fview?usp=sharing), [Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1DpudKyw_XN1Y491n1f-DtA)|\n|[Umdfaces](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1611.01484.pdf)|Align_112x112|8,277|367,888|-|-|[Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F13IDdIMqPCd8h1vWOYBkW6T5bjAxwmxm5\u002Fview?usp=sharing), [Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1UzrBMguV5YLh8aawIodKeQ)|\n|[CelebA](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1411.7766.pdf)|Raw|10,177|202,599|-|-|[Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1FO_p759JtKOf3qOnxOGpmoxCcnKiPdBI\u002Fview?usp=sharing), [Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1DfvDKKEB11MrZcf7hPjJfw)|\n|[CACD-VS](http:\u002F\u002Fcmlab.csie.ntu.edu.tw\u002F~sirius42\u002Fpapers\u002Fchen14eccv.pdf)|Raw|2,000|163,446|-|-|[Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1syrMyJGeXYxbjbmWKLxo1ASzpj2DRrk3\u002Fview?usp=sharing), [Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F13XI67Zn_D_Kncp_9hlTbQQ)|\n|[YTF](http:\u002F\u002Fwww.cs.tau.ac.il\u002F~wolf\u002Fytfaces\u002FWolfHassnerMaoz_CVPR11.pdf)|Align_344x344|1,595|-|3,425|621,127|[Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1o_5b7rYcSEFvTmwmEh0eCPsU5kFmKN_Y\u002Fview?usp=sharing), [Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1M43AcijgGrurb0dfFVlDKQ)|\n|[DeepGlint](http:\u002F\u002Ftrillionpairs.deepglint.com)|Align_112x112|180,855|6,753,545|-|-|[Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1Lqvh24913uquWxa3YS_APluEmbNKQ4Us\u002Fview?usp=sharing)|\n|[UTKFace](https:\u002F\u002Fsusanqq.github.io\u002FUTKFace\u002F)|Align_200x200|-|23,708|-|-|[Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1T5KH-DWXu048im0xBuRK0WEi820T28B-\u002Fview?usp=sharing), [Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F12Qp5pdZvitqBYSJHm4ouOw)|\n|[BUAA-VisNir](http:\u002F\u002Firip.buaa.edu.cn\u002Fsystem\u002F_content\u002Fdownload.jsp?urltype=news.DownloadAttachUrl&owner=1240132834&wbfileid=1277824)|Align_287x287|150|5,952|-|-|[Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1XcqgcOzYsFZ8THEXg4nwVw), PW: xmbc|\n|[CASIA NIR-VIS 2.0](https:\u002F\u002Fwww.cv-foundation.org\u002Fopenaccess\u002Fcontent_cvpr_workshops_2013\u002FW13\u002Fpapers\u002FLi_The_CASIA_NIR-VIS_2013_CVPR_paper.pdf)|Align_128x128|725|17,580|-|-|[Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1MZwONRsPmKTcE1xq6bdDFA), PW: 883b|\n|[Oulu-CASIA](http:\u002F\u002Fwww.ee.oulu.fi\u002F~gyzhao\u002FDownload\u002FDatabases\u002FNIR_VL_FED\u002FDescription.pdf)|Raw|80|65,000|-|-|[Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1HzsmNvA2xvJA-XW8nGKK1A), PW: xxp5|\n|[NUAA-ImposterDB](http:\u002F\u002Fparnec.nuaa.edu.cn\u002Fxtan\u002Fpaper\u002Feccv10r1.pdf)|Raw|15|12,614|-|-|[Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1WeSvoencoyGIi7SKygnEWw), PW: if3n|\n|[CASIA-SURF](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1812.00408.pdf)|Raw|1,000|-|-|21,000|[Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1dTGo9xcdTuK54RBgBWJNQg), PW: izb3|\n|[CASIA-FASD](http:\u002F\u002Fwww.cbsr.ia.ac.cn\u002Fusers\u002Fzlei\u002Fpapers\u002FICB2012\u002FZHANG-ICB2012.pdf)|Raw|50|-|-|600|[Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F15HyX7tizCCuwN9BKiV9_zA), PW: h5un|\n|[CASIA-MFSD](http:\u002F\u002Fbiometrics.cse.msu.edu\u002FPublications\u002FDatabases\u002FMSUMobileFaceSpoofing\u002Findex.htm)|Raw|50|-|-|600| |\n|[Replay-Attack](https:\u002F\u002Fpublications.idiap.ch\u002Fdownloads\u002Fpapers\u002F2012\u002FChingovska_IEEEBIOSIG2012_2012.pdf)|Raw|50|-|-|1,200| |\n|[WebFace260M](https:\u002F\u002Farxiv.org\u002Fabs\u002F2103.04098)|Raw|24M|2M|-||https:\u002F\u002Fwww.face-benchmark.org\u002F|\n* Remark: unzip [CASIA-WebFace](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1411.7923.pdf) clean version with \n  ```\n  unzip casia-maxpy-clean.zip    \n  cd casia-maxpy-clean    \n  zip -F CASIA-maxpy-clean.zip --out CASIA-maxpy-clean_fix.zip    \n  unzip CASIA-maxpy-clean_fix.zip\n  ```\n* Remark: after unzip, get image data \\& pair ground truths from [AgeDB](http:\u002F\u002Fopenaccess.thecvf.com\u002Fcontent_cvpr_2017_workshops\u002Fw33\u002Fpapers\u002FMoschoglou_AgeDB_The_First_CVPR_2017_paper.pdf), [CFP](http:\u002F\u002Fwww.cfpw.io\u002Fpaper.pdf), [LFW](https:\u002F\u002Fhal.inria.fr\u002Ffile\u002Findex\u002Fdocid\u002F321923\u002Ffilename\u002FHuang_long_eccv2008-lfw.pdf) and [VGGFace2_FP](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1710.08092.pdf) align_112x112 versions with \n  ```python\n  import numpy as np\n  import bcolz\n  import os\n\n  def get_pair(root, name):\n      carray = bcolz.carray(rootdir = os.path.join(root, name), mode='r')\n      issame = np.load('{}\u002F{}_list.npy'.format(root, name))\n      return carray, issame\n\n  def get_data(data_root):\n      agedb_30, agedb_30_issame = get_pair(data_root, 'agedb_30')\n      cfp_fp, cfp_fp_issame = get_pair(data_root, 'cfp_fp')\n      lfw, lfw_issame = get_pair(data_root, 'lfw')\n      vgg2_fp, vgg2_fp_issame = get_pair(data_root, 'vgg2_fp')\n      return agedb_30, cfp_fp, lfw, vgg2_fp, agedb_30_issame, cfp_fp_issame, lfw_issame, vgg2_fp_issame\n\n  agedb_30, cfp_fp, lfw, vgg2_fp, agedb_30_issame, cfp_fp_issame, lfw_issame, vgg2_fp_issame = get_data(DATA_ROOT)\n  ```\n* Remark: We share ```MS-Celeb-1M_Top1M_MID2Name.tsv``` ([Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F15X_mIcmcC38KjHA2NAGUIsNXF_iUeMbX\u002Fview?usp=sharing), [Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1AyZBr_Iow1StS3OzWedT1A)), ```VGGface2_ID2Name.csv``` ([Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1tSMrzwkWMCuOycNIjpx9GC3P2Pr1oPOU\u002Fview?usp=sharing), [Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1fRJKvgBxTcd4j6fCfmEUOw)), ```VGGface2_FaceScrub_Overlap.txt``` ([Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1M9F29t0WvAIJWhsBn5xyl00VL-7wBYkc\u002Fview?usp=sharing), [Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1ppZ2qcMfZ8bXq5Sf5LHijA)), ```VGGface2_LFW_Overlap.txt``` ([Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F13MO7su1z0G_Aqc5HwzImBxctORJjyDlO\u002Fview?usp=sharing), [Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1Sl6JIt99oX9G9YwP4HVq2A)), ```CASIA-WebFace_ID2Name.txt``` ([Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1Unqo5E5JR2tSNK0g7KhC6uwYM3tTXXVu\u002Fview?usp=sharing), [Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1zlYTOeLRgGPIR-yPeEurRw)), ```CASIA-WebFace_FaceScrub_Overlap.txt``` ([Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1xHM6JJXv5cl7xmSbZ1mkXyJpXnEgNV4x\u002Fview?usp=sharing), [Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1smuVPG0j7Zikd7UladBSew)), ```CASIA-WebFace_LFW_Overlap.txt``` ([Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1blFEbNGEfncAUQKCeCTb__rv221oZo80\u002Fview?usp=sharing), [Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F10rwsLZFA25e6cW1gJDDZGQ)), ```FaceScrub_Name.txt``` ([Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1R8MofI3pXGAuHsD5wswZXLPBHg8zll25\u002Fview?usp=sharing), [Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F12fryVZO6ytpHhjMidvZpxQ)), ```LFW_Name.txt``` ([Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1zC-0R3sL_wf2Oq1exMpDvJUGnW0VPcWs\u002Fview?usp=sharing), [Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1OFW8vJajkvTviUMiSNwdXA)), ```LFW_Log.txt``` ([Google Drive](https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1afCfVNnguaCaKktsZn8q5CNlqThfeZYk\u002Fview?usp=sharing), [Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1TsQOez_11WcViTV9eo4qOQ)) to help researchers\u002Fengineers quickly remove the overlapping parts between their own private datasets and the public datasets.\n* Due to release license issue, for other face related databases, please make contact with us in person for more details.\n\n****\n### Model Zoo \n:monkey:\n\n* Model\n\n  |Backbone|Head|Loss|Training Data|Download Link|\n  |:---:|:---:|:---:|:---:|:---:|\n  |[IR-50](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1512.03385.pdf)|[ArcFace](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1801.07698.pdf)|[Focal](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1708.02002.pdf)|[MS-Celeb-1M_Align_112x112](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1607.08221.pdf)|[Google Drive](https:\u002F\u002Fdrive.google.com\u002Fdrive\u002Ffolders\u002F1omzvXV_djVIW2A7I09DWMe9JR-9o_MYh?usp=sharing), [Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1L8yOF1oZf6JHfeY9iN59Mg)|\n\n  * Setting\n    ```\n    INPUT_SIZE: [112, 112]; RGB_MEAN: [0.5, 0.5, 0.5]; RGB_STD: [0.5, 0.5, 0.5]; BATCH_SIZE: 512 (drop the last batch to ensure consistent batch_norm statistics); Initial LR: 0.1; NUM_EPOCH: 120; WEIGHT_DECAY: 5e-4 (do not apply to batch_norm parameters); MOMENTUM: 0.9; STAGES: [30, 60, 90]; Augmentation: Random Crop + Horizontal Flip; Imbalanced Data Processing: Weighted Random Sampling; Solver: SGD; GPUs: 4 NVIDIA Tesla P40 in Parallel\n    ```\n  * Training \\& validation statistics\n  \n    \u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FZhaoJ9014\u002Fface.evoLVe\u002Fblob\u002Fmaster\u002Fdisp\u002FFig13.png\" width=\"1000px\"\u002F>\n      \n  * Performance\n\n    |[LFW](https:\u002F\u002Fhal.inria.fr\u002Ffile\u002Findex\u002Fdocid\u002F321923\u002Ffilename\u002FHuang_long_eccv2008-lfw.pdf)|[CFP_FF](http:\u002F\u002Fwww.cfpw.io\u002Fpaper.pdf)|[CFP_FP](http:\u002F\u002Fwww.cfpw.io\u002Fpaper.pdf)|[AgeDB](http:\u002F\u002Fopenaccess.thecvf.com\u002Fcontent_cvpr_2017_workshops\u002Fw33\u002Fpapers\u002FMoschoglou_AgeDB_The_First_CVPR_2017_paper.pdf)|[CALFW](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1708.08197.pdf)|[CPLFW](http:\u002F\u002Fwww.whdeng.cn\u002FCPLFW\u002FCross-Pose-LFW.pdf)|[Vggface2_FP](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1710.08092.pdf)|\n    |:---:|:---:|:---:|:---:|:---:|:---:|:---:|\n    |99.78|99.69|98.14|97.53|95.87|92.45|95.22|\n\n* Model\n\n  |Backbone|Head|Loss|Training Data|Download Link|\n  |:---:|:---:|:---:|:---:|:---:|\n  |[IR-50](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1512.03385.pdf)|[ArcFace](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1801.07698.pdf)|[Focal](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1708.02002.pdf)|Private Asia Face Data|[Google Drive](https:\u002F\u002Fdrive.google.com\u002Fdrive\u002Ffolders\u002F11TI4Gs_lO-fbts7cgWNqvVfm9nps2msE?usp=sharing), [Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F18BSUeA1bpAeRWTprtHgX9w)|\n\n  * Setting\n    ```\n    INPUT_SIZE: [112, 112]; RGB_MEAN: [0.5, 0.5, 0.5]; RGB_STD: [0.5, 0.5, 0.5]; BATCH_SIZE: 1024 (drop the last batch to ensure consistent batch_norm statistics); Initial LR: 0.01 (initialize weights from the above model pre-trained on MS-Celeb-1M_Align_112x112); NUM_EPOCH: 80; WEIGHT_DECAY: 5e-4 (do not apply to batch_norm parameters); MOMENTUM: 0.9; STAGES: [20, 40, 60]; Augmentation: Random Crop + Horizontal Flip; Imbalanced Data Processing: Weighted Random Sampling; Solver: SGD; GPUs: 8 NVIDIA Tesla P40 in Parallel\n    ```\n\n  * Performance (please perform evaluation on your own Asia face benchmark dataset)\n  \n* Model\n\n  |Backbone|Head|Loss|Training Data|Download Link|\n  |:---:|:---:|:---:|:---:|:---:|\n  |[IR-152](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1512.03385.pdf)|[ArcFace](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1801.07698.pdf)|[Focal](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1708.02002.pdf)|[MS-Celeb-1M_Align_112x112](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1607.08221.pdf)|[Baidu Drive](https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1-9sFB3H1mL8bt2jH7EagtA), PW: b197|\n\n  * Setting\n    ```\n    INPUT_SIZE: [112, 112]; RGB_MEAN: [0.5, 0.5, 0.5]; RGB_STD: [0.5, 0.5, 0.5]; BATCH_SIZE: 256 (drop the last batch to ensure consistent batch_norm statistics); Initial LR: 0.01; NUM_EPOCH: 120; WEIGHT_DECAY: 5e-4 (do not apply to batch_norm parameters); MOMENTUM: 0.9; STAGES: [30, 60, 90]; Augmentation: Random Crop + Horizontal Flip; Imbalanced Data Processing: Weighted Random Sampling; Solver: SGD; GPUs: 4 NVIDIA Geforce RTX 2080 Ti in Parallel\n    ```\n  * Training \\& validation statistics\n  \n    \u003Cimg src=\"https:\u002F\u002Fgithub.com\u002FZhaoJ9014\u002Fface.evoLVe\u002Fblob\u002Fmaster\u002Fdisp\u002FFig14.png\" width=\"1000px\"\u002F>\n      \n  * Performance\n\n    |[LFW](https:\u002F\u002Fhal.inria.fr\u002Ffile\u002Findex\u002Fdocid\u002F321923\u002Ffilename\u002FHuang_long_eccv2008-lfw.pdf)|[CFP_FF](http:\u002F\u002Fwww.cfpw.io\u002Fpaper.pdf)|[CFP_FP](http:\u002F\u002Fwww.cfpw.io\u002Fpaper.pdf)|[AgeDB](http:\u002F\u002Fopenaccess.thecvf.com\u002Fcontent_cvpr_2017_workshops\u002Fw33\u002Fpapers\u002FMoschoglou_AgeDB_The_First_CVPR_2017_paper.pdf)|[CALFW](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1708.08197.pdf)|[CPLFW](http:\u002F\u002Fwww.whdeng.cn\u002FCPLFW\u002FCross-Pose-LFW.pdf)|[Vggface2_FP](https:\u002F\u002Farxiv.org\u002Fpdf\u002F1710.08092.pdf)|\n    |:---:|:---:|:---:|:---:|:---:|:---:|:---:|\n    |99.82|99.83|98.37|98.07|96.03|93.05|95.50|\n\n****\n### Achievement \n:confetti_ball:\n\n* 2017 No.1 on ICCV 2017 MS-Celeb-1M Large-Scale Face Recognition [Hard Set](https:\u002F\u002Fwww.msceleb.org\u002Fleaderboard\u002Ficcvworkshop-c1)\u002F[Random Set](https:\u002F\u002Fwww.msceleb.org\u002Fleaderboard\u002Ficcvworkshop-c1)\u002F[Low-Shot Learning](https:\u002F\u002Fwww.msceleb.org\u002Fleaderboard\u002Fc2) Challenges. [WeChat News](http:\u002F\u002Fmp.weixin.qq.com\u002Fs\u002F-G94Mj-8972i2HtEcIZDpA), [NUS ECE News](http:\u002F\u002Fece.nus.edu.sg\u002Fdrupal\u002F?q=node\u002F215), [NUS ECE Poster](https:\u002F\u002Fzhaoj9014.github.io\u002Fpub\u002FECE_Poster.jpeg), [Award Certificate for Track-1](https:\u002F\u002Fzhaoj9014.github.io\u002Fpub\u002FMS-Track1.jpeg), [Award Certificate for Track-2](https:\u002F\u002Fzhaoj9014.github.io\u002Fpub\u002FMS-Track2.jpeg), [Award Ceremony](https:\u002F\u002Fzhaoj9014.github.io\u002Fpub\u002FMS-Awards.jpeg).\n* 2017 No.1 on National Institute of Standards and Technology (NIST) IARPA Janus Benchmark A (IJB-A) Unconstrained Face [Verification](https:\u002F\u002Fzhaoj9014.github.io\u002Fpub\u002FIJBA_11_report.pdf) challenge and [Identification](https:\u002F\u002Fzhaoj9014.github.io\u002Fpub\u002FIJBA_1N_report.pdf) challenge. [WeChat News](https:\u002F\u002Fmp.weixin.qq.com\u002Fs\u002Fs9H_OXX-CCakrTAQUFDm8g).\n\n* State-of-the-art performance on \n\n    * MS-Celeb-1M (Challenge1 Hard Set Coverage@P=0.95: 79.10%; Challenge1 Random Set Coverage@P=0.95: 87.50%; Challenge2 Development Set Coverage@P=0.99: 100.00%; Challenge2 Base Set Top 1 Accuracy: 99.74%; Challenge2 Novel Set Coverage@P=0.99: 99.01%).\n    * IJB-A (1:1 Veification TAR@FAR=0.1: 99.6%±0.1%; 1:1 Veification TAR@FAR=0.01: 99.1%±0.2%; 1:1 Veification TAR@FAR=0.001: 97.9%±0.4%; 1:N Identification FNIR@FPIR=0.1: 1.3%±0.3%; 1:N Identification FNIR@FPIR=0.01: 5.4%±4.7%; 1:N Identification Rank1 Accuracy: 99.2%±0.1%; 1:N Identification Rank5 Accuracy: 99.7%±0.1%; 1:N Identification Rank10 Accuracy: 99.8%±0.1%).\n    * IJB-C (1:1 Veification TAR@FAR=1e-5: 82.6%).\n    * Labeled Faces in the Wild (LFW) (Accuracy: 99.85%±0.217%).\n    * Celebrities in Frontal-Profile (CFP) (Frontal-Profile Accuracy: 96.01%±0.84%; Frontal-Profile EER: 4.43%±1.04%; Frontal-Profile AUC: 99.00%±0.35%; Frontal-Frontal Accuracy: 99.64%±0.25%; Frontal-Frontal EER: 0.54%±0.37%; Frontal-Frontal AUC: 99.98%±0.03%).\n    * CMU Multi-PIE (Rank1 Accuracy Setting-1 under ±90°: 76.12%; Rank1 Accuracy Setting-2 under ±90°: 86.73%).\n    * MORPH Album2 (Rank1 Accuracy Setting-1: 99.65%; Rank1 Accuracy Setting-2: 99.26%).\n    * CACD-VS (Accuracy: 99.76%).\n    * FG-NET (Rank1 Accuracy: 93.20%).\n\n****\n### Acknowledgement \n:two_men_holding_hands:\n\n* This repo is inspired by [InsightFace.MXNet](https:\u002F\u002Fgithub.com\u002Fdeepinsight\u002Finsightface), [InsightFace.PyTorch](https:\u002F\u002Fgithub.com\u002FTreB1eN\u002FInsightFace_Pytorch), [ArcFace.PyTorch](https:\u002F\u002Fgithub.com\u002Fronghuaiyang\u002Farcface-pytorch), [MTCNN.MXNet](https:\u002F\u002Fgithub.com\u002Fpangyupo\u002Fmxnet_mtcnn_face_detection) and [PretrainedModels.PyTorch](https:\u002F\u002Fgithub.com\u002FCadene\u002Fpretrained-models.pytorch).\n* The work of Jian Zhao was partially supported by China Scholarship Council (CSC) grant 201503170248.\n* We would like to thank [Prof. Jiashi Feng](https:\u002F\u002Fsites.google.com\u002Fsite\u002Fjshfeng\u002F), [Dr. Jianshu Li](https:\u002F\u002Fsites.google.com\u002Fview\u002Fli-js), Mr. Yu Cheng (Learning and Vision group, National University of Singapore), Mr. Yuan Xin, Mr. Di Wu, Mr. Zhenyuan Shen, Mr. Jianwei Liu (Tencent FiT DeepSea AI Lab, China), [Prof. Ran He](http:\u002F\u002Fwww.nlpr.ia.ac.cn\u002Fenglish\u002Firds\u002FPeople\u002Frhe.html), [Prof. Junliang Xing](http:\u002F\u002Fpeople.ucas.ac.cn\u002F~0051452?language=en), [Mr. Xiang Wu](http:\u002F\u002Falfredxiangwu.github.io\u002F) (Institute of Automation, Chinese Academy of Sciences), [Prof. Guosheng Hu](https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Fguosheng-hu-6801b333\u002F) (AnyVision Inc., U.K.), [Dr. Lin Xiong](https:\u002F\u002Fbruinxiong.github.io\u002Fxionglin.github.io\u002F) (JD Digits, U.S.), Miss Yi Cheng (Panasonic R\\&D Center, Singapore) for helpful discussions.\n\n\n****\n### Citation \n:bookmark_tabs:\n\n- Please consult and consider citing the following papers:\n     \n      @inproceedings{li2024two,\n      title={Two in One Go: Single-stage Emotion Recognition with Decoupled Subject-Context Transformer},\n      author={Li, Xinpeng and Wang, Teng and Zhao, Jian and Mao, Shuyi and Wang, Jinbao and Zheng, Feng and Peng, Xiaojiang and Li, Xuelong},\n      booktitle={ACM MM},\n      year={2024}\n      }\n\n\n      @article{zhang2024leaf,\n      title={LEAF: Unveiling Two Sides of The Same Coin in Semi-Supervised Facial Expression Recognition},\n      author={Zhang, Fan and Cheng, Zhi-Qi and Zhao, Jian and Peng, Xiaojiang and Li, Xuelong},\n      journal={arXiv preprint arXiv:2404.15041},\n      year={2024}\n      }\n\n\n      @article{xu2025uniface++,\n      title={UniFace++: Revisiting a Unified Framework for Face Reenactment and Swapping via 3D Priors},\n      author={Xu, Chao and Qian, Yijie and Zhu, Shaoting and Sun, Baigui and Zhao, Jian and Liu, Yong and Li, Xuelong},\n      journal={IJCV},\n      year={2025}\n      }\n\n\n      @article{fan2023joint,\n      title={Joint Coupled Representation and Homogeneous Reconstruction for Multi-Resolution Small Sample Face Recognition},\n      author={Fan, Xiaojin and Liao, Mengmeng and Xue, Jingfeng and Wu, Hao and Jin, Lei and Zhao, Jian and Zhu, Liehuang},\n      journal={Neurocomputing},\n      year={2023}\n      }\n\n\n      @article{wu20223d,\n      title={3D-Guided Frontal Face Generation for Pose-Invariant Recognition},\n      author={Wu, Hao and Gu, Jianyang and Fan, Xiaojin and Li, He and Xie, Lidong and Zhao, Jian},\n      journal={T-IST},\n      year={2022}\n      }\n\n\n      @article{wang2021face,\n      title={Face.evoLVe: A High-Performance Face Recognition Library},\n      author={Wang, Qingzhong and Zhang, Pengfei and Xiong, Haoyi and Zhao, Jian},\n      journal={arXiv preprint arXiv:2107.08621},\n      year={2021}\n      }\n      \n      \n      @article{tu2021joint,\n      title={Joint Face Image Restoration and Frontalization for Recognition},\n      author={Tu, Xiaoguang and Zhao, Jian and Liu, Qiankun and Ai, Wenjie and Guo, Guodong and Li, Zhifeng and Liu, Wei and Feng, Jiashi},\n      journal={T-CSVT},\n      year={2021}\n      }\n\n\n      @article{zhao2020towards,\n      title={Towards age-invariant face recognition},\n      author={Zhao, Jian and Yan, Shuicheng and Feng, Jiashi},\n      journal={T-PAMI},\n      year={2020}\n      }\n\n\n      @article{zhao2019recognizing,\n      title={Recognizing Profile Faces by Imagining Frontal View},\n      author={Zhao, Jian and Xing, Junliang and Xiong, Lin and Yan, Shuicheng and Feng, Jiashi},\n      journal={IJCV},\n      pages={1--19},\n      year={2019}\n      }    \n\n\n      @inproceedings{zhao2019multi,\n      title={Multi-Prototype Networks for Unconstrained Set-based Face Recognition},\n      author={Zhao, Jian and Li, Jianshu and Tu, Xiaoguang and Zhao, Fang and Xin, Yuan and Xing, Junliang and Liu, Hengzhu and Yan, Shuicheng and Feng, Jiashi},\n      booktitle={IJCAI},\n      year={2019}\n      }\n\n\n      @inproceedings{zhao2019look,\n      title={Look Across Elapse: Disentangled Representation Learning and Photorealistic Cross-Age Face Synthesis for Age-Invariant Face Recognition},\n      author={Zhao, Jian and Cheng, Yu and Cheng, Yi and Yang, Yang and Lan, Haochong and Zhao, Fang and Xiong, Lin and Xu, Yan and Li, Jianshu and Pranata, Sugiri and others},\n      booktitle={AAAI},\n      year={2019}\n      }\n      \n      \n      @article{zhao20183d,\n      title={3D-Aided Dual-Agent GANs for Unconstrained Face Recognition},\n      author={Zhao, Jian and Xiong, Lin and Li, Jianshu and Xing, Junliang and Yan, Shuicheng and Feng, Jiashi},\n      journal={T-PAMI},\n      year={2018}\n      }\n      \n      \n      @inproceedings{zhao2018towards,\n      title={Towards Pose Invariant Face Recognition in the Wild},\n      author={Zhao, Jian and Cheng, Yu and Xu, Yan and Xiong, Lin and Li, Jianshu and Zhao, Fang and Jayashree, Karlekar and Pranata,         Sugiri and Shen, Shengmei and Xing, Junliang and others},\n      booktitle={CVPR},\n      pages={2207--2216},\n      year={2018}\n      }\n      \n      \n      @inproceedings{zhao3d,\n      title={3D-Aided Deep Pose-Invariant Face Recognition},\n      author={Zhao, Jian and Xiong, Lin and Cheng, Yu and Cheng, Yi and Li, Jianshu and Zhou, Li and Xu, Yan and Karlekar, Jayashree and       Pranata, Sugiri and Shen, Shengmei and others},\n      booktitle={IJCAI},\n      pages={1184--1190},\n      year={2018}\n      }\n      \n      \n      @inproceedings{zhao2018dynamic,\n      title={Dynamic Conditional Networks for Few-Shot Learning},\n      author={Zhao, Fang and Zhao, Jian and Yan, Shuicheng and Feng, Jiashi},\n      booktitle={ECCV},\n      pages={19--35},\n      year={2018}\n      }\n      \n      \n      @inproceedings{zhao2017dual,\n      title={Dual-agent gans for photorealistic and identity preserving profile face synthesis},\n      author={Zhao, Jian and Xiong, Lin and Jayashree, Panasonic Karlekar and Li, Jianshu and Zhao, Fang and Wang, Zhecan and Pranata,           Panasonic Sugiri and Shen, Panasonic Shengmei and Yan, Shuicheng and Feng, Jiashi},\n      booktitle={NeurIPS},\n      pages={66--76},\n      year={2017}\n      }\n      \n      \n      @inproceedings{zhao122017marginalized,\n      title={Marginalized cnn: Learning deep invariant representations},\n      author={Zhao12, Jian and Li, Jianshu and Zhao, Fang and Yan13, Shuicheng and Feng, Jiashi},\n      booktitle={BMVC},\n      year={2017}\n      }\n      \n      \n      @inproceedings{cheng2017know,\n      title={Know you at one glance: A compact vector representation for low-shot learning},\n      author={Cheng, Yu and Zhao, Jian and Wang, Zhecan and Xu, Yan and Jayashree, Karlekar and Shen, Shengmei and Feng, Jiashi},\n      booktitle={ICCVW},\n      pages={1924--1932},\n      year={2017}\n      }\n      \n      \n      @inproceedings{wangconditional,\n      title={Conditional Dual-Agent GANs for Photorealistic and Annotation Preserving Image Synthesis},\n      author={Wang, Zhecan and Zhao, Jian and Cheng, Yu and Xiao, Shengtao and Li, Jianshu and Zhao, Fang and Feng, Jiashi and Kassim, Ashraf},\n      booktitle={BMVCW},\n      }\n","face.evoLVe 是一个基于 PaddlePaddle 和 PyTorch 的高性能人脸识别库。该项目支持多种核心功能，包括面部检测、对齐、关键点检测以及特征提取等，并且通过使用卷积神经网络和深度学习技术来实现高效准确的人脸识别。此外，它还提供了数据增强、硬负样本挖掘及不平衡学习等功能以提升模型性能。此库适用于需要进行大规模人脸数据分析与处理的应用场景，例如安防监控系统、门禁控制、身份验证服务等领域。",2,"2026-06-11 03:24:57","top_topic"]