habrahabr

Футбольная аналитика: что поменялось за 2 года

  • понедельник, 9 октября 2023 г. в 00:00:19
https://habr.com/ru/companies/orbita/articles/764714/
Пару лет назад я рассказывал, как мы трекаем движения игроков на поле, что помогает очень круто оцифровать тренировки детей (в наших футбольных школах). Потом оказалось, что это нужно футбольным клубам по всему миру. Но там классическая засада — мы дошли до определённого предела точности и остановились. А дальше последовал мир дивных открытий, отчасти связанный с ночной лигой Лондона, которая играет, внезапно, вечером. Ну и потому что наш софт начали тестить в большом футболе, и им зашло.

Принцип такой:
  1. Берём кадр видео и Ёлу, она размечает все объекты (игроков, зрителей, мяч, ворота и так далее), затем мы отсеиваем птичек, зрителей и судей и оставляем только значимые объекты.
  2. Делаем так для каждого кадра видео.
  3. Затем привязываем координаты игроков к плоскости поля и получаем положение каждого объекта с точностью до 0,5 метра.
  4. Пытаемся связать игрока из первого кадра с максимально близким (или похожим) объектом во втором кадре и так далее, то есть оттрекать каждого конкретного человека, чтобы можно было видеть их движение по полю весь матч.
  5. Пытаемся понять, что с мячом: кто-то им владеет, он летит и где он вообще.

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

Чтобы вы понимали глубину проблемы, покажу вот этого архангела:



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

Давайте сначала перечислю проблемы, а потом расскажу, что мы с этим делали (или не делали).


Мяч летает


Это проблема. Почему — потому что при съёмке с одной камеры у него нет координат на поле. Точнее, они непонятны. Мы перекладываем двухмерный видеопоток на двухмерное поле не учитывая высоту. Потому что футболисты, в отличие от мяча, летают только незначительную часть матча (например во время «удара ножницами»), и потому всегда находятся достоверно близко к поверхности поля. А вот мяч, находящийся в полёте, может быть где угодно в своей проекции. Разрешения и оптической способности камеры недостаточно, чтобы понять, насколько он удалён от точки съёмки, то есть у него нет «глубины». В итоге впрямую понимать координаты мяча в полёте не получается.

Что можно сделать:
  • Снимать со второй камеры, тогда будет понятно, где мяч. Но поскольку мы пришли к истории с одной камерой, это сложно.
  • Анализировать его тень. Затруднительно, игры проходят в условиях от сумрака до яркого полудня и освещения на 4-16 теней. Задача выглядит сложнее, чем ожидаемая выгода от неё.
  • Анализировать скорость. Если мяч движется слишком быстро, скорее всего, он летит. Дальше можно анализировать точку начала (низкая скорость перед высокой) и точку конца (низкая скорость после высокой) и аналитически восстанавливать координаты между ними. Ещё хорошую наводку даёт кривизна траектории. Судя по всему, нам нужен именно этот вариант.



Это реальная съёмка с Кипра и к выделенному игроку слева летит мяч. Он длинный, это нормально. Последнее, что мы точно знаем про мяч — что он был у игрока справа в рамке, а теперь у игрока слева в рамке. Наверное, он телепортировался туда не сам, а был пас, поэтому мы строим аналитическое событие «пас своему игроку».

Футболисты пересекаются


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


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


Этот тип с потерянным треком — вообще не человек, а судья


Вот очень тривиальный случай пересечения

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

Что можно сделать:
  1. Снимать со второй камеры. Мы попробовали с 4 камер, всё равно разбирать очень сложно. Да, каждая следующая камера даёт больше данных, но это же повышает сложность задачи. Похоже, что это решение на перспективу.
  2. Поднимать камеру. Чем выше камера, тем меньше полных перекрытий. Сейчас камеры ставятся на палки высотой 5 – 8 метров, и это отлично позволяет решать большую часть ситуаций с парами игроков. В кучах это не помогает. Поднимать камеру выше тоже можно: с дрона, висящего ровно над полем треки отлично отслеживаются. В момент, когда мы только начинали, подходящих дешёвых дронов не было, и клубы не были готовы заморачиваться. Сейчас есть доступные дроны, которые спокойно висят 45 минут в ветер, но клубы ещё не готовы заморачиваться их запуском и задаваться вопросами о том, что будет, если они упадут на футболиста или их собьют мячом. Идеально смотрелась бы камера на крыше стадиона, но много где играют на открытом воздухе. Сейчас мы чаще всего используем коробки, где стоит несколько физических камер (они объединяются в одну логическую панорамную сшивкой на уровне прошивки устройства) — для них идеально решение по центру поля на крыше стадиона или центральной мачте. Альтернатива — две камеры на противоположных мачтах. Мы тестировали такую конфигурацию, но прямо сейчас идем по первому варианту в силу того, что сначала надо доказать, что это вообще работает. Ещё мы будем предлагать эксперименты с дронами некоторым клубам.
  3. Разрабатывать аналитические детекторы, позволяющие точнее разбирать, кто и куда побежал после столкновения. Это был наш первый путь, когда каждому игроку в соответствие ставилась его индивидуальная цветовая гистограмма. Но в Метеоре с детьми это отлично работало, потому что дети цветные и разные. В профессиональном спорте точность решения резко упала, потому что профессиональные футболисты в большинстве окрашены одинаково, имеют одинаковые причёски и до кучи одинакового роста. Номер, который на них написан, немного помогает, но его распознавание тоже не всегда возможно корректно. Особенно, если учесть, что игрок на дальнем конце поля — это набор из всего нескольких цветных точек. Итог — тут нужен оркестр моделей с аналитикой движения, распознаванием номера и т.п.
  4. Размечать вручную. Сейчас мы сделали удобный интерфейс, который позволяет быстро показать софту, куда кто побежал в случае непоняток.



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

Камеры отстой


Мы начинали с идеи, что это будут эквадорские дети с самсунгом на палке или омская дворовая команда с айфоном на удочке. Разница в том, что и дорогие айфоны, и телефоны подешевле на удочках отлично справляются с двором, где самый толстый всегда вратарь — и плохо с матчем 11х11. Когда поле имеет ширину 100 метров, глазами уже не видно, что и где происходит полностью. Телефону, внезапно, тоже.

А довольно быстро выяснилось, что наш основной рынок — это всё же профессиональный спорт, но не тот, что ездит на ЧМ по футболу, а лиги уровнем чуть ниже, команды академий и так далее. Как в «Теде Лассо», условно. Они почему-то играют именно 11х11.

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


Часть поля

У нас есть клиент в Бразилии, они пишут все свои матчи и тренировки на GoPro. Есть ещё пара клиентов с профессиональными камерами, а у остальных зоопарк систем между GoPro и камерами ЧМ по футболу.

Проблема в низком эффективном разрешении камер.

Дело вот в чём. Есть фактическое разрешение, где точка — это цветочувствительный элемент матрицы. Если это не честный сенсор, то вообще-то там блоки по 4 сенсора BGRG, которые дальше математически восстанавливаются до 4 RGB-точек. Ок, с этим можно жить. Следующий уровень усложнения — дифракционный предел. Уменьшать матрицу бесконечно невозможно, чем меньше проецируемая картинка, тем хуже различаются детали чисто в силу физических ограничений распространения света. Следующий уровень — искажения объектива. Речь про то, что для компенсации кривой геометрии (а она почти всегда кривая из-за линз не в центральной части кадра), нужно либо применять алгоритмы восстановления, либо просто жить с этим. В итоге на футболиста на краю поля с GoPro может приходиться 4-6 эффективных пикселей. Живите с этим.

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

Смысл нашего решения — снимать поле целиком. Потому что нам нужно знать, что происходит везде на поле, и это суперзначимые данные. Что делали игроки, пока были не в кадре? Правильно ли двигались? Сколько они пробежали в итоге за матч? Как реагировали защитники на отбор мяча в атаке? Что делал вратарь всё это время?

В итоге нам нужна камера, снимающая всё поле. И здесь мы упёрлись в возможности этих самых камер.

Как это ни странно, примерно в тот момент, когда мы поняли, чем и как снимают клубы свои игры, на нас вышли производители камер, которые снимают всё поле. Точнее, всё чуть сложнее. Сначала Динамо Загреб прислали нам свои почти идеальные съёмки, а потом мы поговорили с компанией из метаданных, и они нас уже состыковали. Камеры вот такие:


Pixellot S3, вот обзор

Как видите, там несколько объективов, а прошивка камеры затем сшивает всё в одну бесшовную картинку. Получается вот так:



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

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



Вот ночью (привет, шум) в условиях странного света хорошая камера даёт качество, достаточно, чтобы почти всё время трекать почти всех игроков. На фото — один из стоп-кадров, где синие тренеры не покрыты осознанно, а вот белого игрока Ёла упустила, зато увидела мяч.

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


Добро пожаловать в реальный мир

Где мы сейчас


Есть микросервисная архитектура-конструктор, где есть вот такие шаги:

1. Загрузка видео — тут всё понятно, получить видеофайл, получить в интерфейсы координаты краёв поля.

2. Детекция всех объектов. На игроках качество около 98%. В целом, там важно не то, как точно бокс захватит игрока, а то, что этот бокс вообще будет. Полметра погрешности не сильно сказываются на итоговой статистике по тому же кардио, например. Важнее покрытие времени нахождения игрока. Эти детекторы хорошо работают «из коробки», тут Ёла. Нам пришлось дообучить немного на зелёных игроках, потому что зелёных пешеходов в мире мало. Это было ещё пару лет назад, с тех пор детекторы стали качественнее, и справляются с людьми из коробки. В целом, важно что если можно различить игрока глазом, то можно и в детекторе. Другое дело, что глазом не всегда. Чтобы это понять, достаточно размечать реальные матчи вручную и увидеть, что какой бы хорошей ни была камера, довольно сложно следить за объектами. Они тяжело двигаются и очень слабо различимы. Одинаковая форма и удалённость дополнительно усложняют задачу.

3. Автоматизированное склеивание треков игроков, где очевидно движение из кадра в кадр. Эта часть — NorFair. Это простой эвристический трекер, который доходит до коллизии и останавливается. Он основан на интуитивном предположении, что игроки не умеют телепортироваться и ускоряются и замедляются как люди (или физические объекты с массой и другими параметрами человека). Да, игроки иногда всё же телепортируются (привет, FPS и видеопоток камер), но тогда трекер просто ставит разрыв и дальше передаёт в следующий модуль.

4. Во всех спорных моментах перескока треков треки разрываются и уезжают в специальный интерфейс, где человек проверяет, что игроки правильно склеились. Если надо, обозначает склейку. Ручная операция занимает от 3 до 10 секунд. Увы и ах, но на 5 минут игры приходится от 300 до 1500 спорных пересечений. То, что не получается разобрать автоматически, уезжает человеку. Нейросетевые решения, которые мы использовали, давали большой процент ошибки. Тут машина будет замещать человека всё сильнее и сильнее.




В общей сложности сейчас нужно сделать 4 тысячи треков на матч без овертайма — это примерно 11 человекочасов работы. Этот модуль склейки треков нуждается в улучшении, и это следующая цель автоматизации.

5. Считается процент покрытия. У нас обычно от 80 до 90% покрытия, то есть в конце матча мы отслеживаем 80-90% времени каждого игрока. Поменять там можно пару вещей камерой получше (для тех, у кого GoPro, потому что мы физически не видим, что там за игрок бегает на краю объектива в принципе) и парой аналитических надстроек.

6. Достроить треки мяча. Где-то вручную, где-то перестать трекать бутсу (они похожи), где-то ещё кое-что поправить.

7. Автоматизировано определить события. Например, пас, отбор. Где достоверность определения низкая, спросить оператора через интерфейс, что случилось. Пасы хорошо автоматизируются, а вот отборы и прочие сложные события пока лучше руками. Мы просто считаем, что такое владение, пасы, удары чуть ли не пофреймово, обычно главный источник данных — лесенка из IF’ов. Например, кто ближе к мячу — у того и владение. Если потом мячом стал владеть другой игрок, значит, это был пас.

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






Хайлайт паса

Что происходило всё это время


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

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

То есть мы:
  1. Вернулись к проекту (точнее, перешли из вялотекущего режима в активный).
  2. Разбили весь конвейер на модули.
  3. В каждом модуле доказываем, что можно сделать автоматизировано и повышаем качество.
  4. Больше всего проблем в модуле со склеиванием треков, сейчас аналитика там занимает плюс-минус столько же времени, сколько ручная аналитика матча. Но, во-первых, он потенциально автоматизируется, во-вторых, у нас получается качественно другой набор выходных данных — на всю стратегическую картину, а не вокруг мяча.

Футбольным клубам мы поставляем уже готовую аналитику, ручная разметка на нашей стороне. Плюс есть очень хорошо настраиваемые хайлайты как раз по событиям аналитики. Насколько мы знаем, клубы используют это не для соцсетей (с тренировок это было бы странно делать), а собирают методом Ctrl+F и отправляют игроку, который спросил, почему он последний матч сидел на лавке. Говорят, экономит много времени тренера.

То есть дальше вопрос — как мы удешевим процесс.

Сейчас играет ночная лига Лондона (это один из самых сложных наборов по камерам), каждую тренировку трекает Академия Динамо из Загреба и так далее — Pafos с Кипра, Акрон из Тольятти, наша школа Метеор и наша ЛФЛ-команда. С остальными NDA, простите.

UPD: Спасибо всем, кто стучит в личку с конкретными предложениями и идеями. Если нужно сырое видео посмотреть или поэкспериментировать — вот.