人工智能模型转ONNX 连接摄像头使用ONNX格式的模型进行推理
部署之后模型的运算基本上能快5倍。本地部署之后,联网都不需要,数据和隐私不像在网上那样容易泄露了。
模型部署的通用流程
各大厂商都有自己的推理工具。
训练的归训练,部署的归部署,人工智能也分训练端和部署端,每一个端操心自己事就好了。
ONNX
1.安装ONNX需要的环境
# 如果Pytorch已经安装,请忽略下一步
# pip3 install torch torchvision --extra-index-url https://download.pytorch.org/whl/cu113# 安装工具
# pip install numpy pandas matplotlib tqdm opencv-python pillow -i https://pypi.tuna.tsinghua.edu.cn/simple# 安装onnx和onnxruntime
# pip install onnx -i https://pypi.tuna.tsinghua.edu.cn/simple
# pip install onnxruntime -i https://pypi.tuna.tsinghua.edu.cn/simpleimport onnx
print('ONNX 版本', onnx.__version__)import onnxruntime as ort
print('ONNX Runtime 版本', ort.__version__)
2.将训练好的模型转换为ONNX格式
import torch
from torchvision import models# 有 GPU 就用 GPU,没有就用 CPU
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
print('device', device)# 导入训练好的模型
model = torch.load('../checkpoint/best_0.727.pth')
model = model.eval().to(device)# Pytorch模型转ONNX模型
x = torch.randn(1, 3, 256, 256).to(device)with torch.no_grad():torch.onnx.export(model, # 要转换的模型x, # 模型的任意一组输入'resnet18_fruit30.onnx', # 导出的 ONNX 文件名opset_version=11, # ONNX 算子集版本input_names=['input'], # 输入 Tensor 的名称(自己起名字)output_names=['output'] # 输出 Tensor 的名称(自己起名字))
3.验证onnx模型导出成功
import onnx# 读取 ONNX 模型
onnx_model = onnx.load('resnet18_shizi.onnx')# 检查模型格式是否正确
onnx.checker.check_model(onnx_model)print('无报错,onnx模型载入成功')# 以可读的形式打印计算图
print(onnx.helper.printable_graph(onnx_model.graph))
4.连接摄像头使用ONNX Runtime格式的模型进行推理
'''
FPS为 40左右,为什么比没有部署前少了10个fps左右
'''
import osimport cv2
import numpy as np
import pandas as pd
import timefrom tqdm import tqdm # 进度条import torch
import torch.nn.functional as F
from torchvision import transformsimport onnxruntimefrom PIL import Image, ImageFont, ImageDrawimport matplotlib.pyplot as plt# 导入中文字体,指定字体大小
font = ImageFont.truetype('/opt/software/computer_vision/codes/My_codes/obeject_detection/tongjizhihaoxiong/data/SimHei.ttf', 32)# 载入onnx模型
model = onnxruntime.InferenceSession('resnet18_shizi.onnx')# 载入类别名称 和 ID索引号 的映射字典
idx_to_labels = np.load('/opt/software/computer_vision/codes/My_codes/obeject_detection/tongjizhihaoxiong/recognize_shizi/idx_to_labels.npy', allow_pickle=True).item()
# 获得类别名称
classes = list(idx_to_labels.values())# 测试集图像预处理-RCTN:缩放裁剪、转 Tensor、归一化
test_transform = transforms.Compose([transforms.Resize(256),transforms.CenterCrop(256),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225])])# 处理帧函数
def process_frame(img_bgr):# 记录该帧开始处理的时间start_time = time.time()img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB) # BGR转RGBimg_pil = Image.fromarray(img_rgb) # array 转 PIL## 预处理input_img = test_transform(img_pil) # 预处理input_tensor = input_img.unsqueeze(0).numpy()## onnx runtime 预测ort_inputs = {'input': input_tensor} # onnx runtime 输入pred_logits = model.run(['output'], ort_inputs)[0] # onnx runtime 输出pred_logits = torch.tensor(pred_logits)pred_softmax = F.softmax(pred_logits, dim=1) # 对 logit 分数做 softmax 运算## 解析图像分类预测结果n = 5top_n = torch.topk(pred_softmax, n) # 取置信度最大的 n 个结果pred_ids = top_n[1].cpu().detach().numpy().squeeze() # 解析出类别confs = top_n[0].cpu().detach().numpy().squeeze() # 解析出置信度## 在图像上写中文draw = ImageDraw.Draw(img_pil)for i in range(len(confs)):pred_class = idx_to_labels[pred_ids[i]]# 写中文:文字坐标,中文字符串,字体,rgba颜色text = '{:<15} {:>.3f}'.format(pred_class, confs[i]) # 中文字符串draw.text((50, 100 + 50 * i), text, font=font, fill=(255, 0, 0, 1))img_rgb = np.array(img_pil) # PIL 转 arrayimg_bgr = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2BGR) # RGB转BGR# 记录该帧处理完毕的时间end_time = time.time()# 计算每秒处理图像帧数FPSFPS = 1 / (end_time - start_time)# 图片,添加的文字,左上角坐标,字体,字体大小,颜色,线宽,线型img_bgr = cv2.putText(img_bgr, 'FPS ' + str(int(FPS)), (50, 80), cv2.FONT_HERSHEY_SIMPLEX, 2, (255, 0, 255), 4,cv2.LINE_AA)return img_bgrdef view_video(video_path):# 设置显示窗口的大小width,height = 800,600video = cv2.VideoCapture(video_path)'''把摄像头设置为1980 x 1080'''video.set(cv2.CAP_PROP_FRAME_WIDTH,1920)video.set(cv2.CAP_PROP_FRAME_HEIGHT,1080)video.set(cv2.CAP_PROP_FOURCC,cv2.VideoWriter.fourcc('M','J','P','G'))if video.isOpened():'''video.read() 一帧一帧地读取open 得到的是一个布尔值,就是 True 或者 Falseframe 得到当前这一帧的图像'''open, frame = video.read()else:open = Falsewhile open:ret, frame = video.read()# 如果读到的帧数不为空,那么就继续读取,如果为空,就退出if frame is None:breakif ret == True:# !!!处理帧函数frame = process_frame(frame)cv2.namedWindow('video',cv2.WINDOW_NORMAL)cv2.imshow("video", frame)# 50毫秒内判断是否受到esc按键的信息if cv2.waitKey(50) & 0xFF == 27:breakvideo.release()cv2.destroyAllWindows()if __name__ == '__main__':# 取前1个参数 和 摄像头的Idcamera_id = 0view_video(camera_id)
TensorRT和ONNX的区别
TensorRT和ONNX是深度学习模型优化和跨平台移植方面两个各有优势的工具。TensorRT是NVIDIA推出的用于深度学习模型优化的高性能库,旨在最大程度地提高深度学习推理的效率和吞吐量。
它可以将训练好的神经网络模型转换为高度优化的代码,以便在GPU上进行实时推理。
TensorRT针对不同类型的层使用了一系列高效的算法和技巧来加速计算,并且可以通过与CUDA和cuDNN等NVIDIA库的集成,以及利用GPU硬件加速来进一步提高性能。ONNX(Open Neural Network Exchange)是由微软、Facebook和亚马逊等科技公司联合开发的跨平台深度学习框架,
它借助中间表示的方式将深度学习框架之间的模型和权重参数相互转换,使得用户可以方便地将自己训练好的模型迁移到其他框架或硬件平台上使用。
相比之下,ONNX主要关注的是模型的跨平台移植性,使得用户可以方便地在不同的硬件平台上部署模型,并且支持多种硬件平台,包括CPU、GPU和FPGA等。
相关文章:

人工智能模型转ONNX 连接摄像头使用ONNX格式的模型进行推理
部署之后模型的运算基本上能快5倍。本地部署之后,联网都不需要,数据和隐私不像在网上那样容易泄露了。 模型部署的通用流程 各大厂商都有自己的推理工具。 训练的归训练,部署的归部署,人工智能也分训练端和部署端,每一…...

osgEarth之添加shp
目录 效果 代码 代码分析 加载模式 效果 代码 #include "stdafx.h" #include <osg/Notify> #include <osgGA/StateSetManipulator> #include <osgViewer/Viewer> #include <osgViewer/ViewerEventHandlers>#include <osgEarth/MapNo…...

Eolink Apikit 版本更新:「数据字典」功能上线、支持 MongoDB 数据库操作、金融行业私有化协议、GitLab 生成 API 文档...
🎉 新增 搭建自定义接口协议架构,支持快速适配金融行业各类型私有协议的导入、编辑和展示。 数据字典功能上线,支持以数据字典的形式管理参数枚举值; 数据库连接支持 MongoDB 数据库操作; 基于 Apikit 类型导入 API…...

GPT-4V:AI在医疗领域的应用
OpenAI最新发布的GPT-4V模型为ChatGPT增添了语音和图像功能,为用户提供了更多在日常生活中使用ChatGPT的方式。这次更新将为用户带来更加便捷、直观的交互体验,用户可以直接通过拍照上传图片,并提出相关问题。OpenAI的最终目标是构建一个安全…...

