|
1 |
| -# Анализ трафика на круговом движении (prod версия с множеством камер) |
2 |
| -# Версия с тайм сириес базой данных Influx |
| 1 | +# Анализ трафика на круговом движении |
| 2 | +**production версия с множеством камер и тайм сириес базой данных Influx** |
3 | 3 |
|
4 | 4 | Данная программа осуществляет анализ входящего трафика на участке кругового движения. Алгоритм определяет загруженность примыкающих дорог и выводит интерактивную статистику.
|
5 | 5 |
|
|
10 | 10 | docker compose -p traffic_analyzer up -d --build
|
11 | 11 | ```
|
12 | 12 |
|
13 |
| -Необходимо в главной директории создать файл с переменными окружения, которые будут прокинуты во все контейнеры. Для этого создайте файл `secrets.txt` и положите подобный текст с паролями: |
| 13 | +Необходимо в главной директории создать файл с переменными окружения, которые будут прокинуты во все контейнеры. Для этого создайте файл `.env` и положите подобный текст с паролями и логинами к сервисам: |
14 | 14 | ```
|
15 |
| -POSTGRES_DB=traffic_analyzer_db |
16 |
| -POSTGRES_USER=user |
17 |
| -POSTGRES_PASSWORD=pwd |
| 15 | +INFLUXDB_ADMIN_USER=admin |
| 16 | +INFLUXDB_ADMIN_PASSWORD=admin |
18 | 17 | GF_SECURITY_ADMIN_USER=admin
|
19 | 18 | GF_SECURITY_ADMIN_PASSWORD=admin
|
20 | 19 | ```
|
21 | 20 | Каждая новая камера добавляется как +1 инстанс бекенда traffic_analyzer_camera_N в котором надо указать лишь разные scr и конфигурации через переменные окружения
|
22 | 21 |
|
23 |
| -У каждой камеры сой дашборд между которыми можно переходит по кнопке: |
| 22 | +У каждой камеры свой дашборд между которыми можно переходит по кнопке: |
24 | 23 |
|
25 | 24 | 
|
26 | 25 |
|
| 26 | +## Как запустить локально без дополнительных микросервисов: |
| 27 | +``` |
| 28 | +# ставим библиотеки: |
| 29 | +python -m pip install --upgrade pip |
| 30 | +pip install "numpy<2" |
| 31 | +pip install cython_bbox==0.1.5 lap==0.4.0 |
| 32 | +pip install torch==2.3.1 torchvision==0.18.1 --index-url https://download.pytorch.org/whl/cu121 |
| 33 | +pip install -r requirements.txt |
| 34 | +
|
| 35 | +# запускаем код: |
| 36 | +python main_optimized.py pipeline.send_info_kafka=False |
| 37 | +``` |
| 38 | + |
| 39 | +## Рассмотрим, как реализован код: |
| 40 | + |
| 41 | +Каждый кадр последовательно проходит через ноды, и в атрибуты этого объекта постепенно добавляется все больше и больше информации. |
| 42 | + |
| 43 | +```mermaid |
| 44 | +graph TD; |
| 45 | + A["VideoReader<br>Считывает кадры из видеофайла"] --> B["DetectionTrackingNodes<br>Реализует детектирование машин + трекинг"]; |
| 46 | + B --> C["TrackerInfoUpdateNode<br>Обновляет информацию об актуальных треках"]; |
| 47 | + C --> D["CalcStatisticsNode<br>Вычисляет загруженность дорог"]; |
| 48 | + D --send_info_kafka==False --> F; |
| 49 | + D --send_info_kafka==True --> E["KafkaProducerNode<br>Отправляет результаты в Kafka"]; |
| 50 | + E --> F["ShowNode<br>Отображает результаты на экране"]; |
| 51 | + F --save_video==True --> H["VideoSaverNode<br>Сохраняет обработанные кадры"]; |
| 52 | + F --show_in_web==True & save_video==False --> L["FlaskServerVideoNode<br>Обновляет кадры в веб-интерфейсе"]; |
| 53 | + H --show_in_web==True --> L |
| 54 | +``` |
27 | 55 |
|
28 | 56 |
|
29 | 57 | ## Работа с программой:
|
@@ -55,39 +83,28 @@ __Пример режима демонстрации трекинга машин
|
55 | 83 | 
|
56 | 84 |
|
57 | 85 | ---
|
58 |
| -## Включение сторонних сервисов для визуализации результатов: |
59 |
| -Программа позволяет вести запись актуальной статистики о машинопотоке в базу данных PostgreSQL и тут же осуществлять визуализацию в виде интерактивного дашборда Grafana. |
60 |
| - |
61 |
| - |
62 | 86 |
|
63 |
| -Тем самым у конечного потребителя этого приложения имеется возможность запустить код один раз, подключив на вход RTSP поток или заготовленный видеофайл, и постоянно получать актуальную статистику, а также просматривать историю загруженности участка движения. |
64 | 87 |
|
| 88 | +## Существующие версии кода: |
65 | 89 |
|
66 |
| -## Вывод обработанного видеопотока в веб-интерфейс: |
| 90 | +В проекте специально предусмотрено множество веток, реализующих разные уровни разработки масштабного Computer Vision проекта. |
67 | 91 |
|
68 |
| -Обработанные кадры можно отображать в веб-интерфейсе (вместо отдельного окна OpenCV). Бэкенд сайта реализован с использованием Flask. |
| 92 | +Например, в главной ветке [**main**](https://github.com/Koldim2001/TrafficAnalyzer/tree/main) Docker Compose позволяет поднять сторонние сервисы (Grafana для визуализации и базу данных PostgreSQL). Однако основной код, реализующий бекенд, необходимо запускать локально с помощью имеющегося на компьютере Python. |
69 | 93 |
|
70 |
| -Для того, чтобы запустить проект таким образом, необходимо в файле configs/app_config.yaml в разделе pipeline указать show_in_web=True и в show_node указать imshow=False. Далее можно запускать main.py или main_optimized.py и переходить по ссылке http://localhost:8100/ |
| 94 | +Дальнейшее развитие проекта заключается в реализации полного Docker Compose из всех имеющихся сервисов, включая сам бекенд. Такая версия доступна в ветке [**prod_docker_version**](https://github.com/Koldim2001/TrafficAnalyzer/tree/prod_docker_version). Код из этой ветки очень просто запустить, и не требуется ничего иметь на компьютере, кроме Docker. Проект запускается единственной командой: `docker compose -p traffic_analyzer up -d --build` |
71 | 95 |
|
72 |
| -Пример того, как можно запустить проект и иметь возможность одновременно смотреть стрим по порту 8100 и наблюдать интерактивный дашборд в Grafana по порту 3111: |
| 96 | +Следующим этапом развития проекта стало появление ветки [**multicamera**](https://github.com/Koldim2001/TrafficAnalyzer/tree/multicamera). В ней реализовано всё то же, что и в ветке prod_docker_version, но теперь есть удобная возможность масштабировать проект на большое число камер. Для этого потребуется лишь в файле docker-compose добавить новые контейнеры бекенда с указанием пути до нового видео ресурса. При этом вся обработка будет выполняться нативно внутри контейнеров бекенда, включая инференс самой сети. Под каждую новую камеру автоматически поднимается новый инстанс сети YOLO, реализующий детекцию транспорта. |
73 | 97 |
|
74 |
| - |
75 |
| - |
76 |
| ---- |
| 98 | +Еще одним дальнейшим вариантом развития стало появление ветки [**feature/triton**](https://github.com/Koldim2001/TrafficAnalyzer/tree/feature/triton). По сути это та же ветка multicamera, но теперь все контейнеры бекенда не реализуют инференс сети внутри, а лишь отправляют запросы по gRPC на дополнительный сервис под названием Triton Inference Server. Благодаря этому можно масштабировать проект без значительного увеличения нагрузки (хотя значения FPS будет чуть ниже из-за того, что теперь для инференса надо отправлять запрос на сервис и получать ответы с него). Однако теперь лишь один контейнер взаимодействует с видеокартой, и инстансы бекенда не требуют GPU для работы. |
77 | 99 |
|
78 |
| -## Рассмотрим, как реализован код: |
| 100 | +Еще одним дальнейшим вариантом развития стало появление ветки [**feature/influx**](https://github.com/Koldim2001/TrafficAnalyzer/tree/feature/influx). Это как раз та ветка в которой вы сейчас находитесь. По сути это та же ветка multicamera, но теперь база данных изменена с PostgreSQL на базу данных рмененных рядов InfluxDB. Данная база данных лучше подходит для работы с потоковыми данными, которые записываются с бекенда. При этом запись в InfluxDB осуществляется с помощью сервиса Telegraf, который читает топик брокера сообщений Kafka, в который отправляет бекенд, и производит автоматическое сохранение данных в Influx. |
79 | 101 |
|
80 |
| -Каждый кадр последовательно проходит через ноды, и в атрибуты этого объекта постепенно добавляется все больше и больше информации. |
| 102 | +Структура ветвления Git проекта представлена ниже: |
81 | 103 |
|
82 |
| -```mermaid |
83 |
| -graph TD; |
84 |
| - A["VideoReader<br>Считывает кадры из видеофайла"] --> B["DetectionTrackingNodes<br>Реализует детектирование машин + трекинг"]; |
85 |
| - B --> C["TrackerInfoUpdateNode<br>Обновляет информацию об актуальных треках"]; |
86 |
| - C --> D["CalcStatisticsNode<br>Вычисляет загруженность дорог"]; |
87 |
| - D --sent_info_db==False --> F; |
88 |
| - D --sent_info_db==True --> E["SentInfoDBNode<br>Отправляет результаты в базу данных"]; |
89 |
| - E --> F["ShowNode<br>Отображает результаты на экране"]; |
90 |
| - F --save_video==True --> H["VideoSaverNode<br>Сохраняет обработанные кадры"]; |
91 |
| - F --show_in_web==True & save_video==False --> L["FlaskServerVideoNode<br>Обновляет кадры в веб-интерфейсе"]; |
92 |
| - H --show_in_web==True --> L |
93 | 104 | ```
|
| 105 | +main |
| 106 | +└── prod_docker_version |
| 107 | + └── multicamera |
| 108 | + ├── feature/triton |
| 109 | + └── feature/influx |
| 110 | +``` |
0 commit comments