Оценка позы в реальном времени по видео на Python с помощью YOLOv7 PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Оценка позы в реальном времени из видео на Python с помощью YOLOv7

Введение

Обнаружение объектов — большая область компьютерного зрения и одно из наиболее важных приложений компьютерного зрения «в дикой природе». Из него было извлечено обнаружение ключевых точек (часто используемое для оценки позы).

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

Оценка позы — это удивительное, чрезвычайно веселое и практичное использование компьютерного зрения. С его помощью мы можем избавиться от дорогостоящего и громоздкого оборудования, используемого для оценки поз (костюмов для захвата движения). Кроме того, мы можем сопоставить движение людей с движением роботов в евклидовом пространстве, обеспечивая точное движение двигателя без использования контроллеров, которые обычно не обеспечивают более высокий уровень точности. Оценка ключевых точек может использоваться для преобразования наших движений в 3D-модели в AR и VR, и все чаще для этого используется только веб-камера. Наконец, оценка позы может помочь нам в спорте и безопасности.

В этом руководстве мы будем выполнять оценку позы в реальном времени из видео на Python, используя современную модель YOLOv7.

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

Алёна Савченко и Бруно Массо продемонстрировали потрясающее представление, в том числе перекрывание тел на фоне камеры, быстрые плавные движения и вращение в воздухе. Это будет замечательная возможность увидеть, как модель справляется с трудными для вывода ситуациями!

YOLO и оценка позы

YOLO (Вы только посмотрите один раз) это методология, а также семейство моделей, построенных для обнаружения объектов. С момента создания в 2015 году YOLOv1, YOLOv2 (YOLO9000) и YOLOv3 предлагались одним и тем же автором (авторами), и в последующие годы сообщество глубокого обучения продолжало продвигать разработки с открытым исходным кодом.

Ультралитики YOLOv5 — это отраслевой репозиторий обнаружения объектов, созданный на основе метода YOLO. Он реализован в PyTorch, в отличие от C ++ для предыдущих моделей YOLO, имеет полностью открытый исходный код и имеет красивый простой и мощный API, который позволяет вам делать выводы, обучать и гибко настраивать проект. Это настолько важный элемент, что большинство новых попыток улучшить метод YOLO основываются на нем.

Это, как YOLOR (вы изучаете только одно представление) и YOLOv7, построенный поверх YOLOR (того же автора), также были созданы!

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

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

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

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

Установка YOLOv7

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

! git clone https://github.com/WongKinYiu/yolov7.git

Теперь давайте перейдем к yolov7 каталог, в котором находится проект, и взгляните на его содержимое:

%cd yolov7
!ls
/content/yolov7
cfg	   figure      output.mp4	 test.py       
data	   hubconf.py  paper		 tools
deploy	   inference   README.md	 train_aux.py
detect.py  LICENSE.md  requirements.txt  train.py
export.py  models      scripts		 utils

Примечание: призвание !cd dirname перемещает вас в каталог в этой ячейке. Вызов %cd dirname также перемещает вас в каталог по следующим ячейкам и удерживает вас там.

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

! curl -L https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7-w6-pose.pt -o yolov7-w6-pose.pt

 % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100  153M  100  153M    0     0  23.4M      0  0:00:06  0:00:06 --:--:-- 32.3M

После загрузки мы можем импортировать библиотеки и вспомогательные методы, которые будем использовать:

import torch
from torchvision import transforms

from utils.datasets import letterbox
from utils.general import non_max_suppression_kpt
from utils.plots import output_to_keypoint, plot_skeleton_kpts

import matplotlib.pyplot as plt
import cv2
import numpy as np

Ознакомьтесь с нашим практическим руководством по изучению Git с рекомендациями, принятыми в отрасли стандартами и прилагаемой памяткой. Перестаньте гуглить команды Git и на самом деле изучить это!

