Система на основе Computer Vision, позволяющая получать характеристики по видеозаписи игры в теннис двух игроков.
-
Подготовка файлов
- Загрузите свои веса моделей в папку
models - Поместите исходное видео в папку
input_videos
- Загрузите свои веса моделей в папку
-
Настройка параметров
- Отредактируйте файл
constants/__init__.py - Укажите рост игроков:
PLAYER_1_HEIGHT_METERS— рост ближайшего к камере игрокаPLAYER_2_HEIGHT_METERS— рост второго игрока (дальше от камеры)
- Отредактируйте файл
-
Запуск
main.py— получение характеристик без отрисовки bbox'ов и точек кортаmain_with_draw.py— тот же анализ, но с отладочной информацией
На выходном видео отображается:
- Мини-корт — в правом верхнем углу
- Табло со скоростями игроков — в правом нижнем углу
| Без отладки | С отладкой |
|---|---|
![]() |
![]() |
Система генерирует текстовый файл со следующими метриками:
- Количество ударов и подач каждого игрока
- Доли успешных подач каждого игрока
- Доли двойных ошибок при подачах
- Количество совершенных розыгрышей
- Среднее и максимальное число ударов за розыгрыш
- Длина пробега каждого игрока (в метрах)
- Средние и максимальные скорости игроков (км/ч)
- Видео горизонтального мини-корта и карта покрытия корта:
Мини-корт |
Карта покрытия корта |
| Задача | Модель |
|---|---|
| Детекция игроков и сетки | yolov8s |
| Детекция мяча | yolov26n |
| Детекция точек корта | yolo26s-pose |
Датасеты собраны на платформе Roboflow. Размечены кадры с любительских видео и профессиональных турниров с разных ракурсов, при разном освещении и в различных локациях.
Ссылки на датасеты:
Примечание: Последний датасет содержит 4 класса (сетка, игроки, мяч, ракетки), но количество кадров недостаточно для качественного обучения детекции мелких объектов (мяча и ракеток).
| Детекция мяча | Детекция игрока, сетки, мяча, ракетки |
|---|---|
|
|
Точки корта определяются только на первом кадре с помощью обученной модели YOLO. Реализована возможность их уточнения с помощью компьютерного зрения: в окрестности каждой предсказанной точки выполняется поиск пересечений белых линий разметки, что позволяет повысить точность позиционирования. Данный функционал требует дополнительной настройки параметров для оптимальной работы.
Важно: Модель детектирует только точки 0-13 включительно. Точки 14-18 вычисляются программно в процессе деления корта сеткой.
В случаях, когда корт частично выходит за пределы кадра, применяется специальная логика для восстановления недостающих точек:
Обозначения на рисунке:
🔴 Красные точки — исходные точки, вышедшие за границы кадра
🟢 Зеленые точки — восстановленные позиции точек
Алгоритм восстановления:
- Точки 2 и 3 получают координаты
(0, y_5)и(width, y_7)соответственно, гдеy_5,y_7— координаты точек 5 и 7 по оси ординат - Точки 14 и 15 определяются как первые "белые" пиксели при вертикальном сканировании вверх от восстановленных точек 2 и 3
Мяч представляет собой наиболее сложный объект для детекции ввиду своих особенностей:
- Малый размер объекта
- Высокая скорость перемещения
- Размытие при быстром движении
- Низкая различимость на некоторых кадрах
Примеры проблемных кадров:
| |
| |
Для обеспечения непрерывного трекинга применяется двухэтапный подход:
- Интерполяция пропусков — при отсутствии детекции мяча на кадре, его позиция восстанавливается на основе соседних кадров с детекцией
- Сглаживание траектории — для отображения на мини-корте применяется дополнительное сглаживание интерполированных позиций, что устраняет резкие скачки
В процессе анализа были выявлены две основные проблемы при трекинге игроков:
- Модель может детектировать более двух объектов как "игроков" (например, судей или зрителей);
- Игроки могут временно покидать кадр и возвращаться обратно.
Алгоритм определения игроков
-
Инициализация:
- Собираются все кандидаты в игроки;
- Выбираются 2 объекта, ближайших к точкам корта;
- Присваиваются ID: Игрок 1 — ближе к камере, Игрок 2 — дальше от камеры.
-
Поддержание трекинга:
- При обнаружении новых кандидатов, близких к точкам корта;
- Если один из игроков пропал с предыдущего кадра, новому кандидату присваивается ID пропавшего игрока.
Реализовано на основе правил (rule-based подход).
Важно: На данный момент учет конкретных зон корта не реализован.
Деление мини-корта происходит по точкам, без дополнительных расчетов. Все зоны с делением сеткой и без представлены ниже на Рисунке 2 и Рисунке 3.
Рисунок 3 — Схема корта до деления сеткой на зоны |
Рисунок 4 — Схема корта после деления сеткой на зоны |
- Обученная модель детектирует bounding box сетки на кадре
- Нижняя линия bbox'а принимается за линию сетки
- Линия сетки корректируется для параллельности другой линии корта (отрезок BC на Рисунке 5)
- Находятся пересечения линий зон с откорректированной линией сетки
При наклоне камеры возникает искажение, которое необходимо компенсировать:
Без коррекции линия сетки прошла бы по траектории HP, тогда как правильная линия — AP.














