По направлению C++ мы разработали приложение для подсчета количества посетителей на основе анализа видеопотока с видеокамеры.
Его отличительной особенностью было то, что приложение было разработано как отдельный автономный модуль для запуска на Up Board. Это позволяет клиентам приобрести необходимое количество устройств и самостоятельно установить их в нужных местах.
Также было разработано отдельное серверное приложение, которое позволило удаленно настраивать эти устройства, получать с них статистику, видеопотоки и представлять данные о посетителях в удобном виде.
Приложение для подсчета людей основано на использовании известной библиотеки OpenCV, которая имеет огромное количество алгоритмов компьютерного зрения и позволяет легко и быстро обрабатывать входной видеопоток.
В целом задачу можно представить в виде нескольких модулей:
- Выделение движущихся объектов из общего видеопотока
- Сегментация предметов и поиск людей среди них
- Разделение групп на личности
- Отслеживание людей
- Подсчет посетителей, проходящих через определенные ворота
Однако для реального применения этих алгоритмов нам оказалось недостаточно и пришлось искать пути их улучшения.
Основными проблемами, стоявшими перед нами, были следующие:
- По желанию заказчика необходимо было оставить лишь минимальное количество настроек.
чтобы клиент мог установить «апборд» на разной высоте (например, 3-5 м) и он сам мог начать считать людей без настройки.
То есть нужно было упростить выбор настраиваемых параметров и сделать алгоритм более устойчивым к их изменению.
- Мощность процессора выбранных устройств была достаточно низкой, а алгоритм, быстро работавший на среднем компьютере, стал ужасно медленным при запуске на тестовых модулях.
- Поток людей в торговых центрах часто приводит к тому, что люди проходят слишком близко друг к другу, что требует разделения на отдельных людей, что обычно не учитывается в подобных задачах.
Для разделения людей можно использовать различные детекторы людей, но они также требуют большой производительности.
Удаление фона
Стандартный подход OpenCV к выделению движущихся объектов — использование готового фильтра» Вычитание фона », что автоматически решает эту проблему, однако эксперимент на присланных заказчиком видео показал, что его возможностей недостаточно и нужен более гибкий подход. Для этого требовался лучший выбор объектов, гибкое время «перезаписи остановленных объектов», подбор параметров и т. д. Для решения этой проблемы мы успешно применили алгоритм Атмосфера с нашей собственной реализацией.Его использование позволило улучшить селекцию объектов и более широко варьировать параметры обнаружения.
Сегментация объектов
После получения маски движущихся объектов необходимо выделить из нее отдельные элементы.В целом эта задача вполне стандартная.
Для этих целей полученная маска объекта сначала обрабатывается с помощью морфологических операций по удалению шума, а затем сегментируется с помощью выделения краев.
Размер контуров можно фильтровать по видимому размеру человека на изображении и отбрасывать посторонние объекты.
Разделение людей
Среди полученных элементов мы должны выделить конкретных людей.Проблема в том, что во-первых, маска человека часто делится на множество мелких элементов (из-за схожести одежды с фоном) и тогда части маски нужно объединить в один объект. Во-вторых, бывает и обратный случай, когда несколько идущих рядом людей выглядят как единый объект. Решение первой проблемы было частью описанного ниже решения по отслеживанию людей, а решение второй проблемы потребовало проведения множества экспериментов и разработки быстрого и эффективного алгоритма.
В нашем случае предполагалось, что камера будет установлена в коридорах, на выходе из магазина и т. д., т.е.
поток людей в кадре направлен преимущественно вертикально.
Это предположение позволило разделить людей, анализируя форму предметов.
Таким образом, в исходном контуре объекта рассчитывалась его толщина по направлению движения людей и анализировались полученные графики на наличие выявленных вершин.
Если бы пиков было несколько, размер между которыми был сравним с размером человека, то весьма вероятно, что они соответствуют отдельным людям.
Отслеживание людей
После выбора человека вокруг него отображается условный прямоугольник; задачей было сравнить соседние кадры и по ним определить, куда он движется.Имея идеальную маску, задача оказывается тривиальной; нам нужно только найти пересечения прямоугольников и мы сможем определить направление движения.
Но в общем случае задача усложнялась тем, что часто часть человека сливается с фоном и маска оказывается порванной.
При этом отдельные части тела становятся слишком маленькими и это необходимо учитывать при анализе размеров предметов.
Наличие такой маски затрудняет распознавание людей на изображении даже человеку.
Для решения этой проблемы мы использовали данные предыдущих кадров, объединив которые нам удалось получить более целостную маску человека без проблемных зон.
Люди считают
Последним заданием было подсчитать количество проходящих людей.Для этого были заданы две условные линии, образующие «ворота».
Когда эти линии пересекались по порядку, считалось, что человек вошел или вышел.
При решении этой задачи также возникли проблемы, связанные с ошибками получения маски, а также хаотичным движением человека.
Так маска могла пропадать на пару кадров (например, человек сливался с фоном), а потом появляться за линией.
Или человек может пройти одну линию и тут же вернуться.
Часто, выходя из кассы, люди проходят один за другим и сливаются в один объект, а затем разделяются на два, что приводит к волшебному появлению нового человека.
Комплекс таких задач решался комплексно, как за счет отслеживания человека, если он блуждает между очередями, так и за счет создания дополнительных слегка смещенных ворот, что снижало вероятность ошибки.
В целом это привело к повышению точности подсчета в сложных случаях до 85-90%.
Помимо перечисленных выше решений, в рамках проекта экспериментировались и другие подходы к решению проблем.
Использование стереокамер для точного разделения людей оказалось очень многообещающим.
Для этого мы протестировали кинект в качестве камеры, что существенно повысило точность разделения группы людей.
Однако заказчику было важно иметь монолитное дешевое устройство с одной камерой и поэтому пришлось отказаться от такого подхода.
Еще одним интересным моментом в проекте стала необходимость низкоуровневой оптимизации алгоритмов для получения приемлемых 30 кадров в секунду.
Например, такая незначительная часть, как оптимизация генератора случайных чисел, позволила увеличить скорость выбора объектов в 2 раза, а общую производительность повысила на 20-25%.
Также при построении толщины маски количество точек изначально просто суммировалось вручную, что достаточно медленно.
В дальнейшем алгоритм был усложнен старым добрым алгоритмом Брезенхема для поиска точек контура вручную, что значительно улучшило скорость работы этого модуля.
Проект не обошёлся без инцидентов.
Так что мы долго оптимизировали расчет под приемлемые скорости на тестовых видеороликах, но когда сделали отчетное видео на последних примерах заказчика, была видна некоторая медлительность, что и вызвало у него нарекания.
Проанализировав ситуацию, выяснилось, что эти видеоролики были сняты на экшн-камеру с частотой 60 кадров в секунду.
Простое переформатирование в стандартные 30 кадров в секунду сразу привело к тому, что люди на видео начали двигаться чуть ли не бегом.
Таким образом, наша команда приобрела опыт решения задач обнаружения людей в видеопотоке на приемлемой скорости на портативных устройствах типа «Up-board».
А разработанное программное обеспечение позволило заказчику внедрять и продавать системы подсчета посетителей в виде отдельных, легко встраиваемых модулей.
Теги: #программирование #C++ #OpenCV #компьютерное зрение #программирование на C++
-
Как Создать Свой Собственный Плакат
19 Oct, 24 -
«Ксенофобия В Японии — Обычное Дело»
19 Oct, 24 -
Comet Lake, Итерация Завершена
19 Oct, 24 -
Новый Проект - Linuxstart!
19 Oct, 24 -
Openframe — Iphone Для Дома
19 Oct, 24