Анализ стадий волейбольной игры с помощью искуственного интеллекта
Я уже довольно давно увлекаюсь аналитикой волейбола с помощью искуственного интеллекта. В основном мои усилия концентрировались на распознавании и треккинге мяча и производной информации.
В новом году я решил попробовать что-то новенькое и натравил на игру детектор людей. Цель все та же - из огромного и невнятного видео извлечь собственно розыгрыши и отбросить всякую скукоту.
Для этого нужно распознать людей и на основе их расстановки можно определить стадии игры:
не игра;
расстановка;
игра;
празднование.
Подготовка данных
На основе опыта прошлой статьи в качестве детектора людей будем использовать MobileSSD.
Детектор выдает множество прямоугольников - эти данные надо упаковать, чтобы подать на вход классификатору.
Сразу в голову приходят два способа представления данных - в числовом виде и картинкой. Я решил остановиться на картинках, потому что:
Количество детекций непредсказуемо, соотвественно разумный подход здесь - выбрать какую-то верхнюю границу (скажем, 20) и остальное забивать пустышками. Размер картинок фиксирован.
Выхлоп с детектора идет в непредсказуемом порядке, соотвественно, чтобы данные были похожи - прямоугольники надо сортировать (например слева-направо и снизу-вверх или по размеру) и быть готовым к тому, что какой-то нестабильный объект оказывается в середине и тогда вся последовательность съезжает - качество таких данных остается под вопросом. Стабильность картинки очевидна.
Human-friendly. Глядя на набор чисел, довольно сложно представить как это все будет выглядеть и что оно означает. С картинкой все понятно.
Если коллективный разум подскажет более эффективное решение - буду очень рад.
Вручную разложим кадры на 4 каталога:
cheer
noplay
play
stand
Прогоним, через детектор, отфильтруем детекции (обрасывая слишком большие и маленькие а также те, что на краях кадра, так как нас интересует только корт).
Дальше нарисуем белые прямоугольники на черном фоне и получим такие маски:
Обучение
Дальше выбираем реализацию классификатора. Методов классификации существует немало, для первого шага выберем самые базовые:
KNN обучается с точностью 81% на самих данных и 66% на случайной выборке. TF стабилизируется также примерно в районе 80%.
Тестирование
Проверим эти модели в деле.
Для примера возьмем запись игры из австрийской лиги, которую я использовал в одной из прошлых статей.
Извелекаем кадры из видео. Люди двигаются не очень быстро, поэтому будем считать, что двух кадров в секунду вполне достаточно.
ffmpeg -i video.mp4 -r 2 frames/%05d.jpg
Запускаем MobileSSD детектор и записываем выходные данные в json.
Генерируем маски-картинки из json.
При прогоне оба метода справились хуже, чем при обучении:
KNN - 72 %;
TF - 70 %.
Строим список розыгрышей на основе классифицированных расстановок.
Удивительно, но данные нейросети оказались гораздо более релевантными: на основе классификации KNN построил с допустимой погрешностью всего 8 розыгрышей из 29, а нейросеть - 20.