​目标检测:如何有效实现YOLOv8

news2024/12/22 13:40:57

本文是一篇实用指南,介绍了如何使用命令行界面和Python来对图像、视频和实时网络摄像头中的物体进行检测。

介绍

目标检测是计算机视觉的一个子领域,主要涉及在图像或视频中以一定的置信度识别和定位物体。识别出的物体通常带有一个边界框,提供了关于物体在场景中的性质和位置的信息。

自2015年YOLO(You Only Look Once)问世以来,它的系统以惊人的准确性和速度实现了实时目标检测,震惊了计算机视觉领域。自那时以来,YOLO已经进行了多次改进,提高了预测准确性和效率,最终推出了最新的成员:Ultralytics的YOLOv8。

YOLOv8有五个版本:nano(n)、small(s)、medium(m)、large(l)和extra large(x)。它们的改进分别可以通过它们在COCO val2017数据集上的平均精度(mAP)和延迟进行评估。

72939a48bd6734062d17b56bcbb94478.png

与以前的版本相比,YOLOv8不仅更快、更准确,而且实现这一性能所需的参数更少,而且还配备了直观易用的命令行界面(CLI)和Python软件包,为用户和开发人员提供更无缝的体验。

在本文中,我将演示如何使用CLI和Python来应用YOLOv8来检测静态图像、视频和实时网络摄像头中的物体。

安装

要开始使用YOLOv8,您只需要在终端中运行以下命令即可:

pip install ultralytics

这将通过ultralytics pip包安装YOLOv8。

图像检测

静态图像中的目标检测在各种领域(如监控、医学成像或零售分析)中已被证明是有用的。无论您选择在哪个领域应用您的检测系统,YOLOv8都使您可以轻松实现。下面是我们要对其进行目标检测的原始图像:一张拥挤城市中的交通照片。

4323e79569980b3edd6825e8b5a56f44.png

为了运行YOLOv8,我们将研究CLI和Python两种实现方式。虽然在这种特定情况下我们将使用jpg图像,但YOLOv8支持各种不同的图像格式。

CLI

假设我们想在一张图片上运行超大型的YOLOv8x(我们将其命名为img.jpg),则可以在CLI中输入以下命令:

yolo detect predict model=yolov8x.pt source="img.jpg" save=True

在这里,我们指定以下参数:detect用于物体检测,predict用于执行预测任务,model用于选择模型版本,source用于提供我们图片的文件路径,save用于保存处理过的图片及其对象的边界框以及它们的预测类别和类别概率。

Python

在Python中,可以使用以下直观且低代码的解决方案实现完全相同的任务:

from ultralytics import YOLO


model = YOLO('yolov8x.pt')
results = model('img.jpg', save=True)

无论是使用CLI还是Python,在任一情况下,保存的处理后的图像如下所示:

b4847c77eb822abb9366159a43e9ecd0.png

我们可以清楚地看到它检测到的每个对象周围的边界框,以及它们对应的类标签和概率。

视频检测

在视频文件上执行对象检测与图像文件几乎相同,唯一的区别是源文件格式。与图像一样,YOLOv8支持各种不同的视频格式,可以作为模型的输入进行处理。在我们的情况下,我们将使用mp4文件。

让我们再次看一下CLI和Python实现。为了更快的计算,我们现在将使用YOLOv8m模型,而不是特别大的版本。

CLI

yolo detect predict model=yolov8m.pt source="vid.mp4" save=True

python

from ultralytics import YOLO


model = YOLO('yolov8m.pt')
results = model('vid.mp4', save=True)

首先,在进行物体检测之前,让我们检查一下我们的原始 vid.mp4 文件:

b9fbb91fe660695bea74a5747e1ee5ac.png

视频显示了一个繁忙的城市场景,包括汽车、公交车、卡车和骑自行车的人,以及右侧的一些人显然在等公交车。在使用 YOLOv8 的中等版本处理此文件后,我们得到了以下结果。

7c0b21f7cfc0d35e77d4b6f4ec281d7b.png

