yolo导出的onnx怎么使用onnxruntime调用

1.上几篇文件,写了怎样标注数据,获取yolo数据,怎样训练数据。这篇文章写下,怎样使用yolo训练好的网络进行推理,怎样使用onnxruntime调用网络推理。

2.yolo模型训练后推理,主要分两种,一种是使用yolo官方提供的api推理,一种使用onnx模式推理。

3.使用yolo官方的api推理:
###把qimage图片转成mat函数
def CoverQImageToMat(self):
ptr_=self.CurrentImage.constBits() ###用pyqt加载的图片
###QImage内部是按照每个像素4个字节的方式组织数据的,即使最后一个alpha通道没有使用,也用0xff来填充
image_mat_=np.array(ptr_).reshape(self.CurrentImage.height(),self.CurrentImage.width(),4)
image_mat_rgb_=cv2.cvtColor(image_mat_,cv2.COLOR_RGBA2RGB)
return image_mat_rgb_

self.Model=YOLO(‘best.pt’)###加载模型
image_mat_ = self.CoverQImageToMat()###图片转换,把图片转成opencv的mat
results_=self.Model(image_mat_)###推理获取结果
for result_ in results_: #####循环结果
boxes_ = result_.boxes ####获取boxes
for box_ in boxes_: ####循环boxes
x_,y_,w_,h_=box_.xywh[0] ####获取识别到对象的左上角坐标,长,宽
c=box_.cls ####获取属于第几类
cls_=self.Model.names[int©] ####查询类名
self.BoxX.append(float(x_))
self.BoxY.append(float(y_))
self.BoxWidth.append(float(w_))
self.BoxHeight.append(float(h_))
self.BoxClass.append(cls_)

4.yolo官方提供的api推理,可以按照官方文档就可以推理,这里还在讲下导出的onnx模型后,怎么加载推理。

4.1self.Model.export(format=‘onnx’)###把yolo的模型导出成onnx格式

4.2 使用onnxruntime调用onnx推理。首先安装onnxruntime.lib,这里使用的版本是
onnxruntime-1.16.3-cp311-cp311-win_amd64.whl
onnx-1.15.0-cp311-cp311-win_amd64.whl
这两个文件可以到https://pypi.org/收索下载,使用pip离线安装

4.3 代码导入onnxruntime
import onnxruntime as ort
import onnx

self.OnnxModel = ort.InferenceSession(‘best.onnx’)###加载onnx模型

###推理函数

def UseOnnxInference(self):      	  if (self.CurrentImage.width() > 0) & (self.CurrentImage.height() > 0):####清空结果缓存self.BoxY.clear()	self.BoxX.clear()self.BoxWidth.clear()self.BoxHeight.clear()self.BoxClass.clear()#获取onnx模型输入点inputs =self.OnnxModel.get_inputs()len(inputs)input_onnx_=inputs[0]print("Name:",input_onnx_.name)##输入节点名称print("Type:", input_onnx_.type)##数据格式print("Shape:",input_onnx_.shape)###数据维度image_mat_ = self.CoverQImageToMat()  ###图片转换print("ImageMatShape:",image_mat_.shape)####查看图片的维度img_width_ = image_mat_.shape[1]  ###获取图片输入输出img_height_ = image_mat_.shape[0]###获取图片输入输出target_image_height_ = 640###输入到onnx推理的图片大小target_image_width_ = 640###输入到onnx推理的图片大小scale_precentage_=min(target_image_height_/image_mat_.shape[0],target_image_width_/image_mat_.shape[1])image_mat_=cv2.resize(image_mat_,None,fx=scale_precentage_,fy=scale_precentage_)#缩放成onnx推理的图片大小image_np_=np.array(image_mat_)###图片转成np数组print("ImageNpShape:", image_np_.shape)####查看下维度image_np_=image_np_.transpose(2,0,1)##转成通道在前面的维度print("ImageNpShape:", image_np_.shape)image_np_=image_np_.reshape(1,3,640,640)##添加一个新维度print(image_np_[0, 0, 0, 0])print("ImageNpShape:", image_np_.shape)image_np_ = image_np_.astype(np.float32)####把数据转成float32格式image_np_=image_np_/255.0##数据归一化print(image_np_[0, 0, 0, 0])###获取输出点outputs=self.OnnxModel.get_outputs()output_onnx_=outputs[0]print("Name:",output_onnx_.name)###输出节点名称print("Type:",output_onnx_.type)###输出节点格式print("Shape:",output_onnx_.shape)###输出节点维度###运行推理outputs=self.OnnxModel.run(["output0"],{"images":image_np_})len(outputs)###outputs处理output_onnx_=outputs[0][0]print("OutputOnxxShape:",output_onnx_.shape)###转换 行列output_onnx_=output_onnx_.transpose()print("OutputOnxxShape:", output_onnx_.shape)row=output_onnx_[0]print(row)###输出下第一个特征###获取多小行特征rows_=output_onnx_.shape[0]###获取boxsboxs=[]for i in range(rows_):###获取最大概率 对应的indexprob_ = output_onnx_[i][4:].max()if prob_>self.ConfidenceThres:class_id_ = output_onnx_[i][4:].argmax()###前是个特征代表 x中心 y中心 w宽 h高xc_,yc_,w_,h_ = output_onnx_[i][:4]###转换成x1 y1 x2 y2x1_=(xc_-w_/2)/target_image_width_*img_width_y1_=(yc_-h_/2)/target_image_height_*img_height_x2_=(xc_+w_/2)/target_image_width_*img_width_y2_=(yc_ + h_ / 2) / target_image_height_ * img_height_boxs.append([x1_,y1_,x2_,y2_,class_id_,prob_])###去掉重叠的boxboxs.sort(key=lambda x:[5],reverse=True)result_box_=[]lenght_box_=len(boxs)while lenght_box_>0:box_temp_=boxs[0].copy()boxs_temp_ = []##不是重叠的添加进去boxs_temp_for box_ in boxs:###计算intersectionbox1_x1_,box1_y1_,box1_x2_,box1_y2_=box_temp_[:4]box2_x1_, box2_y1_, box2_x2_, box2_y2_ = box_[:4]distance1_=math.sqrt((box1_x1_-box2_x1_)**2+(box1_y1_-box2_y1_)**2)distance2_=math.sqrt((box1_x2_-box2_x2_)**2+(box1_y2_-box2_y2_)**2)if (distance1_<self.Iou)&(distance2_<self.Iou):passelse:boxs_temp_.append(box_)passboxs.clear()###清空原来的for box_ in boxs_temp_:boxs.append(box_)lenght_box_ = len(boxs)result_box_.append(box_temp_)print(len(result_box_))for box_ in result_box_:box1_x1_, box1_y1_, box1_x2_, box1_y2_ = box_[:4]class_id_,prob_=box_[4:]width = box1_x2_-box1_x1_height = box1_y2_-box1_y1_center_x_= (box1_x2_+box1_x1_)/2center_y_ = (box1_y2_+box1_y1_)/2self.BoxX.append(float(center_x_))self.BoxY.append(float(center_y_))self.BoxWidth.append(float(width))self.BoxHeight.append(float(height))if class_id_==0:self.BoxClass.append('head')if class_id_==1:self.BoxClass.append('helmet')if class_id_==2:self.BoxClass.append('person')

