Привет, Хабр! Очень часто я на просторах интернета натыкаюсь на такой вопрос: «А какое готовое решение по детекции лиц лучше всего использовать?» Так вот, я отобрал 5 решений с Github, которые показались мне хорошими, относительно новыми и лёгкими в использовании, и хотел бы сравнить их между собой. Всем, кому интересно, что из этого вышло, добро пожаловать под кат!
![](https://webcf.waybackmachine.org/web/20220516131417/https://habrastorage.org/getpro/habr/upload_files/f00/17b/136/f0017b13620bcbce5945cc3a18b0a1f4.png)
Суть эксперимента
Для начала, я отобрал на Kaggle с различных датасетов фотографии, на которых присутствуют лица и сформировал свой датасет. Датасет старался сделать максимально разнообразным. В полученном датасете имеются персоны в очках, курящие, в головных уборах, разных возрастов и национальностей, с бородой, а самое главное все фотографии были не самого высокого разрешения, на котором лица были немного размыты либо это размытие сделал я с помощью библиотеки OpenCV. Полученные фотографии разделил на 5 классов, в каждой из которых по 50 фотографий:
dummy faces — в эту папку попали лица статуй, героев симпсонов, аниме персонажей, барби;
лица, на которых присутствуют маски;
лица, которые сфотографированы в профиль;
белокожие;
темнокожие.
Далее данные фотографии я разметил с помощью замечательной программы labelme . Размечать старался таким образом, чтобы в ограничительную рамку попали подбородок, лоб и щёки . Последние две части лица не обязательно могут попадать полностью:
![](https://webcf.waybackmachine.org/web/20220516131417/https://habrastorage.org/getpro/habr/upload_files/da2/a1f/488/da2a1f488fc9d439f4ef4b0261a857c6.png)
После разметки я прогнал фотографии через каждый из алгоритмов и посчитал следующие метрики: Intersection over Union, precision и recall. Про данные метрики можно почитать тут и тут. Уточню, что в данном случае найденное лицо — true positive, не найденное лицо — false negative, а ложное срабатывание(условно, когда машину распознало как лицо) — false positive. Также вычислил скорость работы алгоритма. Ну что ж, теперь перейдём непосредственно к самим решениям!
RetinaFace
И начну я, пожалуй, с самого лучшего алгоритма по таким метрикам как Intersection over Union, precision и recall . Как можно увидеть в readme данного репозитория, то его эффективность обнаружения потрясающая:
![](https://webcf.waybackmachine.org/web/20220516131417/https://habrastorage.org/getpro/habr/upload_files/557/48c/7b5/55748c7b53d821cf06c7012a5506fa25.png)
Вдобавок, с помощью данного репозитория имеется возможность находить ключевые точки лица, выравнивать и распознавать лица. Результат работы данного алгоритма на моих данных показан в табличке ниже:
![](https://webcf.waybackmachine.org/web/20220516131417/https://habrastorage.org/getpro/habr/upload_files/84d/b0c/dd5/84db0cdd575bd7df0d183fc29d0c5710.png)
Facenet-pytorch
Следующий метод чуть хуже по метрикам машинного обучения предыдущего решения, зато на порядок выше по скорости отработки. Также у данного алгоритма есть возможность работы на GPU, что ускоряет работу алгоритма примерно на 40% и потребляет около 1ГБ видеопамяти( цифры, которые приведены в табличке ниже — это результат отработки алгоритма на CPU). Результаты представлены ниже:
![](https://webcf.waybackmachine.org/web/20220516131417/https://habrastorage.org/getpro/habr/upload_files/671/540/97f/67154097f4341d04a6caec71ea3770d3.png)
DBFace
Это решение в описании проекта, также как и первое решение, показывает впечатляющие результаты:
![](https://webcf.waybackmachine.org/web/20220516131417/https://habrastorage.org/getpro/habr/upload_files/af4/426/e69/af4426e69b91573674b765dc075c5763.png)
На деле же оказалось немного хуже по метрикам машинного обучения, нежели первое решение, зато по скорости гораздо лучше:
![](https://webcf.waybackmachine.org/web/20220516131417/https://habrastorage.org/getpro/habr/upload_files/c7e/ad8/3a3/c7ead83a3eb6b5f3833c433b3cb4e378.png)
Face Recognition
Данное решение является одним из самых популярных, если судить по звёздам на Github, но точно не самым лучшим:
![](https://webcf.waybackmachine.org/web/20220516131417/https://habrastorage.org/getpro/habr/upload_files/62f/0cc/2d7/62f0cc2d761ab35772606d906eec1a10.png)
Я предполагаю, текущее решение может быть настолько популярно, так как кроме детекции лиц, тут есть много других полезных функций: возможность находить ключевые точки лица, распознавать лица, работать в реальном времени + разработка ведётся достаточно долго.
Ultra-Light-Fast-Generic-Face-Detector-1MB
Данный алгоритм работает очень быстро, что отрицательно отразилось на других метриках. Также у данного алгоритма есть возможность работы на GPU, но разницу по времени отработки алгоритма я не увидел. Вот какие результаты мне удалось получить:
![](https://webcf.waybackmachine.org/web/20220516131417/https://habrastorage.org/getpro/habr/upload_files/213/d36/8fa/213d368fabf8e0165415a593e2b1777b.png)
Заключение
Все результаты были получены при стандартных параметрах. Наверняка, есть подкрутить некоторые параметры, то можно было бы увидеть ещё лучше результаты. Исходный код с реализацией каждого алгоритма и подсчётом метрик я выложил на Github. Там же доступны датасеты и разметка. Хочу отметить, что все эксперименты проводились на Ubuntu. Также я готов принимать pull request'ы с вашими решениями и результатами!