使用 YOLOv7 PlatoBlockchain 数据智能从 Python 视频中进行实时姿势估计。 垂直搜索。 人工智能。

使用 YOLOv7 从 Python 中的视频实时姿态估计

介绍

目标检测是计算机视觉中的一个大领域,也是计算机视觉“在野外”更重要的应用之一。 从中提取关键点检测(通常用于姿势估计)。

关键点可以是各种点——面部的一部分、身体的四肢等。姿势估计是关键点检测的一种特殊情况——其中的点是人体的一部分。

姿势估计是计算机视觉的一个惊人的、非常有趣和实用的用法。 有了它,我们就可以摆脱用于估计姿势的硬件(动作捕捉服),这些硬件既昂贵又笨重。 此外,我们可以将人类的运动映射到欧几里得空间中机器人的运动,从而在不使用控制器的情况下实现精细的电机运动,而控制器通常不允许更高的精度水平。 关键点估计可用于将我们的动作转换为 AR 和 VR 中的 3D 模型,并且越来越多地仅通过网络摄像头就可以做到这一点。 最后——姿势估计可以在运动和安全方面帮助我们。

在本指南中,我们将使用最先进的 YOLOv7 模型从 Python 视频中执行实时姿态估计。

具体来说,我们将使用在韩国平昌举行的 2018 年冬季奥运会的视频:

Aljona Savchenko 和 Bruno Massot 的表演令人惊叹,包括在镜头前重叠的身体、快速的流体运动和在空中旋转。 这将是一个了解模型如何处理难以推断的情况的绝佳机会!

YOLO 和姿势估计

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

Ultralytics 的 YOLOv5 是一个工业级的对象检测库,建立在 YOLO 方法之上。 它是在 PyTorch 中实现的,与以前的 YOLO 模型的 C++ 不同,它是完全开源的,并且具有精美简单且功能强大的 API,可让您灵活地推断、训练和自定义项目。 它是如此重要,以至于大多数改进 YOLO 方法的新尝试都建立在它之上。

这是怎么了 YOLOR(你只学习一种表示) 以及建立在 YOLOR(同一作者)之上的 YOLOv7 也被创建了!

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 存储库中可用,也可以通过 CLI 轻松下载:

! 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 在操作中),这使得推理速度显着加快。 请注意,强烈建议在 GPU 上执行此操作以获得实时速度,因为 CPU 可能缺乏执行此操作的能力,除非在小视频上运行。

让我们写一个方便的方法来运行推理。 我们将接受图像作为 NumPy 数组(因为这是我们稍后将在阅读视频时传递它们的内容)。 首先,使用 letterbox() 功能——我们将调整视频大小并将其填充为模型可以使用的形状。 这不需要也不会是生成视频的形状(分辨率)!

然后,我们将应用变换,将图像转换为半精度(如果 GPU 可用),将其批处理并在模型中运行:

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

我们将返回模型的预测,以及作为张量的图像。 这些是“粗略”的预测——它们包含许多重叠的激活,我们希望使用非最大抑制来“清理”它们,并将预测的骨架绘制在图像本身上:

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'd 进入它):

使用 YOLOv7 PlatoBlockchain 数据智能从 Python 视频中进行实时姿势估计。 垂直搜索。 人工智能。

请注意: 如果您的 GPU 正在苦苦挣扎,或者如果您想将这样的模型的结果嵌入到将延迟作为工作流程的关键方面的应用程序中 - 使视频更小并在更小的帧上工作。 这是一个全高清 1920×1080 视频,应该能够在大多数家庭系统上快速运行,但如果它在您的系统上运行不佳,请将图像缩小。

结论

在本指南中,我们了解了 YOLO 方法、YOLOv7 以及 YOLO 与对象检测、姿态估计和实例分割之间的关系。 然后,我们研究了如何使用编程 API 轻松安装和使用 YOLOv7,并创建了几种方便的方法来简化推理和显示结果。

最后,我们使用 OpenCV 打开了一个视频,使用 YOLOv7 运行推理,并制作了一个实时执行姿势估计的功能,将生成的视频以全分辨率和 30FPS 保存在本地磁盘上。

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

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

使用 YOLOv7 PlatoBlockchain 数据智能从 Python 视频中进行实时姿势估计。 垂直搜索。 人工智能。

另一个计算机视觉课程?

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

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

里面是什么?

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

时间戳记:

更多来自 堆栈滥用