YOLOv8目标检测代码如何实现训练、测试、调用摄像头实时检测和追踪的接口调用脚本

实现训练、测试、调用摄像头实时检测和追踪的接口调用脚本

目录

  • 介绍
  • 训练模型
  • 图片测试
  • 视频流测试
  • 目标跟踪
  • 结论

介绍

YOLOv8是单阶段目标检测的集大成之作,它可以帮助我们在图像或视频中自动识别和定位感兴趣的目标物体。本文将介绍如何调用YOLOv8的API实现训练、测试和调用摄像头进行实时检测和追踪。

训练模型

首先,我们需要准备训练数据集和标注文件。将图像文件和相应的标注文件存储在一个文件夹中,并按照一种标准格式进行标注,如YOLO格式或COCO格式。然后,使用目标检测框架提供的训练代码,指定训练参数和路径,开始训练模型。在YOLOv8中使用下面的代码即可实现数据集的自动下载和模型训练。

具体的训练命令取决于您选用的目标检测框架,以下是一个示例:

def train():# 加载模型配置文件,这里使用v8的m模型结构model = YOLO('yolov8m.yaml')# 做预训练# model = YOLO('yolov8x.pt')# model = YOLO('yolov8n.yaml').load('yolov8n.pt')# 训练模型model.train(data="coco.yaml", epochs=100, imgsz=640)

上述代码中加载模型配置文件时,如果加载的是 .yaml 文件格式,采用的是从头训练的方案。如果加载的是 .pt 格式则采用的是对应的预训练方案,这种方式在训练时会额外下载对应模型的预训练权重(如果下载失败可考虑科学上网),在训练模型代码中配置数据集文件data、训练迭代次数epochs和输入图片尺寸imgsz。通过执行上述命令,训练代码将读取图像和标注文件,然后使用指定的配置文件和预训练权重进行模型训练。训练过程可能需要一些时间,具体取决于数据集的大小和计算资源的性能。

图片测试

在训练完成后,我们可以使用训练的模型权重进行测试。以下是测试图片代码:

def test_img():# 训练好的模型权重路径model = YOLO("YOLOv8/runs/detect/train1/weights/best.pt")# 测试图片的路径img = cv2.imread("YOLOv8/7.jpg")res = model(img)ann = res[0].plot()while True:cv2.imshow("yolo", ann)if cv2.waitKey(1) & 0xFF == ord('q'):break# 设置保存图片的路径cur_path = sys.path[0]print(cur_path, sys.path)if os.path.exists(cur_path):cv2.imwrite(cur_path + "out.jpg", ann)else:os.mkdir(cur_path)cv2.imwrite(cur_path + "out.jpg", ann)

视频流测试

使用训练的模型权重进行测试。以下是测试视频代码

def test_video():model = YOLO("YOLOv8/runs/detect/train1/weights/best.pt")# 测试视频存放目录pa = "/home/you/Downloads/l.mp4"cap = cv2.VideoCapture(pa)# 调用设备自身摄像头# cap = cv2.VideoCapture(0) # -1# 设置视频尺寸size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)),)# 第一个参数是将检测视频存储的路径out = cv2.VideoWriter('save.mp4', cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 40, size)while cap.isOpened():ret, frame = cap.read()if ret:res = model(frame)ann = res[0].plot()cv2.imshow("yolo", ann)out.write(ann)if cv2.waitKey(1) & 0xFF == ord('q'):breakcv2.destroyAllWindows()cap.release()

设置检测的视频路径,运行程序,实时保存视频内容,按 q 退出。

目标追踪

