使用预训练的 ONNX 格式的 YOLOv8n 模型进行目标检测,并在图像上绘制检测结果

目录

__init__方法:

pre_process方法:

run方法:

filter_boxes方法:

view_img方法:


__init__方法:

    • 初始化类的实例时,创建一个onnxruntime的推理会话,加载名为yolov8n.onnx的模型,并指定使用 CPU 进行推理。
  1. pre_process方法:

    • 接受一个图像路径作为参数。
    • 读取图像并将其从 BGR 颜色空间转换为 RGB 颜色空间。
    • 计算图像的最大边长,创建一个全零的新图像,大小为最大边长的正方形,将原始图像复制到新图像中。
    • 将新图像调整为640x640的大小并归一化,然后增加一个维度并交换维度,以满足模型输入的要求。
    • 计算图像的缩放比例并返回预处理后的图像和缩放比例。
 def pre_process(self,img_path):img=cv2.imread(img_path)img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)max_edge=max(img.shape)h,w,c=img.shapeimg_back=np.zeros((max_edge,max_edge,3),dtype=np.float32)img_back[:h,:w]=imgimg_scale=cv2.resize(img_back,(640,640))/255img_scale=np.expand_dims(img_scale,axis=0)#升维度(1,640,640,3)img_scale=img_scale.transpose(0,3,1,2)#交换维度scale=max_edge/640return img_scale,scale
  1. run方法:

    • 接受一个图像路径作为参数。
    • 调用pre_process方法对图像进行预处理,得到预处理后的图像和缩放比例。
    • 使用预处理后的图像进行模型推理,得到输出结果。
    • 将输出结果传递给filter_boxes方法进行进一步处理。
 def run(self,img_path):img_process,scale=self.pre_process(img_path)input_name=self.session._inputs_meta[0].namesession_out=self.session.run(None,{input_name:img_process})[0][0]#(84,8400)session_out=session_out.transpose(1,0)#8400,84self.filter_boxes(session_out,scale)
  1. filter_boxes方法:

    • 接受模型输出结果和缩放比例作为参数。
    • 遍历模型输出的每一行,提取边界框信息(中心坐标、宽、高)和类别信息。
    • 根据边界框信息计算边界框的四个顶点坐标,并找到最大置信度的类别索引和置信度值。
    • 如果置信度大于 0.6,则将边界框信息、类别索引和置信度值分别添加到对应的列表中。
    • 调用view_img方法显示图像和检测结果。
    def filter_boxes(self,session_out,scale):#cx,cy,w,h,cls(80)boxes=[]confs=[]classes=[]rows=session_out.shape[0]for row in range(rows):infos = session_out[row]cx,cy,w,h=infos[:4]x1=(cx-w//2)*scaley1=(cy-h//2)*scalex2=(cx+w//2)*scaley2=(cy+h//2)*scalecls=infos[4:]idx=np.argmax(cls)conf=cls[idx]if conf>0.6:confs.append(conf)boxes.append((x1,y1,x2,y2))classes.append(idx)self.view_img(img_path,boxes,classes,confs)
  1. view_img方法:

    • 接受图像路径、边界框列表、类别列表和置信度列表作为参数。
    • 读取图像。
    • 遍历边界框列表,对于每个边界框,绘制在图像上,并打印类别和置信度信息。
    • 显示处理后的图像,并等待用户按下任意键退出程序,关闭所有窗口。
    def view_img(self,img_path,boxes,classes,confs):img=cv2.imread(img_path)size=len(boxes)for i in range(size):cls=classes[i]conf=confs[i]x1,y1,x2,y2=boxes[i]x1,y1,x2,y2=int(x1),int(y1),int(x2),int(y2)cv2.rectangle(img,(x1,y1),(x2,y2),color=(0,0,255),thickness=3,lineType=cv2.LINE_AA)print(f'cls={cls},conf={conf}')cv2.imshow('win', img)cv2.waitKey(0)cv2.destroyAllWindows()

所有代码如下:

