Несколько дней провозился с изучением вопроса распознавания лиц на разных платформах используя Unity. Сделал для себя несколько выводов.
Для Unity основным решением можно считать OpenCV for Unity, который является портом через Java. Примеров здесь множество, включая распознавание лица. Из коробки отслеживание «расхлебаное», поэтому для более плавного определения нужно докупить Dlib FaceLandmark Detector. Отслеживание положения лица становиться значительно лучше, количество опорных точек теперь 68.
Производительность печальна, особенно это чувствуется на мобильных устройствах. Большую часть производительности кушает сама «магия» определения, и преобразование специального материала для распознавания в текстуру и обратно. Чем выше разрешение вашей текстуры — тем больше времени займет распознавание. Решение который предлагает сам набор плагинов — уменьшение размера текстуры для определения в меньшую строну и производить расчет каждые N кадров. Такой вариант визуально на первый взгляд увеличивает работу приложения, но если присмотреться - кадр для расчета все равно просаживает картинку. Уменьшение размера для определения влияет на расстояние от камеры — чем лицо дальше тем труднее определить. Выбор — баланс этих двух параметров.
Если вы думаете что замена стандартной камеры webCam Unity на NatCam решит проблему, как подумал я — то вы ошибаетесь.
Как это работает? Берем текстуру с камеры (1280*720) превращаем ее в материал, выводим текстуру на UI или Renderer, если прошло 5 кадров скейлим текстуру (320*180), определяем лицо и пересчитываемым опорные точки относительно скейла.
NatCam Professional.
Картинка выдаваемая плагином действительно выглядит немного лучше, разработчик даже постарался создать пример для соединения плагинов (NatCam+OpenCV) – довольно далекий от «вставил и заработало». Вообще, нужно заметить, что в возможностях плагина и функционале описанному в магазине и на сайте много вещей, которые еще не реализованы, и находятся в закрытых бетах, которые еще нужно выпросить.
Плагин предоставит вам текстуру быстрее нежели стандартный, но обрабатывать texture-Mat-texture вы все равно будете на стороне OpenCV, так что никакого прироста производительность, единственное — мусор он убирать за собой в памяти умеет.
NatCam Extended умеет использовать Google Mobile Vision. Эту реализацию я тоже рассмотрел, в 1.5f2 работала с частотой 1-2 раза в секунду (LG Nexus5x) и плохо понимает поворот лица, в бете вообще не работало. Разработчик обещает будет лучше...
Вывод: чтобы использовать правильно и быстро необходимо распараллеливать обработку в разные потоки, что, видимо, делать нужно на уровне плагина OpenCV при портировании. На этом и выросли передовые Китайские и Индийские компании по передовым алгоритмам :)

