Привет, Хабр! Очень часто я на просторах интернета натыкаюсь на такой вопрос: «А какое готовое решение по детекции лиц лучше всего использовать?» Так вот, я отобрал 5 решений с Github, которые показались мне хорошими, относительно новыми и лёгкими в использовании, и хотел бы сравнить их между собой. Всем, кому интересно, что из этого вышло, добро пожаловать под кат!

Суть эксперимента

Для начала, я отобрал на Kaggle с различных датасетов фотографии, на которых присутствуют лица и сформировал свой датасет. Датасет старался сделать максимально разнообразным. В полученном датасете имеются персоны в очках, курящие, в головных уборах, разных возрастов и национальностей, с бородой, а самое главное все фотографии были не самого высокого разрешения, на котором лица были немного размыты либо это размытие сделал я с помощью библиотеки OpenCV. Полученные фотографии разделил на 5 классов, в каждой из которых по 50 фотографий:

  • dummy faces — в эту папку попали лица статуй, героев симпсонов, аниме персонажей, барби;

  • лица, на которых присутствуют маски;

  • лица, которые сфотографированы в профиль;

  • белокожие;

  • темнокожие.

Далее данные фотографии я разметил с помощью замечательной программы labelme . Размечать старался таким образом, чтобы в ограничительную рамку попали подбородок, лоб и щёки . Последние две части лица не обязательно могут попадать полностью:

После разметки я прогнал фотографии через каждый из алгоритмов и посчитал следующие метрики: Intersection over Union, precision и recall. Про данные метрики можно почитать тут и тут. Уточню, что в данном случае найденное лицо — true positive, не найденное лицо — false negative, а ложное срабатывание(условно, когда машину распознало как лицо) — false positive. Также вычислил скорость работы алгоритма. Ну что ж, теперь перейдём непосредственно к самим решениям!

RetinaFace

И начну я, пожалуй, с самого лучшего алгоритма по таким метрикам как Intersection over Union, precision и recall . Как можно увидеть в readme данного репозитория, то его эффективность обнаружения потрясающая:

Вдобавок, с помощью данного репозитория имеется возможность находить ключевые точки лица, выравнивать и распознавать лица. Результат работы данного алгоритма на моих данных показан в табличке ниже:

Facenet-pytorch

Следующий метод чуть хуже по метрикам машинного обучения предыдущего решения, зато на порядок выше по скорости отработки. Также у данного алгоритма есть возможность работы на GPU, что ускоряет работу алгоритма примерно на 40% и потребляет около 1ГБ видеопамяти( цифры, которые приведены в табличке ниже — это результат отработки алгоритма на CPU). Результаты представлены ниже:

DBFace

Это решение в описании проекта, также как и первое решение, показывает впечатляющие результаты:

На деле же оказалось немного хуже по метрикам машинного обучения, нежели первое решение, зато по скорости гораздо лучше:

Face Recognition

Данное решение является одним из самых популярных, если судить по звёздам на Github, но точно не самым лучшим:

Я предполагаю, текущее решение может быть настолько популярно, так как кроме детекции лиц, тут есть много других полезных функций: возможность находить ключевые точки лица, распознавать лица, работать в реальном времени + разработка ведётся достаточно долго.

Ultra-Light-Fast-Generic-Face-Detector-1MB

Данный алгоритм работает очень быстро, что отрицательно отразилось на других метриках. Также у данного алгоритма есть возможность работы на GPU, но разницу по времени отработки алгоритма я не увидел. Вот какие результаты мне удалось получить:

Заключение

Все результаты были получены при стандартных параметрах. Наверняка, есть подкрутить некоторые параметры, то можно было бы увидеть ещё лучше результаты. Исходный код с реализацией каждого алгоритма и подсчётом метрик я выложил на Github. Там же доступны датасеты и разметка. Хочу отметить, что все эксперименты проводились на Ubuntu. Также я готов принимать pull request'ы с вашими решениями и результатами!

Комментарии (13)


  1. skrutikovksy
    19.04.2022 05:48
    +2

    Интересная статья, единственная придирка(извините за токсик) таблицы можно было бы представить в виде графиков и потом свести к общему графику результат. Было бы чуть нагляднее чем шариться, пусть и не в больших, но таблицах.

    Спасибо автору за материал!


    1. wadik69 Автор
      19.04.2022 10:48

      Идея с общим графиком хорошая! Пожалуй, добавлю чуть позже в readme на github)


  1. tsurugi-no_ken
    19.04.2022 06:16

    Помнится, у распознавалок лиц распространённая проблема это распознавание чёрных. Как с этим обстоит у упомянутых в статье распознавалок?


    1. wadik69 Автор
      19.04.2022 10:39

      Если Вы про темнокожих, то я выделил их в отдельную группу. Результаты куда не хуже, чем для других групп)


  1. Notimer
    19.04.2022 06:49
    +6

    Не такое уж и старое там лицо...


  1. IamSVP
    19.04.2022 08:49

    Вы же добавили данные из открытых датасетов. Может ли быть такое, что на этих данных эти модели учились? Не пропадает тогда объективность метрик?!


    1. wadik69 Автор
      19.04.2022 10:43

      В некоторых репозиториях указаны данные на которых они обучались. Откуда я брал данные, и с данными, на которых они обучали - пересечений не было замечено. Также я в большинсте случаев наносил на фотку дополнительно блюр + порою менял разрешение на более низкое, поэтому совпадения вряд ли будут


  1. lab412
    19.04.2022 09:58

    интересные результаты, но время работы удручает. я может чего то не понял конечно, но самый быстрый алгоритм 3 секунды ищет лицо?? а как же тогда в реальном времени телефоны и всякие OpenCV лица находят на видео? у меня трэкинг лица есть на RPi и в реальном времени работает, а значит как минимум в 75 раз быстрее за 1/25 секунды...


    1. wadik69 Автор
      19.04.2022 10:47
      +1

      Это моя ошибка, я не уточнил, что время указано не для одной фотки, а для 50 сразу. То есть, условно, если в табличке написано 100с, то это значит, что примерно на одной фотографии отрабатывает за 2с


    1. IamSVP
      19.04.2022 16:24
      -2

      так это время питонячее. Оберните модельки в onnx и откройте с OpenCV - скорость вырастет


      1. wadik69 Автор
        19.04.2022 18:08

        Ещё можно было и размер картинки меньше передавать на вход , что тоже , скорее всего, уменьшило время работы алгоритма, но в конце статьи я написал, что все вычисления проводились на основании дефолтных параметров. Под этим имелось также, что никаких оптимизаций с точки зрения времени не делалось)


  1. dimnsk
    19.04.2022 16:52

    Face Recognition - популярное потому что оно может сравнивать лица

    PS mediapipe где?


    1. wadik69 Автор
      19.04.2022 17:55

      Жду Pull Request:)