Research на тему распознавания лиц

7 Oct 2017

Всем привет! Не так давно пришлось столкнуться с задачей распознавания лиц. Вернее даже не распознавания непосредственно лица, а распознавания типа. У знакомых ребят были идеи связанные с этим, им нужно было сделать прототип.

Задача примерно такая. Нужно написать серверную часть приложения, которое на вход получает картинку, фотографию лица, сделанную с мобильного устройства. Сервер должен распознавать лицо и узнавать его тип. Именно тип - овальный, прямоугольный и т.д.

Сама процедура определения типа описана тут: https://lifehacker.ru/2016/11/17/tip-lica/ .

Но здесь все это предлагается делать вручную, стоя перед зеркалом. Нам же нужно было, чтобы сервер делал все это по фотографии.

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

  • Есть php библиотека для распознавания лиц, которая возможно поддерживает данный функционал(не проверял).
    https://www.xarg.org/project/php-facedetect/

  • Есть облачный сервис Face API от Microsoft. Есть клиенты для основных платформ. Опять же, проверить не успел. Есть разные возможности, но в основном именно распознавание лиц.
    https://docs.microsoft.com/ru-ru/azure/cognitive-services/face/quickstarts/php

  • Стороннее API, которое реально работает. Распознает лицо + определяет некоторые данные(прим. возвраст). Судя по описанию, поддерживает и форму, но в demo этого нет. https://www.betafaceapi.com/demo.html

  • Создание слепка лица. В результате теоретически возможно опредилить форму просто по разнице цветов. Насколько я понял, эта библиотека делает слепок с лица
    https://github.com/phg1024/FaceShapeFromShading

    Возможно, по нему удастся достаточно просто понять форму - по контрасту. Также есть научная статья на эту тему:
    https://www.doc.ic.ac.uk/teaching/distinguished-projects/2012/p.snape.pdf

  • Есть библиотека написанная на python, которая делает точно то, что нужно.
    https://github.com/lheadjh/FaceTypeDetector

    Основано на библиотеке Stasm. Доступно руководство, описывающее алгоритм:
    http://www.milbo.org/stasm-files/stasm4.pdf

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

Есть несколько похожих вопросов на stackoverflow:

Наконец, последний вариант. Это чисто моя идея - гипотеза. Не успел проверить. Наверное, похожесть картинок сравнивать проще, чем узнать тип лица. Можно собрать набор картинок с разными типами лица. Для каждой определить тип лица вручную и сохранить. После этого сравнивать картинки каждую с каждой и составлять индекс похожести. На основании индексов пробовать определять форму лица.

В итоге? все это исследование заняло у меня чуть больше часа. Реальных тестов не проводил. Библиотеки не устанавливал и не настраивал Все это было сделано для примерной оценки трудозатрат. И оценки возможности сделать проект впринципе.

К сожалению, мы имели дело с типичным начинающим стартапом. И бюджет проекта был смело оценен в 30 тысяч рублей.

Причем в этот бюджет также входила разработка мобильного приложения + "классный дизайн" и "нескучные обои". Да, это должен быть прототип, но сделать мы его должны были "круто". Чтобы прототип понравился инвесторам.

"Блин, но чем круче будет прототип, тем серьёзнее мы будем выглядеть и больше возьмём денег

Тип, круто сделаете за 5тыщ, и мы возьмём деньги на питче, тогда сможем взять этого разработчика на содержание."

"Погоди, я правильно понимаю, что единовременно оправа прототипа для вас приюеимущественнее возможного содержания?"

Примерно в таком духе:

Вскоре выяснилось, что даже этих денег у заказщика на руках нет и предлагается сделать "круто за 5 тыщ". Естетвенно обещают горы золота, долю в компании, безбедную старость и т.д. До боли знакомо, увы...

В результате, осталось такое вот исследование. Решил опубликовать его в виде статьи

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

Напрашивается идея реализовать алгоритм и оформить в виде простого облачного сервиса. Который будет делать именно это. Ну и платная подписка в какой-то момент.