如何用YOLOv5和PyTorch在Python中进行物体检测推理

305 阅读7分钟

简介

物体检测是计算机视觉的一个大领域,也是计算机视觉在 "野外 "的更重要的应用之一。一方面,它可以用来建立自主系统,在环境中为代理人导航--无论是执行任务的机器人还是自动驾驶汽车,但这需要与其他领域交叉。然而,异常检测(如生产线上的缺陷产品)、定位图像内的物体、面部检测和其他各种物体检测的应用都可以在不与其他领域交叉的情况下完成。

建议这个简短的指南是基于我们的课程中关于物体检测的一个更大的课程的一小部分。 "用Python进行计算机视觉的实用深度学习"课程的一小部分。

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

这使得物体检测在某种程度上更加复杂,通常更加冗长(但并不总是这样),而且不如图像分类那样容易接近。处于一个生态系统中的主要好处之一是,它为你提供了一种方法,使你不需要搜索关于良好做法、工具和使用方法的有用信息。对于物体检测--大多数人必须对该领域的景观做更多的研究,以获得一个好的把握。

幸运的是,Ultralytics已经围绕他们的YOLOv5实现开发了一个简单、非常强大和漂亮的对象检测API。

在这个简短的指南中,我们将在Python中进行物体检测,使用Ultralytics在PyTorch中构建的YOLOv5,使用一套在MS COCO上训练的预训练权重。

YOLOv5

*YOLO(You Only Look Once)*是一种方法,也是为物体检测建立的模型系列。自2015年成立以来,YOLOv1、YOLOv2(YOLO9000)和YOLOv3都是由同一作者提出的--在接下来的几年里,深度学习社区继续进行开源的改进。

Ultralytics的YOLOv5是YOLO在PyTorch中的第一个大规模实现,这使得它比以前更容易获得,但YOLOv5获得如此地位的主要原因也是围绕它建立的漂亮的简单而强大的API。该项目抽象了不必要的细节,同时允许自定义,几乎所有可用的导出格式,并采用了惊人的做法,使整个项目既高效又尽可能地优化。诚然,这是一个开源软件实施之美的例子,以及它如何为我们生活的世界提供动力。

该项目在MS COCO上提供了预训练的权重,这是一个关于上下文中的物体的主要数据集,可用于基准测试和建立一般的物体检测系统,但最重要的是,可用于将上下文中的物体的一般知识转移到自定义数据集。

用YOLOv5进行物体检测

在前进之前,确保你已经安装了torchtorchvision

! python -m pip install torch torchvision

YOLOv5有详细的、无意义的文档和漂亮的简单API,如 repo本身和下面的例子所示。

import torch
# Loading in yolov5s - you can switch to larger models such as yolov5m or yolov5l, or smaller such as yolov5n
model = torch.hub.load('ultralytics/yolov5', 'yolov5s')
img = 'https://i.ytimg.com/vi/q71MCWAEfL8/maxresdefault.jpg'  # or file, Path, PIL, OpenCV, numpy, list
results = model(img)
fig, ax = plt.subplots(figsize=(16, 12))
ax.imshow(results.render()[0])
plt.show()

hub.load() 方法的第二个参数指定了我们想要使用的权重。通过选择yolov5nyolov5l6 之间的任何地方 - 我们正在加载MS COCO预训练的权重。对于自定义模型。

model = torch.hub.load('ultralytics/yolov5', 'custom', path='path_to_weights.pt')

在任何情况下--一旦你把输入信息传递给模型,返回的对象包括有用的方法来解释结果,我们选择了render() ,它返回一个NumPy数组,我们可以把它夹在imshow() 。这样做的结果是一个很好的格式化。

将结果保存为文件

你可以使用results.save() 方法将推理的结果保存为文件。

results.save(save_dir='results')

这将创建一个新的目录,如果它还没有存在的话,并将我们刚刚绘制的同一图像保存为一个文件。

裁剪对象

你也可以决定将检测到的对象裁剪成单独的文件。在我们的例子中,对于检测到的每一个标签,都可以提取一些图像。这很容易通过results.crop() 方法实现,该方法rcreates aruns/detect/ directory, withexpN/crops (where N increases for each run), in which a directory with cropped images is made for each label:

results.crop()
Saved 1 image to runs/detect/exp2
Saved results to runs/detect/exp2

[{'box': [tensor(295.09409),   tensor(277.03699),   tensor(514.16113),   tensor(494.83691)],
  'conf': tensor(0.25112),
  'cls': tensor(0.),
  'label': 'person 0.25',
  'im': array([[[167, 186, 165],
          [174, 184, 167],
          [173, 184, 164],

你也可以用以下方法验证输出文件结构。

! ls runs/detect/exp2/crops
# crops  maxresdefault.jpg

! ls runs/detect/exp2/crops
# backpack   bus   car   handbag   person  'traffic light'   umbrella

对象计数

默认情况下,当你执行检测或打印results 对象时--你会得到对该results 对象进行推理的图像数量(YOLOv5也适用于成批的图像),其分辨率和检测到的每个标签的计数。

print(results)

这就导致了:

image 1/1: 720x1280 14 persons, 1 car, 3 buss, 6 traffic lights, 1 backpack, 1 umbrella, 1 handbag
Speed: 35.0ms pre-process, 256.2ms inference, 0.7ms NMS per image at shape (1, 3, 384, 640)

用脚本进行推理

另外,你可以通过克隆YOLOv5资源库来运行检测脚本,detect.py

$ git clone https://github.com/ultralytics/yolov5 
$ cd yolov5
$ pip install -r requirements.txt

然后运行:

$ python detect.py --source img.jpg

另外,你可以提供一个URL、视频文件、一个有多个文件的目录的路径、一个只匹配某些文件的路径中的glob、一个YouTube链接或任何其他HTTP流。结果将被保存到runs/detect 目录中。

更进一步--计算机视觉的实用深度学习

你好奇的天性使你想更进一步?我们建议查看我们的 课程: "实用计算机视觉深度学习与Python".

另一个计算机视觉课程?

我们不会对MNIST数字或MNIST时尚进行分类。它们在很久以前就已经发挥了作用。太多的学习资源都集中在基本数据集和基本架构上,然后再让先进的黑盒架构来承担性能的负担。

我们希望把重点放在解密实用理解直觉真实项目上。想了解你如何能有所作为吗?我们将带你从我们的大脑处理图像的方式到为乳腺癌写一个研究级的深度学习分类器,再到 "产生幻觉 "的深度学习网络,通过实际工作教你原理和理论,让你掌握诀窍和工具,成为应用深度学习解决计算机视觉的专家。

里面有什么?

  • 视觉的首要原则以及如何教会计算机 "看"。
  • 计算机视觉的不同任务和应用
  • 使你的工作更容易的行业工具
  • 寻找、创建和利用计算机视觉的数据集
  • 卷积神经网络的理论和应用
  • 处理数据集中的领域转移、共同发生和其他偏见
  • 转移学习和利用他人的训练时间和计算资源为你服务
  • 构建和训练一个最先进的乳腺癌分类器
  • 如何对主流观点采取健康的怀疑态度并理解广泛采用的技术的含义
  • 使用t-SNE和PCA可视化ConvNet的 "概念空间"。
  • 公司如何使用计算机视觉技术以取得更好的结果的案例研究
  • 正确的模型评估、潜空间可视化和识别模型的注意力
  • 进行领域研究,处理自己的数据集和建立模型测试
  • 尖端的架构,想法的进展,它们的独特之处以及如何实现它们
  • KerasCV--一个用于创建最先进的管道和模型的WIP库
  • 如何解析和阅读论文并自己实现它们
  • 根据你的应用选择模型
  • 创建一个端到端的机器学习管道
  • 使用Faster R-CNNs、RetinaNets、SSDs和YOLO进行物体检测的景观和直觉
  • 实例和语义分割
  • 用YOLOv5进行实时物体识别
  • 训练YOLOv5物体检测器
  • 使用KerasNLP(业界强大的WIP库)与变形器一起工作
  • 将变形器与ConvNets整合,生成图像的标题
  • DeepDream

结语

在这个简短的指南中,我们看了一下如何使用PyTorch构建的YOLOv5进行物体检测。