如何使用 YOLOv8 做对象检测

介绍

对象检测是一项计算机视觉任务,涉及识别和定位图像或视频中的对象。它是许多应用的重要组成部分,例如自动驾驶汽车、机器人和视频监控。

多年来,已经开发了许多方法和算法来查找图像中的对象及其位置。卷积神经网络对于此类任务有着非常好的性能和质量。

用于此任务的最流行的神经网络之一是 YOLO,由 Joseph Redmon、Santosh Divvala、Ross Girshick 和 Ali Farhadi 在 2015 年在他们著名的研究论文“You Only Look Once: Unified, Real-Time Object Detection”中创建。

从那时起,YOLO 已经出现了相当多的版本。最近的版本可以做的不仅仅是对象检测,还可做对象分割、对象追踪等、姿势识别等任务,本系列文章展示了如何使用YOLOv8。

本系列文章分为3个大模块:

  1. 如何使用对象识别:我们将使用预先训练的好的模型来检测常见的对象类,比如猫和狗。
  2. 如何训练自己的模型:我将展示如何训练自己的模型来检测您选择的特定对象类型,以及如何准备训练数据。
  3. 应用模型:最后将创建一个 Web 应用程序,使用自定义训练模型直接在 Web 浏览器中检测图像上的对象。

YOLOv8适用场景

YOLOv8可以解决分类、对象检测和图像分割问题。所有这些方法都以不同的方式检测图像或视频中的对象,如下图所示:

分类 检测 分割
  1. 图像分类任务: 识别图像上的对象类别并返回其类型名称和置信度。例如,左侧图像实例中中,它识别是“cat”。并且该预测的置信度为 92% (0.92)。
  2. 对象检测任务:除了获取图片上物体类型名称和置信度之外,还返回物体在图像上的边框,包括位置坐标xy、边框宽度和边框高度。如第二张图所示。此外,对象检测可以检测图像上的多个对象及其边界框。
  3. 图像分割任务:除了识别对象类型和边界框之外,图像分割还可以检测对象的形状,如上述的右图所示。

在本文中,讨论如何使用 YOLOv8 的对象检测, 我将创建一个 Web 应用程序,用它来检测图像上的交通灯和路标。在本系列的后续的其他文章中,我将介绍其他功能,包括图像分割。

YOLOv8 入门

从本质上讲,YOLOv8 是一组卷积神经网络模型,使用 PyTorch 框架。

此外,YOLOv8 提供了 Python API,我们也会利用Python在Jupyter环境中展示内容。

我们在Jupyter中建立对应的notebook,然后过运行以下命令在其中安装 YOLOv8 包:

!pip install ultralytics

接着,导入YOLO包:

from ultralytics import YOLO

现在一切准备就绪,可以创建模型了:

model = YOLO("yolov8m.pt")

YOLOv8 是一组神经网络模型,这些模型使用 PyTorch 创建和训练的,并导出到扩展名为 .pt 的文件。存在三种类型的模型,每种类型有 5 个不同尺寸的模型:

分类 检测 分割 种类
yolov8n-cls.pt yolov8n.pt yolov8n-seg.pt 纳米
yolov8s-cls.pt yolov8s.pt yolov8s-seg.pt
yolov8m-cls.pt yolov8m.pt yolov8m-seg.pt
yolov8l-cls.pt yolov8l.pt yolov8l-seg.pt
yolov8x-cls.pt yolov8x.pt yolov8x-seg.pt 巨大

使用的模型越大,可以实现的预测质量就越好,但运行速度就越慢。在本文中,我使用“yolov8m.pt”,它是用于对象检测的中型模型。

第一次运行此代码时,它将从 Ultralytics 服务器下载 yolov8m.pt 文件到当前文件夹,然后创建 YOLO 对象。现在可以使用该对象完成以下任务:

  • train: 用于在图像数据集上训练模型。
  • predict: 用于对指定图像进行预测,例如检测模型可以在此图像上找到的所有对象的边界框。
  • export: 用于将此模型从默认 PyTorch 格式导出为指定格式。

所有官方的 YOLOv8 模型均已在 COCO 数据集 上进行预训练,该数据集是 80 种类型的图像的大集合。

假设我们有张图像名为"cat_dog.jpg":

运行predict以检测其上的所有对象:

results = model.predict("cat_dog.jpg")

predict 方法接受许多不同的输入类型,包括单个图像的路径、图像路径数组等。

通过模型运行输入后,它会返回每个输入图像的结果数组。由于我们只提供了单个图像,因此它返回一个包含单个项目的数组,可以通过以下方式提取该数组:

result = results[0]

result包含检测到的对象以及使用它们的属性。其中最重要的是 boxes 数组,包含有关图像上检测到的边界框的信息。您可以通过运行 len 函数来确定检测到的对象数量:

len(result.boxes)

当我运行此代码时,输出是“2”,这意味着检测到两个对象。

然后,循环或手动分析每个框。先看第一个:

box = result.boxes[0]

box 对象包

  • 24
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

guohuang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值