|
|
# Архитектура проекта
|
|
|
|
|
|
## 1. Общая схема
|
|
|
|
|
|
Проект состоит из нескольких слоев:
|
|
|
|
|
|
1. прием кадров;
|
|
|
2. детекция;
|
|
|
3. трекинг и удержание;
|
|
|
4. оценка движения и восстановление;
|
|
|
5. guidance;
|
|
|
6. выдача команд наружу;
|
|
|
7. логирование и отладка.
|
|
|
|
|
|
## 2. Основная точка входа
|
|
|
|
|
|
### `main.py`
|
|
|
|
|
|
Это главный runtime-файл. Он:
|
|
|
|
|
|
- загружает модель YOLO;
|
|
|
- открывает источник через `open_source`;
|
|
|
- запускает YOLO worker;
|
|
|
- создает `AutoGazeROIWorker` и пытается его запустить, но по умолчанию `AUTOGAZE_ENABLE = False`, поэтому модуль обычно не активен;
|
|
|
- инициализирует Kalman, KLT и ByteTrack;
|
|
|
- ведет основной цикл обработки кадров;
|
|
|
- строит итоговый lock и guidance;
|
|
|
- пишет выходное видео и логи.
|
|
|
|
|
|
## 3. Конфигурация
|
|
|
|
|
|
### `config.py`
|
|
|
|
|
|
Содержит:
|
|
|
|
|
|
- путь к модели;
|
|
|
- источник видео;
|
|
|
- настройки YOLO;
|
|
|
- настройки KLT;
|
|
|
- настройки ByteTrack;
|
|
|
- настройки guidance;
|
|
|
- настройки ROI и recovery;
|
|
|
- параметры записи видео и логов.
|
|
|
|
|
|
### `config_intercept.py`
|
|
|
|
|
|
Содержит:
|
|
|
|
|
|
- range estimation;
|
|
|
- proportional navigation;
|
|
|
- intercept FSM;
|
|
|
- настройки backend'ов управления;
|
|
|
- испытательный UDP-протокол;
|
|
|
- IMM/дополнительные модули.
|
|
|
|
|
|
### `runtime_env.py`
|
|
|
|
|
|
Накладывает env-overrides поверх значений из `config.py` и `config_intercept.py`.
|
|
|
|
|
|
Это особенно важно для Docker, потому что позволяет не редактировать код под каждый запуск.
|
|
|
|
|
|
## 4. Источник видео
|
|
|
|
|
|
### `helpers.py`
|
|
|
|
|
|
Ключевые функции:
|
|
|
|
|
|
- `open_source` — открывает `camera`, `stream` или `file`;
|
|
|
- `get_frame_timestamp_seconds` — вычисляет временную метку кадра;
|
|
|
- `sanitize_dt` — стабилизирует `dt`;
|
|
|
- геометрические и ROI-функции.
|
|
|
|
|
|
## 5. Детекция
|
|
|
|
|
|
### `yolo_worker.py`
|
|
|
|
|
|
Асинхронный worker для запуска YOLO.
|
|
|
|
|
|
Работает в двух режимах:
|
|
|
|
|
|
- по ROI;
|
|
|
- по полному кадру.
|
|
|
|
|
|
Возвращает:
|
|
|
|
|
|
- список детекций;
|
|
|
- время инференса;
|
|
|
- признак, использовался ли ROI.
|
|
|
|
|
|
## 6. Трекинг и удержание
|
|
|
|
|
|
### `bytetrack_min_aggressive.py`
|
|
|
|
|
|
Локальная реализация ByteTrack, добавленная в корень проекта для самодостаточного контейнерного runtime.
|
|
|
|
|
|
### `trackers.py`
|
|
|
|
|
|
Базовые Kalman-трекеры.
|
|
|
|
|
|
### `trackers_safe.py`
|
|
|
|
|
|
Более безопасные ограничения для Kalman.
|
|
|
|
|
|
### `trackers_hybrid.py`
|
|
|
|
|
|
Гибридный KLT-трекер.
|
|
|
|
|
|
## 7. Восстановление и anti-stall логика
|
|
|
|
|
|
### `target_handoff.py`
|
|
|
|
|
|
Логика:
|
|
|
|
|
|
- stale lock;
|
|
|
- fast handoff;
|
|
|
- override guidance;
|
|
|
- временное удержание re-anchor-кандидата.
|
|
|
|
|
|
### `template_matching.py`
|
|
|
|
|
|
Fallback через шаблонное сопоставление.
|
|
|
|
|
|
### `camera_motion.py`
|
|
|
|
|
|
Оценка глобального движения камеры и компенсация.
|
|
|
|
|
|
### `motion_saliency.py`
|
|
|
|
|
|
Помогает переоценивать детекции по движению.
|
|
|
|
|
|
### `stationary_killer.py`
|
|
|
|
|
|
Отбрасывает залипшие и статичные треки.
|
|
|
|
|
|
### `autogaze_runner.py`
|
|
|
|
|
|
Опциональный ROI prior для recover. По умолчанию `AUTOGAZE_ENABLE = False`.
|
|
|
|
|
|
## 8. Guidance
|
|
|
|
|
|
### `guidance.py`
|
|
|
|
|
|
Задачи:
|
|
|
|
|
|
- построение точки прицеливания;
|
|
|
- сглаживание команд;
|
|
|
- удержание при miss;
|
|
|
- экспорт `guidance_state.json`;
|
|
|
- отрисовка crosshair, точки и желтой линии.
|
|
|
|
|
|
Именно этот слой строит:
|
|
|
|
|
|
- `aim_x`, `aim_y`;
|
|
|
- `steer_x`, `steer_y`;
|
|
|
- `confidence`;
|
|
|
- `status` (`SEARCH`, `LOCK`, `HOLD`, `REACQ`).
|
|
|
|
|
|
## 9. Наведение и внешние backend'ы
|
|
|
|
|
|
### `autopilot_bridge.py`
|
|
|
|
|
|
Преобразует guidance-state в внешние команды.
|
|
|
|
|
|
Поддерживает:
|
|
|
|
|
|
- `json`
|
|
|
- `mavlink`
|
|
|
- `msp`
|
|
|
- `proto_udp`
|
|
|
|
|
|
### `range_estimation.py`
|
|
|
|
|
|
Оценка дальности по видимому размеру цели.
|
|
|
|
|
|
### `proportional_navigation.py`
|
|
|
|
|
|
PN-логика.
|
|
|
|
|
|
### `intercept_fsm.py`
|
|
|
|
|
|
FSM фаз:
|
|
|
|
|
|
- `SEARCH`
|
|
|
- `ACQUIRE`
|
|
|
- `TRACK`
|
|
|
- `INTERCEPT`
|
|
|
- `TERMINAL`
|
|
|
- `LOST`
|
|
|
|
|
|
### `imu_fusion.py`
|
|
|
|
|
|
Дополнительный модуль IMU/MAVLink/MSP. Отдельный, не является обязательной частью базового запуска.
|
|
|
|
|
|
## 10. Логирование
|
|
|
|
|
|
### `decision_logger.py`
|
|
|
|
|
|
Записывает:
|
|
|
|
|
|
- покадровые решения;
|
|
|
- причины переключений;
|
|
|
- stale-lock и guidance-reset события.
|
|
|
|
|
|
Выход:
|
|
|
|
|
|
- `track_log_*.csv`
|
|
|
- `track_summary_*.json`
|
|
|
|
|
|
## 11. Что не относится к основному runtime
|
|
|
|
|
|
### `cvat/`
|
|
|
|
|
|
Это отдельный большой каталог для CVAT и не нужен для повседневного запуска трекера.
|
|
|
|
|
|
### `dataset_prep/`
|
|
|
|
|
|
Скрипты подготовки датасета.
|
|
|
|
|
|
Они не нужны для обычного запуска `main.py`.
|