Однажды я писал на Хабр про различные технологии получения 3D изображения с одной камеры. Заканчивал я ту статью словами: “Сам я, правда, до сих пор не сталкивался ни с одной из этих камер, что жалко и досадно."
И вот, внезапно, не прошло и года, Intel проводит в Москве семинар + хакатон по новому поколению своих 3D камер (Intel RealSense). Любопытство взыграло: мы с коллегой записались на мероприятие. Как выяснилось, не зря. Хакатон мы выиграли + получили Developer-версию камеры, которую теперь мучаем.
Статья посвящена двум вещам:
1) Рассказу про камеру, её плюсы и недостатки. Обзор того, что можно сделать, а для каких задач она не годится.
2) Рассказ про концепцию, которую мы предложили на хакатоне и за которую получили первое место.
Камера
Про камеру можно говорить много. Камера оказалась интереснее ожиданий, но не в плане качества, а в плане заложенной математики. Из глобальных вещей:
Во-первых, вместо технологии Time of flight произошло возвращение к структурированной подсветке. Думаю, что точность за ту же цену оказывается выше. Конечно, потенциала больше у ToF, но там огромная стоимость качественного сенсора. Структурированная подсветка имеет интересный рисунок, движущийся во времени
Если честно, я не понимаю, как они нивелируют эту картинку в ИК потоке. Вероятно какой-то межкадровой апроксимацией. Но явно это не заметно.
Во-вторых, очень классная математика для выделения пальцев на руках и контуров лица. Контуры лица выделяются через активные модели внешнего вида, но, алгоритмы расширены на 3D область. Это решение позволило увеличить стабильность и точность работы. Интересный момент — выделение лица работает на обычных камерах. Точность, конечно, поменьше, но при ярком освещении неплохо. Идея мне понравилась. Насколько мне известно, стабильного решения по активным моделям, которое можно было бы взять и использовать бесплатно просто не было (хотя, конечно, 4хгиговый SDK останавливает).
Выделение лица двухэтапно. Сначала каким-то быстрым алгоритмом (вероятно хааром) ищется регион с лицом, потом через активную модель формы натягивается лицо. Устойчиво к мимике и к очкам. Не устойчиво к поворотам более 15-20 градусов.
Решение с выделением пальцев мне тоже понравилось. Идеальной стабильности нет, но система предсказуема, на её основе можно создавать вполне рабочие приложения. Наверное, менее точное, чем у Leap Motion, зато больше область обзора. Решение не идеально. Возникают неоднозначности, криво натягиваются модели. Некоторые из встроенных жестов распознаются через раз. Некоторые из жестов не распознаются, если сначала система не увидит развёрнутую руку. В видео ниже я попробовал осветить проблемы.
На мой взгляд, потенциал есть уже сейчас. А если качество выделения рук повысят ещё раза в полтора, то такое управление будет сравнимо с тачпад.
В третьих, хотелось бы отметить, что Kinect и RealSense имеют разные ниши. Kinect нацелен на большие пространства, для работы с человеком издалека. А RealSense для прямого взаимодействия с системой, куда он установлен. Во многом это определяет и параметры 3D сенсора.
Минусы
Не обошлось и без минусов. Так как текущая версия ещё не финальная, хотелось бы надеяться, что их поправят.
Первый неудобный момент — драйвера пока сырые. У коллеги, с которым мы ходили в какой-то момент камера напрочь отказалась работать. Помог только снос всех драйверов и их переустановка несколько раз.
При инициализации видеопотока периодически происходит фэйл, всё приложение зависает секунд на 20-30 и не стартует. Словлено на двух компах.
Второй момент относится к распознаванию лица. На мой взгляд упускается большое количество информации:
1) Глаза — зеркало души. Почему не выделяется явное направление взгляда? Есть направление лица, есть выделение положения зрачков (откуда, теоретически можно получить направление). Но при углах поворота головы более 5 градусов положение зрачков начинает апроксимироваться центром глаза. При этом это явно никак не указывается. Конечно, хотелось бы, чтобы в API было явно вынесена возможность использовать направление.
2) Выделение лица работает только в двух режимах, в "FACE_MODE_COLOR_PLUS_DEPTH" и в «FACE_MODE_COLOR». Почему нет «FACE_MODE_IR_PLUS_DEPTH» или хотя бы «FACE_MODE_IR»? В условиях слабой освещенности лица выделение перестаёт работать. Почему нельзя использовать для выделения режим, где лицо всегда видно хорошо и стабильно. Многие любят сидеть перед компьютером в полутёмной комнате.
Третий момент — архитектура. Может мы не поняли до конца что-то, но у нас не удалось одновременно запустить распознавание лица и распознавание рук. Любую из этих систем нужно инициализировать отдельно.
Четвёртый минус — не все заявленные частоты работают. Конечно, можно попробовать подобрать с камеры видео 640*480*300fps. Но оно не подбирается в таком качестве и не сохраняется. Хотелось бы, чтобы перечислялись рабочие режимы.
Пятый минус немного персонализированный для той тематике, где мы часто работаем — «биометрия». Будь бы длинна волны лазера 800-900нм, а не 700-600, как в камере, было бы видно много биометрических признаков человека, системы распознавания можно было бы делать прямо на этой камере.
Как мы выиграли Хакатон
Хакатон начинался после полутора часов лекций и показа примеров. Всего было 40 человек в 13 командах. Формат: «даём камеру, через 6 часов покажите проект».Учитывая, что любая видеоаналитика весьма сложна, это немного. С другой стороны, странно проводить такие мероприятия в другом формате (суммарно всё длилось часов 8, под конец все были сильно измотаны).
Кто-то к хакатону основательно готовился. Кто-то взял проекты, сделанные для других целей и сильно модифицировал их. Вся наша с Васей подготовка к хакатону заняла часа три. Сидели, пили чай и думали что же можно сделать. Идей был несколько:
1) Попробовать взять какой-нибудь наш проект и приспособить к нему 3D камеру. Проблема была, что все проекты были именно для 2D-распознавания/аналитики. И прикручивать камеру к ним было явно больше 4х часов. Плюс к тому, непонятно как это можно было красиво обставить.
2) Попробовать показать демонстрационный эффект, какое-то простое и классическое приложение. Управление мышкой/самолётиком глазами/рукой. Рисование на лице усов/бакенбардов. Минус такого варианта — он достаточно пустой и неинтересный. До красивого состояния доводить долго, а простой вариант не будет интересен публике.
3) Показать качественно новую идею, достижимую только на данном продукте. Понятно, что за 4 часа хакатона такую штуку невозможно сваять до конца. Но есть возможность показать демонстрационный эффект. Этот вариант понравился больше всего. Тут основная проблема — придумать такую идею
Одна из вещей, которые мне нравятся — аналитика состояния человека. Возможно, вы читали одну из моих прошлых статей на Хабре. И конечно, меня понесло в ту же сторону. Но делать усиление движения через 3D — малоффективно. Зато через 3D можно снять много характеристик сидящего перед камерой человека. Но вот только как и куда это применить?
Ответ оказался на удивление тривиальным и очевидным, стоило только Васю спросить меня: «а чем может помочь 3D камера в машине?». И тут нас просто понесло. Ведь 3D камера в машине может:
· Следить за тем, засыпает водитель или нет.
· Следить за вниманием водителя, например, что при перестроении водитель не смотрит в зеркала заднего вида.
· Распознавать жесты водителя: водитель может не отрываться от дороги скролить карту/управлять музыкой.
· Автоматическая настройка зеркал перед поездкой.
А самое удивительное: этого ещё никто не сделал. Есть системы определения усталости, в последние пару лет они даже начали использовать видеокамеры. Но с 3d камерой можно точнее определять положение головы водителя, что позволяет контролировать его реакции. К тому же, одно дело, засыпание, а другое — анализ действий и помощь водителю.
За четыре часа собрали простенькую демонстрацию:
За эту идею и демонстрацию нам внезапно выдали первое место.
Если вдруг кому-то нужны наши наброски за 6 часов — вот они. Там EmguCV подключено + вермишельный код. Идея офигенная, но как подступаться к проблеме такого масштаба и уровня интеграции — непонятно. Но такие технологии вполне могут стать переходными к автомобилям-роботам.
Автор: ZlodeiBaal