4.4这里是一个使用onnx检测安全帽子的demo
https://gitee.com/wenyuanmo/py-qt-load-yolo-or-onnx-check-hat/tree/master

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

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

相关文章

系统设计认知与常用方法(架构设计)

系统设计应该着重解决什么问题、回应哪些关切、如何演进、常用设计方法、如何落地&#xff1f; 系统设计认知 设计是需求与开发的连接点 解决复杂度 本质复杂度&#xff1a;问题本身的固有复杂度&#xff08;不可避免&#xff09;衍生复杂度&#xff1a;解决方法引入的额外…

HTTP相关问题

目录 1.从输入URL到页面展示到底发生了什么&#xff1f; 2.HTTP状态码有哪些&#xff1f; 2.1 2XX(成功状态码) 2.2 3XX(重定向状态码) 2.3 4XX(客户端错误状态码) 2.4 5XX(服务端错误状态码) 3.HTTP 请求头中常见的字段有哪些&#xff1f; 4.HTTP和HTTPS有什么区别&…

vue3-内置组件-Transition

基于状态变化的过渡和动画&#xff08;常用&#xff09; 建议多看几遍~~。然后动手去写写&#xff0c;学编程只有多动手才能有感觉。 内置组件: 它在任意别的组件中都可以被使用&#xff0c;无需注册。 Vue 提供了两个内置组件&#xff0c;可以帮助你制作基于状态变化的过渡和动…

EMC测试介绍

EMC测试介绍 EMC包括电磁干扰(EMI) 和抗电磁干扰(EMS)两个部分。发射干扰传导发射测试极限线以峰值检坡器测量时使用的决策树应用EN55022标准的波形示例测试仪器![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/4580f693ae9a4f84891ece29681c7bf2.png) 辐射发射测试…

如何快速捕获和验证用户软件需求,实现快速迭代

在软件开发过程中&#xff0c;快速捕获和验证用户需求&#xff0c;以及迅速迭代功能&#xff0c;是保持项目敏捷性和用户满意度的关键。下面将介绍一些建议&#xff0c;帮助你在软件开发过程中更有效地满足用户需求。 1. 深入沟通与用户互动 要捕获用户需求&#xff0c;必须与…

Lua可变参数函数

基础规则 lua传入参数给一个function时采用的是“多余部分被忽略&#xff0c;缺少部分有nil补足”的形式&#xff1a; function f(a, b)return a or b endCALL PARAMETERS f(3) a3, bnil f(3, 4) a3, b4 f(3, 4, 5) a3, b4 (5 is discarded) unpack/pack…

CPU对数据库的性能影响

最近做了个CPU性能测试&#xff0c;测试语句如下 select count(*) from test01; ---44537344行数据&#xff0c;大概5.6GB 设置了参数alter system set "_serial_direct_read"never; 避免direct path read 为了避免物理IO的影响&#xff0c;多次反复运行&#xff0c;…

