Я уже довольно давно увлекаюсь аналитикой волейбола с помощью искуственного интеллекта. В основном мои усилия концентрировались на распознавании и треккинге мяча и производной информации.
В новом году я решил попробовать что-то новенькое и натравил на игру детектор людей. Цель все та же — из огромного и невнятного видео извлечь собственно розыгрыши и отбросить всякую скукоту.
Для этого нужно распознать людей и на основе их расстановки можно определить стадии игры:
-
не игра;
-
расстановка;
-
игра;
-
празднование.
Подготовка данных
На основе опыта прошлой статьи в качестве детектора людей будем использовать 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.
Ссылки
ссылка на оригинал статьи https://habr.com/ru/post/651325/
Добавить комментарий