Source code taken directly from https://github.com/timesler/facenet-pytorch to create evaluation metric in FaceNet_EvalMetric.ipynb
This is a repository for Inception Resnet (V1) models in pytorch, pretrained on VGGFace2 and CASIA-Webface.
Pytorch model weights were initialized using parameters ported from David Sandberg's tensorflow facenet repo.
See: models/inception_resnet_v1.py
The following models have been ported to pytorch (with links to download pytorch state_dict
's):
Model name | LFW accuracy (listed here) | Training dataset |
---|---|---|
20180408-102900 (111MB) | 0.9905 | CASIA-Webface |
20180402-114759 (107MB) | 0.9965 | VGGFace2 |
There is no need to manually download the pretrained state_dict
's; they are downloaded automatically on model instantiation. To use an Inception Resnet (V1) model for facial recognition/identification in pytorch, use:
from models.inception_resnet_v1 import InceptionResNetV1
# For a model pretrained on VGGFace2
model = InceptionResNetV1(pretrained='vggface2')
# For a model pretrained on CASIA-Webface
model = InceptionResNetV1(pretrained='casia-webface')
# For an untrained model
model = InceptionResNetV1()
# For an untrained 1001-class classifier
model = InceptionResNetV1(classify=True, num_classes=1001)
By default, the above models will return 512-dimensional embeddings of images. To enable classification instead, either pass classify=True
to the model constructor, or you can set the object attribute afterwards with model.classify = True
. For VGGFace2, the pretrained model will output probability vectors of length 8631, and for CASIA-Webface probability vectors of length 10575.
See: models/tensorflow2pytorch.py
Note that this functionality is not needed to use the models in this repo, which depend only on the saved pytorch state_dict
's.
Following instantiation of the pytorch model, each layer's weights were loaded from equivalent layers in the pretrained tensorflow models from davidsandberg/facenet.
The equivalence of the outputs from the original tensorflow models and the pytorch-ported models have been tested and are identical:
>>> compare_model_outputs(mdl, sess, torch.randn(5, 160, 160, 3).detach())
Passing test data through TF model
tensor([[-0.0142, 0.0615, 0.0057, ..., 0.0497, 0.0375, -0.0838],
[-0.0139, 0.0611, 0.0054, ..., 0.0472, 0.0343, -0.0850],
[-0.0238, 0.0619, 0.0124, ..., 0.0598, 0.0334, -0.0852],
[-0.0089, 0.0548, 0.0032, ..., 0.0506, 0.0337, -0.0881],
[-0.0173, 0.0630, -0.0042, ..., 0.0487, 0.0295, -0.0791]])
Passing test data through PT model
tensor([[-0.0142, 0.0615, 0.0057, ..., 0.0497, 0.0375, -0.0838],
[-0.0139, 0.0611, 0.0054, ..., 0.0472, 0.0343, -0.0850],
[-0.0238, 0.0619, 0.0124, ..., 0.0598, 0.0334, -0.0852],
[-0.0089, 0.0548, 0.0032, ..., 0.0506, 0.0337, -0.0881],
[-0.0173, 0.0630, -0.0042, ..., 0.0487, 0.0295, -0.0791]],
grad_fn=<DivBackward0>)
Distance 1.2874517096861382e-06
In order to re-run the conversion of tensorflow parameters into the pytorch model, ensure you clone this repo with submodules, as the davidsandberg/facenet repo is included as a submodule and parts of it are required for the conversion.
Q. Cao, L. Shen, W. Xie, O. M. Parkhi, A. Zisserman. VGGFace2: A dataset for recognising face across pose and age, International Conference on Automatic Face and Gesture Recognition, 2018. PDF
D. Yi, Z. Lei, S. Liao and S. Z. Li. CASIAWebface: Learning Face Representation from Scratch, arXiv:1411.7923v1, 2014. PDF
- Implement dataset, data loader, and image preprocessing for easy prediction.