react 之 react.memo

React.memo 作用&#xff1a;允许组件在props没有改变的情况下跳过重新渲染 组件默认的渲染机制 默认机制&#xff1a;顶层组件发生重新渲染&#xff0c;这个组件树的子级组件都会被重新渲染 // memo // 作用&#xff1a;允许组件在props没有改变的情况下跳过重新渲染import…

敏捷开发交付绩效度量

在快速敏捷开发模式下&#xff0c;主要是要求技术能够快速响应&#xff0c;但并不是对质量没有要求&#xff0c;那么在又快又要质量好的前提下&#xff0c;如何去度量&#xff1f; 主要参考文章&#xff0c;软件交付效能度量 - Thoughtworks洞见 说明&#xff1a;如何在敏捷开…

npm淘宝镜像源换新地址

新的淘宝npm镜像源地址&#xff1a;https://registry.npmmirror.com 切换新的镜像源 npm config set registry https://registry.npmmirror.com然后再执行以下操作查看是否成功 npm config list如果没安装过淘宝镜像源的&#xff0c;则直接安装 npm install -g cnpm --regi…

JVM 性能调优 - 参数调优(3)

查看 JVM 内存的占用情况 编写代码 package com.test;public class PrintMemoryDemo {public static void main(String[] args) {// 堆内存总量long totalMemory Runtime.getRuntime().totalMemory();// jvm 试图使用的最大堆内存long maxMemory Runtime.getRuntime().maxM…

【Linux】Linux权限(下)

Hello everybody!在上一篇文章中&#xff0c;权限讲了大部分内容。今天继续介绍权限剩下的内容&#xff0c;希望大家看过这篇文章后都能有所收获&#xff01; 1.更改文件的拥有者和所属组 对于普通用户&#xff0c;文件的拥有者和所属组都无权修改。 、 、 但root可以修改文件…

多账号运营为什么要使用动态住宅代理IP?

对于跨境有多账号运营需求的企业来说&#xff0c;选择正确类型的代理IP对于平稳运行至关重要。但最适合这项工作的代理类型是什么&#xff1f;为了更好地管理不同平台上的多个账户并优化成本&#xff0c;您可以选择动态住宅代理。 一、什么是动态住宅代理 动态住宅代理IP是互联…

图论:合适的环

4979. 合适的环 - AcWing题库 给定一个 n 个点 m 条边的无向图。 图中不含重边和自环。 请你在图中选出一个由三个点组成的环。 设图中一共有 x 条边满足&#xff1a;不在选择的环内&#xff0c;且与选择的环内某个点相连。 我们希望通过合理选环&#xff0c;使得 x 的值尽可能…

创新方案|经济下行周期下企业避免杀价内卷侵蚀利润亟需5种创新定价策略

随着通胀持续、全球经济衰退逆风让消费者谨慎支出&#xff0c;绝大多数企业都担心如何刺激购买且保持利润率。在本研究认为&#xff0c;公司不应该简单地调整价格&#xff0c;而应该创造性地借鉴其他行业定价打法&#xff0c;通过创新定价选项的组合&#xff0c;增加向客户计价…

LLM之RAG实战(二十二)| LlamaIndex高级检索(一)构建完整基本RAG框架(包括RAG评估)

在RAG&#xff08;retrieval Augmented Generation&#xff0c;检索增强生成&#xff09;系统中&#xff0c;检索到文本的质量对大型语言模型生成响应的质量是非常重要的。检索到的与回答用户查询相关的文本质量越高&#xff0c;你的答案就越有根据和相关性&#xff0c;也更容易…

QMUI_Android:提升Android开发效率与质量的利器

QMUI_Android&#xff1a;提升Android开发效率与质量的利器 在Android应用开发过程中&#xff0c;开发者常常面临着重复编写基础组件和处理兼容性问题的挑战&#xff0c;这不仅耗费时间&#xff0c;也降低了开发效率。为了解决这一问题&#xff0c;Tencent推出了QMUI_Android框…

突破编程_C++_面试(基础知识(7))

面试题16&#xff1a;什么是引用&#xff0c;它与指针有什么区别 引用是变量的别名。对于变量名而言&#xff0c;C 实际上对其是不作存储的&#xff0c;在汇编以后不会出现变量名&#xff0c;变量名作用只是用于方便编译器成汇编代码&#xff0c;是给编译器看的&#xff0c;同…

LeetCode、17. 电话号码的字母组合【中等,dfs回溯】

文章目录 前言LeetCode、17. 电话号码的字母组合【中等&#xff0c;dfs回溯】题目与类型思路递归回溯优化&#xff1a;StringBuilder来回溯补充代码&#xff1a;2024.1.31&#xff08;简化&#xff09; 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博…

C++类和对象:运算符重载

左移运算符重载&#xff1a; class Person {friend ostream& operator<<(ostream& cout, Person& p); public:Person();~Person();static int m_age;void showperson() const{cout << this->m << endl;}int m_A;int m_B;Person operator(Per…