Вы также можете прочитать переведенную версию этого файла на китайском языке.
Это репозиторий для моделей на основе начального RESNET (V1) в Pytorch, предварительно подготовленном на VGGFACE2 и Casia-Webface.
Веса модели Pytorch были инициализированы с использованием параметров, переносимых из Tensorflow Facenet Repo от Дэвида Сандберга.
В этом репо также включена эффективная реализация MTCNN Pytorch для обнаружения лица до вывода. Эти модели также предварительно предварительно. Насколько нам известно, это самая быстрая реализация MTCNN.
Установить:
# 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 && ipythonВ Python, импорт Facenet-Pytorch и модели экземпляра:
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 ()Обработайте изображение:
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 )) См. help(MTCNN) и help(InceptionResnetV1) для сведений об использовании и реализации.
См.: Модели/Начало_RESNET_V1.PY
Следующие модели были перенесены в Pytorch (со ссылками на загрузку pytorch state_dict's):
| Название модели | Точность LFW (как указано здесь) | Обучающий набор данных |
|---|---|---|
| 20180408-102900 (111 МБ) | 0,9905 | Casia-Webface |
| 20180402-114759 (107 МБ) | 0,9965 | Vggface2 |
Нет необходимости вручную загружать предварительно проведенный State_dict's; Они загружаются автоматически на модельном экземпляре и кэшируют для будущего использования в кэше факела. Чтобы использовать модель основания Resnet (V1) для распознавания/идентификации лица в Pytorch, используйте:
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 ()Обе предварительные модели были обучены на изображениях 160x160 PX, поэтому будут работать лучше всего, если применить к изображениям, изменяемым до этой формы. Для достижения наилучших результатов изображения также должны быть обрезаны в лицо, используя MTCNN (см. Ниже).
По умолчанию приведенные выше модели возвращают 512-мерные встроенные изображения. Чтобы включить классификацию вместо этого, либо перенесите classify=True , чтобы потом установить атрибут объекта с помощью model.classify = True . Для VGGFACE2 предварительно подготовленная модель будет выходить логит векторов длины 8631 и для векторов логита Casia-Webface длиной 10575.
Распознавание лица может быть легко применено к необработанным изображениям, сначала обнаружая грани, используя MTCNN, прежде чем вычислять внедрение или вероятности, используя модель основания Resnet. Пример кода в примерах/anfer.ipynb содержит полный пример трубопровода с использованием наборов данных, данных DataLoaders и дополнительной обработки GPU.
MTCNN может использоваться для создания системы отслеживания лица (с использованием метода MTCNN.detect() ). Полный пример отслеживания лица можно найти в примерах/face_tracking.ipynb.

В большинстве ситуаций лучший способ реализовать распознавание лиц - это напрямую использовать предварительные модели, с алгоритмом кластеризации или простыми показателями расстояния для определения идентичности лица. Однако, если требуется настройка (т.е., если вы хотите выбрать идентификацию на основе выходных логитов модели), можно найти пример в примерах/finetune.ipynb.
Это руководство демонстрирует функциональность модуля MTCNN. Темы охватывают:
Смотрите ноутбук на Kaggle.
Этот ноутбук демонстрирует использование трех пакетов обнаружения лица:
Каждый пакет тестируется на его скорость при обнаружении лиц в наборе из 300 изображений (все кадры из одного видео), с поддержкой GPU. Производительность основана на ядре ноутбука Kaggle P100. Результаты суммированы ниже.
| Упаковка | FPS (1080x1920) | FPS (720x1280) | FPS (540x960) |
|---|---|---|---|
| Фасенет-Питорх | 12.97 | 20.32 | 25.50 |
| Facenet-Pytorch (не оставленный) | 9.75 | 14.81 | 19.68 |
| Dlib | 3.80 | 8.39 | 14.53 |
| Mtcnn | 3.04 | 5.70 | 8.23 |

Смотрите ноутбук на Kaggle.
Этот алгоритм демонстрирует, как достичь чрезвычайно эффективного обнаружения лиц, специально предназначенных для видео, используя сходство между соседними кадрами.
Смотрите ноутбук на Kaggle.
Пакет и любой из примеров ноутбуков можно запустить с Docker (или NVIDIA-Docker), используя:
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 Перейдите к примерам/ каталогу и запустите любой из ноутбуков Ipython.
См. Timesler/Jupyter-DL-GPU для деталей контейнера Docker.
Чтобы использовать этот код в собственном GIT Repo, я рекомендую сначала добавить это репо в качестве подмодуля. Обратите внимание, что прибор ('-') в имени репо следует удалить при клонировании в качестве подмодуля, поскольку он будет сломать Python при импорте:
git submodule add https://github.com/timesler/facenet-pytorch.git facenet_pytorch
В качестве альтернативы, код может быть установлен в виде пакета с использованием PIP:
pip install facenet-pytorch
См.: Модели/Utils/Tensorflow2pytorch.py
Обратите внимание, что эта функциональность не требуется для использования моделей в этом репо, что зависит только от сохраненного Pytorch state_dict .
После экземпляра модели Pytorch веса каждого слоя были загружены из эквивалентных слоев в предварительно подготовленных моделях Tensorflow от Davidsandberg/Facenet.
Эквивалентность выходов из исходных моделей Tensorflow и моделей Pytorch, портативных, были протестированы и идентичны:
>>> 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
Чтобы перезапустить преобразование параметров TensorFlow в модель Pytorch, убедитесь, что вы клонируете этот репо -подмодулы , поскольку Davidsandberg/Facenet Repo включен в качестве подмодуля, и его части необходимы для преобразования.
Facenet Repo от Дэвида Сандберга: https://github.com/davidsandberg/facenet
Ф. Шрофф, Д. Калениченко, Дж. Филбин. Facenet: единое внедрение для распознавания лица и кластеризации , Arxiv: 1503.03832, 2015. pdf
Q. Cao, L. Shen, W. Xie, Om Parkhi, A. Zisserman. VGGFACE2: набор данных для распознавания лица в позе и возрасте , Международная конференция по автоматическому признанию лица и распознавания жестов, 2018. PDF
Д. Йи, З. Лей, С. Ляо и С.З. Ли. Casiawebface: Обучение лицевая репрезентация с нуля , Arxiv: 1411.7923, 2014. PDF
К. Чжан, З. Чжан, З. Ли и Я. Цяо. Обнаружение и выравнивание совместного лица с использованием многозадачных каскадных сверточных сетей , IEEE -обработки букв, 2016. PDF