GSFV (GradoService Face Verification)

Разработка системы для верификации лиц с помощью нейросетей в рамках архитектуры Клиент-Сервер

Распознавание ракурса лица

Верификация лиц

Было протестировано некоторое количество моделей верификации.

По результатам выбрана лучшая модель Partial FC.

Модель LFW, % CALFW, % Ошибок при сравнении негативных пар LFW Скорость, GeForce 750 Ti, фото/сек Скорость, CPU, фото/сек
MobileFaceNet 99.63 93.7 0.18 % 116 46
EfficientNet 99.68 94.50 0.12 % 58 12
TF-NAS 99.8 94.77 0.18 % 64 16
AttentionNet-56 99.93 95.57 0.06 % 21 6
QMagFace 99.95 95.983 0.049 % 12 5
Partial FC 99.97 96.05 0.023 % 14 (GeForce 1060: 30) OpenVINO: 5.5 (ONNX: 2.2)

Детектирование лиц

Было протестировано 2 детектора лиц: RetinaFace и SCRFD.

Оба детектора показали примерно одинаковые результаты по скорости и качеству детектирования.

У RetinaFace немного лучше результаты со всеми моделями верификации, кроме Partial FC.

Поэтому в качестве детектора был выбран SCRFD, но для других моделей лучше использовать RetinaFace.

Требуемые ресурсы для сервера

Потребляемая память скриптом server.py при одновременной посылке запросов с 1x-4х источников: ~ 890 Mb

Но нужно учитывать фрагментацию памяти при долгой работе сервера, и вероятность большого числа запросов. Поэтому требуемые ресурсы для сервера такие: Выделенная оперативная память - 8 Gb, Минимум 4 Gb

Создание окружения и установка пакетов

  1. Создайте окружение : conda create -n gsfv python=3.9 conda activate gsfv
  2. Установите необходимые пакеты: pip install -r requirements.txt

Загрузка обученных моделей

Порядок работы со стороны сервера

  1. Запустите http сервер командой python3 server.py <port> [onnx] [openvino] . Аргументы команды :
  2. Для удаленного просмотра лог файла, в адресной строке браузере отправьте команду /log

Порядок работы со стороны клиента

1. Подготовка запроса и его отправка на сервер

Пример на Python response = requests.post(serverURL, files={ 'photo1': open("photo1.png", 'rb'), 'photo2': open("photo2.png", 'rb'),'threshold':'0.4','threshold2':'0.3'}) Пример на JS let formData = new FormData() formData.append("photo1", data1) // data1 - картинка 1 в кодировке base64 или URL formData.append("photo2", data2) // data2 - картинка 2 в кодировке base64 или URL let xhr = new XMLHttpRequest() xhr.open("POST", serverURL) xhr.onload = function() { ... } xhr.send(formData) Пример на C# HttpClient client = new HttpClient(); using var content = new MultipartFormDataContent(); var fsc1 = new StreamContent(File.OpenRead("photo1.png")); content.Add(fsc1, name: "photo1", fileName: "photo1.png"); var fsc2 = new StreamContent(File.OpenRead("photo3.png")); content.Add(fsc2, name: "photo2", fileName: "photo2.png"); using var response = await client.PostAsync(serverURL, content); var responseText = await response.Content.ReadAsStringAsync(); Console.WriteLine(responseText);

2. Получение ответа и интерпретация результата

Пример на Python if response.status_code==200 : result = json.loads(response.text) if 'verify' in result: sim = r['verify']['similarity'] ... else: print("Лицо не найдено") Пример на JS if(xhr.readyState == 4 && xhr.status == 200) { const obj = JSON.parse(xhr.responseText); if ('error' in obj) { ... } let sim = obj.verify.similarity ... } В переменной sim содержится нормализованное значение близости.

Если sim меньше или равна 0, на фотографиях разные люди.

Если sim меньше 0.3, на фотографиях скорее всего один человек, но фото сильно отличаются.

Иначе с большой долей уверенности, на фото один человек

Запуск тестов для проверки корректной работы программы

  1. python test_verification.py - Верификация фотографий и оценка правильности результата
  2. python test_request.py - Запуск локального сервера, верификация фотографий клиентом и оценка правильности результата
  3. python test_client_request.py - Верификация фотографий клиентом и оценка правильности результата. Требуется предварительный запуск server.py

Запуск html примеров

  1. Запустите http сервер: python server.py
  2. Откройте в браузере html/simple_verification.html для выбора фото с компьютера
  3. Откройте в браузере html/calfw_verification.html для сравнения случайных фото из датасета CALFW. В 96.05 % случаев нейросеть даст правильный ответ при сравнении разновозрастных фотографий.

Верификация лиц на C

Платформа на которой производилось тестирование

Необходимые пакеты:

Запуск тестов для проверки корректной работы библиотеки

Вызов функции верификации лиц.

var  fv = new GSCVision.FaceVerification(models_folder,num_cpu_cores,cuda);
var sim = fv.verify(stream1,stream2);

Верификация лиц на C++ (C# + C++ DLL)

Необходимые библиотеки:

Сборка и запуск

Получение статистики в формате json

В строке браузера набрать /stat

Получение посуточной и почасовой статистики в виде графика