Skip to content

Анализ трафика на круговом движении с использованием компьютерного зрения

Notifications You must be signed in to change notification settings

Koldim2001/TrafficAnalyzer

Repository files navigation

Анализ трафика на круговом движении

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

Подробный туториал по проекту - ссылка на видео

Установка:

Необходима версия Python >= 3.10 (лучше 3.10.14)

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
pip install -r requirements.txt

Работа с программой:

Перед запуском необходимо в файле configs/app_config.yaml указать все желаемые параметры. Далее можно запускать код.

Классический запуск кода:

python main.py

Пример запуска в дебаг режиме (профилировщик):

python main.py hydra.job_logging.root.level=DEBUG

Оптимизированный код с помошью multiprocessing позволяет добиться более высокой скорости обработки (>30 fps). Для его запуска необходимо запустить терминальную команду:

python main_optimized.py 

Для тестирования работы проекта в репозитории уже имеется видео test_videos/test_video.mp4. Кроме того, у вас есть возможность загрузить более длинное видео, пройдя по следующей ссылке: Google Drive ссылка.

Чтобы запустить проект с определенным видео, необходимо указать путь к нему в файле конфигурации configs/app_config.yaml проекта в разделе video_reader.src.


Примеры работы кода:

Пример работы алгоритма c выводом статистики: каждая машина отображается цветом, соответствующим дороге, с которой она прибыла к круговому движению + выводится значение числа видимых машин + значения интенсивности входного потока (число машин в минуту с каждой входящей дороги).
Отображается таким образом при выборе в конфигурации show_node.show_info_statistics=True

Traffic statistics 1 Traffic statistics 2

Отключить отображение окна со статистикой можно при выборе в конфигурации show_node.show_info_statistics=False
Чтобы наблюдать fps обработки как в первом представленном примере, необходимо в конфиге указать show_node.draw_fps_info=True.
При наличии GPU получается достигнуть порядка 30-40 кадров в секунду в случае запуска main_optimized.py


Пример режима демонстрации трекинга машин (каждый id своим уникальным цветом отображается)
Отображается таким образом при выборе в конфигурации show_node.show_track_id_different_colors=True

Traffic Tracking


Включение сторонних сервисов для визуализации результатов:

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

Dashboard

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

Что нужно сделать для запуска кода в таком режиме:

  1. Необходимо в файле configs/app_config.yaml в разделе pipeline указать sent_info_db=True.
  2. Необходимо установить все сервисы. Для этого нужно поднять компоуз из контейнеров и создать папки, в которые будут прокинуты вольюмы от них. Чтобы это сделать, требуется в терминале запустить написанный bat-файл:
run_services.bat
  1. Как только убедитесь, что все три контейнеры поднялись и работают, то можно запускать сам код:
python main_optimized.py 

Для доступа в Grafana необходимо перйти на сайт http://localhost:3111/

Пример того, как в реальном времени строятся графики на дашборде после запуска кода:

Grafana


Вывод обработанного видеопотока в веб-интерфейс:

Обработанные кадры можно отображать в веб-интерфейсе (вместо отдельного окна OpenCV). Бэкенд сайта реализован с использованием Flask.

Для того, чтобы запустить проект таким образом, необходимо в файле configs/app_config.yaml в разделе pipeline указать show_in_web=True и в show_node указать imshow=False. Далее можно запускать main.py или main_optimized.py и переходить по ссылке http://localhost:8100/

Пример того, как можно запустить проект и иметь возможность одновременно смотреть стрим по порту 8100 и наблюдать интерактивный дашборд в Grafana по порту 3111:

web+grafana


Рассмотрим, как реализован код:

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

graph TD;
    A["VideoReader<br>Считывает кадры из видеофайла"] --> B["DetectionTrackingNodes<br>Реализует детектирование машин + трекинг"];
    B --> C["TrackerInfoUpdateNode<br>Обновляет информацию об актуальных треках"];
    C --> D["CalcStatisticsNode<br>Вычисляет загруженность дорог"];
    D --sent_info_db==False --> F;
    D --sent_info_db==True --> E["SentInfoDBNode<br>Отправляет результаты в базу данных"];
    E --> F["ShowNode<br>Отображает результаты на экране"];
    F --save_video==True --> H["VideoSaverNode<br>Сохраняет обработанные кадры"];
    F --show_in_web==True & save_video==False --> L["FlaskServerVideoNode<br>Обновляет кадры в веб-интерфейсе"];
    H --show_in_web==True --> L