def tracker():pa = "/home/you/Downloads/l.mp4"cap = cv2.VideoCapture(pa)size = (int(cap .get(cv2.CAP_PROP_FRAME_WIDTH)),int(cap .get(cv2.CAP_PROP_FRAME_HEIGHT)),)model = YOLO("YOLOv8/runs/detect/train1/weights/best.pt")flag = 0out = cv2.VideoWriter('save.mp4', cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 40, size)while True:if flag<1:flag += 1continueelse:flag +=1ret, frame = cap.read()if not ret:breakresults = model.track(frame, persist=True)boxes = results[0].boxes.xyxy.cpu().numpy().astype(int)# result.boxes.id.cpu().numpy().astype(int)try:ids = results[0].boxes.id.cpu().numpy().astype(int)for box, id in zip(boxes, ids):cv2.rectangle(frame, (box[0], box[1]), (box[2], box[3]), (0, 255, 0), 2)cv2.putText(frame,f"Id {id}",(box[0], box[1]),cv2.FONT_HERSHEY_SIMPLEX,1,(0, 0, 255),2,)except Exception as e:print(e)cv2.imshow("frame", frame)out.write(frame)if cv2.waitKey(1) & 0xFF == ord("q"):break

以上的代码使用默认的botsort进行视频跟踪

结论

本文介绍了如何使用YOLOv8目标检测代码实现训练、测试和调用摄像头进行实时检测和追踪的接口调用脚本。通过按照给定的步骤进行操作,您可以轻松地使用目标检测代码实现这些功能,并将其集成到自己的项目中。一切以YOLOv8的官方参考文件为准。希望本文能为您提供帮助,如果您有任何问题或建议,请随时提出。

以下是完整代码

import netron
import torch
from PIL import Image
import onnx
import sys
import os
import numpy as np
from pathlib import Path
from typing import Union
import cv2
from ultralytics import YOLOdef train():# 加载模型配置文件,这里使用v8的m模型结构model = YOLO('yolov8m.yaml')# 做预训练# model = YOLO('yolov8x.pt')# model = YOLO('yolov8n.yaml').load('yolov8n.pt')# 训练模型model.train(data="coco.yaml", epochs=100, imgsz=640)def onnx():# 使用onnx导出文件# model = YOLO('yolov8n.pt')  # load an official modelmodel = YOLO('YOLOv8/runs/detect/train1/weights/best.pt')  # load a custom trained# Export the modelmodel.export(format='onnx')def test_img():# 训练好的模型权重路径model = YOLO("YOLOv8/runs/detect/train1/weights/best.pt")# 测试图片的路径img = cv2.imread("YOLOv8/7.jpg")res = model(img)ann = res[0].plot()while True:cv2.imshow("yolo", ann)if cv2.waitKey(1) & 0xFF == ord('q'):break# 设置保存图片的路径cur_path = sys.path[0]print(cur_path, sys.path)if os.path.exists(cur_path):cv2.imwrite(cur_path + "out.jpg", ann)else:os.mkdir(cur_path)cv2.imwrite(cur_path + "out.jpg", ann)def test_video():model = YOLO("YOLOv8/runs/detect/train1/weights/best.pt")# 测试视频存放目录pa = "/home/you/Downloads/l.mp4"cap = cv2.VideoCapture(pa)# 调用设备自身摄像头# cap = cv2.VideoCapture(0) # -1# 设置视频尺寸size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)),)# 第一个参数是将检测视频存储的路径out = cv2.VideoWriter('save.mp4', cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 40, size)while cap.isOpened():ret, frame = cap.read()if ret:res = model(frame)ann = res[0].plot()cv2.imshow("yolo", ann)out.write(ann)if cv2.waitKey(1) & 0xFF == ord('q'):breakcv2.destroyAllWindows()cap.release()
def tracker():pa = "/home/you/Downloads/l.mp4"cap = cv2.VideoCapture(pa)size = (int(cap .get(cv2.CAP_PROP_FRAME_WIDTH)),int(cap .get(cv2.CAP_PROP_FRAME_HEIGHT)),)model = YOLO("YOLOv8/runs/detect/train1/weights/best.pt")flag = 0out = cv2.VideoWriter('save.mp4', cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 40, size)while True:if flag<1:flag += 1continueelse:flag +=1ret, frame = cap.read()if not ret:breakresults = model.track(frame, persist=True)boxes = results[0].boxes.xyxy.cpu().numpy().astype(int)# result.boxes.id.cpu().numpy().astype(int)try:ids = results[0].boxes.id.cpu().numpy().astype(int)for box, id in zip(boxes, ids):cv2.rectangle(frame, (box[0], box[1]), (box[2], box[3]), (0, 255, 0), 2)cv2.putText(frame,f"Id {id}",(box[0], box[1]),cv2.FONT_HERSHEY_SIMPLEX,1,(0, 0, 255),2,)except Exception as e:print(e)cv2.imshow("frame", frame)out.write(frame)if cv2.waitKey(1) & 0xFF == ord("q"):break# train()
# test_video()
test_img()
# tracker()
# onnx()# 下面是使用netron导出模型结构
# netron.start("YOLOv8/runs/detect/train1/weights/best.onnx")

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

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

