Однажды я писал на Хабр про различные технологии получения 3D изображения с одной камеры. Заканчивал я ту статью словами: «Сам я, правда, до сих пор не сталкивался ни с одной из этих камер, что жалко и досадно».
И вот, внезапно, не прошло и года, Intel проводит в Москве семинар и хакатон по новому поколению своих 3D камер (Intel RealSense). Любопытство взыграло: мы с коллегой записались на мероприятие. Как выяснилось, не зря. Хакатон мы выиграли и получили Developer-версию камеры, которую теперь мучаем.
![](https://habrastorage.org/r/w1560/files/bf0/07d/f3d/bf007df3d79040c0ab138cd510ae20ec.png)
В статье рассказывается о двух вещах:
Про камеру можно говорить много. Она оказалась интереснее ожиданий, но не в плане качества, а в плане заложенной математики. Из глобальных вещей:
Во-первых, вместо технологии Time of flight произошло возвращение к структурированной подсветке. Думаю, что точность за ту же цену оказывается выше. Конечно, потенциала больше у ToF, но там слишком велика стоимость качественного сенсора. Структурированная подсветка имеет интересный рисунок, движущийся во времени:
![image](https://habrastorage.org/r/w780q1/getpro/habr/post_images/208/ab6/e75/208ab6e757a76e8dfad3a9fe8738c565.jpg)
Если честно, то я не понимаю, как они нивелируют эту картинку в ИК потоке. Вероятно какой-то межкадровой апроксимацией, но явно этого не заметно.
Во-вторых, очень классная математика для выделения пальцев на руках и контуров лица. Контуры лица выделяются через активные модели внешнего вида, но, алгоритмы расширены на 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, под конец участники были сильно измотаны).
Кто-то к хакатону основательно готовился. Кто-то взял проекты, сделанные для других целей и сильно модифицировал их. Вся наша с Васей подготовка к хакатону заняла часа три. Сидели, пили чай и думали что же можно сделать. Идей был несколько:
Одна из вещей, которые мне нравятся — аналитика состояния человека. Возможно, вы читали одну из моих прошлых статей на Хабре. И конечно, меня понесло в ту же сторону. Но делать усиление движения через 3D — малоэффективно. Зато через 3D можно снять много характеристик сидящего перед камерой человека. Но вот только как и куда это применить?
Ответ оказался на удивление тривиальным и очевидным, стоило только Васю спросить меня: «а чем может помочь 3D камера в машине?». И тут нас просто понесло. Ведь 3D камера в машине может:
А самое удивительное: этого ещё никто не сделал. Есть системы определения усталости, в последние пару лет они даже начали использовать видеокамеры. Но с 3d камерой можно точнее определять положение головы водителя, что позволяет контролировать его реакции. К тому же, одно дело, засыпание, а другое — анализ действий и помощь водителю.
За четыре часа собрали простенькую демонстрацию:
За эту идею и демонстрацию нам внезапно выдали первое место.
Если вдруг кому-то нужны наши наброски за 6 часов — вот они. Там подключено EmguCV + имеется вермишельный код. Идея офигенная, но как подступаться к проблеме такого масштаба и уровня интеграции — непонятно. Но такие технологии вполне могут стать переходными к автомобилям-роботам.
И вот, внезапно, не прошло и года, Intel проводит в Москве семинар и хакатон по новому поколению своих 3D камер (Intel RealSense). Любопытство взыграло: мы с коллегой записались на мероприятие. Как выяснилось, не зря. Хакатон мы выиграли и получили Developer-версию камеры, которую теперь мучаем.
![](https://habrastorage.org/files/bf0/07d/f3d/bf007df3d79040c0ab138cd510ae20ec.png)
В статье рассказывается о двух вещах:
- Про камеру, её плюсы и недостатки; что с помощью нее можно сделать, а для каких задач она не годится.
- Про концепцию, которую мы предложили на хакатоне и за которую получили первое место.
Камера
Про камеру можно говорить много. Она оказалась интереснее ожиданий, но не в плане качества, а в плане заложенной математики. Из глобальных вещей:
Во-первых, вместо технологии Time of flight произошло возвращение к структурированной подсветке. Думаю, что точность за ту же цену оказывается выше. Конечно, потенциала больше у ToF, но там слишком велика стоимость качественного сенсора. Структурированная подсветка имеет интересный рисунок, движущийся во времени:
![image](https://habrastorage.org/getpro/habr/post_images/208/ab6/e75/208ab6e757a76e8dfad3a9fe8738c565.jpg)
Если честно, то я не понимаю, как они нивелируют эту картинку в ИК потоке. Вероятно какой-то межкадровой апроксимацией, но явно этого не заметно.
Во-вторых, очень классная математика для выделения пальцев на руках и контуров лица. Контуры лица выделяются через активные модели внешнего вида, но, алгоритмы расширены на 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, под конец участники были сильно измотаны).
Кто-то к хакатону основательно готовился. Кто-то взял проекты, сделанные для других целей и сильно модифицировал их. Вся наша с Васей подготовка к хакатону заняла часа три. Сидели, пили чай и думали что же можно сделать. Идей был несколько:
- Попробовать взять какой-нибудь наш проект и приспособить к нему 3D камеру. Проблема состояла в том, что все проекты были именно для 2D-распознавания/аналитики. И прикручивать камеру к ним было явно больше 4х часов. Плюс к тому, непонятно как это можно было красиво обставить.
- Попробовать показать демонстрационный эффект, какое-то простое и классическое приложение. Управление мышкой/самолётиком глазами/рукой. Рисование на лице усов/бакенбардов. Минус такого варианта — он достаточно пустой и неинтересный. До красивого состояния доводить долго, а простой вариант не будет интересен публике.
- Показать качественно новую идею, достижимую только на данном продукте. Понятно, что за 4 часа хакатона такую штуку невозможно сваять до конца. Но есть возможность показать демонстрационный эффект. Этот вариант понравился больше всего. Тут основная проблема — придумать такую идею.
Одна из вещей, которые мне нравятся — аналитика состояния человека. Возможно, вы читали одну из моих прошлых статей на Хабре. И конечно, меня понесло в ту же сторону. Но делать усиление движения через 3D — малоэффективно. Зато через 3D можно снять много характеристик сидящего перед камерой человека. Но вот только как и куда это применить?
Ответ оказался на удивление тривиальным и очевидным, стоило только Васю спросить меня: «а чем может помочь 3D камера в машине?». И тут нас просто понесло. Ведь 3D камера в машине может:
- Следить за тем, засыпает водитель или нет.
- Следить за вниманием водителя, например, что при перестроении водитель не смотрит в зеркала заднего вида.
- Распознавать жесты водителя: водитель может не отрываться от дороги перемещать карту/управлять музыкой.
- Автоматическая настраивать зеркала перед поездкой.
А самое удивительное: этого ещё никто не сделал. Есть системы определения усталости, в последние пару лет они даже начали использовать видеокамеры. Но с 3d камерой можно точнее определять положение головы водителя, что позволяет контролировать его реакции. К тому же, одно дело, засыпание, а другое — анализ действий и помощь водителю.
За четыре часа собрали простенькую демонстрацию:
За эту идею и демонстрацию нам внезапно выдали первое место.
Если вдруг кому-то нужны наши наброски за 6 часов — вот они. Там подключено EmguCV + имеется вермишельный код. Идея офигенная, но как подступаться к проблеме такого масштаба и уровня интеграции — непонятно. Но такие технологии вполне могут стать переходными к автомобилям-роботам.