import cv2
import numpy as np
from ultralytics import YOLO
import onnxruntime as ort
# model=YOLO('yolov8n.pt')
# model.export(format='onnx')
class Onnx:def __init__(self):self.session=ort.InferenceSession('yolov8n.onnx',providers=['CPUExecutionProvider'])pass#创建一个会话def pre_process(self,img_path):img=cv2.imread(img_path)img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)max_edge=max(img.shape)h,w,c=img.shapeimg_back=np.zeros((max_edge,max_edge,3),dtype=np.float32)img_back[:h,:w]=imgimg_scale=cv2.resize(img_back,(640,640))/255img_scale=np.expand_dims(img_scale,axis=0)#升维度(1,640,640,3)img_scale=img_scale.transpose(0,3,1,2)#交换维度scale=max_edge/640passreturn img_scale,scaledef run(self,img_path):img_process,scale=self.pre_process(img_path)input_name=self.session._inputs_meta[0].namesession_out=self.session.run(None,{input_name:img_process})[0][0]#(84,8400)session_out=session_out.transpose(1,0)#8400,84self.filter_boxes(session_out,scale)def filter_boxes(self,session_out,scale):#cx,cy,w,h,cls(80)boxes=[]confs=[]classes=[]rows=session_out.shape[0]for row in range(rows):infos = session_out[row]cx,cy,w,h=infos[:4]x1=(cx-w//2)*scaley1=(cy-h//2)*scalex2=(cx+w//2)*scaley2=(cy+h//2)*scalecls=infos[4:]idx=np.argmax(cls)conf=cls[idx]if conf>0.8:confs.append(conf)boxes.append((x1,y1,x2,y2))classes.append(idx)self.view_img(img_path,boxes,classes,confs)passdef view_img(self,img_path,boxes,classes,confs):img=cv2.imread(img_path)size=len(boxes)for i in range(size):cls=classes[i]conf=confs[i]x1,y1,x2,y2=boxes[i]x1,y1,x2,y2=int(x1),int(y1),int(x2),int(y2)cv2.rectangle(img,(x1,y1),(x2,y2),color=(0,0,255),thickness=3,lineType=cv2.LINE_AA)print(f'cls={cls},conf={conf}')cv2.namedWindow('win',cv2.WINDOW_NORMAL)cv2.imshow('win', img)cv2.waitKey(0)cv2.destroyAllWindows()if __name__ == '__main__':img_path='bus.jpg'ort_infer=Onnx()# ort_infer.pre_process(img_path)ort_infer.run(img_path)

 

 

还可以添加一个nms

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

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

相关文章

C#开发基础之100个常用的C#正则表达式

前言 正则表达式是处理字符串的强大工具,特别是在文本搜索、替换和验证中。本文将100个常用的C#正则表达式进行分类,以帮助我们更快速地找到适合的正则表达式解决方案。 1. 基础匹配 这些正则表达式用于匹配一些基本的字符或字符串模式。 匹配任意字…

利用 Pytest Cache Fixture 实现中间数据缓存

接口自动化过程中,经常会遇到这样一些场景,“请求2需要用到请求1响应的数据”,常见的做法,进行用例依赖或者将请求1的响应结果写入一个文件,用到的时候读取文件。 当然这都不是这篇文章的重点,本片文章主要…

macos MacPort 包管理工具安装和使用

在macos v10.15版本中, xz, python等软件无法使用brew安装, 原因是brew对于旧版本的macos不再支持, 但是我们可以使用另外一个macos下的包管理工具来安装brew无法安装的软件, macport 是一个和brew类似的macos下的一个非常优秀的软件包安装管理工具. MacPort安装前提条件 安…

AR.js 开发与使用指南