相关文章

mysql的json处理

写在前面 需要注意&#xff0c;5.7以上版本才支持&#xff0c;但如果是生产环境需要使用的话&#xff0c;尽量使用8.0版本&#xff0c;因为8.0版本对json处理做了比较大的性能优化。你你可以使用select version();来查看版本信息。 本文看下MySQL的json处理。在正式开始让我们先…

第三篇-Tesla P40+CentOS7+CUDA 11.7 部署实践

硬件环境 系统&#xff1a;CentOS-7 CPU: 14C28T 显卡&#xff1a;Tesla P40 24G 准备安装 驱动: 515 CUDA: 11.7 cuDNN: 8.9.2.26 安装依赖 yum clean all yum update yum install -y gcc gcc-c pciutils kernel-devel-$(uname -r) kernel-headers-$(uname -r)查看GPU信息…

元类的认识和基础用法

元类 “元类就是深度的魔法&#xff0c;99%的⽤户应该根本不必为此操⼼。 如果你想搞清楚 究竟是否需要⽤到元类&#xff0c;那么你就不需要它。 那些实际⽤到元类的⼈都⾮常 清楚地知道他们需要做什么&#xff0c;⽽且根本不需要解释为什么要⽤元类。“——蒂姆彼得斯TimPeter…

PostgreSQL数据库中,查询时提示表不存在的解决办法

最近遇到一个奇怪的问题&#xff0c;以前从来没有遇到过&#xff0c;在postgres SCHEMA下执行select * from table1语句时&#xff0c;提示表不存在&#xff0c;而实际这个表确是存在的&#xff0c;只不过是在public SCHEMA下。在public SCHEMA下执行这个sql语句是没有问题的。…

【Linux下6818开发板(ARM)】在液晶屏上显示RGB颜色和BMP图片

(꒪ꇴ꒪ ),hello我是祐言博客主页&#xff1a;C语言基础,Linux基础,软件配置领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff01;送给读者的一句鸡汤&#x1f914;&#xff1a;集中起来的意志可以击穿顽石!作者水平很有限&#xff0c;如果发现错误&#x…

C++ 类和对象

面向过程/面向对象 C语言是面向过程&#xff0c;关注过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题 C是基于面对对象的&#xff0c;关注的是对象——将一件事拆分成不同的对象&#xff0c;依靠对象之间的交互完成 引入 C语言中结构体只能定义…

flask处理表单数据

flask处理表单数据 处理表单数据在任何 web 应用开发中都是一个常见的需求。在 Flask 中&#xff0c;你可以使用 request 对象来获取通过 HTTP 请求发送的数据。对于 POST 请求&#xff0c;可以通过 request.form 访问表单数据。例如&#xff1a; from flask import Flask, r…

IDEA中连接虚拟机 管理Docker

IDEA中连接虚拟机 管理Docker &#x1f4d4; 千寻简笔记介绍 千寻简笔记已开源&#xff0c;Gitee与GitHub搜索chihiro-notes&#xff0c;包含笔记源文件.md&#xff0c;以及PDF版本方便阅读&#xff0c;且是用了精美主题&#xff0c;阅读体验更佳&#xff0c;如果文章对你有帮…

【点云处理教程】00计算机视觉的Open3D简介

一、说明 Open3D 是一个开源库&#xff0c;使开发人员能够处理 3D 数据。它提供了一组用于 3D 数据处理、可视化和机器学习任务的工具。该库支持各种数据格式&#xff0c;例如 .ply、.obj、.stl 和 .xyz&#xff0c;并允许用户创建自定义数据结构并在程序中访问它们。 Open3D 广…

KafKa脚本操作

