Анализ движения пешеходов и транспорта на дорожных перекрестках по данным камер наблюдения

  • baycgis
  • 06 сентября, 2021
  • Комментариев нет
Введение

Перед нами встала задача анализа движения пешеходов и транспортных средств для автоматизированного получения различных данных на основании анализа последовательности изображений, поступающих с видеокамер в режиме реального времени или из архивных записей. С этой целью мы использовали специальное программное обеспечение, позволяющее вести мониторинг и анализ данных в автоматическом режиме. Для нашего случая была разработана система мониторинга трафика автомобилей и пешеходов на дорогах для оценки загруженности, и последующей оптимизации транспортного потока, которая была подключена к платформе cGIS.

Входные данные

Мы взяли данные с камер видеонаблюдения, которые отправляют видеопотоки с нескольких перекрестков города.

Каждая камера предоставляет:

  • HLS поток с разрешением 1920×1080 (Full HD);
  • видеофрагменты длительностью 4 секунды;
  • частота кадров видео равна 25 FPS.
Постановка задачи

Для того чтобы осуществлять анализ движения необходимо получать данные о перемещениях людей и автомобильного транспорта в области видимости камер и строить статистику на основании подсчета количества появлений того или иного класса объекта.

Но для объективной оценки загруженности дорог недостаточно просто подсчитывать появления объектов. Необходимо понимать пространственное распределение загруженности, то есть, на каких участках дорог происходят заторы с точки зрения геопространственных координат.

С наличием траекторий движений транспорта и людей появляется возможность построения тепловых карт загруженности дорог для наглядного отображения на электронной карте.

Таким образом, для поставленной задачи необходимо решить следующие подзадачи:

  1. Подобрать оптимальный по скорости и качеству алгоритм детектирования объектов на изображениях в режиме реального времени.
  2. Реализовать алгоритм идентификации объектов на основе распознанных частей изображения на каждом кадре и присвоить каждому объект свой уникальный идентификатор.
  3. Определить, каким образом проецировать на карту траектории движения объектов.
Обработка данных

Параллельную обработку данных с нескольких камер было решено осуществлять с использованием Apache Kafka, позволяющей создавать очереди из кадров для каждой камеры наблюдения. Кадры с каждой камеры обрабатываются библиотекой ffmpeg, а именно:

  1. Происходит разбиение видеопотока на фрагменты из 100 кадров.
  2. Каждый кадр уменьшается до размера 860×680 для меньшей загруженности последующего алгоритма обработки. Указанный размер был подобран экспериментально для достижения необходимой скорости обработки кадров.
  3. Меняется порядок цветовых каналов кадра с RGB на BGR для последующей обработки кадров библиотекой OpenCV.

Стоит отметить, что использование ffmpeg для раскадровки аргументировано тем фактом, что OpenCV не имеет функционала для обработки байтовых сообщений из оперативной памяти.

Выбор архитектуры модели

Для решения задачи детектирования было решено использовать модель семейства YOLO. Модели данного семейства хорошо показали себя для решения задач обнаружения объектов в реальном времени в соревнованиях VOC, ImageNet Classification Challenge и многих других.
На момент написания статьи наиболее оптимальным в данном семействе является модель YOLOv3 и ее вариации. Далее будут рассматриваться две архитектуры: YOLOv3 и Tiny YOLOv3. Вторая архитектура – это упрощенная реализация модели YOLOv3 для ускорения работы и получения большего количества кадров в секунду (FPS).

Для решения задачи отслеживания и идентификации объектов мы выбирали между алгоритмами SORT и DeepSORT.

Суть алгоритма SORT заключается в использовании фильтра Калмана для работы трекера. Основная идея фильтра Калмана состоит в том, что детектор, насколько бы он не был хорош по качеству на валидационной выборке, он может в какой то момент не обнаруживать объект из-за окклюзий, плохой видимости, или удаленности. Тем не менее, движение каждого объекта может оцениваться при помощи кинематической модели на основе предыдущих оценок. Таким образом, с начала мы получаем наиболее вероятную оценку положения объекта, а затем уточняем, когда появляются оценки от нашего детектора.

Проблемой в данном случае остается идентификация объектов, то есть, определение того, что на предыдущем кадре был именно тот же самый объект.

Обычно это достигается за счет измерения расстояния между центроидами полученных детектором прямоугольных рамок (Рисунок 1). Мы предполагаем, что между ближайшими кадрами один и тот же объект будет находится на минимальном расстоянии, но это срабатывает не во всех случаях.

