简介
物体检测是计算机视觉的一个大领域,也是计算机视觉在 "野外 "的更重要的应用之一。
物体检测并不像图像分类那样标准化,主要是因为大多数新的发展通常是由个人研究者、维护者和开发者完成的,而不是由大型库和框架完成的。在TensorFlow或PyTorch这样的框架中打包必要的实用脚本,并维护迄今为止指导开发的API指南,是很困难的。
这使得物体检测在某种程度上更加复杂,通常更加冗长(但并不总是这样),而且不如图像分类那样容易接近。
对于大众来说,幸运的是--Ultralytics围绕他们的YOLOv5开发了一个简单、非常强大和漂亮的物体检测API,该API已经被其他研发团队扩展到较新的版本,例如YOLOv7。
在这个简短的指南中,我们将在Python中使用最先进的YOLOv7进行姿势估计(关键点检测)。
关键点可以是各种不同的点--脸部的一部分,身体的四肢,等等。姿势估计是关键点检测的一个特例--其中的点是人体的一部分,可以用来取代昂贵的位置跟踪硬件,实现空中机器人控制,并通过AR和VR为人类自我表达的新时代提供动力。
YOLO和姿势估计
*YOLO(You Only Look Once)*是一种方法,也是为物体检测而建立的模型系列。自2015年成立以来,YOLOv1、YOLOv2(YOLO9000)和YOLOv3都是由同一作者提出的--而深度学习社区在持续的几年里继续进行开源的进步。
Ultralytics的YOLOv5是YOLO在PyTorch中的第一个大规模实现,这使得它比以前更容易获得,但YOLOv5获得如此地位的主要原因也是围绕它建立的漂亮的简单而强大的API。该项目抽象了不必要的细节,同时允许自定义,几乎所有可用的导出格式,并采用了惊人的做法,使整个项目既高效又尽可能地优化。
YOLOv5仍然是建立物体检测模型的主要项目,许多旨在推进YOLO方法的存储库以YOLOv5为基线,并提供类似的API(或简单地分叉该项目并在其基础上建立)。这就是 YOLOR(你只需学习一种表现形式)和YOLOv7就是如此,它建立在YOLOR(同一作者)之上,是YOLO方法的最新进展。
YOLOv7不仅仅是一个物体检测架构--提供了新的模型头,可以输出关键点(骨架),除了只进行边界框回归外,还可以进行实例分割,这不是以前YOLO模型的标准。这并不奇怪,因为许多物体检测架构在早期也被重新用于实例分割和关键点检测任务,由于共享的通用架构,根据任务的不同有不同的输出。尽管这并不令人惊讶--支持实例分割和关键点检测将可能成为基于YOLO的模型的新标准,这些模型几年前就已经开始超越几乎所有其他的两阶段检测器。
YOLOv7与一篇名为"YOLOv7:可训练的免费包设定了实时物体检测器的新技术 "的论文一起发布,其源代码可在GitHub上找到。
该模型本身是通过架构上的变化,以及优化训练的各个方面创建的,被称为 "免费袋",它在不增加推理成本的情况下提高了准确性。
安装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笔记本会记住这个变化,所以不需要一直调用这个命令。
每当你用一组给定的权重运行代码时--它们会被下载并存储在这个目录中。为了进行姿态估计,我们要下载预先训练好的YOLOv7模型的权重,这些权重可以在GitHub的/releases/download/ 标签下找到。
! 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
torch 和 ,这很简单--YOLOv7是用PyTorch实现的。 、 和 模块来自YOLOv7项目,它们为我们提供了帮助预处理和准备输入的方法,以便模型运行推理。其中, ,用于填充图像; ,用于在模型的初始输出上运行非最大抑制算法,并为我们的解释产生一个干净的输出;以及 和 方法,用于在给定的图像上添加关键点,一旦它们被预测。torchvision utils.datasets utils.general utils.plots 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']
# Put in inference mode
model.float().eval()
if torch.cuda.is_available():
# half() turns predictions into float16 tensors
# which significantly lowers inference time
model.half().to(device)
return model
model = load_model()
随着模型的加载,让我们创建一个run_inference() 方法,接受一个指向我们系统中的文件的字符串。该方法将使用OpenCV读取图像(cv2 ),用letterbox() ,对其进行变换,并将其变成一个批处理(该模型的训练和期望批处理,如常)。
def run_inference(url):
image = cv2.imread(url) # shape: (480, 640, 3)
# Resize and pad image
image = letterbox(image, 960, stride=64, auto=True)[0] # shape: (768, 960, 3)
# Apply transforms
image = transforms.ToTensor()(image) # torch.Size([3, 768, 960])
# Turn image into batch
image = image.unsqueeze(0) # torch.Size([1, 3, 768, 960])
output, _ = model(image) # torch.Size([1, 45900, 57])
return output, image
在这里,我们已经返回了转换后的图像(因为我们想提取原始图像并在上面绘图)和模型的输出。这些输出包含45900个关键点的预测,其中大部分是重叠的。我们要对这些原始预测进行非最大抑制,就像物体检测预测一样(预测了许多边界框,然后根据一些置信度和IoU阈值将它们 "折叠 "起来)。在压制之后,我们可以将每个关键点绘制在原始图像上并显示出来。
def visualize_output(output, image):
output = non_max_suppression_kpt(output,
0.25, # Confidence Threshold
0.65, # IoU Threshold
nc=model.yaml['nc'], # Number of Classes
nkpt=model.yaml['nkpt'], # Number of Keypoints
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进行计算机视觉的实用深度学习".
又是一个计算机视觉课程?
我们不会对MNIST的数字或MNIST的时尚进行分类。它们在很久以前就已经发挥了作用。太多的学习资源都集中在基本数据集和基本架构上,然后再让先进的黑盒架构来承担性能的负担。
我们希望把重点放在解密、实用、理解、直觉和真实项目上。想了解你如何能有所作为吗?我们将带你从我们的大脑处理图像的方式到为乳腺癌写一个研究级的深度学习分类器,再到 "产生幻觉 "的深度学习网络,通过实际工作教你原理和理论,让你掌握诀窍和工具,成为应用深度学习解决计算机视觉的专家。
里面有什么?
- 视觉的首要原则以及如何教会计算机 "看"。
- 计算机视觉的不同任务和应用
- 使你的工作更容易的行业工具
- 寻找、创建和利用计算机视觉的数据集
- 卷积神经网络的理论和应用
- 处理数据集中的领域转移、共同发生和其他偏见
- 转移学习和利用他人的训练时间和计算资源为你服务
- 构建和训练一个最先进的乳腺癌分类器
- 如何对主流观点采取健康的怀疑态度并理解广泛采用的技术的含义
- 使用t-SNE和PCA可视化ConvNet的 "概念空间"。
- 公司如何使用计算机视觉技术取得更好结果的案例研究
- 正确的模型评估、潜空间可视化和识别模型的注意力
- 进行领域研究,处理自己的数据集和建立模型测试
- 尖端的架构,想法的进展,它们的独特之处以及如何实现它们
- KerasCV--一个用于创建最先进的管道和模型的WIP库
- 如何解析和阅读论文并自己实现它们
- 根据你的应用选择模型
- 创建一个端到端的机器学习管道
- 使用Faster R-CNNs、RetinaNets、SSDs和YOLO进行物体检测的景观和直觉
- 实例和语义分割
- 用YOLOv5进行实时物体识别
- 训练YOLOv5物体检测器
- 使用KerasNLP(业界强大的WIP库)与变形器一起工作
- 将变形器与ConvNets整合,生成图像的标题
- 深度梦想
- 用于计算机视觉的深度学习模型优化
