Подсчет автомобильного трафика методами Computer Vision
Иногда у нас встречаются задачи по подсчету клиентопотока. Мы можем считать очереди, заполнение общественных мест и т.д.
Представим, что нам поставили задачу посчитать поток машин в определенном месте в разное время. На ум приходит только то, что человеку фактически придется вручную произвести примерный расчет по тем или иным показателям.
Давайте попробуем автоматизировать данную задачу, так как на текущий момент у нас есть огромное количество инструментов и вычислительных мощностей.Для начала определимся с источником видеозаписей. Для примера можно взять портал https://weacom.ru/cams. На данном портале размещены в общий доступ различные камеры, которые имеют качественное изображение и хорошее расположение (отлично видно дорогу и автомобили)
В качестве примера камеры возьмем https://weacom.ru/cams/view/akademmost2
Данная камера отлично подойдет дли примера, после попробуем усложнить задачу. Чтобы получить кадры с камеры, нам необходимо подключиться к потоку самой камеры. Заходим в исходный код и находим ссылку на видеопоток с текущей камеры.
Имея данную ссылку, мы можем с использованием Python и OpenCV получать кадры с данного потока.
Так как у нас поток идет быстрее, чем мы успеваем считывать кадры, принудительно замедляем поток до необходимого нам значения, примерно раз в секунду.
Теперь, когда у нас есть кадры – наша задача применить алгоритм для слежения за автомобилями. Для этого возьмем связку Yolo + Deepsort.
В качестве готовой реализации воспользуемся — https://github.com/mikel-brostrom/Yolov5_DeepSort_Pytorch. Данный репозиторий в целом уже содержит все, что нам нужно, останется только перенести его себе и доработать под задачу.
Для начала склонируем репозиторий
И установим все необходимые библиотеки:
Так как yolo обучена на MS Сoco датасете, нам необходимо оставить в распознавании только те классы, которые нам нужны, а именно bus, car, truck. Изменим конфигурацию на классы 4 6 8.
Запустим код из коробки – посмотрим результат работы. Ради интереса попробовал запустить на другой рандомной камере:
В целом, мы видим, что алгоритм работает, слежение идет. Некоторое время понаблюдав за алгоритмом, я закрыл окно.
Вспоминаем нашу задачу – нам нужно посчитать трафик за определенный период времени.
Визуально алгоритм вроде бы уже это делает – но на самом деле точность алгоритма страдает сильно – проставленные id уже явно превышают количество визуально видимых авто.
В таком случае нам необходимо просто добавить счетчики на каждый новый ID.
Для этого внесем в track.py изменения:
Добавляем все уникальные id выявленных машин в список:
А в конце просто убираем дубликаты и выводим длину списка
Запустим алгоритм еще раз – посмотрим на результаты – выглядит уже лучше.
В целом данный алгоритм можно оставить для тестирования. В следующих статьях рассмотрим мультипоточное отслеживание потоков с разных камер.