Рубрики
Без рубрики

Путешествие по созданию баскетбольной мини-карты

Одной из конкретных целей в баскетбольном процессе Analytics Analytics Analytics является MI … Теги с Python, MachineLearning.

Одной конкретной целью проекта Analytics Analytics Analytics Analytics Analytics – предоставить мини-карту игроков. В основном вид сверху вниз с разными игроками, представленными в виде цветных кругов.

В конце концов мы могли также нарисовать движение игроков на 2D-вид, чтобы обнаружить шаблоны баскетбольных игр.

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

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

Я сделал две эксперименты с камерой, где камера расположена в углу, а другая, где она находится в середине (как показано на рисунках ниже).

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

Читайте также мою статью о том, как Запишите баскетбольную игру в бюджете

С маскими моделями R-CNN вы можете легко идентифицировать объекты на изображении. # Йоло

Я играл с Yolo на прошлой неделе, но хотел экспериментировать с Детектин2 (работает от Pytorch). Это проект с открытым исходным кодом из Facebook, он реализует современные алгоритмы обнаружения объектов. Удивительно, что он может обнаружить, давайте посмотрим.

Смешная достаточная использованная модель считает, что правый баскетбольный обруч представляет собой телевизор с вероятностью 56%. Он также правильно нашел стул с вероятностью 61%.

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

Coco Panoptic Сегментация Модель обнаруживает потолок, стены и пол и цветов их соответственно. Это будет очень интересный вклад для обнаружения суда, потому что теперь мы можем ограничить «поиск» на этаже Polygon.

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

Восстановление положения каждого игрока осуществляется с помощью следующего кода Python.

Метод defaultpredictor.predictor возвращает список координат прямоугольника (pred_boxes) каждого идентифицированного объекта. Классы объектов хранятся в PRED_Classes, где объекты человека помечены как 0.

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

pts_src = np.array([
    [1, 258],       # left bottom - bottom corner
    [400, 308],     # middle bottom corner
    [798, 280],     # right bottom - bottom corner
    [798, 220],     # right bottom - top corner
    [612, 176],     # top right rorner
    [186, 168],     # top left corner
    [3, 201]        # left bottom - top corner
    ])   

Рисунок этого многоугольника на изображение позволило мне отлаживать координаты моего суда и настроить их при необходимости.

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

# Use the boxes info from the tensor prediction result
#
# x1,y1 ------
# |          |
# |          |
# |          |
# --------x2,y2
#

from shapely.geometry import Point, Polygon

color = [255, 0, 0]   # BLUE
thickness = 2
radius = 2

i  = 0
for box in pred_boxes:

  # Include only class Person
  if pred_classes[i] == 0:  

    x1 = int(box[0])
    y1 = int(box[1])

    x2 = int(box[2])
    y2 = int(box[3])

    xc = x1 + int((x2 - x1)/2)
    player_pos = (xc, y2)

    court = Polygon(src_pts)

    # Draw only players that are within the basketball court
    if Point(player_pos).within(court):
      cv2.circle(im, player_pos, radius, color, thickness, lineType=8, shift=0)

    i += 1

Отлично, мы теперь отмечали 8 игроков на баскетбольном суде и два, которые скрыты в спине 🏀💪🏻

Используя преобразование изображения гомографии, мы можем превратить вышеуказанное изображение на 2D Court Image, показанном ниже.

Нет Alt Text, предусмотренный для этого изображения, мы объявляем подобные координаты суда (одинаковые 7 баллов, начиная с левого нижнего – нижнего угла и т. Д.) Но теперь с 2D-изображения.

# Four corners of the court + mid-court circle point in destination image 
# Start top-left corner and go anti-clock wise + mid-court circle point
dst_pts = np.array([
    [43, 355],       # left bottom - bottom corner
    [317, 351],      # middle bottom corner
    [563, 351],      # right bottom - bottom corner
    [629, 293],      # right bottom - top corner
    [628, 3],        # top right rorner
    [8, 4],          # top left corner
    [2, 299]         # left bottom - top corner
    ])   

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

# Calculate Homography

h, status = cv2.findHomography(src_pts, dst_pts)

img_out = cv2.warpPerspective(im, h, (img_dst.shape[1], img_dst.shape[0]))

Выходное изображение (IMG_OUT) показывает точки плеера в 2D представлении суда! 😱

Решение по баскетболу мини-карта почти здесь.

Стратегия маски

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

lower_range = np.array([255,0,0])                         # Set the Lower range value of blue in BGR
upper_range = np.array([255,155,155])                     # Set the Upper range value of blue in BGR
mask = cv2.inRange(img_out, lower_range, upper_range)     # Create a mask with range
result = cv2.bitwise_and(img_out, img_out, mask = mask)   # Performing bitwise and operation with mask in img variable                            

mask = cv2.inRange(result, lower_range, upper_range)  
cv2_imshow(mask)      

Теперь мы можем получить координаты пикселей «не нулевых» в маске и используйте эти координаты, чтобы нарисовать круг на 2D-баскетбольной форме.

#get all non zero values
coord = cv2.findNonZero(mask)

# Radius of circle 
radius = 3

# Blue color in BGR 
color = (255, 0, 0) 

# Line thickness of 2 px 
thickness = 2

court_img = cv2.imread('./court.jpg')
for pos in coord:
  center_coordinates = (pos[0][0], pos[0][1])
  cv2.circle(court_img, center_coordinates, radius, color, thickness) 

cv2_imshow(court_img)

Обновление (29 дек 2019 г.)

Изучая визуализацию отслеживания следов игрока, я столкнулся с этим Пример отслеживания мяча Отказ Эта демонстрация использует метод opencv Findcontours для извлечения координат шарика в маске. Таким образом, вместо использования CV2.Findnonzero (маска), которая возвращает все ненулевые пиксели в маске, теперь я могу получить только 8 координат игроков в маске, используя следующий код:

cnts = cv2.findContours(mask.copy(), 
                        cv2.RETR_EXTERNAL, 
                        cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)

Отличный, (проект) работоспособное решение прибыло:)

Смотрите также видео пример вывода на YouTube Отказ

Нам все еще нужно идентифицировать игроков на команду, которая может быть достигнута с использованием обнаружения цвета.

Если мы сможем идентифицировать каждого отдельного игрока, мы также можем сделать отслеживание игрока на мини-карте.

Я создал Полное руководство Что приведет вас к пошаговым шагам через вышеупомянутое путешествие.

Надеюсь, этого достаточно, чтобы поэкспериментировать и, возможно, придумывать некоторые практические предложения о том, как завершить 2D отображение?!

Мир,

Стефан

Оригинал: “https://dev.to/stephan007/the-journey-towards-creating-a-basketball-mini-map-73o”