Большой! Давайте продолжим загрузку модели и создадим скрипт, который позволит вам делать выводы из видео с помощью YOLOv7 и OpenCV.

Оценка позы в реальном времени с помощью YOLOv7

Давайте сначала создадим метод для загрузки модели из загруженных весов. Мы проверим, какое устройство у нас есть (CPU или GPU):

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")

def load_model():
    model = torch.load('yolov7-w6-pose.pt', map_location=device)['model']
    
    model.float().eval()

    if torch.cuda.is_available():
        
        
        model.half().to(device)
    return model

model = load_model()

В зависимости от того, есть ли у нас GPU или нет, мы включим половинную точность (используя float16 вместо float32 в операциях), что значительно ускоряет вывод. Обратите внимание, что настоятельно рекомендуется выполнять это на графическом процессоре для скорости в реальном времени, поскольку процессорам, вероятно, не хватит мощности для этого, если только они не работают с небольшими видео.

Давайте напишем удобный метод для выполнения логического вывода. Мы будем принимать изображения в виде массивов NumPy (поскольку мы будем передавать их позже при чтении видео). Во-первых, с помощью letterbox() функция — мы изменим размер и дополним видео до формы, с которой может работать модель. Это не должно быть и не будет формой (разрешением) результирующего видео!

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

def run_inference(image):
    
    image = letterbox(image, 960, stride=64, auto=True)[0] 
    
    image = transforms.ToTensor()(image) 
    if torch.cuda.is_available():
      image = image.half().to(device)
    
    image = image.unsqueeze(0) 
    with torch.no_grad():
      output, _ = model(image)
    return output, image

Мы вернем прогнозы модели, а также изображение в виде тензора. Это «грубые» прогнозы — они содержат много перекрывающихся активаций, и мы хотим «очистить их» с помощью Non-Max Supression и нанести предсказанные скелеты на само изображение:

def draw_keypoints(output, image):
  output = non_max_suppression_kpt(output, 
                                     0.25, 
                                     0.65, 
                                     nc=model.yaml['nc'], 
                                     nkpt=model.yaml['nkpt'], 
                                     kpt_label=True)
  with torch.no_grad():
        output = output_to_keypoint(output)
  nimg = image[0].permute(1, 2, 0) * 255
  nimg = nimg.cpu().numpy().astype(np.uint8)
  nimg = cv2.cvtColor(nimg, cv2.COLOR_RGB2BGR)
  for idx in range(output.shape[0]):
      plot_skeleton_kpts(nimg, output[idx, 7:].T, 3)

  return nimg

С их помощью наш общий поток будет выглядеть так:

img = read_img()
outputs, img = run_inference(img)
keypoint_img = draw_keypoints(output, img)

Чтобы преобразовать это в настройку видео в реальном времени — мы будем использовать OpenCV для чтения видео и запускать этот процесс для каждого кадра. Для каждого кадра мы также будем записывать кадр в новый файл, закодированный как видео. Это обязательно замедлит процесс, поскольку мы запускаем вывод, его отображение и запись, поэтому вы можете ускорить вывод и отображение, избегая создания нового файла и записи в него в цикле:

def pose_estimation_video(filename):
    cap = cv2.VideoCapture(filename)
    
    fourcc = cv2.VideoWriter_fourcc(*'MP4V')
    out = cv2.VideoWriter('ice_skating_output.mp4', fourcc, 30.0, (int(cap.get(3)), int(cap.get(4))))
    while cap.isOpened():
        (ret, frame) = cap.read()
        if ret == True:
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
            output, frame = run_inference(frame)
            frame = draw_keypoints(output, frame)
            frame = cv2.resize(frame, (int(cap.get(3)), int(cap.get(4))))
            out.write(frame)
            cv2.imshow('Pose estimation', frame)
        else:
            break

        if cv2.waitKey(10) & 0xFF == ord('q'):
            break

    cap.release()
    out.release()
    cv2.destroyAllWindows()

