В предыдущей статье мы рассказывали о модернизации одной из самых популярных функций видеоанализа Macroscop – функции подсчета посетителей.
Мы решили сделать ее лучше, точнее и удобнее для пользователя. Оставался один небольшой вопрос: как это сделать? В нашем случае порядок действий был таким:
1. Читать научные статьи и публикации;
2. Обсуждать, анализировать и выбирать идеи;
3. Прототипировать и тестировать;
4. Выбрать и разработать единственную.
Выполнив первые два шага, мы приняли решение создавать новый подсчет посетителей, который будет базироваться на информации о глубине. Глубина – это расстояние по вертикали от камеры до предметов, попадающих в ее поле зрения. Она дает информацию о высоте того, кто пересекает линию входа-выхода, поэтому позволяет отличать людей от прочих объектов.
Глубину можно получить несколькими разными способами. И нам необходимо было выбрать, каким именно способом мы будем это делать в рамках нового подсчета. Мы определили 4 приоритетных направления для дальнейшей проработки.
1. Использовать стереонасадку для видеокамеры.
Один из вариантов получения данных о глубине — создать стереонасадку на объектив видеокамеры, которая будет двоить изображение. Далее написать алгоритм, который будет обрабатывать его, совмещать соответствующие опорные точки и получать стереоизображение, которое позволит узнать данные о расстояниях и построить карту глубины.
Забегая вперед отметим, что варианты, предполагающие конструирование чего-либо аппаратного (будь то насадка или устройство) нас привлекали в меньшей степени. Мы разработчики и являемся специалистами в написании алгоритмов и программ. И нам не очень хотелось браться за то, в чем мы не являемся профессионалами.
Сначала мы искали готовые насадки, чтобы проверить наши рассуждения на практике. Но найти вариант, который устраивал бы нас по всем параметрам, не удалось. Тогда мы напечатали свой собственный образец насадки на 3D-принтере, но и он оказался неудачным.
В процессе также выяснилось, что использование стереонасадки снижает универсальность решения, так как не на каждую камеру ее можно надеть. Поэтому необходимо было бы либо выпускать линейку разных насадок, либо ограничивать пользователей в выборе камер.
Еще одним ограничением стало то, что стереонасадка существенно сужает поле зрения камеры (раза в 2). Иногда входы-выходы бывают достаточно широкими, такими что, даже обычных видеокамер устанавливают несколько. А если поле зрения камеры сузить вдвое, то это еще усложнит жизнь инсталляторам и повысит стоимость системы. Кроме того, некоторые пользователи хотят не просто считать посетителей, но и получать обзорную картинку со своей видеокамеры.
2. Синхронизировать изображения с двух камер.
На самом деле от этого варианта мы практически сразу отказались. Во-первых, это привело бы к существенному удорожанию решения для пользователя. Во-вторых, решать задачу синхронизации кадров с двух разных камер представлялось нам нецелесообразным. Ее реализация требовала от нас собрать устройство, которое включало бы 2 идентичные камеры, установленные в определенных позициях и на определенном расстоянии друг от друга. Но главное, нам требовалось одновременно получать с этих камер одни и те же кадры. Это уже было сложнее: в камере могут возникать внутренние задержки, и если делать обработку кадров на уровне ПО, то как понимать, в какую миллисекунду пришел тот или иной кадр относительно кадра с другой камеры?
Мы приняли решение проработать другие варианты.
3. Использовать опыт Microsoft.
Изучая тему глубины изображений, мы нашли исследование от Microsoft. В нем был описан метод использования ИК-подсветки камеры для определения расстояния. Вообще, этот вариант представлялся очень интересным: берем любую камеру с ИК-подсветкой, засвечиваем область, оцениваем яркость и получаем нужные нам данные о глубине. Чем более засвечена область, тем ближе она расположена к камере. Но оказалось, что этот метод хорошо решает только узкие задачи, например, распознает жесты. Потому что разные материалы в разной степени отражают свет.
Поэтому предметы могут по факту находиться на одном расстоянии, но из-за разности материалов и способности поглощать и отражать свет, расстояние до них будет по-разному интерпретироваться. Это мы проверили опытным путем в офисе, когда получили карту для разложенных на одном уровне разных предметов из разных материалов:
В итоге, этот алгоритм хорошо работает только на каком-то одном материале, а в нашем случае речь идет об абсолютно неоднородной среде.
4. Использовать структурную подсветку.
Структурная подсветка по сути тоже работает на ИК-лучах. Только в предыдущем варианте излучаются лучи и измеряется уровень освещенности поверхностей, на которые они попадают, а в текущем — на поверхность излучается картинка (например, круги). Считываются отраженные изображения, и по их размерам и искажениям можно понять, насколько далеко от излучателя расположен тот или иной предмет. В варианте из п.3 карта строится на основании интенсивности лучей (которая напрямую зависит от отражающей способности поверхностей), а в текущем – на основании данных о структуре отраженной картинки, и яркость здесь не учитывается.
Этот вариант представлялся нам наиболее выигрышным. К тому же мы смогли найти подходящее готовое аппаратное устройство со структурной подсветкой. А это означало, что нам не нужно заниматься тем, что не является нашей специализацией (конструировать это самое устройство). Нам оставалось заняться своим делом – написать алгоритм обработки.
Первый прототип мы писали на Kinect (это сенсорный игровой контроллер от Microsoft для распознавания жестов). Ожидания подтвердились, выбранный подход оказался работоспособным — устройство выдавало карту приемлемой глубины и точности. Однако в последствии выяснилось, что для нашей специфики Kinect был удобен не во всем. Прежде всего это USB-устройство, что не вписывается в инфраструктуру наших пользователей (IP-видеосистемы). Поэтому нам пришлось бы что-то надстраивать над ним или поставлять в комплекте переходник с USB на сетевой вход. Вторым весомым ограничением стало то, что Kinect не обладает вычислительной мощностью. Учитывая, что сама по себе карта глубины в чистом виде весит довольно много, без обработки и сжатия на борту устройства, ее было довольно проблематично передавать по сети.
Окончательная реализация 3D – подсчета включает иное устройство со структурной подсветкой. Оно обладает самостоятельной вычислительной мощностью, которая в текущей реализации используется для сжатия карты глубины, благодаря чему разгружается сеть. А о том, как происходит та самая программная обработка и осуществляется подсчет, мы уже подробно написали в статье «Глубокий расчет. Как 3D-технологии помогают считать людей и делают жизнь проще?».
P.S.:
Разработка нового решения – это не всегда непроглядное написание кода. Искать, читать, пробовать, печатать на 3D-принтере, приносить что-то из дома, чтобы проверить свою теорию – вот настоящий процесс разработки. И зачастую чтобы создать что-то прорывное, новое, надо отойти от привычных моделей работы.
Мы решили сделать ее лучше, точнее и удобнее для пользователя. Оставался один небольшой вопрос: как это сделать? В нашем случае порядок действий был таким:
1. Читать научные статьи и публикации;
2. Обсуждать, анализировать и выбирать идеи;
3. Прототипировать и тестировать;
4. Выбрать и разработать единственную.
Выполнив первые два шага, мы приняли решение создавать новый подсчет посетителей, который будет базироваться на информации о глубине. Глубина – это расстояние по вертикали от камеры до предметов, попадающих в ее поле зрения. Она дает информацию о высоте того, кто пересекает линию входа-выхода, поэтому позволяет отличать людей от прочих объектов.
Глубину можно получить несколькими разными способами. И нам необходимо было выбрать, каким именно способом мы будем это делать в рамках нового подсчета. Мы определили 4 приоритетных направления для дальнейшей проработки.
1. Использовать стереонасадку для видеокамеры.
Один из вариантов получения данных о глубине — создать стереонасадку на объектив видеокамеры, которая будет двоить изображение. Далее написать алгоритм, который будет обрабатывать его, совмещать соответствующие опорные точки и получать стереоизображение, которое позволит узнать данные о расстояниях и построить карту глубины.
Забегая вперед отметим, что варианты, предполагающие конструирование чего-либо аппаратного (будь то насадка или устройство) нас привлекали в меньшей степени. Мы разработчики и являемся специалистами в написании алгоритмов и программ. И нам не очень хотелось браться за то, в чем мы не являемся профессионалами.
Сначала мы искали готовые насадки, чтобы проверить наши рассуждения на практике. Но найти вариант, который устраивал бы нас по всем параметрам, не удалось. Тогда мы напечатали свой собственный образец насадки на 3D-принтере, но и он оказался неудачным.
В процессе также выяснилось, что использование стереонасадки снижает универсальность решения, так как не на каждую камеру ее можно надеть. Поэтому необходимо было бы либо выпускать линейку разных насадок, либо ограничивать пользователей в выборе камер.
Еще одним ограничением стало то, что стереонасадка существенно сужает поле зрения камеры (раза в 2). Иногда входы-выходы бывают достаточно широкими, такими что, даже обычных видеокамер устанавливают несколько. А если поле зрения камеры сузить вдвое, то это еще усложнит жизнь инсталляторам и повысит стоимость системы. Кроме того, некоторые пользователи хотят не просто считать посетителей, но и получать обзорную картинку со своей видеокамеры.
2. Синхронизировать изображения с двух камер.
На самом деле от этого варианта мы практически сразу отказались. Во-первых, это привело бы к существенному удорожанию решения для пользователя. Во-вторых, решать задачу синхронизации кадров с двух разных камер представлялось нам нецелесообразным. Ее реализация требовала от нас собрать устройство, которое включало бы 2 идентичные камеры, установленные в определенных позициях и на определенном расстоянии друг от друга. Но главное, нам требовалось одновременно получать с этих камер одни и те же кадры. Это уже было сложнее: в камере могут возникать внутренние задержки, и если делать обработку кадров на уровне ПО, то как понимать, в какую миллисекунду пришел тот или иной кадр относительно кадра с другой камеры?
Мы приняли решение проработать другие варианты.
3. Использовать опыт Microsoft.
Изучая тему глубины изображений, мы нашли исследование от Microsoft. В нем был описан метод использования ИК-подсветки камеры для определения расстояния. Вообще, этот вариант представлялся очень интересным: берем любую камеру с ИК-подсветкой, засвечиваем область, оцениваем яркость и получаем нужные нам данные о глубине. Чем более засвечена область, тем ближе она расположена к камере. Но оказалось, что этот метод хорошо решает только узкие задачи, например, распознает жесты. Потому что разные материалы в разной степени отражают свет.
Поэтому предметы могут по факту находиться на одном расстоянии, но из-за разности материалов и способности поглощать и отражать свет, расстояние до них будет по-разному интерпретироваться. Это мы проверили опытным путем в офисе, когда получили карту для разложенных на одном уровне разных предметов из разных материалов:
В итоге, этот алгоритм хорошо работает только на каком-то одном материале, а в нашем случае речь идет об абсолютно неоднородной среде.
4. Использовать структурную подсветку.
Структурная подсветка по сути тоже работает на ИК-лучах. Только в предыдущем варианте излучаются лучи и измеряется уровень освещенности поверхностей, на которые они попадают, а в текущем — на поверхность излучается картинка (например, круги). Считываются отраженные изображения, и по их размерам и искажениям можно понять, насколько далеко от излучателя расположен тот или иной предмет. В варианте из п.3 карта строится на основании интенсивности лучей (которая напрямую зависит от отражающей способности поверхностей), а в текущем – на основании данных о структуре отраженной картинки, и яркость здесь не учитывается.
Этот вариант представлялся нам наиболее выигрышным. К тому же мы смогли найти подходящее готовое аппаратное устройство со структурной подсветкой. А это означало, что нам не нужно заниматься тем, что не является нашей специализацией (конструировать это самое устройство). Нам оставалось заняться своим делом – написать алгоритм обработки.
Первый прототип мы писали на Kinect (это сенсорный игровой контроллер от Microsoft для распознавания жестов). Ожидания подтвердились, выбранный подход оказался работоспособным — устройство выдавало карту приемлемой глубины и точности. Однако в последствии выяснилось, что для нашей специфики Kinect был удобен не во всем. Прежде всего это USB-устройство, что не вписывается в инфраструктуру наших пользователей (IP-видеосистемы). Поэтому нам пришлось бы что-то надстраивать над ним или поставлять в комплекте переходник с USB на сетевой вход. Вторым весомым ограничением стало то, что Kinect не обладает вычислительной мощностью. Учитывая, что сама по себе карта глубины в чистом виде весит довольно много, без обработки и сжатия на борту устройства, ее было довольно проблематично передавать по сети.
Окончательная реализация 3D – подсчета включает иное устройство со структурной подсветкой. Оно обладает самостоятельной вычислительной мощностью, которая в текущей реализации используется для сжатия карты глубины, благодаря чему разгружается сеть. А о том, как происходит та самая программная обработка и осуществляется подсчет, мы уже подробно написали в статье «Глубокий расчет. Как 3D-технологии помогают считать людей и делают жизнь проще?».
P.S.:
Разработка нового решения – это не всегда непроглядное написание кода. Искать, читать, пробовать, печатать на 3D-принтере, приносить что-то из дома, чтобы проверить свою теорию – вот настоящий процесс разработки. И зачастую чтобы создать что-то прорывное, новое, надо отойти от привычных моделей работы.
Комментарии (3)
t2n
20.12.2017 17:24Я не мог не заметить что в предыдущей статье, ссылку на которую вы даёте, что в этой вы специально не упоминаете что это за устройство. Это коммерческая тайна? Я просто сам недавно смотрел на подобные устройства и вот как раз со встроенным модулем для вычислений и сетевым интерфейсом не видел, обычно камера с USB и отдельно модуль обработки.
t2n
А что за аппаратную платформу вы используете? Это какая то собственная разработка?
MACROSCOP Автор
Мы используем готовое устройство стороннего производителя, но в него зашита наша программа. Непосредственно аппаратную часть сами не разрабатывали и не конструируем.
Это аналог Kinect, но лишенный ряда недостатков, о которых писали выше.