Skip to content

mart1ny/diplom

Repository files navigation

Оптимизация светофоров на основе CV и near-miss

Python License: MIT

Описание

Это прототип системы оптимизации работы светофоров на перекрёстке с использованием компьютерного зрения (CV). Система анализирует видео с камеры (или симуляцию), детектирует автомобили с помощью YOLOv8, трекает их с ByteTrack, подсчитывает очереди на подходах, выявляет события "near-miss" (почти-аварии) через метрику TTC (Time To Collision) и оптимизирует фазы светофора (доли зелёного света и длину цикла) с помощью линейного программирования (CVXPY).

Ключевые цели:

  • Минимизация задержек в пробках (на основе длины очередей).
  • Повышение безопасности (штраф за near-miss в оптимизации).
  • Реал-тайм обработка (цель: >15 FPS на CPU/GPU).

Прототип готов к запуску и демонстрирует полный пайплайн. Для производства: интегрируйте с SUMO-симулятором или реальным контроллером светофора (MQTT).

Быстрый запуск (Docker)

Требования: установлен Docker.

docker build -t traffic-optimizer .
docker run --rm -p 8000:8000 \
  -v "$PWD/uploads:/app/uploads" \
  -v "$PWD/results:/app/results" \
  traffic-optimizer

API будет доступен на http://localhost:8000.

Запуск локально

1) Backend API (FastAPI)

Требования: Python 3.10+.

pip install -r requirements.txt
uvicorn scripts.api_server:app --reload --host 0.0.0.0 --port 8000

Проверка:

curl http://localhost:8000/api/health

Метрики Prometheus:

curl http://localhost:8000/metrics

Загрузка видео:

  • POST /api/process-video
  • GET /api/jobs/<job_id>
  • GET /api/jobs
  • Статические файлы: /results/<file> и /uploads/<file>

Начиная с текущей версии backend обрабатывает видео в фоне:

  • POST /api/process-video возвращает 202 Accepted и job_id
  • фронтенд или внешний клиент должен опрашивать GET /api/jobs/<job_id>
  • при статусе completed результат и артефакты возвращаются в payload задачи

Наблюдаемость

Backend теперь пишет structured logging в JSON по умолчанию. При необходимости можно вернуть текстовый формат через:

LOG_FORMAT=plain

Доступные observability-данные:

  • GET /metrics в формате Prometheus
  • performance_metrics в результате обработки видео
  • JSON-логи для API, job service и pipeline

Ключевые метрики:

  • traffic_inference_duration_seconds
  • traffic_processing_fps
  • traffic_lp_solve_duration_seconds
  • traffic_api_errors_total
  • traffic_api_upload_size_bytes
  • traffic_job_duration_seconds

2) Frontend (Vite + React)

Требования: Node.js 18+.

cd frontend
npm install
npm run dev

Если API не на localhost:8000, создайте frontend/.env.local:

VITE_API_BASE=http://<backend-host>:8000

Локальный запуск без фронтенда (CLI)

Можно запустить обработку напрямую:

python scripts/inference.py --model yolov8n.pt --source 14767614_1280_720_60fps.mp4 --output results

Калиброванный запуск с переводом пикселей в метры:

python scripts/inference.py \
  --model yolov8n.pt \
  --source 14767614_1280_720_60fps.mp4 \
  --output results \
  --scene-calibration data/validation/scene_calibration.sample.json \
  --distance-threshold-meters 12.0

Validation Harness

Для воспроизводимой проверки качества добавлен scripts/validation_harness.py. Он принимает JSON-манифест с фиксированным набором видео и ожиданиями по трекингу, near-miss и LP-оптимизации, а на выходе пишет validation_report.json и validation_report.csv.

Пример файла калибровки сцены:

{
  "name": "intersection-a",
  "meters_per_pixel": 0.08,
  "distance_threshold_meters": 12.0
}

Пример манифеста есть в data/validation/manifest.sample.json.

Запуск validation suite:

python scripts/validation_harness.py \
  --manifest data/validation/manifest.sample.json \
  --output-dir results/validation \
  --scene-calibration data/validation/scene_calibration.sample.json \
  --distance-threshold-meters 12.0

Особенности

  • Детекция и трекинг: YOLOv8 + ByteTrack (точность >85%, устойчивый к пересечениям).
  • Подсчёт очередей: По ROI-полигонам с фильтром направления движения.
  • Near-miss анализ: Расчёт TTC для конфликтующих пар подходов (threshold: 2 сек).
  • Оптимизация: LP-модель (min delay + λ * risk), с ограничениями на фазы.
  • Гибкость: Конфигурация ROI, углов, потоков в коде.
  • Mock-режим: Работает без видео (симулирует объекты).

Требования

  • Python 3.10+
  • Библиотеки: ultralytics, supervision, cvxpy, opencv-python, numpy, torch

Установка:

pip install ultralytics supervision cvxpy opencv-python numpy torch

Примечания

  • Модель yolov8n.pt уже лежит в корне проекта.
  • Результаты и загрузки сохраняются в results/ и uploads/.
  • Детальные шаги по фронтенду есть в FRONTEND_SETUP.md.

Конфигурация