Рисунок 1. Расстояние между объектами вычисляется по центроидам.

Например, два человека идут навстречу друг другу, и после их пересечения в кадре могут перепутаться идентификаторы данных объектов, что приведет к ошибкам.

Для этого алгоритм SORT модифицируется добавлением отдельной нейронной сети, которая преобразует часть изображения в предсказанной детектором рамке в вектор фиксированной длины, описывающий семантический смысл изображения со свойством расстояния, то есть, расстояния между двумя такими векторами говорят о степени схожести объектов на изображении.

Это достигается за счет обучения нейронной сети метрике расстояния, показывая на обучении похожие и не похожие друг на друга пары. На выходе получаем нейронную сеть, преобразующую изображение в вектор со свойством расстояния.


Рисунок 2. Архитектура нейронной сети, преобразующей изображение в семантический вектор.

Получается алгоритм DeepSORT, который сравнивает не расстояние между центроидами прямоугольных рамок на разных кадрах, а их семантические описания. Таким образом, идентификация объекта становится более устойчивой к ошибкам типа false positive.

Проблемой для такого подхода является тот факт, что нейронная сеть, строящая семантические вектора, должна делать это для определенного класса объектов, например, для людей, легковых автомобилей, грузовиков. Поэтому, чтобы в одном кадре отслеживались как автомобили, так и люди, нам необходимо два обученных энкодера (нейронной сети, преобразующей изображение в семантический вектор) для людей и транспорта.

В решении нашей задачи мы использовали готовые весовые коэффициенты для детектора YOLOv3, распознающего 80 классов с набора данных VOC. Для энкодера по умолчанию были взяты весовые коэффициенты, предобученные на кодирование семантических векторов для людей на наборе данных Market-1501.

Рисунок. 3. Пример изображений из набора данных Market-1501.

Так как нам необходимо еще отслеживать и автомобили, то добавилась задача обучения энкодера для объектов класса автомобилей.

Описание набора данных транспорта

Чтобы обучить энкодер преобразовывать изображения с транспортом, мы использовали набор данных VeRi, содержащий в качестве изображений пары (X — Y), где

  • X — изображение с автомобилем;
  • Y — изображение с автомибилем, похожим на автомобиль с изображения X цветом, формой, фактурой, но при этом, например, под другим ракурсом.

Всего 40 тысяч изображений, где для каждого изображения есть хотя бы одна пара.

Рисунок. 4. Пример из набора данных VeRi.
Обучение и результаты

На основании имеющихся пар строятся триплеты, то есть, для пары (X — Y) (anchor – positive) подбирается изображение Z (negative), содержащее объект, не похожий на те, что содержатся в паре (X — Y). Таким образом, формируется функция потерь триплетов, чтобы обучить вектора схожих объектов находиться близко, а различные объекты — далеко друг от друга.

Рисунок 5. Принцип работы обучения метрики расстояния.

Для кодирования изображений в семантический вектор использовалась небольшая сверточная нейронная есть, состоящая из 3 сверточных (convolutional) слоев, и объединяющих (pooling) слоев между ними. На конце был установлен полносвязный (fully connected) слой размером 128.

Обучение проводилось с использованием фреймворка для машинного обучения TensorFlow на видеокарте Nvidia GeForce 1660 TI 6 GB:

  • Количество эпох — 100
  • Размер батчей — 8
  • Шаг градиента — 0.1
  • Оптимизатор Adam
  • Инициализация весов Ксавьера
  • Функция потерь — Triplet loss

Качество оценивалось при помощи метрики качества Precision@k. Данная метрика используется для оценки качества работы поисковых систем. Если сделать запрос на определенное изображение, то метрика Precision@k выдает вероятность того, что в выборке из k изображений, полученных на запрос, появится нужный объект.

Итого мы получили следующее результаты:

МетрикаЗначение
Precision@10.69
Precision@50.91
Precision@100.94
Precision@200.98

Таблица № 1. Результаты обучения метрики расстояния для изображений с транспортом.

Рисунок 6. Графики метрик ранжирования

Если использовать алгоритмы уменьшения размерности векторов (например, t-SNE), посчитанных для всех 40 тысяч изображений, то можно отобразить все автомобили в семантическом 3D пространстве, где наиболее похожие друг на друга объекты расположены наиболее близко к другу (Рисунок 7).

Рисунок 7. Семантическое пространство автомобилей проецированное в 3D при помощи алгоритма T-sNe.

