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

Оценка позы/обнаружение ключевых точек с помощью YOLOv7 в Python

Введение

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

Обнаружение объектов не так стандартизировано, как классификация изображений, в основном потому, что большинство новых разработок обычно выполняются отдельными исследователями, сопровождающими и разработчиками, а не большими библиотеками и фреймворками. Трудно упаковать необходимые служебные сценарии в такую ​​​​инфраструктуру, как TensorFlow или PyTorch, и поддерживать рекомендации API, которые до сих пор руководили разработкой.

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

К счастью для масс, Ultralytics разработала простой, очень мощный и красивый API для обнаружения объектов на основе YOLOv5, который был расширен другими группами исследователей и разработчиков в более новых версиях, таких как YOLOv7.

В этом кратком руководстве мы будем выполнять оценку позы (обнаружение ключевых точек) в Python с помощью современного YOLOv7.

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

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

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

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

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

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

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

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

Установка YOLOv7

Давайте продолжим и установим проект с GitHub:

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

Это создает yolov7 каталог в вашем текущем рабочем каталоге, в котором вы сможете найти основные файлы проекта:

%cd yolov7
!ls

/Users/macbookpro/jup/yolov7
LICENSE.md       detect.py        models           tools
README.md        export.py        paper            train.py
cfg              figure           requirements.txt train_aux.py
data             hubconf.py       scripts          utils
deploy           inference        test.py

Примечание: Блокноты Google Colab сбрасываются в основной рабочий каталог в следующей ячейке даже после вызова %cd dirname, поэтому вам придется продолжать вызывать ее в каждой ячейке, в которой вы хотите выполнить операцию. Локальные блокноты Jupyter запоминают изменение, поэтому нет необходимости продолжать вызывать команду.

Всякий раз, когда вы запускаете код с заданным набором весов, они будут загружены и сохранены в этом каталоге. Чтобы выполнить оценку позы, нам нужно загрузить веса для предварительно обученной модели YOLOv7 для этой задачи, которую можно найти в разделе /releases/download/ вкладка на GitHub:

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

  % 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  3742k      0  0:00:42  0:00:42 --:--:-- 4573k

/Users/macbookpro/jup

Отлично, мы скачали yolov7-w6-pose.pt weights, который можно использовать для загрузки и реконструкции обученной модели для оценки позы.

Загрузка модели оценки позы YOLOv7

Давайте импортируем библиотеки, которые нам понадобятся для оценки позы:

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

torch и torchvision достаточно просты — YOLOv7 реализован с помощью PyTorch. utils.datasets, utils.general и utils.plots модули взяты из проекта YOLOv7 и предоставляют нам методы, которые помогают с предварительной обработкой и подготовкой входных данных для модели, на которой выполняется вывод. Среди них letterbox() дополнить изображение, non_max_supression_keypoint() для запуска алгоритма Non-Max Supression на начальных выходных данных модели и получения чистых выходных данных для нашей интерпретации, а также output_to_keypoint() и plot_skeleton_kpts() методы для фактического добавления ключевых точек к данному изображению, как только они будут предсказаны.

Мы можем загрузить модель из файла веса с помощью torch.load(). Давайте создадим функцию для проверки доступности графического процессора, загрузим модель, переведем ее в режим вывода и переместим на графический процессор, если он доступен:

def load_model():
    device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    model = torch.load('yolov7/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()

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

Загрузив модель, давайте создадим run_inference() метод, который принимает строку, указывающую на файл в нашей системе. Метод будет читать изображение с помощью OpenCV (cv2), дополните его letterbox(), примените к нему преобразования и превратите его в пакет (модель, как обычно, обучается и ожидает пакеты):

def run_inference(url):
    image = cv2.imread(url) 
    
    image = letterbox(image, 960, stride=64, auto=True)[0] 
    
    image = transforms.ToTensor()(image) 
    
    image = image.unsqueeze(0) 
    output, _ = model(image) 
    return output, image

Здесь мы вернули преобразованное изображение (поскольку мы хотим извлечь оригинал и построить на нем график) и выходные данные модели. Эти выходные данные содержат 45900 предсказаний ключевых точек, большинство из которых перекрываются. Мы хотим применить немаксимальное подавление к этим необработанным прогнозам, как и к прогнозам обнаружения объектов (где прогнозируется множество ограничивающих рамок, а затем они «схлопываются» с учетом некоторой достоверности и порога IoU). После подавления мы можем нанести каждую ключевую точку на исходное изображение и отобразить ее:

def visualize_output(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)
    plt.figure(figsize=(12, 12))
    plt.axis('off')
    plt.imshow(nimg)
    plt.show()

Теперь для некоторого входного изображения, такого как karate.jpg в основном рабочем каталоге мы можем запустить вывод, выполнить Non-Max Supression и построить результаты с помощью:

output, image = run_inference('./karate.jpg')
visualize_output(output, image)

Это приводит к:

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

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

Заключение

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

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

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

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

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

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

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

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

Что внутри?

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

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

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