Я уже довольно давно увлекаюсь аналитикой волейбола с помощью искуственного интеллекта. В основном мои усилия концентрировались на распознавании и треккинге мяча и производной информации.
В новом году я решил попробовать что-то новенькое и натравил на игру детектор людей. Цель все та же - из огромного и невнятного видео извлечь собственно розыгрыши и отбросить всякую скукоту.
Для этого нужно распознать людей и на основе их расстановки можно определить стадии игры:
не игра;
расстановка;
игра;
празднование.
Подготовка данных
На основе опыта прошлой статьи в качестве детектора людей будем использовать 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.
Ссылки
Комментарии (14)
molec
14.02.2022 12:38+1Интересная задача, но правда кажется, что здесь приведена только первая половина статьи с постановкой и выбранным методом, но практически без результатов и метрик качества :) . Очень бы хотелось увидеть финальный продукт, начало классное! Есть несколько смущающих меня моментов, может и Вы найдете какие-то идеи для себя.
Во-первых, хотелось бы обучать модель на одной игре, а валидировать на игре других команд, чтобы было по-честному.
Во-вторых, не знаю как Вам, но мне кажется, что спортивные сцены всегда по своей сути динамичны, поэтому классификатор может сильно лучше заработать, если на вход подавать не 1 кадр, а серию, например, из 3 кадров, вырванных с интервалом с несколько десятых секунды.
В-третьих, можно присмотреться к затратным сетям, описывающим постановку рук ног человека. С этой информацией классификатор должен справляться намного лучше, но и данные становятся сильно дороже. Опять же, от масок с большим количеством пустой информации можно перейти к более формальным данным, сильно снизив размерность задачи. Например, использовать координаты, ширину и высоту фигур людей, упорядоченных в каком-то определенном порядке.
В-четвертых, очень не хватает confusion matrix. Тот же переходный процесс от расстановки к игре и от игры к празднованию - очевидная проблема для классификации.
Как мне видится процесс разметки данных. Пишем скриптик, который в очень замедленном режиме будет воспроизводить видео. Даем оператору возможность нажимать 4 кнопки: c n p s - каждая маркирует начало каждой стадии игры. Т.о. получаем таймлайн разметки игры. В последствии выдираем кадры из размеченной части датасета, при этом стараясь не нарываться на переходные от одной стадии к другой фрагменты. Имея размеченный по времени датасет мы можем в тч играться с подачей в модель серий кадров, менять алгоритмы постобработки и тп. Опять же, мы точно знаем, сколько человек должно быть на площадке. Это может нам сильно помочь с выбором threshhold’ а динамически, просто отбирать 12+1 фигур, похожих на человека в кадре, а не играться с линией отсечения.
Stantin Автор
14.02.2022 15:40+1Во-первых, хотелось бы обучать модель на одной игре, а валидировать на игре других команд, чтобы было по-честному.
Согласен, но статья про идею, а доводка займет в разы больше времени
если на вход подавать не 1 кадр, а серию, например, из 3 кадров
Вот над этим я как раз думаю, равно как и над применением posenet
Например, использовать координаты, ширину и высоту фигур людей, упорядоченных в каком-то определенном порядке
Эту проблему я упоминал - стандартизировать выхлоп детектора - сама по себе интересная задача, опять же выходящая за рамки идеи-гипотезы.
Опять же, мы точно знаем, сколько человек должно быть на площадке.
Не факт. Во-первых, возможны ошибки детектора, плюс к этому в динамике люди часто перекрываются или заслоняют друг друга или смазываются, так что ошибки детектора иногда достаточно серьезны. Плюс к этому, волейболы бывают разные - 6x6, 3x3, 4x4, 2x2 и для начала надо понять в какой из них тут играют.
softi
Ничего не понятно, но очень интересно. Конкретных результатов так и не увидели в статье... (Мало кто пойдет сам в репозиторий качать, запускать скрипты). Видимо, результаты вышли настолько плохими, что в статье решили их даже не светить... Последний абзац вообще что-то неясное...
Bromka
из огромного и невнятного видео извлечь собственно розыгрыши и отбросить всякую скукоту.
Ценность, видимо, в этом. Потому что в волейболе (по крайней мере не профессиональном) розыгрыши, наверное, занимают треть времени. Сходить и передать, подготовка к подаче и все такое.
Stantin Автор
Да, монтаж видео - кропотливая работа и у любителей как правило нет ресурсов на это, они вываливают в сеть свои записи на 2 часа, из которых первые 10 минут люди ходят вокруг площадки.
Если вы хотите найти на видео себя или какой-то конкретный эпизод - только тотальная прокрутка.
Bromka
Попробую записать следующую тренировку и прогнать. Ракурсы имеют значение?
Stantin Автор
Да, камера должна быть позади корта
Stantin Автор
Достаточно же цифр было в статье: 80% при обучении, 70% при тесте, 8 и 20 розыгрышей из 29 распознано.
Что вам не хватает?