看图识熊(三)

使用Windows Machine Learning加载ONNX模型并推理

环境要求

Windows Machine Learning支持在Windows应用程序中加载并使用训练好的机器学习模型。Windows 10从10.0.17763.0版本开始提供这套推理引擎,所以需要安装17763版本的Windows 10 SDK进行开发,并且需要运行在17763及以上版本的Windows 10中。

创建UWP项目

打开Visual Studio 2017,新建项目,在Visual C#分类中选择,填写项目名称为,点击确定空白应用(通用 Windows)``ClassifyBear

img

在弹出的对话框中,设置目标版本和最低版本都是17763

img

添加模型文件到项目中

打开解决方案资源管理器中,在项目中的目录上点右键->添加->现有项,添加模型文件Assets``BearModel.onnx

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

img

打开解决方案资源管理器,应该可以看到在项目根目录自动生成了和模型同名的代码文件,里面就是对该模型的一层封装,包括了输入输出的定义、加载模型的方法以及推理的方法。BearModel.cs

如果在解决方案资源管理器中没有看到该文件,说明生成失败,失败的原因可能是路径中包含中文、或者onnx模型不合法、或者其它原因,可以尝试手动生成。

在开始菜单中找到并打开,运行如下命令VS 2017的开发人员命令提示符

mlgen.exe -i d:\BearModel.onnx -o d:\BearModel.cs -l CS -n BearModel

其中,指定ONNX模型路径,指定要生成的封装代码的路径,指定代码的语言,指定代码使用的命名空间。注意,命令中不要出现中文字符。-i``-o``-l``-n

生成成功后,可以手动将生成的BearModel.cs添加项目中;如果还是生成失败,需要根据错误信息继续排查原因

设计界面

打开,将整个Grid片段替换为如下代码:MainPage.xaml

<Grid><StackPanel Margin="12"><TextBlock Text="输入要识别的图片地址:" Margin="12"></TextBlock><TextBox x:Name="tbImageUrl" Margin="12"></TextBox><Button x:Name="tbRun" Content="识别" Tapped="TbRun_Tapped" Margin="12"></Button><TextBlock x:Name="tbBearType" Margin="12"></TextBlock><Grid BorderBrush="Gray" BorderThickness="1" Margin="12" Width="454" Height="454"><Image x:Name="imgBear" Stretch="Fill" ImageOpened="ImgBear_ImageOpened" ImageFailed="ImgBear_ImageFailed"></Image></Grid></StackPanel>
</Grid>

显示效果如下图:

img

  • 输入框中用来输入要识别的图片的URLtbImageUrl

  • 按钮用来触发加载图片tbRun

  • 文本框用来显示识别的结果tbBearType

  • 图片控件用来预览要识别的图片,同时,我们也从这个控件中取出对应的图片数据,传给我们的模型推理类库去推理。这里将图片控件设置为正方形并且将属性设置为,可以保证图片拉伸显示为一个正方形的形状,这样可以方便我们直观的了解模型的输入,因为在前面查看模型信息的时候也看到了,该模型的输入图片应是227*227的正方形。imgBear``Stretch``Fill

上面的片段中分别给按钮和图片控件添加了事件响应,我们在后续小节中添加对应的实现。XAML

添加按钮的事件响应

前面文件中给按钮添加事件,这里在中完成对应的实现,从输入框中读入图片的URL,然后让图片控件加载该URL对应的图片:XAML``MainPage.xaml.cs

private void TbRun_Tapped(object sender, TappedRoutedEventArgs e)
{tbBearType.Text = string.Empty;
​Uri imageUri = null;try{imageUri = new Uri(tbImageUrl.Text);}catch (Exception){tbBearType.Text = "URL不合法";return;}
​tbBearType.Text = "加载图片...";
​imgBear.Source = new BitmapImage(imageUri);
}

添加图片控件的事件响应

前面文件中给图片控件添加了两个事件:图片加载完成的事件和加载失败的事件,这里在中完成对应的实现:XAML``MainPage.xaml.cs

private void ImgBear_ImageOpened(object sender, RoutedEventArgs e)
{RecognizeBear();
}
​
private void ImgBear_ImageFailed(object sender, ExceptionRoutedEventArgs e)
{tbBearType.Text = "图片加载失败";
}

###处理模型的输入

打开自动生成的模型封装文件可以看到需要的输入如下:BearModel.cs

public sealed class BearModelInput
{public ImageFeatureValue data; // BitmapPixelFormat: Bgra8, BitmapAlphaMode: Premultiplied, width: 227, height: 227
}

这里需要一个类型的数据,可以使用从中创建。使用时,你可以不用担心图片格式的转换和缩放,系统会自动处理图片来匹配模型需要的输入格式。目前支持的像素格式为Gray8、Rgb8和Bgr8,色值范围为0-255。ImageFeatureValue``ImageFeatureValue.CreateFromVideoFrame``VidelFrame``ImageFeatureValue

下面是处理图片输入的代码:

private async Task<BearModelInput> GetInputData()
{// 将图片控件重绘到图片上RenderTargetBitmap rtb = new RenderTargetBitmap();await rtb.RenderAsync(imgBear);
​// 取得所有像素值var pixelBuffer = await rtb.GetPixelsAsync();
​// 构造模型需要的输入格式SoftwareBitmap softwareBitmap = SoftwareBitmap.CreateCopyFromBuffer(pixelBuffer, BitmapPixelFormat.Bgra8, rtb.PixelWidth, rtb.PixelHeight);VideoFrame videoFrame = VideoFrame.CreateWithSoftwareBitmap(softwareBitmap);ImageFeatureValue imageFeatureValue = ImageFeatureValue.CreateFromVideoFrame(videoFrame);
​BearModelInput bearModelInput = new BearModelInput();bearModelInput.data = imageFeatureValue;return bearModelInput;
}

加载模型并推理

这是最关键的一步,也是非常简单的一步。自动生成的模型封装文件中已经封装了加载模型的方法和推理的方法,直接调用就可以:BearModel.cs

private async void RecognizeBear()
{// 加载模型StorageFile modelFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri($"ms-appx:///Assets/BearModel.onnx"));BearModelModel model = await BearModelModel.CreateFromStreamAsync(modelFile);
​// 构建输入数据BearModelInput bearModelInput = await GetInputData();
​// 推理BearModelOutput output = await model.EvaluateAsync(bearModelInput);
​tbBearType.Text = output.classLabel.GetAsVectorView().ToList().FirstOrDefault();
}

测试

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

img

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

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

相关文章

〔025〕Stable Diffusion 之 接口开发 篇

✨ 目录 ▷ 启动接口▷ 接口文档▷ 接口开发▷ 代码解释▷ 启动接口 想要在各种其他服务中对接 Stable Diffusion 的绘画功能,需要开启 Stable Diffusion 的 api 功能开发接口需要有一定的技术功底才可以,非技术人员其实不用学习直接在 webui-user.bat 文件中的 set COMMANDL…

国内女足球员限薪120万;越南总人口突破1亿;华科阿里等联合打造 TF-T2V 视频方案,无需文本标注

今日精选 • 华科阿里等联合打造 TF-T2V 视频方案&#xff0c;无需文本标注• 越南总人口突破1亿• 国内女足球员限薪120万• 专家建议取消大城市买房买车限制 大模型 • OpenAI 和微软遭大规模起诉 “窃取”他人作品训练 AI 模型• Salesforce 研究提出新视频生成 AI 模型 …

力扣:438. 找到字符串中所有字母异位词 题解

Problem: 438. 找到字符串中所有字母异位词 438. 找到字符串中所有字母异位词 预备知识解题思路复杂度Code其它细节推荐博客或题目博客题目滑动窗口哈希表 预备知识 此题用到了双指针算法中的滑动窗口思想&#xff0c;以及哈希表的运用。c中是unordered_map。如果对此不了解的u…

消除字母Scratch-第14届蓝桥杯Scratch省赛真题第6题

6. 消除字母&#xff08;100分&#xff09; 编程实现&#xff1a;消除字母。 具体要求&#xff1a; 1). 点击绿旗&#xff0c;角色、背景如图所示&#xff08;创建1个字母表&#xff0c;并存入26个字母&#xff09;&#xff1b; 2). 等待1秒&#xff0c;阿拉蕾说&#xff1…

使用高德API获取公交线路数据,无需代码

下面内容包括&#xff1a; 如何使用高德API获取线路数据&#xff0c;无需代码如何将获取下来的线路数据处理成geodataframe 线路数据获取 网址&#xff08;高德开放平台&#xff09;&#xff1a; https://lbs.amap.com/demo/javascript-api/example/bus-info/search-bus-rou…

【Python常用函数】一文让你彻底掌握Python中的numpy.append函数

大数据时代的到来,使得很多工作都需要进行数据挖掘,从而发现更多有利的规律,或规避风险,或发现商业价值。而大数据分析的基础是学好编程语言。本文和你一起来探索Python中的append函数,让你以最短的时间明白这个函数的原理。也可以利用碎片化的时间巩固这个函数,让你在处…

java SSM水质历史数据可视化设计myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM水质历史数据可视化设计是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主…

本地部署 Ollama

本地部署 Ollama 0. Ollama 能帮我们做什么1. 下载 Ollama2. 安装 Ollama3. 使用 Ollama4. Ollama 和 Langchain 的集成 0. Ollama 能帮我们做什么 在本地启动并运行大型语言模型。 运行 Llama 2、Code Llama 和其他模型。自定义并创建自己的。 1. 下载 Ollama 访问 https:…

opencv期末练习题(6)附带解析

滑动块调整图像灰度 import cv2 import numpy as np """ 滑动块调整图像灰度1. 读取图片&#xff0c;并转为灰度图 2. 定义启动滑块和阈值滑块 3. 只有启动滑块的值为1时&#xff0c;拖动阈值滑块才生效 4. 根据阈值滑块的值实时对图像进行二值化操作 "&qu…

分布式事务理论及Seata实践

分布式事务简介 事务是指作为单个逻辑工作单元执行的一系列操作&#xff0c;要么完全地执行&#xff0c;要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成&#xff0c;否则不会永久更新面向数据的资源。事务的四个特征&#xff08;ACID&#xff09; …

element-ui table height 属性导致界面卡死

问题: 项目上&#xff0c;有个点击按钮弹出抽屉的交互, 此时界面卡死 原因分析: 一些场景下(父组件使用动态单位/弹窗、抽屉中使用), element-ui 的 table 会循环计算高度值, 导致界面卡死 github 上的一些 issues 和解决方案: Issues ElemeFE/element GitHub 官方讲是升…

Rockchip平台双屏异显功能实现(基于Android13)

Rockchip平台双屏异显功能实现(基于Android13) 1. 异显实现方案 Rockchip SDK平台支持两种不同的异显方案&#xff1a;Android Presentation和Android Activity指定屏幕启动。 使用Android Presentation方案&#xff0c;需要在APP开发中调用相应接口以使指定视图&#xff08…