草庐IT

一文带你了解时下最新的目标检测模型——YOLOv8

朱先忠 2023-03-29 原文

​译者| 朱先忠

审校 | 孙淑娟

YOLOv8是什么?

YOLOv8是Ultralytics公司推出的基于对象检测模型的YOLO最新系列,它能够提供截至目前最先进的对象检测性能。

借助于以前的YOLO模型版本支持技术,YOLOv8模型运行得更快、更准确,同时为执行任务的训练模型提供了统一的框架,这包括:

  • 目标检测
  • 实例分割
  • 图像分类

在撰写本文时,Ultralytics的YOLOv8存储库中其实还有很多功能有待添加,这包括训练模型的整套导出功能等。此外,Ultralytics将计划在Arxiv上发布一篇相关的论文,将对YOLOv8与其他最先进的视觉模型进行比较。

YOLOv8的新功能

Ultralytics为YOLO模型发布了一个全新的存储库(https://github.com/ultralytics/ultralytics)。该存储库被构建为用于训练对象检测、实例分割和图像分类模型的统一框架。

以下列举的是这个新版本的一些关键功能:

  • 用户友好的API(命令行+Python)。
  • 更快、更准确。
  • 支持:
  1. 目标检测,
  2. 实例分割和
  3. 图像分类。
  • 可扩展到所有以前的版本。
  • 新的骨干网络。
  • 新的Anchor-Free head对象检测算法。
  • 新的损失函数。

此外,YOLOv8也非常高效和灵活,它可以支持多种导出格式,而且该模型可以在CPU和GPU上运行。

YOLOv8中提供的子模型

YOLOv8模型的每个类别中共有五个模型,以便共同完成检测、分割和分类任务。其中,YOLOv8 Nano是最快和最小的模型,而YOLOv8Extra Large(YOLOv8x)是其中最准确但最慢的模型。

YOLOv8这次发行中共附带了以下预训练模型:

  • 在图像分辨率为640的COCO检测数据集上训练的对象检测检查点。
  • 在图像分辨率为640的COCO分割数据集上训练的实例分割检查点。
  • 在图像分辨率为224的ImageNet数据集上预处理的图像分类模型。

下面,让我们来看看使用YOLOv8x进行检测和实例分割模型的输出效果,请参考下面的gif动画。

如何使用YOLOv8?

为了充分发挥出YOLOv8的潜力,需要从存储库以及ultralytics包中安装相应的需求。

要安装这些需求,我们首先需要克隆一下该模型的存储库,命令如下:

git clone https://github.com/ultralytics/ultralytics.git

接下来,安装需求配置文件:

pip install -r requirements.txt

在最新版本中,Ultralytics YOLOv8同时提供了完整的命令行界面(CLI)API和Python SDK,用于执行训练、验证和推理任务。

为了使用yolo命令行界面(CLI),我们需要安装ultralytics包,命令如下:

pip install ultralytics

如何通过命令行界面(CLI)使用YOLOv8?

安装必要的软件包后,我们可以使用yolo命令访问YOLOv8 CLI。以下给出的是使用yolo CLI运行对象检测推断的命令行代码示例:

yolo task=detect \
mode=predict \
model=yolov8n.pt \
source="image.jpg"

其中,task参数可以接受三个参数值:detect、classify和segment,分别对应于检测、分类和分段三种任务。类似地,mode参数可以有三个取值,分别是train、val或predict。此外,在导出训练模型时,我们也可以将mode参数指定为export。

有关所有可能的yolo CLI标志和参数,有兴趣的读者可参考链接https://docs.ultralytics.com/config/。

如何通过Python API使用YOLOv8?

除了通过上面CLI方式使用YOLOv8外,我们还可以创建一个简单的Python文件,导入YOLO模块并执行我们选择的任务。

from ultralytics import YOLO
model = YOLO("yolov8n.pt") # 加载一个预训练的YOLOv8n模型
model.train(data="coco128.yaml") #训练模型
model.val() # 评估验证集上的模型性能
model.predict(source="https://ultralytics.com/images/bus.jpg") #对图像进行预测
model.export(format="onnx") # 将模型导出为ONNX格式

例如,在上述代码中首先在COCO128数据集上训练YOLOv8 Nano模型,然后在验证集上对其进行评估,最终对样本图像进行预测。

接下来,让我们通过yolo CLI方式来使用对象检测、实例分割和图像分类模型进行推断。

目标检测的推断结果

以下命令实现使用YOLOv8 Nano模型对视频进行检测。

yolo task=detect mode=predict model=yolov8n.pt source='input/video_3.mp4' show=True

该推断的运行硬件环境是在笔记本电脑GTX 1060 GPU上以几乎105 FPS的速度运行的,最终我们得到以下输出结果:

使用YOLOv8 Nano模型进行检测推断

需要说明的是,YOLOv8 Nano模型在几帧内把猫和狗进行了混合。让我们使用YOLOv8 Extra Large模型对同一视频进行检测并检查输出。

yolo task=detect mode=predict model=yolov8x.pt source='input/video_3.mp4' show=True

注意:上面的YOLOv8 Extra Large模型在GTX 1060 GPU上以平均17 FPS的速度运行。

使用YOLOv8超大模型进行检测推断

尽管这一次的误分类略有减少,但模型仍然在一些帧中进行了错误的检测。

实例分割的推理结果

使用YOLOv8实例分割模型运行推理同样是很简单的。我们只需要在上面的命令中更改一下任务和模型名称即可,结果如下:

yolo task=segment mode=predict model=yolov8x-seg.pt source='input/video_3.mp4' show=True

因为实例分割与对象检测是结合在一起的,所以这一次运行时的平均FPS约为13。

使用YOLOv8超大模型进行分割推断

分割图在输出中看起来很干净。即使当猫在最后几帧隐藏在块下时,模型也能够检测并分割它。

图像分类的推理结果

最后,由于YOLOv8已经提供了预训练的分类模型,让我们使用yolov8x-cls模型对同一视频进行分类推断。这是截止目前存储库提供的最大分类模型。

yolo task=classify mode=predict model=yolov8x-cls.pt source='input/video_3.mp4' show=True

使用YOLOv8超大模型进行分类推断

默认情况下,视频用模型预测的前5个类进行标注。在没有任何后期处理的情况下,标注部分直接使用了ImageNet类名。

YOLOv8 vs YOLOv7 vs YOLOv6 vs YOLOv5

可以看出,YOLOv8模型似乎比之前的YOLO模型表现更好;这不仅是相比于YOLOv5模型来说的,YOLOv8也优越于YOLOv7和YOLOv6模型。

YOLOv8与其他YOLO模型性能相比。

由上图可以看出,与以640图像分辨率训练的其他YOLO模型相比,所有YOLOv8模型在参数数量相似的情况下具有更好的吞吐量。

接下来,让我们更为详细了解一下最新的YOLOv8模型与Ultralytics公司的YOLOv5模型的性能差异。下面几个表格显示了YOLOv8和YOLOv5之间的综合比较情况。

总体比较

YOLOv8和YOLOv5之间的性能比较

YOLOv8模型与YOLOv5模型性能比较表

对象检测比较

YOLOv8模型与YOLOv5模型对象检测性能比较情况见下表:

YOLOv8模型与YOLOv5模型对象检测性能比较

实例分段比较

YOLOv8模型与YOLOv5模型实例分段性能比较情况见下表:

YOLOv8与YOLOv5实例分割模型性能比较

图像分类比较

YOLOv8与YOLOv5图像分类模型情况

整体来看,其实也很明显,最新的YOLOv8模型比YOLOv5要好得多,除了一种分类模型外。

YOLOv8目标检测模型的发展

下面给出的这张图像显示了YOLO目标检测模型的时间线以及YOLOv8的演变情况。

YOLOv8目标检测模型的演变情况

YOLOv1模型

YOLO对象检测的第一个版本,即YOLOv1,由Joseph Redmon等人于2015年发布。这是第一个产生SSD和所有后续YOLO模型的单级对象检测(SSD)模型。

YOLO 9000(第2版)

YOLOv2,又称YOLO 9000,由YOLOv1的原作者约瑟夫·雷蒙提出。它改进了原来的YOLOv1模型——引入了锚盒(Anchor Box)的概念和更好的主干(即Darknet-19)。

YOLOv3

2018年,约瑟夫·雷蒙和阿里·法哈迪公布了YOLOv3模型。其实,这不是一个架构上的飞跃,算是一份技术报告,但YOLO家族还是有了很大的进步。YOLOv3模型使用Darknet-53主干、残差连接,并使用更好的预训练和图像增强技术来实现改进。

Ultralytics YOLO目标检测模型

YOLOv3之前的所有YOLO对象检测模型都使用C编程语言编写,并使用Darknet框架。但是,新手们发现很难遍历代码库并对模型进行微调。

于是,大约与YOLOv3模型发布的同时,Ultralytics发布了第一个使用PyTorch框架实现的YOLO(YOLOv3)。这个模型更为容易访问,也更容易用于转移学习领域。

发布YOLOv3模型后不久,约瑟夫·雷蒙离开了计算机视觉(Computer Vision)研究界。YOLOv4(Alexey等人)是最后一个用Darknet编写的YOLO模型。之后,又相继出现了其他许多的YOLO物体检测模型,例如缩放版YOLOv4、YOLOX、PP-YOLO、YOLOv6和YOLOv7代表了其中较为突出的一些模型。

在YOLOv3之后,Ultralytics还发布了YOLOv5,它比所有其他YOLO模型更好、更快、更易于使用。

截至目前(2023年1月),Ultralytics在Ultralytics存储库下发布了YOLOv8,这可能是迄今为止最好的YOLO模型。

结论

在本文中,我们探讨了YOLO模型的最新版本,即YOLOv8。其中,我们具体介绍了这款新模型的性能,以及软件包附带的命令行界面用法。除此之外,我们还对少数几个视频数据进行了推断展示。

在以后的文章中,我们还将在自定义数据集上对YOLOv8模型进行微调。

最后,如果您自己也在进行任何有关YOLOv8模型的实验,请在评论部分告诉我

译者介绍

朱先忠,51CTO社区编辑,51CTO专家博客、讲师,潍坊一所高校计算机教师,自由编程界老兵一枚。

​原文标题:Ultralytics YOLOv8: State-of-the-Art YOLO Models,作者:Sovit Rath​

有关一文带你了解时下最新的目标检测模型——YOLOv8的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  3. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  4. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  5. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  6. ruby-on-rails - 如何将验证与模型分开 - 2

    我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:

  7. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  8. ruby-on-rails - Rails 模型——非持久类成员或属性? - 2

    对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs

  9. ruby-on-rails - Rails - 从另一个模型中创建一个模型的实例 - 2

    我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案

  10. ruby-on-rails - Ruby 中的内存模型 - 2

    ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序

随机推荐