所有操作位于/usr/local/kafka_2.12-3.5.1/bin。 rootubuntu2203:/usr/local/kafka_2.12-3.5.1/bin# pwd /usr/local/kafka_2.12-3.5.1/bin rootubuntu2203:/usr/local/kafka_2.12-3.5.1/bin# ls connect-distributed.sh kafka-delegation-tokens.sh kafka-mirror-mak…

15. Spring AOP 的实现原理 代理模式

目录 1. 代理模式 2. 静态代理 3. 动态代理 3.1 JDK 动态代理 3.2 CGLIB 动态代理 4. JDK 动态代理和 CGLIB 动态代理对比 5. Spring代理选择 6. Spring AOP 实现原理 6.1 织入 7. JDK 动态代理实现 8. CGLIB 动态代理实现 9. 总结 1. 代理模式 代理模式&#xf…

Mac查看系统状态

syatem profiler mac系统中提供了system profiler来查看系统的详细信息&#xff0c;包括硬件、网络以及安装的软件 Console 显示了系统上的日志文件信息&#xff0c;有助于诊断问题 Activity Monitor 可以提供正在运行的系统的相关信息 https://zhhll.icu/2021/Mac/查看系统…

【云原生】一文学会Docker存储所有特性

目录 1.Volumes 1.Volumes使用场景 2.持久将资源存放 3. 只读挂载 2.Bind mount Bind mounts使用场景 3.tmpfs mounts使用场景 4.Bind mounts和Volumes行为上的差异 5.docker file将存储内置到镜像中 6.volumes管理 1.查看存储卷 2.删除存储卷 3.查看存储卷的详细信息…

Java课题笔记~Maven基础

2、Maven 基础 2.1 Maven安装与配置 下载安装 配置&#xff1a;修改安装目录/conf/settings.xml 本地仓库&#xff1a;存放的是下载的jar包 中央仓库&#xff1a;要从哪个网站去下载jar包 - 阿里云的仓库 2.2 创建Maven项目

丁鹿学堂:前端学习进阶指南之react入门(react在html中使用数据绑定和修改)

在html中使用react 今天跟大家分享react的基础语法。 我们采用最简单的方法&#xff0c;就是在html中引入react 因为一上来就使用脚手架的话&#xff0c;很多配置大家不一定清楚。 而在html中使用react的话&#xff0c;可以直接去学习react最基本的语法。 这是零基础学习r…

MySQL数据库 【索引事务】

目录 一、概念 二、索引的优缺点 1、索引的优点 2、索引的缺陷 三、索引的使用 1、查看索引 2、创建索引 3、删除索引 四、索引底层的数据结构 1、B树 2、B树 五、索引事务 1、概念和回滚 2、事务的使用 3、事务的基本特性 4、并发会遇到的问题 &#xff08…

jenkins执行jmeter时,报Begin size 1 is not equal to fixed size 5

jenkins执行jmeter脚本的时候一直提示如下错误&#xff1a; Tidying up ... Fri Jul 28 17:03:53 CST 2023 (1690535033178) Error generating the report: org.apache.jmeter.report.dashboard.GenerationException: Error while processing samples: Consumer failed wi…

游游的排列构造

示例1 输入 5 2 输出 3 1 5 2 4 示例2 输入 5 3 输出 2 1 4 3 5 #include<bits/stdc.h> using namespace std; typedef long long ll; const int N1e55; int n,k; int main(){scanf("%d%d",&n,&k);int xn-k1;int yn-k;int f1;for(int i1;i&l…

LLVM框架系统

Getting Started with LLVM Core Libraries 参考1 LLVM是构架编译器(compiler)的框架系统&#xff0c;以C编写而成&#xff0c;用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time)&#xff0c;对开…

P1162 填涂颜色

题目描述 由数字 0 组成的方阵中&#xff0c;有一任意形状闭合圈&#xff0c;闭合圈由数字 1 构成&#xff0c;围圈时只走上下左右 4 个方向。现要求把闭合圈内的所有空间都填写成 2。例如&#xff1a;66 的方阵&#xff08;n6&#xff09;&#xff0c;涂色前和涂色后的方阵如…