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

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

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

  • не игра;

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

  • игра;

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

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

На основе опыта прошлой статьи в качестве детектора людей будем использовать 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.

Ссылки

Комментарии (14)


  1. softi
    14.02.2022 08:30
    +4

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


    1. Bromka
      14.02.2022 10:25

      из огромного и невнятного видео извлечь собственно розыгрыши и отбросить всякую скукоту.

      Ценность, видимо, в этом. Потому что в волейболе (по крайней мере не профессиональном) розыгрыши, наверное, занимают треть времени. Сходить и передать, подготовка к подаче и все такое.


      1. Stantin Автор
        14.02.2022 15:43

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

        Если вы хотите найти на видео себя или какой-то конкретный эпизод - только тотальная прокрутка.


        1. Bromka
          14.02.2022 17:38

          Попробую записать следующую тренировку и прогнать. Ракурсы имеют значение?


          1. Stantin Автор
            14.02.2022 19:26

            Да, камера должна быть позади корта


    1. Stantin Автор
      14.02.2022 15:26

      Достаточно же цифр было в статье: 80% при обучении, 70% при тесте, 8 и 20 розыгрышей из 29 распознано.

      Что вам не хватает?


  1. dimnsk
    14.02.2022 09:12

    mediapipe не тестировали ?


    1. Stantin Автор
      14.02.2022 15:29

      Нет, только сейчас узнал о его существовании


      1. dimnsk
        14.02.2022 15:33

        он на CPU достатчно шустро работает
        и + позы будет явно интерсно тоде анализировать


        1. Stantin Автор
          14.02.2022 15:45

          У него под капотом же все равно какие-то нейросети, можно работать с ними напрямую без посредников.


          1. dimnsk
            14.02.2022 16:30

            предобученные сетки да
            https://github.com/google/mediapipe


  1. molec
    14.02.2022 12:38
    +1

    Интересная задача, но правда кажется, что здесь приведена только первая половина статьи с постановкой и выбранным методом, но практически без результатов и метрик качества :) . Очень бы хотелось увидеть финальный продукт, начало классное! Есть несколько смущающих меня моментов, может и Вы найдете какие-то идеи для себя.

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

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

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

    В-четвертых, очень не хватает confusion matrix. Тот же переходный процесс от расстановки к игре и от игры к празднованию - очевидная проблема для классификации.

    Как мне видится процесс разметки данных. Пишем скриптик, который в очень замедленном режиме будет воспроизводить видео. Даем оператору возможность нажимать 4 кнопки: c n p s - каждая маркирует начало каждой стадии игры. Т.о. получаем таймлайн разметки игры. В последствии выдираем кадры из размеченной части датасета, при этом стараясь не нарываться на переходные от одной стадии к другой фрагменты. Имея размеченный по времени датасет мы можем в тч играться с подачей в модель серий кадров, менять алгоритмы постобработки и тп. Опять же, мы точно знаем, сколько человек должно быть на площадке. Это может нам сильно помочь с выбором threshhold’ а динамически, просто отбирать 12+1 фигур, похожих на человека в кадре, а не играться с линией отсечения.


    1. Stantin Автор
      14.02.2022 15:40
      +1

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

      Согласен, но статья про идею, а доводка займет в разы больше времени

       если на вход подавать не 1 кадр, а серию, например, из 3 кадров

      Вот над этим я как раз думаю, равно как и над применением posenet

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

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

       Опять же, мы точно знаем, сколько человек должно быть на площадке.

      Не факт. Во-первых, возможны ошибки детектора, плюс к этому в динамике люди часто перекрываются или заслоняют друг друга или смазываются, так что ошибки детектора иногда достаточно серьезны. Плюс к этому, волейболы бывают разные - 6x6, 3x3, 4x4, 2x2 и для начала надо понять в какой из них тут играют.


  1. Bromka
    16.02.2022 12:42

    -