同样,我们可以看到 YOLOv8m 在准确捕捉场景中的对象方面做得非常好。它甚至可以检测到作为较大整体的一部分的较小的物体,例如骑自行车的人佩戴的背包。

实时检测

最后,让我们看一下在实时网络摄像头视频中检测对象所需的内容。为此,我将使用我的个人网络摄像头,就像之前一样,既有 CLI 方法,也有 Python 方法。为了减少延迟并减少视频中的滞后,我将使用轻量级的 YOLOv8 的纳米版本。

CLI

yolo detect predict model=yolov8n.pt source=0 show=True

这些参数大部分与我们上面看到的用于图像和视频文件的参数相同,唯一不同的是source参数,它允许我们指定要使用哪个视频源。在我的情况下,它是内置网络摄像头(0)。

python

from ultralytics import YOLO


model = YOLO('yolov8n.pt')
model.predict(source="0", show=True)

同样,我们可以使用超低代码的Python解决方案执行相同的任务。

这里有一张 YOLOv8n 在实时网络摄像头源上的示例图。

b3ceb8911d58b4bf93b9fc4409f2611d.png

太棒了!尽管视频质量较低,光照条件不佳,YOLOv8仍然能够很好地捕捉到对象,甚至还能检测到背景中的一些物体,例如左侧的橄榄油和醋瓶以及右侧的水槽。

值得注意的是,尽管这些直观的CLI命令和低代码Python解决方案是快速开始对象检测任务的好方法,但它们在进行自定义配置时存在一定的局限性。例如,如果我们想要配置边界框的美学效果或执行简单的任务,例如计算和显示在任何给定时间检测到的对象数量,我们将不得不使用诸如cv2或supervision等包来编写自己的自定义实现。

实际上,上面的网络摄像头录像是使用以下Python代码记录的,以调整网络摄像头的分辨率和自定义定义边界框及其注释。(注:这主要是为了使上面的GIF更具表现力。上面显示的CLI和Python实现足以产生类似的结果。)

import cv2
import supervision as sv
from ultralytics import YOLO




def main():
    
    # to save the video
    writer= cv2.VideoWriter('webcam_yolo.mp4', 
                            cv2.VideoWriter_fourcc(*'DIVX'), 
                            7, 
                            (1280, 720))
    
    # define resolution
    cap = cv2.VideoCapture(0)
    cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)


    # specify the model
    model = YOLO("yolov8n.pt")


    # customize the bounding box
    box_annotator = sv.BoxAnnotator(
        thickness=2,
        text_thickness=2,
        text_scale=1
    )




    while True:
        ret, frame = cap.read()
        result = model(frame, agnostic_nms=True)[0]
        detections = sv.Detections.from_yolov8(result)
        labels = [
            f"{model.model.names[class_id]} {confidence:0.2f}"
            for _, confidence, class_id, _
            in detections
        ]
        frame = box_annotator.annotate(
            scene=frame, 
            detections=detections, 
            labels=labels
        ) 
        
        writer.write(frame)
        
        cv2.imshow("yolov8", frame)


        if (cv2.waitKey(30) == 27): # break with escape key
            break
            
    cap.release()
    writer.release()
    cv2.destroyAllWindows()
    
if __name__ == "__main__":
    main()

虽然这些代码的细节超出了本文的范围,但以下是一个很好的参考,使用了类似的方法,如果您有兴趣提高自己的对象检测能力:

https://youtu.be/QV85eYOb7gk

结论

YOLOv8不仅在准确性和速度方面优于其前身,而且还通过极易使用的CLI和低代码Python解决方案大大提高了用户体验。它还提供五种不同的模型版本,使用户有机会根据其个人需求和对延迟和准确性的容忍度进行选择。

无论您的目标是在静态图像、视频或现场网络摄像头上执行对象检测,YOLOv8都能够以无缝的方式完成。但是,如果您的应用程序需要自定义配置,则可能需要使用其他计算机视觉包,例如cv2和supervision。

·  END  ·

HAPPY LIFE

d1a3d5f3aa012d535808b7522af774d1.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/527001.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c++ 11标准模板(STL) std::set(三)

定义于头文件 <set> template< class Key, class Compare std::less<Key>, class Allocator std::allocator<Key> > class set;(1)namespace pmr { template <class Key, class Compare std::less<Key>> using se…

如何使用chatgpt生成精美PPT提高工作效率

本教程收集于:AIGC从入门到精通教程 如何快速生成精美PPT提高工作效率 一、ChatGPT生成markdown源代码 二、Mindshow登录/注册 三、导入markd

Redis缓存架构详解

文章目录 Redis缓存结构详解前言Redis 缓存架构redis 和db数据一致性先写db还是写redis如果是先写db,再删除缓存呢&#xff1f;延迟双删 简单的缓存,并发不高,没啥流量简单的缓存,并发高,但是存在redis和 Db 双写不一致,读写并发不一致问题解决方案 1解决方案 2解决方案 3读写锁…

Linux常用命令——iconv命令

在线Linux命令查询工具 iconv 转换文件的编码方式 补充说明 iconv命令是用来转换文件的编码方式的&#xff0c;比如它可以将UTF8编码的转换成GB18030的编码&#xff0c;反过来也行。JDK中也提供了类似的工具native2ascii。Linux下的iconv开发库包括iconv_open,iconv_close,…

《程序员面试金典(第6版)》面试题 16.22. 兰顿蚂蚁(哈希映射,C++)

题目描述 一只蚂蚁坐在由白色和黑色方格构成的无限网格上。开始时&#xff0c;网格全白&#xff0c;蚂蚁面向右侧。每行走一步&#xff0c;蚂蚁执行以下操作。传送门 (1) 如果在白色方格上&#xff0c;则翻转方格的颜色&#xff0c;向右(顺时针)转 90 度&#xff0c;并向前移动…

【Vue2.0源码学习】虚拟DOM篇-Vue中的虚拟DOM

文章目录 1. 前言2. 虚拟DOM简介3. Vue中的虚拟DOM3.1 VNode类3.2 VNode的类型3.2.1 注释节点3.2.2 文本节点3.2.3 克隆节点3.2.4 元素节点3.2.5 组件节点3.2.6 函数式组件节点3.2.7 小结 3.3 VNode的作用 4. 总结 1. 前言 虚拟DOM&#xff0c;这个名词作为当下的前端开发人员…

Android Studio Flamingo (火烈鸟) 升级踩坑记录

由于想要验证Compose最新的debug特性&#xff0c;而我目前使用的版本&#xff08;Dolphin 小海豚&#xff09;不支持&#xff0c;查看官网说明需要最新版本&#xff0c;所以不得已进行了一下Android Studio版本升级&#xff0c;过程中遇到一些问题&#xff0c;本文仅做记录。&a…

FPGA驱动WM8731音频收发全网最细讲解 提供2套工程源码和技术支持

目录 1、前言2、WM8731音频解读3、vivado工程1介绍4、vivado工程2介绍5、上板调试验证6、资料获取 1、前言 本文用FPGA驱动WM8731音频芯片&#xff0c;实现音频相关的应用&#xff0c;适用于在校学生做毕业设计、研究生项目开发&#xff0c;也适用于在职工程师做项目开发&…

Ae 首选项:启动和修复

使用“首选项”里面的启动和修复 Start and Repair面板&#xff0c;可以解决 Ae 中的首选项设置问题&#xff0c;而无需更改、删除或者重新进行设置。 启动选项 Startup Options 启用主屏幕 Enable Home Screen 确定是否在启动 Ae 时显示主屏幕。 更改将在下次启动时有效。 显示…

element-plus 问题

对话框内部下拉框会在左上角 在对话框内打开下拉框后点击关闭按钮&#xff0c;尚未关闭的下拉框会在左上角出现&#xff08;或闪现&#xff09; 解决方案&#xff1a; popper-append-to-body 此方法失效&#xff0c;改用 :teleported"false" teleported&#xff1a;…

JDBC和数据库连接池

文章和代码已经归档至【Github仓库&#xff1a;https://github.com/timerring/java-tutorial 】或者公众号【AIShareLab】回复 java 也可获取。 文章目录 JDBC 概述基本介绍模拟JDBCJDBC 带来的好处 JDBC 快速入门JDBC 程序编写步骤JDBC 第一个程序 获取数据库连接5种方式方式1…

接入 GPT-4 的 AI 虚拟女友,一周狂挣 50 万!

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; 随着 ChatGPT 的爆火&#xff0c;互联网上也衍生出不少令人直呼脑洞大开的 AI 应用。 最近&#xff0c;国外一位名为 Caryn Marjorie 的小姐姐搞了个骚操作&#xff0c;基于 GPT-4 调教出来…

Spring Cloud LoadBalancer是什么?

什么是Spring Cloud LoadBalancer Spring Cloud LoadBalancer是Spring Cloud官方自己提供的客户端负载均衡器, 用来替代 Ribbon。 Spring官方提供了两种负载均衡的客户端&#xff1a; RestTemplate RestTemplate是Spring提供的用于访问Rest服务的客户端&#xff0c;RestTempla…

30从零开始学Java之详解面向对象的7种创建方式

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在上一篇文章中&#xff0c;壹哥给大家介绍了Java中的类及其特点、创建过程等内容&#xff0c;相信你…

【Nginx高级篇】Lua基础语法和OpenResty的安装

目录 一、前言 二、Lua基础语法 hello world 保留关键字 注释 变量 字符串 空值 布尔类型 作用域 控制语句 if-else for循环 函数 赋值 返回值 Table 数组 遍历 成员函数 三、openresty的安装 &#xff08;一&#xff09;预编译安装 &#xff08;二&…

VMware中Ubuntu拓展磁盘容量的两种方式 图形化方式命令行磁盘分区方式(亲测有效简单且详细)linux磁盘分区

文章目录 前言1. 软件设置扩容2. 容量查看3. 容量拓展实现3.1 图形化容量拓展分配3.2 磁盘命令行方式拓展容量3.2.1 确定磁盘挂载目录3.2.2 系统磁盘扩容 4. 分盘扩容TIPS&#xff1a;总结&#xff1a; 前言 在用VMware虚拟机的情况下&#xff0c;一开始分配的容量在使用过程中…

PMP项目管理-[第十二章]采购管理

采购管理知识体系&#xff1a; 规划采购管理&#xff1a; 实施采购&#xff1a; 控制采购&#xff1a; 12.1 规划采购管理 定义&#xff1a;记录项目采购决策、明确采购方法、识别潜在卖方的过程 作用&#xff1a;确定是否从项目外部获取货物或服务.如果是&#xff0c;则还要确…

循环结构程序设计

一、循环结构语句 C语言提供了三种循环语句&#xff08;for语句&#xff09;、while语句和do-while语句。 for语句&#xff1a; for(表达式1 &#xff1b; 表达式2 &#xff1b; 表达式3) {   循环体语句&#xff1b; } for语句的执行过程&#xff1a; 首先计算表达式1。判断…

【LED子系统】五、核心层详解(二)

个人主页&#xff1a;董哥聊技术 我是董哥&#xff0c;高级嵌入式软件开发工程师&#xff0c;从事嵌入式Linux驱动开发和系统开发&#xff0c;曾就职于世界500强公司&#xff01; 创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01; 文章目录…

基于B/S架构、可替代付费商业软件的一站式量化交易平台

产品简介 这是一个面向程序员的量化交易软件&#xff0c;用于期货、股票、外汇、炒币等多种交易场景&#xff0c;实现自动交易。已对接了CTP接口&#xff08;国内期货&#xff09;、老虎证券接口&#xff08;美股港股&#xff09;。 功能特性&#xff1a; 一站式平台&#x…