# 🎾 Pickle - Pickleball Ball Tracking Система трекинга пикабольного мяча с автоматической детекцией корта и преобразованием координат в метры. ## Что делает 1. **Детекция корта** - автоматический поиск 4 углов корта (Roboflow модель) 2. **Детекция мяча** - поиск мяча на каждом кадре (YOLO v8) 3. **Трансформация координат** - преобразование пикселей в метры (homography) 4. **Визуализация** - видео с траекторией, графики, тепловая карта ## Быстрый старт ```bash # Запуск docker-compose up -d # Открыть Dagster UI open http://localhost:3000 # Запустить пайплайн docker exec pickle-dagster dagster asset materialize --select '*' -m dagster_project ``` ## Структура пайплайна ``` 1. extract_video_frames → Извлекает 100 кадров (с 10-й секунды) ↓ 2. detect_court_keypoints → Находит 4 угла корта ↓ ↓ 3. detect_ball_positions ←┘ Детектит мяч на всех кадрах ↓ 4. compute_2d_coordinates → Преобразует пиксели в метры ↓ 5. visualize_trajectory → Создает визуализации ``` ## Результаты После выполнения пайплайна в `data/`: - **extract_video_frames.json** - метаданные видео - **detect_court_keypoints.json** - координаты углов корта - **detect_ball_positions.json** - позиции мяча в пикселях - **compute_2d_coordinates.json** - позиции мяча в метрах - **visualization.mp4** - видео с траекторией, кортом и координатами - **frames/** - извлеченные кадры - **ball_detections/** - кадры с найденным мячом - **court_detection_preview.jpg** - превью с найденными углами корта ## Структура проекта ``` pickle/ ├── dagster_project/ # Dagster пайплайн │ ├── assets/ # 5 asset'ов пайплайна │ └── io_managers/ # JSON IO manager ├── src/ # Основной код │ ├── ball_detector.py # YOLO детекция │ ├── court_calibrator.py # Калибровка корта │ ├── ball_tracker.py # Трекинг │ └── video_processor.py # Обработка видео ├── data/ # Результаты выполнения ├── DJI_0017.MP4 # Видео для обработки ├── docker-compose.yml └── Dockerfile ``` ## Конфигурация Параметры в `dagster_project/assets/`: - **video_extraction.py** - `start_sec=10`, `num_frames=100` - **ball_detection.py** - `confidence_threshold=0.3`, slicing 320x320 - **coordinate_transform.py** - корт 13.4м × 6.1м ## Модели - **Корт**: `ping-pong-paddle-ai-with-images/pickleball-court-p3chl-7tufp` (Roboflow) - **Мяч**: `pickleball-detection-1oqlw/1` (Roboflow) → fallback на YOLOv8n ## Требования - Docker & Docker Compose - 4GB+ RAM - Видео файл `DJI_0017.MP4` в корне проекта ## Docker команды ```bash # Билд и запуск docker-compose up --build -d # Логи docker-compose logs -f # Остановка docker-compose down # Выполнить пайплайн docker exec pickle-dagster dagster asset materialize --select '*' -m dagster_project # Выполнить один asset docker exec pickle-dagster dagster asset materialize --select 'detect_ball_positions' -m dagster_project ``` ## Dagster UI http://localhost:3000 Показывает: - Граф зависимостей между assets - Логи выполнения - История запусков - Метаданные результатов ## Формат данных **compute_2d_coordinates.json**: ```json [ { "frame": 6, "timestamp": 0.2, "pixel_x": 1234.5, "pixel_y": 678.9, "x_m": 5.67, "y_m": 2.34, "confidence": 0.85 } ] ``` ## Производительность - Извлечение кадров: ~1 сек - Детекция корта: ~1 сек - Детекция мяча: ~6 сек (100 кадров, ~15 FPS) - Трансформация координат: <1 сек - Визуализация: ~1 сек **Итого**: ~10 секунд на 100 кадров видео ## Стоимость **$0** - всё работает локально в Docker, без облачных API ## License MIT