В результате была получена легкая нейронная сеть, способная преобразовывать изображение в вектор, который имеет свойство расстояния. Чем меньше расстояние между векторами, тем более похожи друг на друга объекты на изображении.

Внедрив данную нейронную сеть в алгоритм трекера, мы получили возможность детектировать трафик множества объектов разных классов, а именно, людей и транспорта (Рисунок 8).

Рисунок 8. Видеопоток, обработанный нейронной сетью.
Получение координат

После того, как мы получили алгоритм отслеживания объектов в видеопотоке, перед нами встала задача научиться отображать траектории объектов на карте, чтобы в дальнейшем подсчитывать интенсивность движения и степень загруженности дорог в определенный отрезок времени.

С начала мы применили перспективное преобразование. То есть, на каждой интересующей нас камере мы отметили краевые пиксели на каждом из углов изображения при том условии, что мы сможем найти объекты, привязанные к этим пикселям на карте. Это позволяет переносить объекты в плоскости камеры на плоскость поверхности Земли, сопоставляя точки на плоскости камеры с соответствующими точками Земной поверхности (Рисунок 9).

Рисунок 9. Разметка краевых точек на изображении для дальнейшего проецирования.

Отметив пиксели, мы нашли привязанные к ним ориентиры на карте и определили их географические координаты в формате «широта/долгота».

Далее, средствами перспективного преобразования пиксели на камере были преобразованы в точки на карте, и полученные траектории объектов были перенесены на плоскость Земли (Рисунок 10).

Рисунок 10. Перспективное преобразование двух плоскостей.

На основании полученных траекторий и частоты появления объектов были построены тепловые карты перемещения объектов и построены гистограммы появления объектов в той или иной части города, где установлены камеры.

Рисунок 11. Тепловая карта движений пешеходов с привязкой к координатам местности.
Рисунок 12. Гистограмма появления пешеходов на перекрестке за месяц по часам.
Рисунок 13. Гистограмма появления автомобилей на перекрестке за месяц по часам.
Оптимизация модели

Следующей задачей стала оптимизация алгоритмов отслеживания для использования в режиме реального времени. Так как нам необходимо обрабатывать множество камер с наименьшим количеством затрачиваемых ресурсов, то необходимо использовать все возможные инструменты, которые позволяют ускорить работу нейронных сетей.

На первой итерации, когда модель была запущена, количество кадров в секунду для одной камеры не превышало 11 FPS, то есть, модель в своем изначальном виде была слишком тяжеловесной, и не могла быть использована для работы в режиме реального времени.

Сначала мы попробовали обрабатывать только каждый 4-й кадр видеопотока, что дало линейный прирост производительности. То есть, уменьшив количество кадров в n раз мы получили n-кратный прирост производительности модели. Алгоритм стал работать с частотой кадров 40-45 FPS. Но этого все равно оказалось недостаточно, так как добавление нескольких камер таким же образом снижало скорость, что сводило данное улучшение лишь к обработке двух камер на одном сервере.

Затем мы решили изменить архитектуру детектора, но сохранить основную ее идею, применив модель Tiny YOLOv3.

Tiny YOLOv3 существенно улучшила скорость обработки видеопотока, и мы смогли обрабатывать уже 8 камер с частотой 30 FPS.

Последующее улучшения уже касались оптимизации затрат. Известно, что использовать арендованные сервера с видеокартами — крайне дорогостоящая услуга, поэтому было решено рассмотреть существующие оптимизации алгоритмов детектирования под процессоры семейства Intel.

В качестве инструмента оптимизации мы рассмотрели фреймворк компании Intel – OpenVino Toolkit. При помощи данного инструмента мы оптимизировали нашу модель под процессоры семейства Intel, и провели эксперименты с различными конфигурациями.

№ экспериментаКоличество видеопотоковКоличество виртуальных потоков (vСPU)
FPS
14220
24435
34840
48218
58422
68825
716210
816412
916815
Таблица № 2. Результаты испытаний для разных конфигураций оборудования

Рис. 14. Графики FPS для разных конфигурация оборудования.

На основании проведенных экспериментов была подобрана устойчивая конфигурация для обработки видеопотоков c 8-и камер на 8 vCPU, что в дальнейшем позволило масштабировать решение с оптимальной с точки зрения бюджета серверной архитектурой.

Заключение

В данной статье описан цикл исследования и разработки решения для анализа видеопотоков с камер наблюдения с получением аналитики движения транспорта и пешеходов. Разработанный стек технологий позволил нам в дальнейшем создавать другие решения в данной области с применением современных технологий в области искусственного интеллекта.

ru_RU