在 Python PlatoBlockchain 数据智能中使用 YOLOv7 进行姿势估计/关键点检测。 垂直搜索。 哎。

在 Python 中使用 YOLOv7 进行姿势估计/关键点检测

介绍

目标检测是计算机视觉中的一个大领域,也是计算机视觉“在野外”更重要的应用之一。

对象检测不像图像分类那样标准化,主要是因为大多数新开发通常是由个人研究人员、维护人员和开发人员完成的,而不是大型库和框架。 很难将必要的实用程序脚本打包到 TensorFlow 或 PyTorch 等框架中,并维护迄今为止指导开发的 API 指南。

这使得对象检测稍微复杂一些,通常更冗长(但并非总是如此),并且比图像分类更不易接近。

对大众来说幸运的是——Ultralytics 围绕他们的 YOLOv5 开发了一个简单、非常强大和漂亮的对象检测 API,其他研发团队已经将其扩展为更新的版本,例如 YOLOv7。

在这个简短的指南中,我们将使用最先进的 YOLOv7 在 Python 中执行姿势估计(关键点检测)。

关键点可以是各种点——面部的一部分、身体的四肢等。姿势估计是关键点检测的一个特例——其中点是人体的一部分,可以用来代替昂贵的位置跟踪硬件,实现空中机器人控制,并通过 AR 和 VR 推动人类自我表达的新时代。

YOLO 和姿势估计

YOLO(你只看一次) 是一种方法论,也是为对象检测而构建的一系列模型。 自 2015 年成立以来,YOLOv1、YOLOv2 (YOLO9000) 和 YOLOv3 都是由同一作者提出的——并且深度学习社区在接下来的几年中继续推进开源。

Ultralytics 的 YOLOv5 是 PyTorch 中 YOLO 的第一个大规模实现,这使得它比以往任何时候都更易于访问,但 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 Notebooks 也会重置到下一个单元格中的主工作目录 %cd dirname,因此您必须在要在其中执行操作的每个单元格中继续调用它。本地 Jupyter Notebook 会记住更改,因此无需继续调用该命令。

每当您运行具有给定权重集的代码时,它们都会被下载并存储在此目录中。 为了进行姿态估计,我们需要下载该任务的预训练 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 权重文件,可用于加载和重建经过训练的模型以进行姿态估计。

加载 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

torchtorchvision 很简单——YOLOv7 是用 PyTorch 实现的。 这 utils.datasets, utils.generalutils.plots 模块来自 YOLOv7 项目,并为我们提供了帮助预处理和准备输入以供模型运行推理的方法。 其中有 letterbox() 填充图像, non_max_supression_keypoint() 在模型的初始输出上运行非最大抑制算法,并为我们的解释产生一个干净的输出,以及 output_to_keypoint()plot_skeleton_kpts() 预测后,将关键点实际添加到给定图像的方法。

我们可以从权重文件中加载模型 torch.load(). 让我们创建一个函数来检查 GPU 是否可用,加载模型,将其置于推理模式并在可用时将其移动到 GPU:

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 在主工作目录中,我们可以运行推理、执行非最大值抑制并绘制结果:

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

结果是:

这是一个相当难以推断的图像! 右边练习者的右臂大部分是隐藏的,我们可以看到模型推断它是隐藏的并且在身体的右侧,错过了肘部弯曲并且手臂的一部分在前面. 左边的练习者看得更清楚,即使有一条隐藏的腿,也能正确推断出来。

事实上——一个坐在后面的人, 相机几乎完全看不见 仅根据坐下时臀部的位置,似乎正确估计了他们的姿势。 代表网络的伟大工作!

结论

在本指南中——我们简要介绍了 YOLOv7,它是 YOLO 家族的最新进展,它建立在 YOLOR 之上,并进一步提供了超出大多数基于 YOLO 模型的标准对象检测功能的实例分割和关键点检测功能.

然后,我们研究了如何下载已发布的权重文件,加载它们以构建模型并为人类执行姿势估计推断,从而产生令人印象深刻的结果。

走得更远——计算机视觉的实用深度学习

你好奇的天性让你想走得更远? 我们建议查看我们的 套餐: “使用 Python 进行计算机视觉的实用深度学习”.

在 Python PlatoBlockchain 数据智能中使用 YOLOv7 进行姿势估计/关键点检测。 垂直搜索。 哎。

另一个计算机视觉课程?

我们不会对 MNIST 数字或 MNIST 时尚进行分类。 他们很久以前就发挥了作用。 在让高级黑盒架构承担性能负担之前,太多的学习资源专注于基本数据集和基本架构。

我们想专注于 揭秘, 实际性, 理解, 直觉真实项目. 想学 形成一种 你可以有所作为? 我们将带您从大脑处理图像的方式到编写研究级的乳腺癌深度学习分类器,再到“产生幻觉”的深度学习网络,通过实际工作教您原理和理论,为您配备成为应用深度学习解决计算机视觉问题的专家的专业知识和工具。

里面是什么?

  • 视觉的首要原则以及如何教计算机“看”
  • 计算机视觉的不同任务和应用
  • 让您的工作更轻松的交易工具
  • 为计算机视觉寻找、创建和利用数据集
  • 卷积神经网络的理论与应用
  • 处理数据集中的域转移、共现和其他偏差
  • 迁移学习并利用他人的训练时间和计算资源为您谋取利益
  • 构建和训练最先进的乳腺癌分类器
  • 如何将健康的怀疑态度应用于主流思想并理解广泛采用的技术的含义
  • 使用 t-SNE 和 PCA 可视化 ConvNet 的“概念空间”
  • 公司如何使用计算机视觉技术取得更好结果的案例研究
  • 适当的模型评估、潜在空间可视化和识别模型的注意力
  • 执行领域研究,处理您自己的数据集并建立模型测试
  • 尖端架构、想法的发展、是什么让它们与众不同以及如何实现它们
  • KerasCV – 用于创建最先进的管道和模型的 WIP 库
  • 如何解析和阅读论文并自己实现它们
  • 根据您的应用选择型号
  • 创建端到端机器学习管道
  • 使用 Faster R-CNN、RetinaNets、SSD 和 YOLO 进行对象检测的景观和直觉
  • 实例和语义分割
  • 使用 YOLOv5 进行实时对象识别
  • 训练 YOLOv5 目标检测器
  • 使用 KerasNLP(行业强大的 WIP 库)使用 Transformers
  • 将 Transformers 与 ConvNet 集成以生成图像的标题
  • 深梦
  • 计算机视觉的深度学习模型优化

时间戳记:

更多来自 堆栈滥用