Ассоциация VideoWriter принимает несколько параметров — имя выходного файла, FourCC (четыре кода кодека, обозначающие кодек, используемый для кодирования видео), частоту кадров и разрешение в виде кортежа. Чтобы не угадывать и не изменять размер видео — мы использовали ширину и высоту исходного видео, полученные с помощью VideoCapture экземпляр, содержащий данные о самом видео, такие как ширина, высота, общее количество кадров и т. д.

Теперь мы можем вызвать метод для любого входного видео:

pose_estimation_video('../ice_skating.mp4')

Это откроет окно OpenCV, отображающее вывод в реальном времени. А также, он запишет видео файл в yolov7 каталог (поскольку мы cdвникал в это):

Оценка позы в реальном времени по видео на Python с помощью YOLOv7 PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Примечание: Если у вашего графического процессора проблемы или если вы хотите внедрить результаты такой модели в приложение, для которого задержка является ключевым аспектом рабочего процесса, уменьшите размер видео и работайте с меньшими кадрами. Это видео в формате Full HD 1920×1080, и оно должно работать быстро на большинстве домашних систем, но если оно не работает так же хорошо на вашей системе, уменьшите изображение(я).

Заключение

В этом руководстве мы рассмотрели метод YOLO, YOLOv7 и взаимосвязь между YOLO и обнаружением объектов, оценкой позы и сегментацией экземпляров. Затем мы рассмотрели, как легко установить YOLOv7 и работать с ним с помощью программного API, и создали несколько удобных методов, упрощающих вывод и отображение результатов.

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

Двигаясь дальше — практическое глубокое обучение компьютерному зрению

Ваша любознательная натура заставляет вас идти дальше? Рекомендуем ознакомиться с нашим "Курс": «Практическое глубокое обучение компьютерному зрению с помощью Python».

Оценка позы в реальном времени по видео на Python с помощью YOLOv7 PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Еще один курс по компьютерному зрению?

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

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

Что внутри?

  • Первые принципы зрения и как научить компьютеры «видеть»
  • Различные задачи и приложения компьютерного зрения
  • Ремесленные инструменты, которые облегчат вашу работу
  • Поиск, создание и использование наборов данных для компьютерного зрения
  • Теория и применение сверточных нейронных сетей
  • Обработка смещения домена, совпадения и других смещений в наборах данных
  • Передача обучения и использование времени обучения и вычислительных ресурсов других в ваших интересах
  • Создание и обучение современного классификатора рака молочной железы
  • Как применить здоровую дозу скептицизма к господствующим идеям и понять последствия широко распространенных методов
  • Визуализация «концептуального пространства» ConvNet с использованием t-SNE и PCA
  • Тематические исследования того, как компании используют методы компьютерного зрения для достижения лучших результатов
  • Правильная оценка модели, визуализация скрытого пространства и выявление внимания модели
  • Выполнение исследования предметной области, обработка ваших собственных наборов данных и создание модельных тестов
  • Передовые архитектуры, развитие идей, что делает их уникальными и как их реализовать
  • KerasCV — WIP-библиотека для создания современных пайплайнов и моделей.
  • Как разбирать и читать статьи и реализовывать их самостоятельно
  • Выбор моделей в зависимости от вашего применения
  • Создание сквозного конвейера машинного обучения
  • Ландшафт и интуиция при обнаружении объектов с помощью Faster R-CNN, RetinaNets, SSD и YOLO
  • Экземпляр и семантическая сегментация
  • Распознавание объектов в реальном времени с помощью YOLOv5
  • Обучение детекторам объектов YOLOv5
  • Работа с трансформерами с использованием KerasNLP (надежная библиотека WIP)
  • Интеграция Transformers с ConvNets для создания подписей к изображениям
  • DeepDream
  • Оптимизация модели глубокого обучения для компьютерного зрения

Отметка времени:

Больше от Стекабьюс