Определение траектории мяч в волейболе по видео - vball-net

Определение траектории мяч в волейболе по видео - vball-net

2026/03/09


  Небольшая история, как мы получили лёгкую сеть для детекции волейбольного мяча с производительностью 200+ fps на CPU (OpenVINO, i5-10400F)

Живое демо определения мяча
github fast-volleyball-tracking-inference

У меня есть хобби — игра в волейбол на любительском уровне.
Профессиональные команды имеют инструменты для анализа игры.
В конце 2024 года я в инстаграме увидел видео от BallTime.
Это отличный сервис для подробного видеоанализа.

Мне как IT-специалисту стало интересно, как можно реализовать хотя бы часть похожего функционала.

Поиск по теме показал, что есть работы других авторов:
https://medium.com/better-programming/volleyball-serve-detection-with-machine-learning-68288a7e68eb

Интересный подход — определение мяча через классификатор.
Самый простой и распространённый способ — использование YOLOv5/v8/v11 + ByteTrack.

Минус YOLO — волейбольный мяч маленький: на дальних планах ≈ 5×5 px при видео 1920×1080.
Сети YOLO плохо работают на маленьких объектах.
Можно использовать подход SAHI (когда кадр подаётся на детекцию по частям, а результат собирается в полноразмерный кадр).

TrackNet — сеть для поиска быстрых спортивных объектов

В результатах поиска мне попалась статья об использовании сети на базе U-Net архитектуры для отслеживания траектории воланчика в бадминтоне или теннисного мяча.

Преимущество TrackNet над YOLO — использование нескольких кадров видео.
Нейронная сеть получает временнýю информацию по трём кадрам. YOLO же работает с каждым кадром как с отдельной картинкой.

Ключевая особенность — используются несколько кадров.

Первые тесты я проводил с TrackNetV4 — tensorflow2.

Первая сложность, с которой столкнулся, — это датасет.
Одна из самых сложных задач — подготовка датасета для обучения.
Чтобы повторить чужой эксперимент, нужен датасет.
Если ваши данные отличаются от тех, на которых обучалась сеть, результат будет намного хуже.

При обучении начальных моделей на бытовой видеокарте RTX 3060
на моих данных (~20 000 кадров) одна эпоха занимала 50 минут.
Неделя разметки — и я получил свой датасет под любительские Action Cam:

https://volleyball-orel.ru/static/system/docs/data202507112330.tgz

Для аннотации мяча использовался скрипт на Python (cv2):
https://github.com/asigatchov/vball-net-pytorch/blob/main/src/utils/imgLabel.py

/media/photos/img1.jpg

Как TrackNet превращается в vball-net

Когда я запустил первый inference, скорость работы оказалась ниже заявленной в статьях.
Мне требовалась гораздо большая производительность именно на CPU (и на GPU тоже).

TrackNetV4:
- input — 3 кадра (9 каналов на вход)
- output — 3 heatmap’а (3 канала)

Ускорение vball-net

Как можно ускорить обработку?

  • уменьшить объём данных → делаем кадры чёрно-белыми
  • увеличить количество кадров за один проход

Сеть уже обрабатывала 9 каналов → подаём 9 grayscale-кадров.
Меняем модель так, чтобы на выходе было 9 heatmap’ов.

/media/photos/img2.jpg

Второй хак для повышения производительности — обработка каждого кадра ровно один раз.
Мы каждый раз подаём на вход 9 новых кадров. Это позволяет ускорить обработку (по сравнению со скользящим окном) примерно в 9 раз.

Скользящее окно: центральный кадр — основной, остальные (1–4 и 6–9) — вспомогательные.

Экспериментально уменьшаем количество слоёв в модели и оцениваем соотношение точность / скорость.

Результаты первых экспериментов:

vball-net tensorflow2
vball-net pytorch