7 окт. 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 Уже реализован алгоритм, однако нужно самостоятельно создать и обучить нейронную сеть на определенном наборе дагнных - эти данные не предоставляются. Правда, непонятно, насколько это решение рабочее и в актуальном состоянии
Предлагается натренировать нейронную сеть и использовать opencv. Есть схожая задача по клачификации пола https://stackoverflow.com/questions/18373444/face-type-detection, http://docs.opencv.org/2.4/modules/contrib/doc/facerec/tutorial/facerec_gender_classification.html
Предлагают разные сценарии использования opencv. В частности Active Appearance Model (AAM) и KLT algorithm in Opencv https://stackoverflow.com/questions/27886901/detect-face-shape-oval-square-diamond
Предлагают изучить это руководство: http://hanzratech.in/2015/02/03/face-recognition-using-opencv.html
Еще предлагают такой вариант:
You can train a linear classifier for that. If the accuracy is good enough, cool. Else train a CNN. But first collect some labelled data.
Тут наблюдается небольшой холивар на тему, какие есть библиотеки для распознавания лиц. Все это именно распознавание, но зато есть неплохая подборка инструментов. Возможно, какой-то из них поддерживает распознавание типа лица https://stackoverflow.com/questions/953714/face-recognition-library
Наконец, последний вариант. Это чисто моя идея - гипотеза. Не успел проверить. Наверное, похожесть картинок сравнивать проще, чем узнать тип лица. Можно собрать набор картинок с разными типами лица. Для каждой определить тип лица вручную и сохранить. После этого сравнивать картинки каждую с каждой и составлять индекс похожести. На основании индексов пробовать определять форму лица.
В итоге? все это исследование заняло у меня чуть больше часа. Реальных тестов не проводил. Библиотеки не устанавливал и не настраивал Все это было сделано для примерной оценки трудозатрат. И оценки возможности сделать проект впринципе.
К сожалению, мы имели дело с типичным начинающим стартапом. И бюджет проекта был смело оценен в 30 тысяч рублей.
Причем в этот бюджет также входила разработка мобильного приложения + "классный дизайн" и "нескучные обои". Да, это должен быть прототип, но сделать мы его должны были "круто". Чтобы прототип понравился инвесторам.
"Блин, но чем круче будет прототип, тем серьёзнее мы будем выглядеть и больше возьмём денег
Тип, круто сделаете за 5тыщ, и мы возьмём деньги на питче, тогда сможем взять этого разработчика на содержание."
"Погоди, я правильно понимаю, что единовременно оправа прототипа для вас приюеимущественнее возможного содержания?"
Примерно в таком духе:
Вскоре выяснилось, что даже этих денег у заказщика на руках нет и предлагается сделать "круто за 5 тыщ". Естетвенно обещают горы золота, долю в компании, безбедную старость и т.д. До боли знакомо, увы...
В результате, осталось такое вот исследование. Решил опубликовать его в виде статьи
Во первых на память. Во-вторых, вдруг, кому-нибудь пригодится.1 Да и к тому же, кто знает, мб придется что-то подобное когда-то делать самому.
Напрашивается идея реализовать алгоритм и оформить в виде простого облачного сервиса. Который будет делать именно это. Ну и платная подписка в какой-то момент.