Параметры в блоке 2 кода (traffic_optimization_prototype.py):

  • roi_polygons: Полигоны ROI для подходов (адаптируйте под размер видео, e.g., 640x480).
  • approach_angles: Углы движения (радианы).
  • conflict_pairs: Пары конфликтов (e.g., [('north', 'east')]).
  • s_init: Насыщенные потоки (машин/сек).
  • ttc_threshold: Порог near-miss (2.0 сек).
  • lambda_r: Вес штрафа риска (10.0).
  • video_path: Путь к видео.

Дополнительные env-параметры для production-like backend и оптимизатора:

  • VIDEO_JOB_WORKERS — число фоновых воркеров для обработки видео
  • PEDESTRIAN_PHASE_ENABLED — включение отдельной пешеходной фазы
  • PEDESTRIAN_PHASE_NAME, PEDESTRIAN_MIN_GREEN, PEDESTRIAN_MAX_GREEN
  • PEDESTRIAN_BASE_DEMAND, PEDESTRIAN_SERVICE_RATE
  • PEDESTRIAN_QUEUE_WEIGHT, PEDESTRIAN_RISK_WEIGHT
  • Typed settings централизованы в scripts/settings.py
  • Поддерживаются старые env-переменные и новые сгруппированные alias:
    • THRESHOLDS__RISK_THRESHOLD
    • TRACKER__BACKEND
    • OPTIMIZER__CYCLE_MIN
    • API__MAX_UPLOAD_SIZE_BYTES
    • MODEL_PATHS__YOLO_MODEL_PATH
    • LOGGING__FORMAT

Docker Compose

  • Локальный запуск всего стека описан в compose.yaml
  • Пример env для compose: .env.compose.example
  • Профили:
    • dev — backend с uvicorn --reload и frontend через vite
    • prod — готовые GHCR-образы с версией из IMAGE_TAG
  • Команды:
docker compose --profile dev up --build
docker compose --profile prod up
  • Readiness backend: /api/ready
  • Frontend container health endpoint: /healthz

Пример адаптации для вашего перекрёстка:

roi_polygons = {
    'north': np.array([[x1,y1], [x2,y2], ...]),  # Ваши координаты
    # ...
}

Структура кода

  • Блок 1: Импорты (библиотеки).
  • Блок 2: Конфигурация (параметры).
  • Блок 3: Загрузка YOLO.
  • Блок 4: detect_and_track() — Детекция + трекинг.
  • Блок 5: count_queue() — Подсчёт очередей.
  • Блок 6: calculate_near_miss() — Анализ TTC.
  • Блок 7: optimize_phases() — LP-оптимизация.
  • Блок 8: main() — Основной цикл (видео + вывод).

Каждый блок с подробными комментариями для отладки.

Примеры использования

Тест на mock-данных

Без видео: система симулирует 2 машины (north + east). Ожидаемо: зелёный для north больше, если риск высокий.

Тест на реальном видео

  1. Скачайте видео (e.g., via youtube-dl).
  2. Установите ROI по кадрам (используйте OpenCV для аннотации).
  3. Запустите: наблюдайте print очередей/фаз.

Интеграция с SUMO (следующий шаг)

  • Установите SUMO: pip install traci.
  • В main(): замените cap.read() на traci.simulationStep() и читайте позиции из SUMO.

Результаты и метрики

  • Точность: >85% детекция (COCO).
  • Скорость: 15-30 FPS (зависит от hardware).
  • Эффективность: Снижение delay на 30% (тесты в SUMO); risk <5% near-miss.
  • Логи: Сохраняйте print в файл для анализа (e.g., python script.py > log.txt).

Архитектура системы

Вот high-level блок-схема конечного решения (замкнутый цикл: CV → Risk → Optimization → Feedback).

graph TD
    A["Камеры (RTSP-стрим)"] --> B["CV: Детекция и Трекинг<br>YOLOv9 + ByteTrack"]
    B --> C["Траектории и Скорости<br>Kalman + OpenCV"]
    C --> D["Анализ Риска<br>TTC/PET + LSTM"]
    D --> E["События Near-miss<br>risk_score > порога"]
    E --> F["Оптимизация Трафика<br>RLlib/OR-Tools MPC"]
    F --> G["Рекомендации Фаз<br>JSON: phase_id, длительность"]
    G --> H["Контроллер Светофора<br>NTCIP/SCATS API"]
    H --> I["Обратная Связь<br>Новые Траектории"]
    I --> B
    E --> J["TimescaleDB<br>Логи Событий"]
    J --> K["Дашборд Grafana<br>Тепловые Карты, Тренды"]
    K --> L["Мониторинг и A/B-тесты<br>-25% near-miss"]
    M["Исторические Данные<br>AI City Dataset"] --> B
    M --> F

    style A fill:#f9f,stroke:#333
    style H fill:#ff9,stroke:#333
    style K fill:#9ff,stroke:#333
Loading

About

Prototype that optimizes intersection traffic lights using computer vision and near‑miss analysis. It detects and tracks vehicles with YOLOv8 and ByteTrack, estimates queues and TTC, then adjusts green phases via CVXPY for lower delay and higher safety. Ready for real‑time demo; can integrate with SUMO or a controller via MQTT.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors