Привет, Хабр! Ещё до продажи Мосигры мы полезли в образование. Там оказалось чуть интереснее, чем могло показаться сначала, и на сегодня мы успели открыть 124 футбольных школы, киберспортивные секции, танцы, шахматы и всё такое. Карантин слегка подрезал нам работу до 70 активных точек. Тут надо сказать, что с учётом опыта розницы, в ДНК проекта сразу закладывали очень быструю масштабируемость, чтобы по возможности построить межгалактическую сеть дополнительного образования. А один из самых больших вопросов в такой ситуации — как контролировать качество этого самого образования.

Вот футбольные тренировки. С одной стороны, конечно, у нас есть методология, которая частично на базе испанской, а потом нам её очень сильно доработали умные дядьки в РГУФК. По идее, она даёт некий стандарт, как и чему тренеры будут учить детей, но этого мало. Каждый тренер — яркая индивидуальность. Это круто, но опасно: нужно как-то следить за прогрессом. Более того, это не только наша хотелка как организации, но и прямая хотелка родителей.

Родители в образовании обычно не чувствуют прогресса ребёнка. Есть, конечно, всякие турниры, отчётные концерты и годовые экзамены, но обратная связь длиной в полгода — плохой план. Мы решили, что нужно автоматически генерировать отчёты с каждой тренировки. И вот тут мы подходим к тому, что обычно делается руками для профессиональной футбольной команды — видеоаналитике действий игроков на поле. Садится человек и примерно за 50-100 долларов за час расшифровывает происходящее. Схема не масштабируемая: вот у нас в январе 2020 занималось 165 групп в среднем по 9 раз в месяц – это будет от 75 до 150 тысяч долларов в месяц.

Но, поскольку мы живём в веке свёрточных нейросеток, можно сделать всё с дешманской камерой (но всё же fullHD 30 FPS) прямо на школьной тренировке. И, более того, мы это уже сделали до стадии беты.




Поскольку история началась в бедном на события 2018-м, сначала мы рассматривали носимые устройства. Получилось обсудить варианты с руководителем отдела носимых устройств Интела. Спецы сказали, что для масштабирования лучше подходит видеоаналитика, которая на момент начала 2019 смотрелась ещё немного подозрительно, но уже уверенно завоёвывала рынок. Я не представляю себе квартал в Омске или где-то на задворках Рио-де-Жанейро, где дети берут браслеты или жилеты по 100-200 долларов и играют в них. Зато очень хорошо представляю, как они крепят телефон в углу дворовой площадки, чтобы потом получить много интересной аналитики.

Примеры носимых — жилеты Catapult PLAYR или браслеты за 20-25 долларов. Браслеты опираются на GPS, а мы тренируем в помещениях. Плюс устройства дают из-за этого самого GPS большую погрешность — тестовые профессиональный PLAYR, полупрофессиональный браслет и любительский Zepp после пробежки в 5 километров показали разброс в примерно 20%. И это на улице. Ставить опорную станцию в помещении точно вообще никто не будет из-за сложности и цены. Забегая вперёд, скажу, что граница проходит очень чётко: поставить камеру на стойку 3,5 метра уже большая проблема для тренера, а вот на 2,5 м (мобильная фотостойка) — уже вполне дело.

В общем, если хочется расти в сто или тысячу раз, то носимые устройства проигрывают видеопотоку. На этом этапе сразу же появился драфт технического задания, который мы показали трём разным подрядчикам в СНГ. Оказалось, в Омске есть очень хорошая компания ISS Art, но победила в нашем мини-тендере всё же Exposit из Гродно (РБ). Общая цель исследования была в том, чтобы понять, что можно вообще получить с одной камеры. Опять же, по результатам выяснилось, что камер всё же надо две, потому что иначе не получается нормально разбирать пересечения игроков и куча-малу на поле. Сейчас объясню. Теперь давайте перейду, собственно, к тому, как всё это работает.

Как всё это работает


Тренер берёт стойку и ставит на неё камеру. Сейчас высота между 2,5 и 3,5 метра.

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

Затем камера снимает матч. Тренер выгружает видеопоток на сервер и делает две важные вещи: размечает игроков и поле. На поле просто ставит координаты для привязки:



А вот с игроками интереснее. На первом этапе алгоритма на вход поступает единичный кадр видео, который пропускается через офигенную YOLOv4 (вот пост про неё), обученную на огромном датасете. Ёла умеет распознавать разные объекты 80 разных классов и рисовать вокруг них прямоугольники. Нам нужны люди, и их фигуры Ёла умеет искать быстро при достаточно высокой точности. Сразу скажу, что мы не дообучали сеть на отдельный подвид людей — футболистов-землян. Почему — чуть позже, но сделать это ещё предстоит. Проблем с точностью нет, если камера имеет как минимум FullHD-разрешение.



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



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

Вот так это примерно выглядит:



id,model,time,x,y
1,Player #1,1,720.6555699,116.3949013
1,Player #1,2,717.6837681,103.9404428
1,Player #1,3,699.1052595,58.58709532
1,Player #1,4,690.485308,33.3260856
1,Player #1,5,682.9340908,10.84806003
1,Player #1,6,674.9020647,-7.132002268
1,Player #1,7,676.235805,-6.452270864
1,Player #1,8,676.7274432,-6.460374907
1,Player #1,9,663.3592791,-29.10869212
1,Player #1,10,647.6801409,-52.19268234
1,Player #1,11,623.5022147,-90.13981343
1,Player #1,12,612.7593122,-109.9416432
1,Player #1,13,610.0347813,-108.9674604
1,Player #1,14,597.8952811,-121.5757764


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



Тут надо сказать, что эта часть алгоритмов трекинга (до коллизии) тоже уже хорошо отработана человечеством. В камерах есть следящий автофокус, который умеет примерно ловить нужные объекты и вести их, даже если это велосипедист, который скрывается за столбами. В камеры эти алгоритмы, кстати, перекочевали из железных самонаводящихся ракет, то есть вычислительной мощности там не очень много. Мы же используем пакет DeepSORT (вот прекрасный пост про него). Если игрок бежит по полю один и не отнимает мяч, эта связка работает почти идеально. На практике в среднем раз в 3-4 секунды игрок теряется, потому что происходит пересечение на поле.

В первой задумке мы находили игрока по номеру на майке и вели дальше отсюда и до забора. Но это не сработало. То есть Google Tesseract OCR отлично ищет цифры, но дети не всегда спиной, плюс часто используют манишки.

После пересечения нужна реидентификация игрока. В идеальном мире для этого нужно, чтобы все игроки имели какой-то свой отличительный признак, который видно с любого ракурса. Специалисты заметили, что сзади у игрока номер и фамилия на спине, а спереди — лицо на голове. Опять же, двадцать первый век, и быстро померить лицо по Бертильоновой системе — вообще не проблема. Мы теперь называем это «идентификация по лицу». На всякий напомню, что до появления фотографий было непонятно, как опознавать людей, поэтому им делали измерения вроде расстояния между зрачками и так далее, что подходило для идентификации, но не для аутентификации. С появлением первых серебряных фотопластин начали снимать, но преступники отчаянно сопротивлялись, корчили рожи и рыпались, что на выдержке около 30 минут вначале и 15 секунд уже на мокром процессе всё равно создавало море искажений. Тем не менее, технологии семнадцатого-восемнадцатого века отлично прижились в FaceID.

Но оказалось, что есть способ куда проще. Цветовая гистограмма игроков почти всегда разная. Как с 30-го ряда Лужников номер не видно, но можно опознать игрока по форме и цвету волос, комплекции и цвету кожи, так и у нас легко построить цветовой профиль и просто понять, кто и куда побежал после пересечения. Точнее, цветовая гистограмма позволяет создать и сравнить цветовой слепок игрока. А вот уже «человекочитаемые» комплекция, формы, поворот и прочие такие характеристики не играют роль в распознавании в алгоритме. Цвет волос, например, занимает слишком незначительную часть в итоговой гистограмме. Ещё цветовая гистограмма помогает группировать похожие визуально треки DeepSORT’а на основании общей цветовой палитры. Это дало трекинг длиной 10-12 секунд непрерывно. И это для детской тренировки, а не для матча «старшаков». В ситуации, когда на поле много агрессивно играющих людей, длительность трека куда ниже. Гистограмма служит поверхностным уровнем для DeepSORT'а, то есть обеспечивает контроль того, как отработала нейросеть. Ещё можно дополнять её последующей оценкой местом игрока на поле, поскольку те же защитники склонны играть ближе к своим воротам в среднем. Дальше планируем использовать обученную на размеченных данных Resnet для увеличения точности реидентификации.

Но 10-12 секунд — это всё равно мало, потому что сейчас эти коллизии разбирает тренер вручную после тренировки. Именно поэтому нужно две камеры: если получать поток с этой и с той стороны столкновения, то можно очень точно сказать, что же произошло. Связано это с тем, что игроки непрозрачные, иначе бы DeepSORT легко справлялся бы. В общем, сейчас поддержка второй камеры у нас только на уровне «она отвечает за другую часть поля», но дальше мы будем совмещать потоки, чтобы разбирать ситуации. Всё это планируется допилить к лету (но ничего конкретно не обещаю)

Вот нормальный трекинг, коллизия разобрана хорошо:



А вот проблема:



Собственно, если раньше тренер снимал каждого игрока для распознавания перед матчем, то теперь достаточно просто обозначить, где кто на стриме один раз, и ПО само разберётся.

Тут надо сказать пару слов про, собственно, Exposit. Начали они с того, что принимали участие в стартапе Wizart, который можно увидеть в Петровиче или Wallpops в США. Снимаете комнату, нейросети распознают полы, стены и кошку, и можно дальше «примерять» разную отделку. Второй крупный проект у них был с фотографией бумажной ЭКГ и поиском критичных диагнозов. То есть они сначала приводили из плохой фотографии ЭКГ к норме, а потом искали паттерны заболеваний. Точность была выше 80%, то есть алгоритм вполне пригодный для клинического применения (и это на очень маленьком датасете). Но ближе всего им была история с торговым центром в Гродно, где они переделали счётчики посетителей на видеоаналитике. Для начала – для теплокарт. Теплокарты, кстати, есть и в футболе, и часто содержат информацию о стиле игры. Вот пример.

Простите.

Тепловая карта «Интера» во втором тайме матча с «Удинезе»


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

Так вот. Если к лету у нас будет более-менее точный трекинг детей на футбольном поле, то мы получим инструмент контроля тренировок и игр. Более-менее точный — это если алгоритм будет терять ребёнка раз в 3 минуты, уже подходит для практического применения, но мы надеемся с кросс-камерного алгоритма получить качество выше. Ну и надо немного допилить интерфейсы, потому что тренеру должно быть удобно.

Сейчас уже выгружается вот такое:



Да, сам пакет поставляется в докер-образе, разворачивается в k8s-среде с S3 для видео и картинок нарезки. Видео сейчас обрабатывается со скоростью x3, то есть 10 минут видео обсчитывается со скоростью 30 минут на одной мощной виртуалке (GeForce GTX 1050 для YOLOv4 и DeepSORT, Intel Core i5-8300H 2.30Ghz (8 cores), ADATA SX6000LNP SSD). Очевидно, это тоже точка роста.

Много всё ещё зависит от камеры: сначала мы хотели использовать панорамные объективы с полем зрения почти 180 градусов, но сейчас смотрим в сторону 60-градусных (84-градусных) из-за падения качества и искажений при восстановлении до обычной картинки (нужно для привязки координат и распознавания).


SJCAM SJ4000 покрывает поле в две камеры с низкой опоры. Распознавание дальше 10 метров страдает, поэтому мы перешли сейчас к камерам с более узким полем зрения.


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

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

К чему всё это приведёт?


  • Во-первых, родитель будет видеть физический прогресс ребёнка. Речь про ту самую историю «бегает быстрее», например. Это прям победа-победа, потому что выросшее на RPG поколение будет наблюдать, как их дети качаются от занятия к занятию (на самом деле нет, надо выдавать рекорды и усреднения). И я представляю, какое горение разных мест такой подход сквозных метрик может вызвать в обычном образовательном процессе, да.
  • Во-вторых, есть статистика матча. Если вы когда-нибудь играли в лазертаг, то знаете, как в конце матча мотивирует получить статистику и процент попаданий. Дети смогут получать эту выгрузку в формате, позволяющем гордиться и хвастаться. Для этого ещё нужно трекать мяч. К счастью, он сильно отличается от всего на поле. К несчастью, он довольно вёрткий. Мяч мы пока не трогали, планируем летом.
  • В-третьих, можно выделять паттерны упражнений, что важно для проверки соответствия тренировки методологии (до таких детекторов ещё далеко, но это вполне реалистичный запрос). То есть можно проверять, делает ли тренер то, что нужно. В сочетании со статистикой, это открывает нам огромные возможности от АБ-тестов разных методологий тренировки до подбора оптимальных упражнений под конкретных людей и команды.
  • Где-то не сильно далеко от детекторов (но очень далеко от текущего состояния) маячит автовыгрузка 1-минутного клипа с лучшими моментами матча конкретного ребёнка для родителей.
  • Ну и статистика по прогрессу каждого игрока от матча к матчу в перспективе поменяет систему скаутинга про-игроков. Мы же ещё в прошлом году замахивались на быстрое развитие, и развились бы, если бы не пандемия.


В общем, просто знайте, что то, что ещё лет пять назад казалось космосом, сейчас можно сделать дёшево и сердито для тренера. Нам в «Метеоре», в отличие от профессиональных команд, не нужна 100% точная статистика, достаточно условных 90%, потому что это уже позволяет даже при игре во дворе получать внятную обратную связь очень быстро. Глядя на это всё, могу сказать, что потихонечку сбывается моя давняя мечта залезть в систему образования со здравым смыслом. Правда, пока до этого ещё далеко, и не факт, что прям точно получится. Но много чего точно можно заменить на скрипт )