onnx检测推理

起因:当我想把检测的onnx模型转换到特定的设备可以使用的模型时,报错do not support dimension size > 4,onnx中有些数据的维度是五维,如图。本文使用的是edgeyolo,它使用的是yolox的head,最后的输出加上grid和乘以stride。我们需要把这些后处理给剥离出来自己写。

在这里插入图片描述

  1. 在导出onnx的时候可以把后处理的那部分注释掉,下图是我的处理方式,只在导出onnx时,myexport=1.。导出完毕后,onnx的结构如图。这样在后续转模型的时候就不会出现do not support dimension size > 4 了。在这里插入图片描述在这里插入图片描述
  2. 得到onnx后,手写后处理,附赠onnx推理代码:
import onnxruntime
import numpy as np
import cv2
import os
import tqdm
# 指定 ONNX 模型文件路径
onnx_model_path = 'my.onnx'
sess = onnxruntime.InferenceSession(onnx_model_path)
strides = [8,16,32]  # 80*80 40*40 20*20
featuremaps = [80,40,20]coco_classes = ['person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck','boat', 'traffic light', 'fire hydrant', 'stop sign', 'parking meter', 'bench','bird', 'cat', 'dog', 'horse', 'sheep', 'cow', 'elephant', 'bear', 'zebra','giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee','skis', 'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove','skateboard', 'surfboard', 'tennis racket', 'bottle', 'wine glass', 'cup','fork', 'knife', 'spoon', 'bowl', 'banana', 'apple', 'sandwich', 'orange','broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch','potted plant', 'bed', 'dining table', 'toilet', 'tv', 'laptop', 'mouse','remote', 'keyboard', 'cell phone', 'microwave', 'oven', 'toaster', 'sink','refrigerator', 'book', 'clock', 'vase', 'scissors', 'teddy bear', 'hair drier','toothbrush'
]def sigmoid(x):return 1 / (1 + np.exp(-x))def get_color(idx):idx += 3return (37 * idx % 255, 17 * idx % 255, 29 * idx % 255)def onnx_infer(img_path):# 创建 ONNX 运行时的 Session# 构造输入数据img = cv2.imread(img_path)img = cv2.resize(img,(640,640))input_data = np.transpose(img,(2,0,1))[None,...]input_data = np.array(input_data,dtype=np.float32)# 进行推理output_data = sess.run(['output_0','344','367'], {'input_0': input_data})posted_output = []for i,output in enumerate(output_data):b,n,c = output.shapeoutput[..., 4:] = sigmoid(output[..., 4:])y = np.arange(featuremaps[i]).repeat(featuremaps[i]).reshape(-1,1)x = np.reshape([np.arange(featuremaps[i]) for _ in range(featuremaps[i])],(-1,1))grid = np.concatenate([x,y],axis=1)output[0,:, 0:2] = (output[0,:, 0:2] + grid) * strides[i]  # xyoutput[0,:, 2:4] = np.exp(output[0,:, 2:4]) * strides[i]  # whposted_output.append(output[0])posted_output = np.concatenate(posted_output)box_corner = np.zeros_like(posted_output)box_corner[:, 0] = posted_output[:, 0] - posted_output[:, 2] / 2 # 左上右下box_corner[:, 1] = posted_output[:, 1] - posted_output[:, 3] / 2box_corner[:, 2] = posted_output[:, 0] + posted_output[:, 2] / 2box_corner[:, 3] = posted_output[:, 1] + posted_output[:, 3] / 2posted_output[:, :4] = box_corner[:, :4]# Get score and class with highest confidence# class_conf, class_pred = np.max(posted_output[:, 5:85], axis=1)class_conf = np.max(posted_output[:, 5:85], axis=1)class_pred = np.argmax(posted_output[:, 5:85], axis=1)conf_mask = (posted_output[:, 4] * class_conf.squeeze() >= 0.25)# Detections ordered as (x1, y1, x2, y2, obj_conf, class_conf, class_pred)detections = posted_output[conf_mask]cls_scores = class_conf[conf_mask]cls_cat = class_pred[conf_mask]indices = cv2.dnn.NMSBoxes(detections[:,:4], detections[:,4]*cls_scores,score_threshold=0.1, nms_threshold=0.55)ans_bbox = detections[indices][:,:4]ans_conf = cls_scores[indices]*detections[indices][:,4] # 分类*定位ans_cat = cls_cat[indices]for bbox,conf,cat in zip(ans_bbox,ans_conf,ans_cat):x0,y0,x1,y1 = bboxcv2.rectangle(img,(int(x0),int(y0)),(int(x1),int(y1)),get_color(int(cat)),2,2)label = f'{coco_classes[int(cat)]}: {conf:.2f}'cv2.putText(img, label, (int(x0),int(y0) - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, get_color(int(cat)), 2)cv2.imwrite(os.path.join('onnx_infer',img_path.split('/')[-1]),img)if __name__ == '__main__':data_root = 'imgs/'imgs = os.listdir(data_root)for img in tqdm.tqdm(imgs):onnx_infer(os.path.join(data_root,img))

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

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

相关文章

gmid方法设计五管OTA二级远放

首先给出第一级是OTA,第二级是CS的二级运放电路图: gmid的设计方法可以根据GBW、Av、CL来进行电路设计,因此在设计电路之前需要以上的参数要求。 1、为了满足电路的相位裕度至少60,需要对GBW、主极点、零点进行分析。 首先给出其…

应用程序无法找到xinput1_3.dll怎么办,xinput1_3.dll 丢失的解决方法

当电脑系统或特定应用程序无法找到或访问到 xinput1_3.dll 文件时,便会导致错误消息的出现,例如“找不到 xinput1_3.dll”、“xinput1_3.dll 丢失”等。这篇文章将大家讨论关于 xinput1_3.dll 文件的内容、xinput1_3.dll丢失问题的解决方法,以…