OpenCV 在ImShow窗体上选择感兴趣的区域
窗体上选择感兴趣ROI区域 在计算机视觉处理中, 通常是针对图像中的一个特定区域进行处理, 有时候这个特定区域需要人来选择, OpenCV 也提供了窗口选择ROI机制. 窗体支持两种选择ROI区域的方法, 一个是单选, 一个是多选, 操作方法如下: 单选: 通过鼠标在屏幕上选择区域, 然后通过…...

ubuntu 安装redis详细教程
下载redis安装包 链接如下: http://redis.io/download 本例版本为:redis-7.2.3.tar.gz 下载安装包到目录/opt下,路径可修改,本例为/opt wget https://github.com/redis/redis/archive/7.2.3.tar.gz 解压安装包,并…...

qframework 架构 (作者:凉鞋)使用笔记
一些准则: 根据VIEW->SYSTEM->MODEL的分层架构 初始架构: app. using FrameworkDesign;namespace ShootingEditor2D(项目的命名空间) {public class ShootingEditor2D (游戏名称): Architecture&l…...

【JMeter】定时器分类以及场景介绍
1. 定时器分类 固定定时器 作用:请求之间设置等待时间应用场景:查询商品列表后,去查看列表商品详情页。针对商品列表数据量比较大的,响应时间会比较长,就需要设置等待时间然后去查看商详 2.定时器的作用域࿱…...

Spring Boot 请求/actuator/beans 无法访问 返回404
问题复现 在保证项目加入了spring-boot-starter-actuator依赖,并成功启动后。通过浏览器进行访问,返回如下图结果: 问题排查 1. 查看日志 从日志中可以看到基于路径’/actuator’下只暴露了一个端点 2. 访问http://localhost:8080/actua…...

AVD联网
AVD联网: 解决Android Studio模拟器无法联网_android studio模拟器没有网络-CSDN博客 挺好的,就是访问网站的时候只能用ip,而不能用域名。 AVD设置代理: android studio踩坑记 AVD模拟器代理设置_android studio avd 配置代理-…...

[Vue warn]: Missing required prop: “action“
控制台显示错误信息 vue.runtime.esm.js:4605 [Vue warn]: Missing required prop: "action" found in ---> <ElUpload> at packages/upload/src/index.vue <ElTableRow> <ElTableBody> <ElTable> at pack…...
Python标准库有哪些
概述 可用性注释 内置函数 内置常量 由 site 模块添加的常量 # Author : 小红牛 # 微信公众号:wdPython内置类型 逻辑值检测 布尔运算 — and, or, not 比较运算 数字类型 — int, float, complex 布尔类型 - bool 迭代器类型 序列类型 — list, tuple, range 文本…...

基于ssm的校园办公室报修管理系统
基于ssm的校园办公室报修管理系统 摘要 基于SSM的校园办公室报修管理系统是一个现代化的、高效的报修平台,它能够帮助校园内的教职工和学生更方便、更快捷地提交和处理报修请求。该系统基于Spring、SpringMVC和MyBatis(简称SSM)开发ÿ…...
1Panel 升级 Halo报错
1Panel 升级 Halo报错 通过 1panel 升级 2.10.0 -> 2.10.1 后启动失败,出现 No value found for protocol 错误, 1Panel-halo-rzxY | Caused by: io.r2dbc.spi.NoSuchOptionException: No value found for protocol 1Panel-halo-rzxY | at io.r2dbc.spi.Conn…...

spring-clound基础开发
一、使用openfeig调用远程另外一个服务接口 1、创建一个spring boot工程,并且创建2个模块来当微服务模块 2、分别配置2个模块的启动文件 3、分别两个模块下创建一个测试的控制器 4、在项目的根目录的pom.xml中添加spring-cloud配置 <properties><java.version>1…...

基于SSM的劳务外包管理系统的设计与实现
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…...

uni-app学习笔记(二)
目录 一、路由与页面跳转 1、tabar与普通页面跳转例子 2、navigateTo 3、switchTab 二、vue组件 1、传统vue组件的使用 2、easycom 三、uView组件库 1、安装配置 2、引入配置 3、使用 四、Vuex 1、认识 2、state基本使用 3、mapState使用 五、网络请求 1、封装…...
使用axios拦截器解决前端并发冲突问题
使用 axios 拦截器解决「 前端并发冲突 」 问题 背景 并发冲突问题, 是日常开发中一个比较常见的问题。 不同用户在较短时间间隔内变更数据,或者某一个用户进行的重复提交操作都可能导致并发冲突。 并发场景在开发和测试阶段难以排查全面,…...

IPv6详解
目录: 第一部分 IPv6的诞生背景和引起的主要变化 第二部分 IPv6数据报的基本首部和扩展首部 第三部分 IPv6地址 第四部分 IPv4向IPv6过渡 第一部分 IPv6的诞生背景和引起的主要变化 一.IPv6的诞生背景 IPv4存在设计缺陷: IPv4的设计者最初并没有想到该协议会在全球范围内广…...

【C++干货铺】STL简述 | string类的使用指南
个人主页点击直达:小白不是程序媛 C系列专栏:C干货铺 代码仓库:Gitee 目录 什么是STL STL的版本 STL的六大组件 STL的缺陷 string类 C语言中的字符串 标准库中的string类 string类常用的接口使用指南 string类中常见的构造 strin…...

NumPy 比较、掩码与布尔逻辑
文章目录 比较、掩码与布尔逻辑示例:统计下雨天数作为通用函数(Ufuncs)的比较运算符使用布尔数组计数条目布尔运算符 布尔数组作为掩码使用关键字 and/or 与运算符 &/| 的区别 比较、掩码与布尔逻辑 本文介绍如何使用布尔掩码来检查和操…...
Spring 中的disposableBean介绍
在 Spring 框架中,DisposableBean 是一个接口,用于定义 Bean 在被销毁前需要执行的清理逻辑。它是 Spring 容器生命周期回调机制的一部分。 🌱 什么是 DisposableBean DisposableBean 接口是 Spring 提供的一个标准接口,用于通知…...
C/C++ 面试复习笔记(2)
C语言如何实现快速排序算法? 答案:快排是一种分治算法,选择一个基准元素,将数据划分成两部分,然后递归排序 补充: void quick_sort(int arr[], int start, int end) {//判断是否需要排序if (start > …...

el-select 实现分页加载,切换也数滚回到顶部,自定义高度
el-select 实现分页加载,切换也数滚回到顶部,自定义高度 1.html <el-form-item label"俱乐部:" prop"club_id" label-width"120px"><el-select :disabled"Boolean(match_id)" style"w…...
WebFuture:Ubuntu 系统上在线安装.NET Core 8 的步骤
方法一:使用官方二进制包安装 下载.NET Core 8 SDK 二进制包:访问 .NET Core 8 SDK 官方下载页面,根据你的系统架构选择对应的 Linux x64 版本等下载链接,将其下载到本地4. 创建安装目录:在终端中执行以下命令创建用于…...

从零开始的云计算——番外实战,iptables防火墙项目
目录 一网络规划 二项目要求 三环境准备 1防火墙设置 2PC1设置 3PC2设置 4服务器S1设置 四环境检测 1内网链接 2外网连接 五防火墙配置及测试 1内部网络中的pc1采用SNAT访问外部互联网,但是无法ping到内部网关。 编辑编辑 2内部网络服务器s1通过DN…...
Docker 常用命令详解
🐳 Linux 安装 Docker 及常用命令详解(适用于 Ubuntu) 📦 一、安装 Docker(Ubuntu 系统) 1. 更新系统 sudo apt update sudo apt upgrade -y2. 安装必要依赖 sudo apt install -y apt-transport-https …...
《doubao-lite-32k 模型缓存机制使用指南》
doubao-lite-32k 模型缓存机制使用指南 一、缓存概述 1. 缓存作用 doubao-lite-32k 模型的缓存(Session 缓存)主要用于多轮对话场景,实现以下功能: 存储历史对话信息(Token),避免重复传输上下文,减少计算资源消耗。 优化长上下文(最长 32K Token)处理效率,提升多…...

鸿蒙缺少WMIC missing WMIC
在DecEco Studio中选择模拟器的时候会弹出“可能会导致设备管理功能失效。请检查并安装 WMIC”。 在启动鸿蒙模拟器时报:missing WMIC missing WMIC lt may cause the device management function to fail. Please check and install WMIC. 解决方案:…...

【react+antd+vite】优雅的引入svg和阿里巴巴图标
1.安装相关包 由于是vite项目,要安装插件来帮助svg文件引入进来,否则会失败 npm下载包 npm i vite-plugin-svgr vite.config.ts文件内: import svgr from "vite-plugin-svgr"; //... export default defineConfig({plugins: …...