Хотим сохранить ваше время и нервы с задачей по подсчету трафика на перекрестках.
Ярослав и Никита ‑ наши CV‑инженеры, поделились решением, которое всего за 4 шага поможет подойти к релизу с минимальной потерей времени и денег.
Статья будет полезна начинающим CV‑инженерам, продуктологам, владельцам IT‑продукта, маркетологам и проджект‑менеджерам.
![](https://habrastorage.org/getpro/habr/upload_files/95d/773/af0/95d773af0e4e0a599e9e2a8df4dc0534.jpg)
Задача подсчета трафика на перекрестке заключается в определении количества транспортных средств (ТС), проезжающих через него. Результаты подсчета трафика могут быть использованы для управления транспортным потоком, обеспечения безопасности дорожного движения и выявления проблемных участков дороги.
Для решения поставленной задачи можно использовать различные методы, например, установить датчики движения или камеры видеонаблюдения.
Из этих методов наиболее приоритетным решением является установка камер, передающих видео на устройство с соответствующим программным обеспечением. Такая реализация позволяет не только подсчитывать количество транспорта, но и классифицировать его, а всего одна камера может охватывать весь перекресток.
Применение датчиков требует установки оборудования на каждую полосу перекрестка, что увеличивает стоимость системы, а также трудоёмкость монтажа.
![](https://habrastorage.org/getpro/habr/upload_files/867/d28/dd5/867d28dd51ba05625f920dd8c50bd319.png)
Для решения задачи подсчета трафика на перекрестке с помощью камер видеонаблюдения необходимо использовать методы компьютерного зрения. Один из подходов заключается в использовании детектора и трекера объектов.
Что такое детектор и трекер объектов? В чем разница?
Детектор объектов ‒ это алгоритм, который позволяет автоматически находить объекты на изображении.
Например, на изображении с камеры можно обнаружить ТС, вычислить их положение в кадре, а также классифицировать их (легковое авто, грузовое, автобус и т.д.).
Трекер объектов представляет собой алгоритм, позволяющий отслеживать перемещение объекта на последующих кадрах видео.
То есть, данный алгоритм позволяет присвоить идентификатор каждому объекту в кадре и указать, где находится тот же объект на следующем кадре.
Сначала детектор объектов используется для нахождения всех ТС в кадре. Затем трекер объектов используется для отслеживания перемещения каждого обнаруженного ТС. Когда ТС покидает область перекрестка, оно считается учтенным, и данные о количестве выехавших ТС обновляются.
Детектор объектов (Object Detection)
Существует большое количество алгоритмов, способных решать данную задачу. Подробного рассказа про эти алгоритмы в нашей статье не будет. При желании с ними можно ознакомиться здесь. Из всего представленного множества детекторов YOLOv5, по нашему мнению, будет самым подходящим вариантом по следующим причинам:
Возможность работы в реальном времени, так как решение относится к one‑stage детекторам и требует небольших вычислительных затрат.
Большое комьюнити, что позволяет легко находить решение практически любых проблем.
Решение опубликовано 25 января 2020 года, благодаря чему уже найдено и исправлено большое количество багов.
Развернуть решение можно на любом ноутбуке, для этого есть простая инструкция.
![](https://habrastorage.org/getpro/habr/upload_files/538/9ed/3c5/5389ed3c58ee75195bf8ac9878b0a6f8.png)
На момент написания статьи уже опубликован YOLOv8, однако данный репозиторий не имеет плюсов, описанных во 2 и 3 пунктах.
Для реализации подсчёта трафика можно воспользоваться предобученными весами YOLOv5. Все 80 классов нам не понадобятся для подсчёта трафика, достаточно выбрать только нужные (car, bus, truck, motorcycle). Если же есть потребность в более подробной классификации авто, необходимо обучить кастомную модель. Инструкция по обучению также представлена в репозитории YOLOv5. Обучение кастомной модели на большой выборке перекрёстков позволит также добиться и высокой точности при обнаружении авто.
Трекер объектов (Object Tracking)
Здесь также можно найти большое количество решений. Хорошая статья по теме здесь. Остановимся на DeepSORT по следующим причинам:
Возможность работы в реальном времени, так как решение является относительно легковесным.
Легкий запуск, так как есть реализация на Tensorflow и PyTorch.
Большое комьюнити (не такое, как у YOLOv5, но всё же).
![](https://habrastorage.org/getpro/habr/upload_files/da6/fcf/7b3/da6fcf7b3bdbe672afacc60c44ed22ae.webp)
Для решения задачи подсчёта трафика можно использовать и более лёгкую версию трекера SORT, если есть возможность обеспечить стабильную работу детектора (объект не теряется на видео в течение всего времени нахождения в кадре).
Но! Такой алгоритм не позволит восстановить трек, если он был перекрыт другим объектом или потерян детектором.
Также стоит учитывать, что DeepSORT по умолчанию обучен для трекинга людей в кадре, но для трекинга других объектов его также можно использовать.
Если есть желание добиться максимальной точности, веса нужно обучить на наборе данных с автомобилями.
Однако! Стоит помнить, что различные реализации алгоритма используют разные модели для ре‑идентификации объектов.
Репозиторий обучения модели для оригинальной реализации на основе Tensorflow здесь.
Для обучения аналога с реализацией на основе PyTorch тут.
Запуск решения
Так, реализация описанного решения включает в себя четыре основных шага:
Принять видеопоток.
Пропустить его через детектор YOLOv5.
Полученные детекции обработать с помощью DeepSORT.
Проанализировать треки, полученные на основе работы DeepSORT (подсчитать проехавшие автомобили).
Первые три пункта можно реализовать на основе множества примеров (таких как этот) или самостоятельно. Подсчёт трафика можно выполнить разными способами.
Рассмотрим два из них:
Указание линий, при пересечении которых авто заносится в статистику.
![](https://habrastorage.org/getpro/habr/upload_files/e7a/937/58d/e7a93758d4396b310b8be052eb54de0d.png)
Разбивка кадра на зоны, при пересечении которых также обновляется статистика.
![](https://habrastorage.org/getpro/habr/upload_files/8a4/ffa/004/8a4ffa004cb37552590df29dd66f18c7.png)
После выполнения всех четырёх шагов мы получим рабочее решение по расчету транспортного потока. Запустить описанное решение можно на любом ПК, техническое оснащение определит скорость обработки одного кадра.
К примеру, на ноутбуке с процессором Intel Core i7 10th Gen и видеокартой Nvidia Geforce GTX 1060 Ti данное решение работает со скоростью в 15–20 FPS (при использовании YOLOv5 размера S и DeepSORT с реализацией на PyTorch).
Таким образом, можно реализовать подобный проект с использованием домашнего ноутбука (видеокарта не обязательна при реализации).
Однако! Если нужно посчитать статистику за долгий промежуток времени на каком‑то перекрёстке, то отводить под эту задачу ПК затратно. Для решения таких проблем существует большое количество edge‑платформ (советуем интересную статью на эту тему).
Достаточно популярной платформой является линейка Nvidia Jetson. Самый дешёвый из них — Jetson Nano. Именно это устройство было выбрано для тестирования описанного выше решения. Jetson nano требует установки ОС (JetPack) по инструкции от Nvidia.
![](https://habrastorage.org/getpro/habr/upload_files/1fe/268/09a/1fe26809a40f0f8b1d94f7c683ad8bf9.webp)
Выбрав платформу и установив все необходимые зависимости и репозитории, при запуске мы столкнёмся со следующей проблемой: частота работы решения составит всего 1–2 FPS, что не позволит работать в реальном времени. Это обусловлено тем, что Jetson nano содержит маломощный процессор с архитектурой ARM (4 ядра на 1.5 ГГц), а также видеокарту с 128 ядрами.
Всё это заметно уступает привычным характеристикам для ПК. К счастью, для ускорения работы нашего метода на Jetson существует Deepstream, который можно установить при использовании JetPack.
Deepstream
Deepstream — это набор инструментов, написанных на языке C++, позволяющих обрабатывать видеопотоки из файла или камеры (rtsp или usb соединения), построен с использованием платформы GStreamer с открытым исходным кодом.
Deepstream SDK в своём составе имеет плагины для Object detection, Object tracking и других сопутствующих задач при обработке изображений (декодирование, preprocessing, визуализация и т. д.).
Есть содержательная статья на тему.
![](https://habrastorage.org/getpro/habr/upload_files/16f/31b/7e6/16f31b7e61c51cbb429eee6f09174297.png)
Установка Deepstream производится по инструкции.
Версия 6.0 является последней возможной для Jetson nano. Установив Deepstream, мы получаем возможность запуска примера с использованием различных детекторов (YOLOv3, YOLOv4, SSD, DetectNet_v2) и трекеров (SORT, DeepSORT, NvDCF, IOU).
Запуск примера с использованием DetectNet_v2 и IOU позволяет обрабатывать видео с частотой в 25 FPS на 4 потока единовременно на базе Jetson nano. Такой результат значительно превышает ранее описанные показатели. Обусловлено это использованием оптимизированных плагинов в составе Deepstream, которые максимально переносят вычисления с CPU на GPU.
Однако в примерах используются другие решения, отличные от описанных ранее. Deepstream имеет возможность конфигурирования плагина трекера под работу DeepSORT, но не имеет возможности конфигурации под YOLOv5. С помощью репозитория можно адаптировать алгоритм для запуска под Deepstream.
Проведя конфигурацию нужных плагинов для решения задачи с использованием YOLOv5 и DeepSORT, при запуске получим 13 FPS. Конечно, это не 25 FPS, но всё же позволяет обрабатывать данные в реальном времени, а также показывает прирост производительности на Jetson как минимум в 6 раз в сравнении с использованием оригинальных репозиториев.
Deepstream также можно использовать на любом устройстве с видеокартой линейки Nvidia и ОС Ubuntu 20.04. Для упрощения работы с плагинами Deepstream реализован репозиторий, позволяющий конфигурировать и запускать плагины с помощью Python.
Аналогичные устройства
Безусловно, Jetson является лидером среди конкурентов, так как сопровождается понятной документацией с большим количеством примеров. Однако санкции со стороны компании Nvidia в отношении РФ затрудняют покупку продукции.
Российских аналогов, сопоставимых по возможностям, к сожалению, не существует. Но есть несколько производителей из Китая, продукцию которых купить возможно. Вот два из них:
Huawei Atlas 500 (есть и другие модели) ‒ устройство с процессором на базе ARM и нейросетевым процессором. Такое устройство стоит в несколько раз дороже, но его необходимо рассматривать в качестве сервера для обработки нескольких видеопотоков. Правда, документация оставляет желать лучшего. Репозиторий c примерами тут.
![](https://habrastorage.org/getpro/habr/upload_files/39a/079/19f/39a07919f37075bc12ca66d43b82681e.png)
Rockchip — компания, производящая микропроцессоры и микросхемы. Среди их устройств есть серия с установленной NPU (нейросетевой процессор, позволяющий ускорять вычисления). Одно из таких устройств — Rockchip RK3588. С документацией также есть проблемы, но многие хвалят само устройство.
Если у вас есть примеры edge-устройств с понятной документацией и без санкционных ограничений, будем рады прочитать ваши комментарии ?
Дайте знать, если обзор был для вас интересен – мы будем делать их чаще ?