查收查引(通过文献检索开具论文收录或引用的检索证明)

开具论文收录证明的 专业术语为 查收查引,是高校图书馆、情报机构或信息服务机构提供的一项有偿服务。 因检索需要一定的时间,提交委托时请预留足够的检索时间。 一般需要提供:论文题目、作者、期刊名称、发表年代、卷期、页码。 目录 一、查…

MIT6.5840-2023-Lab1: MapReduce

前置知识 MapReduce:Master 将一个 Map 任务或 Reduce 任务分配给一个空闲的 worker。 Map阶段:被分配了 map 任务的 worker 程序读取相关的输入数据片段,生成并输出中间 k/v 对,并缓存在内存中。 Reduce阶段:所有 ma…

QT 中基于 TCP 的网络通信 (备查)

基础 基于 TCP 的套接字通信需要用到两个类: 1)QTcpServer:服务器类,用于监听客户端连接以及和客户端建立连接。 2)QTcpSocket:通信的套接字类,客户端、服务器端都需要使用。 这两个套接字通信类…

《当代家庭教育》期刊论文投稿发表简介

《当代家庭教育》杂志是家庭的参谋和助手,社会的桥梁和纽带,人生的伴侣和知音,事业的良师益友。 国家新闻出版总署批准的正规省级教育类G4期刊,知网、维普期刊网收录。安排基础教育相关稿件,适用于评职称时的论文发表…

今天面试招了个25K的测试员,从腾讯出来的果然都有两把刷子···

公司前段时间缺人,也面了不少测试,前面一开始瞄准的就是中级的水准,也没指望来大牛,提供的薪资在15-25k,面试的人很多,但平均水平很让人失望。看简历很多都是4年工作经验,但面试中,不…

OkGo导入失败解决办法

jcenter()maven { url "https://jitpack.io" }再同步就可以了

c++ atmoic acquire/release

由于多核cpu缓存的存在,以及gcc编译优化,cpu指令层面的优化,导致程序的执行顺序可能跟你写的顺序不完全一致(reorder)。 但是在多线程编程中如何确保各个线程能正确的读取到各个变量呢(而不是cache中老旧的…

【Vue3从入门到项目实现】RuoYi-Vue3若依框架前端学习——登录页面

若依官方的前后端分离版中,前端用的Vue2,这个有人改了Vue3的前端出来。刚好用来学习: https://gitee.com/weifengze/RuoYi-Vue3 运行前后端项目 首先运行项目 启动前端,npm install、npm run dev 启动后端,按教程配置…

自定义登录页面模板(移动端)

login/index <script setup lang"ts"> </script><template><div class"login-page">//组件 由于配置了自动注册&#xff0c;所以无需引入<cp-nav-barright-text"注册"click-right"$router.push(/register)&quo…

Codeforces Round 913 (Div. 3)补题

Rook 题目大意&#xff1a;我们给定一个棋盘(如下图)&#xff0c;棋盘上有一个车&#xff0c;问车可以到的位置&#xff0c;任意顺序输出即可。 思路&#xff1a;输出车的行列中非它本身的点即可。 #include<bits/stdc.h> using namespace std; int main() {int t;scanf…

Fabric:链码的部署及执行

Hyperledger Fabric:V2.5.4 写在最前 使用Fabric搭建自定义网络参考&#xff1a;https://blog.csdn.net/yeshang_lady/article/details/134113296 使用Fabric创建应用通道参考&#xff1a;https://blog.csdn.net/yeshang_lady/article/details/134668458 接下来将介绍如何在自…

ELK的日志解决方案

1. 安装和配置ELK 确保你已经安装了Elasticsearch、Logstash和Kibana。你可以按照官方文档或使用包管理工具进行安装。 Elasticsearch官方配置文档 Kibana官方配置文档 2. Logstash配置 拉取logstash 创建容器 docker run -it \ --name logstash \ --privileged \ -p 5044:5…

Ubuntu-Sim2Real环境配置(下)

cd ICRA-RM-Sim2Real/docker_client/ ./exec_client.sh cd ~ roslaunch rtab_navigation rtab_navigation.launch 执行上面代码的时候后台一直刷新 cd ICRA-RM-Sim2Real/docker_client/ ./exec_client.sh cd ~ roslaunch carto_navigation navigation.launch 1.Usage 执行该…

【微服务】spring循环依赖深度解析

目录 一、循环依赖概述 1.2 spring中的循环依赖 二、循环依赖问题模拟 2.1 循环依赖代码演示 2.2 问题分析与解决 2.2.1 使用反射中间容器 三、spring循环依赖问题解析 3.1 spring中的依赖注入 3.1.1 field属性注入 3.1.2 setter方法注入 3.1.3 构造器注入 3.2 spri…

树莓派学习:wiringPi+硬件pwm+舵机

目录 目的 代码 只有io口1是支持pwm&#xff0c;其他要软件pwm 编译 运行 目的 黄色pwm&#xff0c;红色正极&#xff0c;棕色负极 让sg90舵机转动&#xff0c;就需要一个20ms的周期pwm&#xff0c;其中高电平在0.5-2.5ms之间 转动角度 高电平在一个周期内的时间0 …

ElasticSearch篇---第四篇

系列文章目录 文章目录 系列文章目录前言一、elasticsearch 是如何实现 master 选举的?二、elasticsearch 索引数据多了怎么办,如何调优,部署?三、说说你们公司 es 的集群架构,索引数据大小,分片有多少?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽…

集成开发环境 PyCharm 的安装【侯小啾python基础领航计划 系列(二)】

集成开发环境PyCharm的安装【侯小啾python基础领航计划 系列(二)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔…