Você também pode ler uma versão traduzida deste arquivo em chinês 简体中文版.
Este é um repositório para os modelos Inception ResNet (V1) em Pytorch, pré-criado em VGGFFace2 e Casia-Webface.
Os pesos do modelo de Pytorch foram inicializados usando parâmetros portados do repo Facenet de David Sandberg.
Também está incluído neste repositório uma implementação eficiente do MTCNN para detecção de rosto antes da inferência. Esses modelos também são pré -tenhados. Até onde sabemos, esta é a implementação mais rápida do MTCNN disponível.
Instalar:
# With pip:
pip install facenet-pytorch
# or clone this repo, removing the '-' to allow python imports:
git clone https://github.com/timesler/facenet-pytorch.git facenet_pytorch
# or use a docker container (see https://github.com/timesler/docker-jupyter-dl-gpu):
docker run -it --rm timesler/jupyter-dl-gpu pip install facenet-pytorch && ipythonEm Python, importe FaceNet-Pytorch e modelos instantados:
from facenet_pytorch import MTCNN , InceptionResnetV1
# If required, create a face detection pipeline using MTCNN:
mtcnn = MTCNN ( image_size = < image_size > , margin = < margin > )
# Create an inception resnet (in eval mode):
resnet = InceptionResnetV1 ( pretrained = 'vggface2' ). eval ()Processar uma imagem:
from PIL import Image
img = Image . open ( < image path > )
# Get cropped and prewhitened image tensor
img_cropped = mtcnn ( img , save_path = < optional save path > )
# Calculate embedding (unsqueeze to add batch dimension)
img_embedding = resnet ( img_cropped . unsqueeze ( 0 ))
# Or, if using for VGGFace2 classification
resnet . classify = True
img_probs = resnet ( img_cropped . unsqueeze ( 0 )) Consulte help(MTCNN) e help(InceptionResnetV1) para obter detalhes de uso e implementação.
Veja: Models/Incception_resnet_v1.py
Os seguintes modelos foram portados para Pytorch (com links para baixar o Pytorch state_dict's):
| Nome do modelo | Precisão da LFW (conforme listado aqui) | Conjunto de dados de treinamento |
|---|---|---|
| 20180408-102900 (111MB) | 0,9905 | Casia-Webface |
| 20180402-114759 (107 MB) | 0,9965 | Vggface2 |
Não há necessidade de baixar manualmente os Estados pré -traidos; Eles são baixados automaticamente na instanciação do modelo e armazenados em cache para uso futuro no cache da tocha. Para usar um modelo de Inception ResNet (V1) para reconhecimento/identificação facial em Pytorch, use:
from facenet_pytorch import InceptionResnetV1
# For a model pretrained on VGGFace2
model = InceptionResnetV1 ( pretrained = 'vggface2' ). eval ()
# For a model pretrained on CASIA-Webface
model = InceptionResnetV1 ( pretrained = 'casia-webface' ). eval ()
# For an untrained model with 100 classes
model = InceptionResnetV1 ( num_classes = 100 ). eval ()
# For an untrained 1001-class classifier
model = InceptionResnetV1 ( classify = True , num_classes = 1001 ). eval ()Ambos os modelos pré -ridicularizados foram treinados em imagens de 160x160 px, portanto, terão o melhor desempenho se aplicadas às imagens redimensionadas a essa forma. Para obter melhores resultados, as imagens também devem ser cortadas no rosto usando o MTCNN (veja abaixo).
Por padrão, os modelos acima retornarão incorporações 512-dimensionais de imagens. Para ativar a classificação, aprove classify=True para o construtor do modelo, ou você pode definir o atributo do objeto posteriormente com model.classify = True . Para VGGFFace2, o modelo pré-terenciado produzirá vetores de logit de comprimento 8631 e para os vetores de logit de Casia-webface do comprimento 10575.
O reconhecimento de rosto pode ser facilmente aplicado a imagens brutas detectando primeiro faces usando o MTCNN antes de calcular a incorporação ou probabilidades usando um modelo de resnet de Inception. O código de exemplo em exemplos/inferno.IPYNB fornece um pipeline de exemplo completo utilizando conjuntos de dados, dataloaders e processamento opcional de GPU.
O MTCNN pode ser usado para criar um sistema de rastreamento de rosto (usando o método MTCNN.detect() ). Um exemplo de rastreamento de rosto completo pode ser encontrado em exemplos/face_tracking.ipynb.

Na maioria das situações, a melhor maneira de implementar o reconhecimento de face é usar os modelos pré -treinados diretamente, com um algoritmo de cluster ou uma simples métrica de distância para determinar a identidade de uma face. No entanto, se for necessário Finetuning (ou seja, se você deseja selecionar a identidade com base nos logits de saída do modelo), um exemplo poderá ser encontrado em exemplos/Finetune.ipynb.
Este guia demonstra a funcionalidade do módulo MTCNN. Os tópicos abordados são:
Veja o caderno em Kaggle.
Este notebook demonstra o uso de três pacotes de detecção de rosto:
Cada pacote é testado quanto à sua velocidade na detecção das faces em um conjunto de 300 imagens (todos os quadros de um vídeo), com o suporte à GPU ativado. O desempenho é baseado no kernel de notebook P100 da Kaggle. Os resultados estão resumidos abaixo.
| Pacote | FPS (1080x1920) | FPS (720x1280) | FPS (540x960) |
|---|---|---|---|
| FaceNet-Pytorch | 12.97 | 20.32 | 25.50 |
| FaceNet-Pytorch (não lotado) | 9.75 | 14.81 | 19.68 |
| dlib | 3.80 | 8.39 | 14.53 |
| mtcnn | 3.04 | 5.70 | 8.23 |

Veja o caderno em Kaggle.
Esse algoritmo demonstra como obter uma detecção de rosto extremamente eficiente especificamente em vídeos, aproveitando as semelhanças entre os quadros adjacentes.
Veja o caderno em Kaggle.
O pacote e qualquer um dos notebooks de exemplo podem ser executados com o Docker (ou NVIDIA-Docker) usando:
docker run --rm -p 8888:8888
-v ./facenet-pytorch:/home/jovyan timesler/jupyter-dl-gpu
-v < path to data > :/home/jovyan/data
pip install facenet-pytorch && jupyter lab Navegue até os exemplos/ diretório e execute qualquer um dos notebooks IPython.
Consulte Timesler/Jupyter-DL-GPU para obter detalhes do contêiner do Docker.
Para usar este código em seu próprio repo Git, recomendo primeiro adicionar este repositório como submodule. Observe que o traço ('-') no nome do repo deve ser removido ao clonar como submódulo, pois quebrará o Python ao importar:
git submodule add https://github.com/timesler/facenet-pytorch.git facenet_pytorch
Como alternativa, o código pode ser instalado como um pacote usando PIP:
pip install facenet-pytorch
Veja: modelos/utils/tensorflow2pytorch.py
Observe que essa funcionalidade não é necessária para usar os modelos neste repositório, que dependem apenas do Pytorch state_dict salvo.
Após a instanciação do modelo Pytorch, os pesos de cada camada foram carregados de camadas equivalentes nos modelos de tensorflow pré -treinamento de Davidsandberg/Facenet.
A equivalência das saídas dos modelos originais de tensorflow e os modelos portados por Pytorch foi testada e é idêntica:
>>> 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
Para executar novamente a conversão de parâmetros de tensorflow no modelo Pytorch, verifique se você clonou esse repositório com submódulos , pois o repositório Davidsandberg/Facenet está incluído como submódulo e partes dele são necessárias para a conversão.
Facenet repo de David Sandberg: https://github.com/davidsandberg/facenet
F. Schroff, D. Kalenichenko, J. Philbin. FaceNet: Uma incorporação unificada para reconhecimento e cluster de rosto , arxiv: 1503.03832, 2015. PDF
Q. Cao, L. Shen, W. Xie, Om Parkhi, A. Zisserman. Vggface2: um conjunto de dados para reconhecer o rosto em pose e idade , conferência internacional sobre reconhecimento automático de rosto e gesto, 2018. PDF
D. Yi, Z. Lei, S. Liao e Sz Li. Casiawebface: Learning Face Representation De Scratch , Arxiv: 1411.7923, 2014. PDF
K. Zhang, Z. Zhang, Z. Li e Y. Qiao. Detecção e alinhamento de rosto articular usando redes convolucionais em cascata múltipla , Cartas de processamento de sinal IEEE, 2016. PDF