AI video analytics with object detection, tracking, face/LPR recognition, and user-guided fine-tuning.
| Component | Technology |
|---|---|
| Containerization | Podman (RHEL) / Docker |
| Database | PostgreSQL 17 with pgvector |
| MQTT | Mosquitto |
| Object detection | YOLOv11 (Ultralytics) |
| Tracking | DeepSORT (Kalman + IoU) |
| Face recognition | InsightFace (ArcFace) |
| License plates | PaddleOCR |
| Vehicle make | CLIP zero-shot |
| UI | Bootstrap 5, vanilla JS |
Two-model approach:
- YoloDetector — base yolo11m (COCO 80 classes) — runs only on motion frames
- CropClassifier — fine-tuned.pt (custom classes) — classifies cropped objects
COCO detection and name classification run on crops. Training is done separately; resulting fine-tuned.pt is uploaded to the server.
# 1. Copy and configure
cp config/cameras.yaml.example config/cameras.yaml
cp config/settings.yaml.example config/settings.yaml
cp config/triggers.yaml.example config/triggers.yaml
cp .env.example .env
# edit .env
# 2. Run
docker compose up -d
# 3. Check
curl http://localhost:8090/healthbash scripts/install-deps.sh
cp .env.example .env && vim .env
WITH_LOCAL_PG=yes WITH_MQTT=yes bash scripts/deploy.sh
curl http://localhost:8090/healthAll configs in config/:
cameras.yaml— RTSP cameras (copy from .example, set your rtsp_url)settings.yaml— detection thresholds, motion, tracker, LPR, face, VMRtriggers.yaml— triggers and actions (webhook/mqtt/log)
Most settings are available via the web UI (gear icon in top right). Changes apply via PUT /config with hot-reload — no restart needed.
- Image 70% + compact table 30%
- Only name and last seen time
- Suitable for monitoring
- Full table with detail panel on the right
- Search / filters / grouping
- Rename objects, assign classes
- Ignore and delete
Toggle button in the top right of the navbar.
- Assign names to objects via UI
- In "Дообучение" tab (Settings → 6th tab) download dataset ZIP
- On a machine with GPU: run
training/train.bat - Replace
fine-tuned.pton the server - Click "Загрузить модель" in UI or restart the container
train.py automatically creates a combined dataset from all named classes.
| Variable | Default | Description |
|---|---|---|
DB_HOST |
postgres (docker) |
PostgreSQL host |
DB_PORT |
5432 |
Port |
DB_NAME |
cam |
Database name |
DB_USER |
cam |
User |
DB_PASSWORD |
change_me |
Password |
MQTT_HOST |
mosquitto (docker) |
MQTT host |
MQTT_PORT |
1883 |
MQTT port |
HEALTH_PORT |
8090 |
Health endpoint port |
TZ |
Europe/Moscow |
Time zone |
WITH_LOCAL_PG |
no |
Podman: PG in same pod |
WITH_GPU |
no |
Podman: NVIDIA GPU passthrough |
OMP_NUM_THREADS |
4 |
CPU threads for OpenMP |
curl http://localhost:8090/health # status + summary
curl http://localhost:8090/stats # aggregated stats
curl http://localhost:8090/objects?limit=20 # object list
curl http://localhost:8090/objects/{id} # object details
curl http://localhost:8090/filters # available filters
curl http://localhost:8090/config # config (GET/PUT)
curl http://localhost:8090/config/reload # hot-reload| Script | Purpose |
|---|---|
scripts/deploy.sh |
Deploy podman pod |
scripts/build-push.sh |
Build + push to registry |
scripts/test-stream.sh |
Check RTSP/ONVIF cameras |
scripts/health-check.sh |
Health monitoring |
training/train.py |
Fine-tune YOLO |
training/train.bat |
Same (Windows) |
cam/
├── config/ # configuration
│ ├── cameras.yaml # RTSP cameras
│ ├── settings.yaml # global settings
│ ├── triggers.yaml # triggers
│ └── mqtt/ # Mosquitto config
├── docker/ # Containerfiles
├── src/ # source code
│ ├── detection/ # YOLO + CropClassifier
│ ├── recognition/ # LPR, Face, VMR
│ ├── tracking/ # DeepSORT
│ ├── storage/ # PostgreSQL + repository
│ ├── pipeline.py # main pipeline
│ └── main.py # aiohttp server
├── training/ # fine-tuning
├── ui/ # web interface
├── docker-compose.yml # Docker Compose
└── .env.example # env template
Система видеоаналитики с AI-обнаружением, трекингом, распознаванием лиц/номеров и дообучением на пользовательских данных.
| Компонент | Технология |
|---|---|
| Контейнеризация | Podman (RHEL) / Docker |
| БД | PostgreSQL 17 с pgvector |
| MQTT | Mosquitto |
| Обнаружение объектов | YOLOv11 (Ultralytics) |
| Трекинг | DeepSORT (Kalman + IoU) |
| Распознавание лиц | InsightFace (ArcFace) |
| Распознавание номеров | PaddleOCR |
| Распознавание марок | CLIP zero-shot |
| UI | Bootstrap 5, vanilla JS |
Проект использует двухмодельный подход:
- YoloDetector — базовая yolo11m (COCO 80 классов) — работает только на кадрах с движением
- CropClassifier — fine-tuned.pt (пользовательские классы) — классифицирует вырезанные объекты
Детекция COCO и классификация имён выполняются на crop'ах. Дообучение производится отдельно, результат (fine-tuned.pt) загружается на сервер.
# 1. Скопировать и настроить конфиги
cp config/cameras.yaml.example config/cameras.yaml
cp config/settings.yaml.example config/settings.yaml
cp config/triggers.yaml.example config/triggers.yaml
cp .env.example .env
# заполнить .env
# 2. Запустить
docker compose up -d
# 3. Проверить
curl http://localhost:8090/healthbash scripts/install-deps.sh
cp .env.example .env && vim .env
WITH_LOCAL_PG=yes WITH_MQTT=yes bash scripts/deploy.sh
curl http://localhost:8090/healthВсе конфиги в config/:
cameras.yaml— RTSP-камеры (копия из .example, вписать свои rtsp_url)settings.yaml— пороги детекции, motion, трекер, LPR, face, VMRtriggers.yaml— триггеры и действия (webhook/mqtt/log)
Большинство настроек доступно через веб-интерфейс (шестерёнка в правом верхнем углу). Изменения применяются через PUT /config и hot-reload — без перезапуска.
- Картинка 70% + компактная таблица 30%
- Только имя и время последнего появления
- Подходит для мониторинга
- Полная таблица с детальной панелью справа
- Поиск / фильтры / группировка
- Переименование объектов, назначение классов
- Игнорирование и удаление
Переключение — кнопка в правом верхнем углу навбара.
- Через UI задать имена объектам
- На вкладке "Дообучение" (Settings → 6-я вкладка) скачать ZIP с датасетом
- На машине с GPU:
training/train.bat - Полученный
fine-tuned.ptзаменить на сервере - Через UI нажать "Загрузить модель" или перезапустить контейнер
train.py автоматически создаёт единый датасет из всех именованных классов.
| Переменная | По умолчанию | Описание |
|---|---|---|
DB_HOST |
postgres (docker) |
Хост PostgreSQL |
DB_PORT |
5432 |
Порт |
DB_NAME |
cam |
Имя БД |
DB_USER |
cam |
Пользователь |
DB_PASSWORD |
change_me |
Пароль |
MQTT_HOST |
mosquitto (docker) |
Хост MQTT |
MQTT_PORT |
1883 |
Порт MQTT |
HEALTH_PORT |
8090 |
Порт health endpoint |
TZ |
Europe/Moscow |
Часовой пояс |
WITH_LOCAL_PG |
no |
Podman: PG в том же pod |
WITH_GPU |
no |
Podman: проброс NVIDIA GPU |
OMP_NUM_THREADS |
4 |
Число потоков CPU для OpenMP |
curl http://localhost:8090/health # статус + сводка
curl http://localhost:8090/stats # агрегированная статистика
curl http://localhost:8090/objects?limit=20 # список объектов
curl http://localhost:8090/objects/{id} # детали объекта
curl http://localhost:8090/filters # доступные фильтры
curl http://localhost:8090/config # текущая конфигурация (GET/PUT)
curl http://localhost:8090/config/reload # hot-reload| Скрипт | Назначение |
|---|---|
scripts/deploy.sh |
Развёртывание podman pod |
scripts/build-push.sh |
Сборка + push в registry |
scripts/test-stream.sh |
Проверка RTSP/ONVIF камер |
scripts/health-check.sh |
Мониторинг здоровья |
training/train.py |
Дообучение YOLO |
training/train.bat |
То же (Windows) |
cam/
├── config/ # конфигурация
│ ├── cameras.yaml # RTSP-камеры
│ ├── settings.yaml # глобальные настройки
│ ├── triggers.yaml # триггеры
│ └── mqtt/ # конфиг Mosquitto
├── docker/ # Containerfile'ы
├── src/ # исходный код
│ ├── detection/ # YOLO + CropClassifier
│ ├── recognition/ # LPR, Face, VMR
│ ├── tracking/ # DeepSORT
│ ├── storage/ # PostgreSQL + репозиторий
│ ├── pipeline.py # основной пайплайн
│ └── main.py # aiohttp сервер
├── training/ # дообучение
├── ui/ # веб-интерфейс
├── docker-compose.yml # Docker Compose
└── .env.example # шаблон переменных