AI看图识熊实战(一)

使用ONNX Runtime封装onnx模型并推理

进行这一步之前,请确保已正确安装配置了Visual Studio 2017 和 C#开发环境。

项目的代码也可以在这里找到,下面的步骤是带着大家从头到尾做一遍。

界面设计

创建Windows窗体应用(.NET Framework)项目,这里给项目起名ClassifyBear。

在解决方案资源管理器中找到Form1.cs,双击,打开界面设计器。从工具箱中向Form中依次拖入控件并调整,最终效果如下图所示:

左侧从上下到依次是:

  • Label控件,将内容改为“输入要识别的图片地址:”

  • TextBox控件,可以将控件拉长一些,方便输入URL

  • Button控件,将内容改为“识别”

  • Lable控件,将label的内容清空,用来显示识别后的结果。因为label也没有边框,所以在界面看不出来。可以将此控件的字体调大一些,能更清楚的显示推理结果。

右侧的控件是一个PictureBox,用来预览输入的图片,同时,我们也从这个控件中取出对应的图片数据,传给我们的模型推理类库去推理。建议将控件属性的SizeMode更改为StretchImage,并将控件长和宽设置为同样的值,保持一个正方形的形状,这样可以方便我们直观的了解模型的输入,因为在前面查看模型信息的时候也看到了,该模型的输入图片应是正方形(当前最新的定制化视觉服务导出的模型需要的输入图片大小为224*224)。

添加模型文件到项目中

打开解决方案资源管理器中,在项目上点右键->添加->现有项,在弹出的对话框中,将文件类型过滤器改为所有文件,然后导航到模型所在目录,选择模型文件并添加。本示例中使用的模型文件是BearModel.onnx

模型是在应用运行期间加载的,所以在编译时需要将模型复制到运行目录下。在模型文件上点右键,属性,然后在属性面板上,将生成操作属性改为内容,将复制到输出目录属性改为如果较新则复制

添加OnnxRuntime库

微软开源的OnnxRuntime库提供了NuGet包,可以很方便的集成到Visual Studio项目中。

打开解决方案资源管理器,在引用上点右键,管理NuGet程序包。

在打开的NuGet包管理器中,切换到浏览选项卡,搜索onnxruntime,找到Microsoft.ML.OnnxRuntime包,当前版本是0.4.0,点击安装,稍等片刻,按提示即可完成安装。

当前NuGet发布的OnnxRuntime库支持x64及x86架构的运行库,建议使用x64的,所以这里将项目的目标架构改为x64。

在解决方案上点右键,选择配置管理器。在配置管理器对话框中,将活动解决方案平台切换为x64。如果没有x64,在下拉框中选择新建,按提示新建x64平台。

处理输入并加载模型进行推理

在Form1.cs上点右键,选择查看代码,打开Form1.cs的代码编辑窗口。

添加一个成员变量

// 使用Netron查看模型,得到模型的输入应为224*224大小的图片
private const int imageSize = 224;

回到Form1的设计界面,双击识别按钮,会自动跳转到代码页面并添加了button1_Click方法,在其中添加以下代码:

首先,每次点击识别按钮时都先将界面上显示的上一次的结果清除

