- PVSM.RU - https://www.pvsm.ru -

В программировании есть много разных способов аутентификации и каждая из них имеет как свои плюсы, так и минусы. В этой статье я хотел бы сделать обзор библиотеки, позволяющей с легкостью добавить аутентификацию лица в ваше .NET приложение.
Меня зовут Салахетдинов Орхан, и я — .NET-разработчик. Люблю изучать что-то новое в сфере программирования (и не только) и хочу внести свою лепту в развитие open-source. Еще хотел бы добавить, что это моя первая статья, я бы хотел написать еще одну (возможно, и несколько) статей про системы распознавания лиц и как они работают на простом языке. Если будет хороший актив и фидбек, то почему бы и нет? Судите, как хотите, так как я рад любому фидбеку, исключение — тотальная аннигиляция поста (опционально).
Не так давно, буквально несколько месяцев назад, мне стала любопытна тема computer vision и ее часть — face recognition. Мне всегда нравилась функция FaceID от Apple, так как она очень удобная и практичная, и я подумал: есть ли такая библиотека для платформы .NET? К сожалению, после недолгого ресерчинга я так и не нашел чего-то похожего для .NET. В итоге я решил создать свою библиотеку аутентификации лица. Цель данной библиотеки — прежде всего пиар показать .NET- (и не только) разработчикам, как легко можно использовать Face Authentication в своих проектах. Она, к слову, есть как в NuGet [1] так и в GitHub [2]

Для начала установим сам Nuget [1]
dotnet add package FaceAuth
Хотел бы добавить, что при скачивании данного Nuget-пакета вам дополнительно скачаются его зависимости, а именно Emgu.CV и Emgu.CV.runtime.windows. Если у вас Linux или Mac, то следовательно заменяем Emgu.CV.runtime.windows на Emgu.CV.runtime.ваша ос.
После установки библиотеки мы можем написать простейший код для аутентификации лица.
using FaceAuth;
var auth = new FaceAuthProvider();
// Check and Initialize out camera
if (auth.CameraInitialize())
{
// Initialize FaceRecognizer model
auth.LoadFaceRecognizer();
//Register
auth.RegisterIFace("The name of the person you are registering", 10);
// Recognize face
auth.Recognize();
}
else
{
Console.WriteLine("Your Camera Not Found!");
}
1.
var auth = new FaceAuthProvider();
Происходит инициализация DNN (глубокой нейронной сети) для нахождения и выделения лица и самой модели для определения лица. Также при первой сборке проекта в пути binDebugnet6.0 создается папка Assets, в которой будут два файла: deploy.prototxt и res10_300x300_ssd_iter_140000_fp16.caffemodel. Эти файлы нужны для инициализации нашей DNN.
2.
auth.CameraInitialize()
Как и понятно по названию, происходит инициализация нашей камеры, а точнее — ее поиск. Если есть камера, нам вернется true, иначе — false.
auth.LoadFaceRecognizer();
В данном коде происходит поиск и обучение модели распознавания лиц.
Во-первых, идет поиск папки TrainedFaces, в которой находятся лица для обучения. Если такой не имеется, то она создается. Если папка существует, то оттуда берутся все фотографии лиц, и они скармливаются модели.
Структура хранения лиц для обучения выглядит следующим образом:
└── TrainedFaces/ # Папка для хранения изображений лиц
├── Имя 1/ # Имя зарегестрированного человека
├── Фотография1.jpg
├── Фотография2.jpg
├── Фотография3.jpg
├── Имя 2/ # Имя зарегестрированного человека
├── Фотография1.jpg
├── Фотография2.jpg
├── Фотография3.jpg
├── Имя 3/ # Имя зарегестрированного человека
├── Фотография1.jpg
├── Фотография2.jpg
├── Фотография3.jpg
Все изображения, конечно же, черно-белые для более эффективной работы модели распознавания лиц.
4.
auth.RegisterIFace("The name of the person you are registering", 10);
Тут происходит сам процесс регистрирования лиц. Под словом регистрирования подразумевается их сохранение в проекте, по структуре, которая описана выше.
5.
auth.Recognize();
Ну и наконец само распознавание лица. Первое что делает метод Recognize() так это проверяет обучена ли модель, если нет то он выдает исключение Recognition Model not trained.
Наша модель распознавания лиц, а именно Fisher Face Recognizer, использует алгоритмы Principal Component Analysis (PCA) и Linear Discriminant Analysis (LDA) для извлечения характеристических признаков лица. Не стоит вдаваться в подробности о том, как в принципе работают модели распознавания лиц в этой статье. Об этом стоит написать отдельную статью, но могу вкратце сказать, что наша модель смотрит на разные части лица и ищет те, которые помогают отличить одного человека от другого. Она сравнивает новое лицо с лицами, на которых она тренировалась, и определяет, зарегистрировано оно или же нет.
Вот советы из GitHub [2] самой библиотеки.
Для большой работы нужно от 50-200 изображений одного человека в разных положениях головы.
Вы можете поместить auth.Recognize() в цикл из 10 итераций и получить хотя бы 1 true для успешной аутентификации.
// Recognize face
for (int i = 0; i < 10; i++)
{
if (auth.Recognize())
{
Console.WriteLine("Successful authentication");
return;
}
}
Console.WriteLine("Failed authentication");
Recognize() желательно делать не в бесконечном цикле, для более эффективной аутентификации.
Рекомендуется сделать анти-спам систему для защиты от взлома.
bool TryRecognize(FaceAuthProvider _auth, ref int _recognizeCount)
{
_recognizeCount++;
return _auth.Recognize();
}
int recognizeCount = 0;
for (int i = 0; i < 10; i++)
{
if (recognizeCount <= 5)
{
TryRecognize(auth, ref recognizeCount);
}
else
{
Console.WriteLine("You cant recognize more");
return;
}
}
Я бы очень хотел увидеть FaceAuth в крупных проектах, возможно, я добавлю его и в свои проекты. Я надеюсь, я смог внести хоть какой-то вклад в open-source-сообщество, ну и для .NET-разработчиков в целом. Надеюсь, вам понравилась данная статья, жду комментариев и активности :)
Автор:
Or1onn
Источник [3]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/net/385715
Ссылки в тексте:
[1] NuGet: https://www.nuget.org/packages/FaceAuth/
[2] GitHub: https://github.com/Or1onn/FaceAuth
[3] Источник: https://habr.com/ru/articles/745306/?utm_source=habrahabr&utm_medium=rss&utm_campaign=745306
Нажмите здесь для печати.