Распознавание подачи в волейболе с помощью машинного обучения

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Введение

Развитие искусственного интеллекта сейчас переживает бурный рост, и сфера его применения постоянно расширяется, проникая в области, ранее никак не связанные с ИТ.

Хорошим примером такой экспансии является спорт.

Не так давно появился термин Sport tech и количество проектов значительно выросло за последние несколько лет.

Волейбол - перспективное направление в спортивной аналитике. Один из самых массовых видов спорта, распространен в очень многих странах.

Итак, у нас есть видеозапись волейбольной игры. С какой целью она обычно делается? Возможно, чтобы показать друзьям или пересматривать лучшие моменты долгими зимними вечерами. Но наверное, в сыром виде, запись не очень годится для этого. Ведь скорее всего, первые минут десять игроки будут переодеваться и разминаться, а после каждого розыгрыша будет проходить минута-другая, пока кто-то сбегает за мячом.

В общем, мы подходим к очевидной цели - избавиться от всего скучного и оставить только самое интересное.  Ок, стратегия ясна, переходим к тактике.

Для стороннего зрителя (которым конечно является искуственный интеллект) есть несколько маркеров для привлечения внимания: игроки, мяч, судья, табло. Любой из этих объяектов может быть подвергнут аналитике. Но сегодня мы поговорим о мяче.

Связь зрительского интереса и мяча вполне очевидна: мяч летает - мы смотрим. Нет мяча - некуда смотреть. В общем, понятно, что нам надо вырезать все кадры, где мяч не летает и тогда это можно будет смотреть без зевоты.

Распознавание и треккинг мяча

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

Алгоритм распознавал мяч в воздухе, и если объект наблюдения терялся на 5 секунд - розыгрыш считался законченным и новый розыгрыш отсчитывался с того момента, как мяч снова будет замечен в воздухе.

Кое-что получилось, много воды было отфильтровано, но нашлись и недостатки:

  • Оказалось, что мяч часто движется вне игрового процесса. Бросить мяч партнеру, постучать о землю, размяться в перерыве - это все считается. Но оно не интересно.

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

  • Сбои в распознавании, это отдельная тема

Так мы подходим к тому, что в дополнение к тому, чтобы увидеть мяч, надо бы как-то понять, что происходит и использовать это в своих целях.

Распознавание траекторий

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

В целом, подача дает нам массу информации: 

  • Однозначно разделяет розыгрыши

  • Показывает, кто выиграл в прошлый раз

  • Ее отсутствие намекает, что это скорее всего не игровой фрагмент

В общем, хорошо бы уметь распознавать подачу. А пока что мы имеем массу каких-то траекторий. 

Волейбол - бесконечно многообразная игра, а снимать ее на камеру можно еще более разнообразными способами.

В мире самый популярный подход - ставить камеру позади корта. У России особый путь и большинство видео снято камерой сбоку (правда в свежих видео наметилась тенденция к глобализму). Иногда встречаются варианты - камера свеху или в одном из углов площадки. 

Беда в том, что траектория, которая в одном ракусе является подачей с дальней стороны, в другом может быть аккуратным приемом справа от сетки и случайным отскоком .

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

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

Технические подробности

Положим, что волейбольная траектория может быть одним из 6-ти вариантов:

  • Подача с ближней стороны

  • Подача с дальней стороны

  • Прием/пас

  • Атака

  • Отброс (неигровая передача)

  • Неправильная траектория (такое бывает)

На самом деле, вариантов можно придумать намного больше, но поскольку нас волнует именно подача, то остальное не так уж принципиально.

Между собой классы траекторий могут отличаться по размаху, скорости движения мяча, крутизне параболы, много чего можно еще придумать. Чтобы не городить вручную цепочки условий, можно переложить эту работу на компьютер. 

Перед нами задача классификации - одно из основных применений машинного обучения.

Возникает вопрос, в каком виде передавать данные траекторий на классификацию. Есть несколько вариантов:

  • Рисовать картинки траекторий

  • Брать из траекторий фиксированное количество точек

  • Вытянуть какие-либо признаки (например: скорость, размер мяча, крутизна параболы)

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

Про муки выбора признаков можно написать отдельную статью, это в целом открытый вопрос и бескрайнее поле для экспериментов. В лоб  получилось ~70% успехов, однако если обучать сеть на похожих играх, то результат вырастает до 80% процентов.