// 识别之前先重置界面显示的内容
label1.Text = string.Empty;
pictureBox1.Image = null;
pictureBox1.Refresh();然后,让图片控件加载图片bool isSuccess = false;
try
{pictureBox1.Load(textBox1.Text);isSuccess = true;
}
catch (Exception ex)
{MessageBox.Show($"读取图片时出现错误:{ex.Message}");throw;
}如果加载成功,将图片数据处理成需要的大小,然后加载模型进行推理。if (isSuccess)
{// 图片加载成功后,从图片控件中取出224*224的位图对象Bitmap bitmap = new Bitmap(pictureBox1.Image, imageSize, imageSize);
​float[] imageArray = new float[imageSize * imageSize * 3];
​// 按照先行后列的方式依次取出图片的每个像素值for (int y = 0; y < imageSize; y++){for (int x = 0; x < imageSize; x++){var color = bitmap.GetPixel(x, y);
​// 使用Netron查看模型的输入发现// 需要依次放置224 *224的蓝色分量、224*224的绿色分量、224*224的红色分量imageArray[y * imageSize + x] = color.B;imageArray[y * imageSize + x + 1 * imageSize * imageSize] = color.G;imageArray[y * imageSize + x + 2 * imageSize * imageSize] = color.R;}}
​// 设置要加载的模型的路径,跟据需要改为你的模型名称string modelPath = AppDomain.CurrentDomain.BaseDirectory + "BearModel.onnx";
​using (var session = new InferenceSession(modelPath)){var container = new List<NamedOnnxValue>();
​// 用Netron看到需要的输入类型是float32[None,3,224,224]// 第一维None表示可以传入多张图片进行推理// 这里只使用一张图片,所以使用的输入数据尺寸为[1, 3, 224, 224]var shape = new int[] { 1, 3, imageSize, imageSize };var tensor = new DenseTensor<float>(imageArray, shape);
​// 支持多个输入,对于mnist模型,只需要一个输入,输入的名称是datacontainer.Add(NamedOnnxValue.CreateFromTensor<float>("data", tensor));
​// 推理var results = session.Run(container);
​// 输出结果有两个,classLabel和loss,这里只关心classLabelvar label = results.FirstOrDefault(item => item.Name == "classLabel")? // 取出名为classLabel的输出.AsTensor<string>()?.FirstOrDefault(); // 支持多张图片同时推理,这里只推理了一张,取第一个结果值
​// 显示在控件中label1.Text = label;}
}

注意,这里的数据转换一定要按照前面查看的模型的信息来转换,图片大小需要长宽都是224像素,并且要依次放置所有的蓝色分量、所有的绿色分量、所有的红色分量,如果顺序不正确,不能达到最佳的推理结果。

测试

编译运行,然后在网上找一张熊的图片,把地址填到输入框内,然后点击识别按钮,就可以看到识别的结果了。注意,这个URL应该是图片的URL,而不是包含该图片的网页的URL。

如果运行时遇到类似于找不到onnxruntime的dll的问题,可能是编译时相关库没有拷到运行目录下,可以尝试先清理解决方案,然后再重新编译解决方案。也可以手动到解决方案目录\packages\Microsoft.ML.OnnxRuntime.0.4.0\runtimes\win-x64\native下将onnxruntime.dll拷到程序运行目录

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

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

相关文章

c# 学习笔记 - 枚举

文章目录 1. 枚举1.1 枚举结构梳理1.2 枚举完整代码1.3 枚举知识点补充 2. 迭代两种命名空间接口3. yield语句 1. 枚举 1.1 枚举结构梳理 结构图   上图内容可能依旧不通俗易懂&#xff0c;这里使用最简明的话语告诉大家实现方式. foreach语句就是集合的遍历操作&#xff0c…

221.【2023年华为OD机试真题(C卷)】字符串变换最小字符串(贪心策略-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目二.解题思路三.题解代码Python题解代码JAVA题解…

2024.1.3力扣每日一题——从链表中移除节点

2024.1.3 题目来源我的题解方法一 递归方法二 栈方法三 反转链表方法四 单调栈头插法 题目来源 力扣每日一题&#xff1b;题序&#xff1a;2487 我的题解 方法一 递归 当前节点对其右侧节点是否删除无影响&#xff0c;因此可以对其右侧节点进行递归移除。 若当前节点为空&am…

快速掌握Postman实现接口测试

快速掌握Postman实现接口测试 Postman简介 Postman是谷歌开发的一款网页调试和接口测试工具&#xff0c;能够发送任何类型的http请求&#xff0c;支持GET/PUT/POST/DELETE等方法。Postman非常简单易用&#xff0c;可以直接填写URL&#xff0c;header&#xff0c;body等就可以发…

Unity2D学习笔记 | 《勇士传说》教程 | (六)

目录 &#xff08;一&#xff09;存档点对象制作 &#xff08;二&#xff09;保存数据与加载数据 &#xff08;三&#xff09;存储数值与场景 &#xff08;四&#xff09;游戏结束画面制作 &#xff08;五&#xff09;序列化数据保存 &#xff08;一&#xff09;存档点对象…

Java多线程技术11——ThreadPoolExecutor类的使用2

1 isShutdown()方法 public boolean isShutdown()方法的作用是判断线程池是否已经关闭 public class Run1 {public static void main(String[] args) {Runnable runnable new Runnable() {Overridepublic void run() {try {System.out.println("开始: " Thread.c…

软件安装文档 | MinIO

# docker 下载镜像 docker pull minio/minio# 安装镜像docker run \ --name minio \ -p 19000:9000 \ -p 19090:9090 \ -d --restartalways \ -e "MINIO_ROOT_USERsuweijie" \ -e "MINIO_ROOT_PASSWORDSuweijie0217" \ -v /home/data:/data \ -v /home/c…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux系统编程第三天-Linux进程练习题(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666_嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机…

优化|PLSA理论与实践

PLSA又称为概率潜在语义分析&#xff0c;是一种利用概率生成模型对文本集合进行话题分析的无监督学习方法。该模型最大的特点是加入了主题这一隐变量&#xff0c;文本生成主题&#xff0c;主题生成单词&#xff0c;从而得到单词-文本共现矩阵。本文将对包含物理学、计算机科学、…

学习笔记——C++中的循环结构 while语句

while循环语句 作用&#xff1a;满足循环条件&#xff0c;执行循环语句 语法&#xff1a;while&#xff08;循环条件&#xff09;{循环语句} 解释&#xff1a;只要循环条件的结果为真&#xff0c;就执行循环语句 以打印0-9这十个数字为例&#xff0c;特别需要注意的是&…

Anaconda安装失败及解决办法

查看Anaconda版本时正常显示 报错显示&#xff1a; 解决办法&#xff1a; 确保系统要求满足&#xff1a;检查你的操作系统是否满足 Anaconda 的最低要求。例如&#xff0c;确保你使用的是 64 位操作系统&#xff0c;同时具备足够的磁盘空间。禁用防病毒软件&#xff1a;某些防…

单片机原理及应用:独立式键盘控制LED与多功能按键识别

今天来介绍另一个外设——按键与LED的配合工作&#xff0c;与开关不同&#xff0c;按键需要注意消除抖动带来的影响&#xff0c;代码逻辑也会更复杂一写&#xff0c;下面先为大家介绍独立式键盘的相关知识。 单片机的独立式键盘指的是一种不依赖于计算机或其他外部设备的键盘输…

【STM32学习】硬件CRC与传统CRC-32计算的不同点

硬件CRC与传统CRC-32计算的不同点 1、stm32的硬件CRC32与传统CRC-32有何不同&#xff1f;2、解决办法 1、stm32的硬件CRC32与传统CRC-32有何不同&#xff1f; ①STM32F103的硬件CRC校验是对整个32位字进行CRC计算&#xff0c;传统的CRC-32是逐字节的计算。 ②STM32的硬件CRC32的…

基于SSM的校内信息服务发布系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

Redis高并发高可用(集群)

Redis Cluster是Redis的分布式解决方案,在3.0版本正式推出,有效地解决了Redis分布式方面的需求。当遇到单机内存、并发、流量等瓶颈时,可以采用Cluster架构方案达到负载均衡的目的。之前,Redis分布式方案一般有两种: 1、客户端分区方案,优点是分区逻辑可控,缺点是需要自己…

初识动态内存管理

前言&#xff1a; 我们都知道&#xff0c;内存分为几个区——栈区、堆区、静态区、常量区、代码区&#xff0c;我们在写代码的时候经常会遇到栈溢出这个问题&#xff0c;是因为在程序运行之前&#xff0c;我们无法准确的知道要分配多少空间给程序&#xff0c;所以说很容易造…

CentOS使用docker安装mysql并使用navicat 远程链接

这篇文章没用开启mysql的挂载功能&#xff0c;如果想开启的话可以和我的下篇文章结合着看。 CentOS中开启mysql挂载-CSDN博客 docker在之前的文章中已经安装完成了 这里输入命令查询已被上传的MySQL镜像 docker search mysql这里stars代表点赞数&#xff0c;official代表官…

KNN 回归

K 近邻回归&#xff08;K-Nearest Neighbors Regression&#xff09;是一种基于实例的回归算法&#xff0c;用于预测连续数值型的输出变量。它的基本思想是通过找到与给定测试样本最近的 K 个训练样本&#xff0c;并使用它们的输出值来预测测试样本的输出。它与 K 最近邻分类类…

计算机毕业设计----SSM场地预订管理系统

项目介绍 本项目分为前后台&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 用户角色包含以下功能&#xff1a; 按分类查看场地,用户登录,查看网站公告,按分类查看器材,查看商品详情,加入购物车,提交订单,查看订单,修改个人信息等功能。 管理员角…

java基于SSM的二手交易平台设计与开发论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本二手交易平台就是在这样的大环境下诞生&#xff0c;其可以帮助使用者在短时间内处理完毕庞大的数据信息&am…