Initial commit
This commit is contained in:
151
README.md
Normal file
151
README.md
Normal file
@@ -0,0 +1,151 @@
|
||||
# 🎾 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
|
||||
Reference in New Issue
Block a user