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

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

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

Наборы данных

Также очень необходим правильный выбор наборов данных, чтобы оказать соответствующее влияние на результаты. В этом обнаружении позы модель предварительно обучается на двух разных наборах данных, а именно: Набор данных ключевых точек COCO и Набор данных позы человека MPII.

1. COCO: Набор данных COCO keypoints - это набор данных для двухмерной оценки позы с изображениями, собранными с Flickr. COCO - это крупнейший на сегодняшний день набор данных 2D Pose Assessment, который считается эталоном для тестирования алгоритмов 2D Pose Assessment. Модель COCO дает 18 очков.

Формат вывода COCO: нос - 0, шея - 1, правое плечо - 2, правый локоть - 3, правое запястье - 4, левое плечо - 5, левый локоть - 6, левое запястье - 7, правое Бедро - 8, Правое колено - 9, Правая лодыжка - 10, Левое бедро - 11, Левое колено - 12, Левая лодыжка - 13, Правый глаз - 14, Левый глаз - 15, Правое ухо - 16, Левое ухо - 17, Фон - 18

2. MPII: Набор данных позы человека MPII - это набор данных для двухмерной оценки позы, состоящий из почти 500 различных человеческих действий, собранных из видеороликов Youtube. MPII был первым набором данных, который содержал такой разнообразный диапазон поз, и первым набором данных, в котором в 2014 году была запущена задача оценки двухмерных поз. Модель MPII дает 15 точек.

Формат вывода MPII: голова - 0, шея - 1, правое плечо - 2, правый локоть - 3, правое запястье - 4, левое плечо - 5, левый локоть - 6, левое запястье - 7, правое Бедро - 8, Правое колено - 9, Правая лодыжка - 10, Левое бедро - 11, Левое колено - 12, Левая лодыжка - 13, Грудь - 14, Задний план - 15.

Эти точки генерируются, когда набор данных обрабатывается и тщательно обучается с помощью сверточной нейронной сети (CNN).

Реализация

Шаг 1. Сбор требований (веса моделей) и сеть нагрузки

Обученные модели необходимо загрузить в OpenCV. Модели обучаются в Caffe Deep Learning Framework. Модель кафе состоит из двух файлов: файла .prototxt и файла .caffemodel.

  1. Файл .prototxt определяет архитектуру нейронной сети.
  2. В файле .caffemodel хранятся веса обученной модели.

Затем загружаем эти два файла в сеть.

# Specify the paths for the 2 files
protoFile = "pose/mpi/pose_deploy_linevec_faster_4_stages.prototxt"
weightsFile = "pose/mpi/pose_iter_160000.caffemodel"
# Read the network into Memory
net = cv2.dnn.readNetFromCaffe(protoFile, weightsFile)

Шаг 2. Прочтите изображение и подготовьте ввод в сеть.

Во-первых, нам нужно преобразовать изображение из формата OpenCV в формат BLOB-объектов Caffe с помощью функции blobFromImage, чтобы его можно было передать в качестве входных данных в сеть. Параметры должны быть предоставлены в функции blobFromImage. Менять местами каналы R и B нет необходимости, поскольку и OpenCV, и Caffe используют формат BGR.

# Read image
frame = cv2.imread("image.jpg")
# Specify the input image dimensions
inWidth = 368
inHeight = 368
# Prepare the frame to be fed to the network
inpBlob = cv2.dnn.blobFromImage(frame, 1.0 / 255, (inWidth, inHeight), (0, 0, 0), swapRB=False, crop=False)
# Set the prepared object as the input blob of the network
net.setInput(inpBlob)

Шаг 3. Сделайте прогнозы и проанализируйте ключевые точки

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

output = net.forward()

На выходе получается 4-мерная матрица:

  1. Первое измерение - это идентификатор изображения (в случае, если вы передаете в сеть более одного изображения).
  2. Второе измерение указывает индекс ключевой точки. Модель создает карты достоверности (распределение вероятностей по изображению, представляющее достоверность совместного местоположения в каждом пикселе) и карты соответствия частей, которые все объединены. Для модели COCO она состоит из 57 частей - 18 карт достоверности ключевых точек + 1 фон + 19 * 2 карт соответствия частей. Точно так же для MPI он дает 44 балла. Мы будем использовать только первые несколько точек, которые соответствуют ключевым точкам.
  3. Третье измерение - это высота выходной карты.
  4. Четвертое измерение - это ширина выходной карты.

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

Как только ключевые точки обнаружены, мы наносим их на изображение.

H = out.shape[2]
W = out.shape[3]
# Empty list to store the detected keypoints
points = []
for i in range(len()):
    # confidence map of corresponding body's part.
    probMap = output[0, i, :, :]
    # Find global maxima of the probMap.
    minVal, prob, minLoc, point = cv2.minMaxLoc(probMap)
    # Scale the point to fit on the original image
    x = (frameWidth * point[0]) / W
    y = (frameHeight * point[1]) / H
    if prob > threshold :
        cv2.circle(frame, (int(x), int(y)), 15, (0, 255, 255), thickness=-1, lineType=cv.FILLED)
        cv2.putText(frame, "{}".format(i), (int(x), int(y)), cv2.FONT_HERSHEY_SIMPLEX, 1.4, (0, 0, 255), 3, lineType=cv2.LINE_AA)
# Add the point to the list if the probability is greater than the threshold
        points.append((int(x), int(y)))
    else :
        points.append(None)
cv2.imshow("Output-Keypoints",frame)
cv2.waitKey(0)
cv2.destroyAllWindows()

Шаг 4: нарисуйте скелет

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

for pair in POSE_PAIRS:
    partA = pair[0]
    partB = pair[1]
    if points[partA] and points[partB]:
        cv2.line(frameCopy, points[partA], points[partB], (0, 255, 0), 3)

Результат

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

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

https://youtu.be/UdtLLrS1ft0 (входное видео)

https://youtu.be/SgAlHivxJ8E (выходное видео)

Весь исходный код для справки представлен в моей ссылке на репозиторий Github https://github.com/ManaliSeth/Athlete-Pose-Detection

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