1. AR.js 简介 AR.js 是基于 Web 技术的 AR 库,依赖于 WebGL 和 WebRTC,可以在大多数现代浏览器上运行。它的主要优势在于不需要安装任何插件或应用程序,用户只需通过浏览器即可体验 AR 效果。AR.js 提供了 Marker-based(基于标记…

假期学习--对象底层结构和继承链

OC本质底层实现转化其实都是C/C代码。 OC对象的本质就是结构体。 NSObject底层是struct objc_object结构体 ;struct objc_class : objc_object { …省略无关代码 // Class ISA; //ISA(从objc_object继承过来的) Class superclass; //指向其父类 cache_t cache…

【Istio】

Istio 是一个开源的服务网格(Service Mesh)平台,设计用于帮助开发者和运维人员管理、保护和监控微服务架构。随着微服务架构的广泛采用,服务间通信的管理变得越来越复杂。Istio 通过在服务之间插入一个透明的网络层,简…

旅游行业怎么利用C#接口发送短信

旅游企业一般拥有众多的分支机构,同时各地分支机构又有众多下属分散在当地各区的旅游营业报名点,以前传统的解决方案是采用专线、MODEM拔号等方式,专线的成本很高,MODEM拔号更费时,且长途拔号互联成本在多点情况下费用…

企业数据治理之主数据---供应商主数据

一、供应商主数据的定义 供应商是向企业或个人提供商品、服务或资源的个人、公司或其他实体。一般企业内部的供应商有多种,有零部件采购供应商、材料采购供应商、设备采购供应商、外协生产供应商等,而且这些供应商在企业内部有可能有不同的部门负责&…

微前端集成优化:让所有子应用体积更小,加载更快!

简介 随着前端的日益发展,微前端架构越来越受到青睐。它通过将前端应用拆分为多个独立的子应用,每个子应用可以独立开发、部署和运行,从而提升了开发效率和团队协作。目前主流的微前端方案应该是qiankun了。 以笔者公司为例,采用…

基于SpringBoot的在线答疑系统

你好呀,我是计算机专业毕业生,专注于在线教育平台的开发与实现。 开发语言:Java 数据库:MySQL 技术:Java技术 Spring Boot框架 工具:IntelliJ IDEA、Navicat、Maven、Tomcat 系统展示 首页 个人中心…

【C#】【EXCEL】Bumblebee/Components/Analysis/GH_Ex_Ana_CondAverage.cs

Bumblebee/Components/Analysis/GH_Ex_Ana_CondAverage.cs 这段代码定义了一个名为 GH_Ex_Ana_CondAverage 的类,它是一个 Grasshopper 组件。这个组件的主要功能是为 Excel 工作表中的一个范围添加基于平均值的’条件格式’。以下是对这个组件的功能和特点的详细介…

FFmpeg源码:read_packet_wrapper、fill_buffer函数分析

AVIOContext结构体和其相关的函数分析: FFmpeg源码:avio_r8、avio_rl16、avio_rl24、avio_rl32、avio_rl64函数分析 FFmpeg源码:read_packet_wrapper、fill_buffer函数分析 FFmpeg源码:avio_read函数分析 FFmpeg源码&#xff…

scrapy--图片管道-ImagesPipeline

免责声明:本文仅做演示与分享~ 目录 介绍 ImagesPipeline pipelines.py items.py zz.py settings.py 介绍 scrapy 还提供了处理图片、视频、音频等媒体文件的插件,如: - scrapy-images:用于下载和处理图片 - scrapy-video&#xff1…

责任链设计模式详解

责任链设计模式详解 一、定义 责任链设计模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许多个对象有机会处理请求,从而避免请求的发送者和接收者之间的耦合。这种模式将这些对象连接成一条链,并沿着…

提前还房贷结果失败了该怎么办?需要注意哪些?怎么做更顺利?

提前还房贷结果失败了,该怎么办? 1. 满足条件再申请:部分银行对提前还款设有一定的条件和限制,例如需要提前预约,对已还款时间和还款金额也有具体的要求。如果借款人未能满足这些条件,提前还款的申请可能会…

【精选】计算机毕业设计之:基于springboot超市进销存系统

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

Stable Diffusion AI绘画工具的安装与配置(MAC用户)

AI绘画的热潮席卷了整个创意行业,Stable Diffusion作为其中的翘楚,让艺术创作变得前所未有的简单。然而,对于使用Mac电脑用户来说,安装和配置Stable Diffusion可能显得有些棘手。别担心,这份详细的教程将手把手教你如何…

【Material-UI】Select 组件中的 `Auto width`、`Small Size` 和 `Other Props` 详解

文章目录 一、Select 组件概述1. 组件介绍2. Select 组件的基本结构 二、Auto width 属性详解1. Auto width 的作用2. Auto width 属性的基本用法3. Auto width 的实际应用场景 三、Small Size 属性详解1. Small Size 的作用2. Small Size 属性的基本用法3. Small Size 的实际应…

pytorch 数据处理

torch工具类Dataset和DataLoader 对于NN模型训练来说,需要将数据转换成torch识别的数据类型,才能喂给模型。pytorch中,通常使用Dataset和DataLoader这两个工具类来构建数据管道。 Dataset定义了数据集的内容,类似一个列表的数据…

Windows怎么让防火墙开放端口

开放端口的方法 先从控制面板,进入到Windows Defender防火墙 点击高级设置,点击入站规则 点击右边的新建规则,点击端口,点击下一步 选择协议类型和端口号点击下一步即可 查看是否开放端口成功的方法: 进入任务管