Pull to refresh

Анализ стадий волейбольной игры с помощью искуственного интеллекта

Reading time2 min
Views3.7K

Я уже довольно давно увлекаюсь аналитикой волейбола с помощью искуственного интеллекта. В основном мои усилия концентрировались на распознавании и треккинге мяча и производной информации.

В новом году я решил попробовать что-то новенькое и натравил на игру детектор людей. Цель все та же - из огромного и невнятного видео извлечь собственно розыгрыши и отбросить всякую скукоту.

Для этого нужно распознать людей и на основе их расстановки можно определить стадии игры:

  • не игра;

  • расстановка;

  • игра;

  • празднование.

Подготовка данных

На основе опыта прошлой статьи в качестве детектора людей будем использовать MobileSSD.

Детектор выдает множество прямоугольников - эти данные надо упаковать, чтобы подать на вход классификатору.

Сразу в голову приходят два способа представления данных - в числовом виде и картинкой. Я решил остановиться на картинках, потому что:

  • Количество детекций непредсказуемо, соотвественно разумный подход здесь - выбрать какую-то верхнюю границу (скажем, 20) и остальное забивать пустышками. Размер картинок фиксирован.

  • Выхлоп с детектора идет в непредсказуемом порядке, соотвественно, чтобы данные были похожи - прямоугольники надо сортировать (например слева-направо и снизу-вверх или по размеру) и быть готовым к тому, что какой-то нестабильный объект оказывается в середине и тогда вся последовательность съезжает - качество таких данных остается под вопросом. Стабильность картинки очевидна.

  • Human-friendly. Глядя на набор чисел, довольно сложно представить как это все будет выглядеть и что оно означает. С картинкой все понятно.

Если коллективный разум подскажет более эффективное решение - буду очень рад.

Вручную разложим кадры на 4 каталога:

  • cheer

  • noplay

  • play

  • stand

Прогоним, через детектор, отфильтруем детекции (обрасывая слишком большие и маленькие а также те, что на краях кадра, так как нас интересует только корт).

Дальше нарисуем белые прямоугольники на черном фоне и получим такие маски:

Празднование
Празднование
Нет игры
Нет игры
Игра
Игра
Расстановка
Расстановка

Обучение

Дальше выбираем реализацию классификатора. Методов классификации существует немало, для первого шага выберем самые базовые:

KNN обучается с точностью 81% на самих данных и 66% на случайной выборке. TF стабилизируется также примерно в районе 80%.

Тестирование

Проверим эти модели в деле.

Для примера возьмем запись игры из австрийской лиги, которую я использовал в одной из прошлых статей.

  1. Извелекаем кадры из видео. Люди двигаются не очень быстро, поэтому будем считать, что двух кадров в секунду вполне достаточно.

ffmpeg -i video.mp4 -r 2 frames/%05d.jpg
  1. Запускаем MobileSSD детектор и записываем выходные данные в json.

  2. Генерируем маски-картинки из json.

  3. Прогоняем маски через классификатор.

При прогоне оба метода справились хуже, чем при обучении:

  • KNN - 72 %;

  • TF - 70 %.

  1. Строим список розыгрышей на основе классифицированных расстановок.

Удивительно, но данные нейросети оказались гораздо более релевантными: на основе классификации KNN построил с допустимой погрешностью всего 8 розыгрышей из 29, а нейросеть - 20.

Ссылки

Tags:
Hubs:
Total votes 6: ↑4 and ↓2+2
Comments14

Articles