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

Футбол (футбол в США) - один из самых популярных видов спорта во всем мире, и он способен привлечь внимание миллионов энтузиастов к одной игре в высших лигах: миллионы (x2) глаз Зациклен на тех же изображениях, на которых 22 игрока борются за владение мячом.

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

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

Также не забудьте взглянуть на работу моего друга @matteoronchetti, с которым я работал на протяжении всего этого веселого и сложного проекта!

Эта проблема

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

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

Подход

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

Мы придумали такое разделение:

  • Система отсчета и оценка гомографии (как спроецировать положение игроков из камеры в 2D-плоскость).
  • Обнаружение объектов (то есть, что и где находятся игроки / мяч / судья).
  • Отслеживание объектов (то есть как отслеживать объекты во фреймах).
  • Идентификация игрока (то есть как распознать игроков по кадрам).
  • Признание команды (как определить, за какую команду играет игрок).

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

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

А затем мы просто повторяем кадр за кадром до конца видео. На этом этапе у нас есть фаза, которую мы назвали сглаживанием, в которой мы, по сути, даем себе возможность оглянуться на все знания, которые мы извлекли на данный момент, кадр за кадром, и мы «делаем обратные корректировки» в чтобы сделать траектории и обнаружения более согласованными на протяжении всей последовательности.

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

Обнаружение объекта

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

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

Да, в наборе данных COCO (на котором обучается YOLO) есть класс только для футбольных мячей на случай, если вам интересно.

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

Справочная система

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

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

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

Слежение за объектами

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

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

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

После этого простая логика отслеживания определяет жизненный цикл отслеживаемых объектов (активный / неактивный) и обеспечивает обновление состояний Калмана с помощью наблюдений.

Идентификация игрока

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

Мы обучили CNN распознавать числа, которые вы видите на обратной стороне майки, с довольно хорошей точностью и допуском перекоса, дополнив популярный набор данных Street View House Numbers (SVHN). Как мы уже упоминали выше, найти достойные и доступные изображения футбольных матчей с ярлыками оказалось слишком сложно. Вот почему нам пришлось проявить творческий подход, и мы считаем, что это довольно хороший пример адаптации прикладной предметной области.

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

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

Признание команды

У вас есть две команды, состоящие из игроков в одной футболке (плюс судья) на поле: мне кажется, это идеальная установка для использования старого доброго алгоритма K-средних.

Вы можете пойти на что-то более интересное и перевести все в спектральную область, но все же вы можете получить хорошие результаты, кластеризовав 2 команды в цветовом пространстве HSV, используя ограничивающие прямоугольники игроков и завершая все с помощью tf-idf weighting , чтобы отфильтровать зеленый цвет поля из каждого ограничивающего прямоугольника.

P.S: судья может быть обнаружен как особый "выброс" в одном из 2 групп команд, применяя любую технику обнаружения выбросов. Например, DBSCAN дал хорошие результаты.

Результат

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

Если у вас возникнут какие-либо предложения, вопросы или просто поболтать, не стесняйтесь обращаться ко мне по адресу [email protected] или @nick_lucche в Twitter.

Спасибо за чтение и удачи на поле!