На Гитхаб я выложил одну из ранних версий датасета, там же происходит подбор классификатора посредством lazypredict:

Random Forest оказался в лидерах, хотя изначально я планировал использовать модный LGBM. В дальнейшем я еще сравнивал RF с KNN и SVM, но оба не выдержали конкуренции - KNN сразу показал низкий процент, SVM держался дольше, но в итоге тоже провалился.

Дальйшее обучение и тестирование происходило только через RF, вопрос был в количестве эстиматоров, но после 50 показатели перестали прогрессировать.

По итогу, 70-80% конечно мало, но есть перспертива для улучшений путем более глубокой проработки признаков. Мотивация высока, так как распознавание подачи - это важный и может даже ключевой шаг в направлении понимания игровых ситуаций, без которого дальшейшая аналитика выглядит весьма неопределенно.

Применение классификатора в реальной игре

Дальше только про волейбол.

Наилучшие результаты можно получить, если обучить классификатор на эталонной игре и проверить на похожей - с теми же настройками камеры и уровнем игроков. Уровень имеет значение - между любителями на пляже и финалом Олимпиады будет большая разница в траекториях - во втором случае подач и ударов не видно, резкие передачи - почти ничего общего.

Конечно, в классификации случаются ошибки. 

Ошибки первого рода (когда подача не распознается), могут быть выправлены с помощью определенного натягивания совы на глобус. Как правило, подача присутствует среди кандидатов, но ее оценка проигрывает другому типу траектории. В этом случае помогает поиск траектории с максимальной оценкой по классам подач.

С ошибками второго рода (когда подачей признается другая траектория) ситуация хуже. Можно было бы выбрать опять траекторию с максимальной оценкой по классам, но проблема в том, что в один розыгрыш могут попасть сразу несколько настоящих подач (частая ситуация на смонтированном видео, где паузы между розыгрышами уже вырезаны). Такую ситуацию сложно отличить от ложнотрицательного результата, так пауза между траекториями может быть вызвана как паузой в игре, так и провалом в распознавании мяча. Тут есть еще над чем поработать.

Для примера посмотрим на игру пляжниц от 2020 года Бочарова/Воронина - Мотрич/Шалаевская - хорошее качество, удачный ракурс и счет на экране (последнее быстро потеряло смысл, так как игроки периодически меняются сторонами).

В начале интересный факт - первые два розыгрыша прикрыты заставкой, но это не помешало алгоритму их разобрать и правильно распознать подачу:

Счет, как уже говорилось, не отражает реальной ситуации из-за смены сторон, но все равно способен дать какую-то информацию для сверки: например, согласно табло в  последнем розыгрыше, в игре было две партии, которые закончились со счетом 21:15, 21:13, то есть в игре было 60 розыгрышей.

Алгоритм нашел 58 розыгрышей, при этом обнаружил несколько подозрительных моментов, где было подач не было обнаружено или оказалось больше одной (но критерии не дотянули до того, чтобы их порезать):

В целом - неплохо, но можно еще улучшить.

В плане оптимизации видео - 40 минут видеозаписи превратились в 15 игровых.

Если кому интересны сами розыгрыши - они здесь.

Ссылки

  • Статья о распознавании мяча

  • Гитхаб с выбором классификатора

  • Оригинальная игра из примера

  • Дайджест игры после автоматической обработки

  • Детали аналитики по этой игре

Источник: https://habr.com/ru/post/723942/


Интересные статьи

Интересные статьи

Каждое дополнительное действие, выполняемое во время оформления заказа, снижает вероятность того, что клиент совершит покупку. Средний показатель отказа от корзины равен 70% — значительная потеря поте...
Мы, команда NtechLab, постараемся понятным языком рассказать, из чего на самом деле состоят самые современные алгоритмы распознавания лиц, с которыми каждый из нас сталкивается в повседневной жизни, п...
Инженерная цель данного эксперимента заключалась в разработке системы из трёх частей, а именно модели сегментации изображения, скрипта управления двигателем и спринклера,...
В мире инженерного образования существует много отличных курсов, но зачастую программа обучения, построенная на них, обладает одним серьезным недостатком — отсутствием хорошей связности между раз...
Давайте немного поговорим о том, как мы обрабатываем ошибки. В JavaScript у нас есть встроенная функция языка для работы с исключениями. Проблемный код мы заключаем в конструкцию try...catch. Это...