YOLOv8 и поиск мяча
Так сложилось, что я люблю играть в волейбол и активно снимаю свои игры и тренировки.
У любителей обычно стоит стационарная камера на штативе, которая захватывает всю площадку (или почти всю) в формате 16:9. При этом современные соцсети потребляют контент вертикально (9:16) и короткими роликами около минуты.
Задача: быстро делать вертикальные видео из любительских волейбольных съёмок.
Центральный объект внимания в волейболе — мяч. Значит, нужно определять начало розыгрыша и дальше уверенно следить за мячом. Если сопровождать мяч и делать кроп из 16:9 в 9:16 — получаем готовый вертикальный ролик.
При изучении темы детекции объектов почти сразу попадаешь на семейство YOLO. Отличные модели. В предобученных весах есть класс sport ball.
Но возникает проблема. Площадка 18×9 метров, диаметр мяча — 65–67 см. Чем дальше мяч от камеры, тем он меньше на изображении и тем хуже его определяет YOLO.
Человек легко отслеживает мяч даже на сложных кадрах, потому что видит движение и контекст последовательности. А при покадровой обработке YOLO часто «теряет» маленький объект.
На первом этапе мы попробовали superframe — три grayscale-кадра, записанные в RGB-каналы. Это позволило явно подсветить движущиеся объекты.
Такой подход заметно повысил точность детекции маленьких движущихся объектов.
TrackNetV4 и специализированные спортивные модели
Оказалось, что задачу уже хорошо решили до нас. Существует целая линейка моделей TrackNet (TrackNetX), специально созданных для отслеживания быстрых и мелких объектов в спорте (теннис, бадминтон, ).
TrackNet работает на основе тепловых карт (heatmap). Модель смотрит не на один кадр, а на последовательность (обычно 3 кадра) и предсказывает положение мяча с учётом траектории.
В TrackNetV4 добавили механизм внимания для движущихся объектов: github.com/TrackNetV4/TrackNetV4.
Существует два основных режима работы:
-
Один центральный кадр → одно предсказание — максимальная точность.
-
Три кадра → три предсказания — выше скорость.
vball-net — наша производительная модель под CPU
Как появилась модель vball-net ?
Мы взяли TrackNetV4 за основу и сильно модифицировали её под свои нужды.
Основные изменения:
-
На вход подаётся 9 grayscale-кадров вместо 3 RGB.
-
На выходе — 9 предсказаний (heatmap для каждого входного кадра).
Гипотезы, которые подтвердились:
-
Человек уверенно видит волейбольный мяч даже на чёрно-белом видео → нейросети тоже достаточно яркостной информации.
-
Волейбольный мяч значительно крупнее теннисного → можно радикально уменьшить модель.
Количество параметров
TrackNetV4 — 11.04 млн
vball-net — ~58k
Результат на Intel(R) Core(TM) i5-10400F CPU @ 2.90GHz — 80 fps ( на 1920х1080 видео)
Преимущества легких моделей
скорость работы 80+ fps на CPU
скорость обучение — 20к кадров — 8-10мин на эпоху для RTX3060 12GB. Модель на пик выходит примерно за 30 эпох (зависит от разера датасета)
Как результат мы можем дообучить модель практически на любой игровой видео карте
На старте автор проводил обучение на RTX 2060 6G ( 20 мин на эпоху)
Специфика датасета и дальнейшее улучшение
Все видео сняты с экшен-камер на 30 fps:
-
Xiaomi Mijia 4K Action (рыбий глаз)
-
DJI Action 2 (сильный «туннель» из-за коррекции дисторсии)
-
DJI Action 4 (аналогично)
Из-за сильных искажений и разных характеристик камер модель очень рекомендуется дообучать под конкретную камеру, зал и угол съёмки. Это даёт значительный прирост качества.
Создание вертикального видео
Создание видео выполняется в 3 прохода
1 этап — детекция мяча — получаем ball.csv файл с предсказаниями центра мяча
2 этап — строим треки мяча на основе координат и фильтруем ложные детекты
3 этап — для кокретрых треков создаем вертикальное видео
VIDEO="examples/gtu_20250316_002.mp4"MODEL="models/VballNetV1_seq9_grayscale_330_h288_w512.onnx"OUT="output"# 1) Detection -> ball.csvuv run src/inference_onnx_seq_gray_v2.py \ --video_path "$VIDEO" \ --model_path "$MODEL" \ --output_dir "$OUT" \ --only_csv# 2) Tracks from CSV -> track_*.jsonuv run src/track_calculator.py \ --csv_path "$OUT/gtu_20250316_002/ball.csv" \ --output_dir "$OUT"# 3) Vertical reels from tracksuv run src/make_reels.py \ --video_path "$VIDEO" \ --track_0026.json "$OUT/gtu_20250316_002/tracks/track_0028.json \ --output_dir "$OUT"
Привер reels/shorts можно посмотреть по ссылкам
Youtube https://youtube.com/shorts/26lpljOL9WU?feature=share
VK — https://vkvideo.ru/clip-55450327_456242219
github — инференса https://github.com/asigatchov/fast-volleyball-tracking-inference
ссылка на оригинал статьи https://habr.com/ru/articles/1035966/