В этой теме я рассказал о том, как мне удалось разработать оценку позы человека с использованием OpenCV и Tensorflow. Я попытался объяснить процесс как можно проще вместе с необходимой частью реализации.

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

Перво-наперво: Что такое оценка позы? Оценка позы - это общая проблема компьютерного зрения, когда мы определяем положение и ориентацию объекта. Обычно это означает обнаружение ключевых точек, описывающих объект.

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

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

  1. Задача COCO Keypoints
  2. Набор данных позы человека MPII
  3. Набор данных позы VGG

Модель COCO дает 18 баллов, а модель MPII - 15 баллов. Результаты, нанесенные на человека, показаны на изображении ниже. Эти точки генерируются, когда набор данных обрабатывается и тщательно обучается с помощью сверточной нейронной сети (CNN).

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

Реализация:

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

# 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)

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

# 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)

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

output = net.forward()

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

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

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

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

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

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

Вы можете найти весь исходный код для справки в моей ссылке репозитория GitHub на проект:

https://github.com/kunjshah2511/Human-Pose-Estimation

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