Разработка системы для верификации лиц с помощью нейросетей в рамках архитектуры Клиент-Сервер
19.01.2023 Добавлена библиотека для автономной верификации лиц на C#20.01.2023 Добавлена поддержка toolkit OpenVINO runtime. 23.01.2023 Добавлены тесты на C++ под OpenVINO runtime. 24.01.2023 Добавлены тесты на C# c подключением DLL на C++ под OpenVINO runtime. 28.12.2023 Распознавание ракурса 11.02.2024 Добавлена статистика запросов scale>1 : хорошо, >0.8 : удовл.distortions>0.99 : нет искажений, >0.9 : удовл.part>0.2 : хорошоslope<5 : хорошо, <30 : удовл.proportions>1 : хорошоtest_request_pose.pyБыло протестировано некоторое количество моделей верификации.
По результатам выбрана лучшая модель 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
conda create -n gsfv python=3.9
conda activate gsfvpip install -r requirements.txtmodels.python3 server.py <port> [onnx] [openvino] .
Аргументы команды :port - номер порта сервера.onnx - установить toolkit для расчета моделей от Microsoft. openvino - установить toolkit для расчета моделей от Intel.openvino опережает onnx в 2-6 раз. onnx будет опережать openvino на 10-30 %onnx. Пример на 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);
Пример на 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, на фотографиях скорее всего один человек, но фото сильно отличаются.
Иначе с большой долей уверенности, на фото один человек
python test_verification.py - Верификация фотографий и оценка правильности результатаpython test_request.py - Запуск локального сервера, верификация фотографий клиентом и оценка правильности результатаpython test_client_request.py - Верификация фотографий клиентом и оценка правильности результата. Требуется предварительный запуск server.pypython server.pyhtml/simple_verification.html для выбора фото с компьютераhtml/calfw_verification.html для сравнения случайных фото из датасета CALFW.
В 96.05 % случаев нейросеть даст правильный ответ при сравнении разновозрастных фотографий. ./modelscsharp/GSCVisioncsharp/GSCVision_testcsharp/GSCVision_testvar fv = new GSCVision.FaceVerification(models_folder,num_cpu_cores,cuda);
var sim = fv.verify(stream1,stream2);
CPPfaceVerification.sln (VS 2022), build all.csharp\FaceVerification_testcompile_and_run_tests.bat.В строке браузера набрать