Введение
Обнаружение объектов — большая область компьютерного зрения и одно из наиболее важных приложений компьютерного зрения «в дикой природе».
Обнаружение объектов не так стандартизировано, как классификация изображений, в основном потому, что большинство новых разработок обычно выполняются отдельными исследователями, сопровождающими и разработчиками, а не большими библиотеками и фреймворками. Трудно упаковать необходимые служебные сценарии в такую инфраструктуру, как 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».
Еще один курс по компьютерному зрению?
Мы не будем заниматься классификацией цифр MNIST или моды MNIST. Они уже давно отслужили свою роль. Слишком много учебных ресурсов сосредоточено на базовых наборах данных и базовых архитектурах, прежде чем позволить продвинутым архитектурам черного ящика взять на себя бремя производительности.
Мы хотим сосредоточиться на демистификация, практичность, понимание, интуиция и реальные проекты. Хочу учиться КАК Вы можете внести разнообразие? Мы проведем вас от того, как наш мозг обрабатывает изображения, до написания классификатора глубокого обучения исследовательского уровня для рака молочной железы, до сетей глубокого обучения, которые «галлюцинируют», обучая вас принципам и теории посредством практической работы, вооружая вас ноу-хау и инструменты, чтобы стать экспертом в применении глубокого обучения для решения задач компьютерного зрения.
Что внутри?
- Первые принципы зрения и как научить компьютеры «видеть»
- Различные задачи и приложения компьютерного зрения
- Ремесленные инструменты, которые облегчат вашу работу
- Поиск, создание и использование наборов данных для компьютерного зрения
- Теория и применение сверточных нейронных сетей
- Обработка смещения домена, совпадения и других смещений в наборах данных
- Передача обучения и использование времени обучения и вычислительных ресурсов других в ваших интересах
- Создание и обучение современного классификатора рака молочной железы
- Как применить здоровую дозу скептицизма к господствующим идеям и понять последствия широко распространенных методов
- Визуализация «концептуального пространства» ConvNet с использованием t-SNE и PCA
- Тематические исследования того, как компании используют методы компьютерного зрения для достижения лучших результатов
- Правильная оценка модели, визуализация скрытого пространства и выявление внимания модели
- Выполнение исследования предметной области, обработка ваших собственных наборов данных и создание модельных тестов
- Передовые архитектуры, развитие идей, что делает их уникальными и как их реализовать
- KerasCV — WIP-библиотека для создания современных пайплайнов и моделей.
- Как разбирать и читать статьи и реализовывать их самостоятельно
- Выбор моделей в зависимости от вашего применения
- Создание сквозного конвейера машинного обучения
- Ландшафт и интуиция при обнаружении объектов с помощью Faster R-CNN, RetinaNets, SSD и YOLO
- Экземпляр и семантическая сегментация
- Распознавание объектов в реальном времени с помощью YOLOv5
- Обучение детекторам объектов YOLOv5
- Работа с трансформерами с использованием KerasNLP (надежная библиотека WIP)
- Интеграция Transformers с ConvNets для создания подписей к изображениям
- DeepDream
- Оптимизация модели глубокого обучения для компьютерного зрения
- блокчейн
- C + +
- код
- Coingenius
- Компьютерное зрение
- глубокое обучение
- Java
- Обнаружение ключевой точки
- обучение с помощью машины
- невзаимозаменяемый токен
- OpenSea
- PHP
- Платон
- Платон Ай
- Платон Интеллектуальные данные
- Платон игра
- Платоблокчейн
- ПлатонДанные
- платогейминг
- Polygon
- Оценка позы
- Питон
- pytorch
- реагировать
- умный контракт
- Solana
- Стекабьюс
- Торчвидение
- Vyper
- Web3
- Йоло
- зефирнет