【中小学AI人工智能教育】导出ONNX通用模型在桌面应用中进行调用 Ai创想实验室是专门为中小学AI教育开发的教学平台包含了值计算、图像分类、音频分类、文本分类、数值回归、图像回归、图像分类回归、平衡杆、手写数字生成、文本生成等中小学人工智能学习类项目。无需编程基础、无需添加硬件、无需购买算力、无隐私担忧、无需师资培训即可进行教学实践。前面我们介绍了如何进行农业病虫害分析实验本文以其为例介绍如何使用导出嵌入式等文件来构建一个应用。首先把已训练模型导入到训练器然后导出。解压缩提取其中的ONNX模型。最终效果如下1、nuget包使用.net8构建一个windows窗体工程nuget一下Imports Microsoft.ML.OnnxRuntime Imports Microsoft.ML.OnnxRuntime.Tensors我们不使用ML的抽象层它不仅是处理图像的时候有点不太顺手。2、绘制界面按照代码和上图绘制界面即可。3、加载模型Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Try Dim modelPath Path.Combine(AppDomain.CurrentDomain.BaseDirectory, models, model_2026-07-07_01-56-55_6a4c5ceb38a349.54749119_95f5e4230d3348ce.onnx) If Not File.Exists(modelPath) Then MessageBox.Show(找不到模型文件: modelPath) btnPredict.Enabled False Return End If 直接加载 ONNX 模型 Dim options As New SessionOptions() options.AppendExecutionProvider_CPU(0) _session New InferenceSession(modelPath, options) _modelLoaded True lblStatus.Text 模型加载成功 lblStatus.ForeColor System.Drawing.Color.Green btnPredict.Enabled True Catch ex As Exception MessageBox.Show(加载失败: ex.Message) lblStatus.Text 加载失败 btnPredict.Enabled False End Try End Sub4、图像预处理和预测 图像预处理 Private Function ProcessImage(imagePath As String) As Single() Using original As New Bitmap(imagePath) Using resized As New Bitmap(128, 128) Using g As Graphics Graphics.FromImage(resized) g.InterpolationMode Drawing2D.InterpolationMode.HighQualityBicubic g.DrawImage(original, 0, 0, 128, 128) End Using Dim data(128 * 128 * 3 - 1) As Single Dim idx As Integer 0 For y As Integer 0 To 127 For x As Integer 0 To 127 Dim c As Color resized.GetPixel(x, y) data(idx) c.R / 255.0F data(idx 1) c.G / 255.0F data(idx 2) c.B / 255.0F idx 3 Next Next Return data End Using End Using End Function用图像数据生成张量然后推理并处理结果Private Sub btnPredict_Click(sender As Object, e As EventArgs) Handles btnPredict.Click If Not _modelLoaded OrElse _session Is Nothing Then MessageBox.Show(模型未加载) Return End If Using openDlg As New OpenFileDialog() openDlg.Filter 图像文件|*.jpg;*.jpeg;*.png;*.bmp If openDlg.ShowDialog() DialogResult.OK Then Return Try picBox.Image Image.FromFile(openDlg.FileName) 1. 预处理图像 Dim inputData ProcessImage(openDlg.FileName) 2. 创建输入张量 Dim inputTensor As New DenseTensor(Of Single)(inputData, New Integer() {1, 128, 128, 3}) Dim inputs As New List(Of NamedOnnxValue)() inputs.Add(NamedOnnxValue.CreateFromTensor(_inputName, inputTensor)) 3. 执行推理 Using results _session.Run(inputs) 获取输出 Dim outputTensor results.First(Function(x) x.Name _outputName).AsTensor(Of Single)() Dim scores outputTensor.ToArray() 4. 找到最高概率的类别 Dim maxIdx As Integer 0 For i As Integer 1 To scores.Length - 1 If scores(i) scores(maxIdx) Then maxIdx i Next 5. 显示结果使用中文标签 lblResult.Text 预测结果: _classNames(maxIdx) lblConfidence.Text 置信度: scores(maxIdx).ToString(P2) 6. 显示所有类别概率 Dim msg As String 各类别概率: vbCrLf vbCrLf For i As Integer 0 To scores.Length - 1 msg _classNames(i) : scores(i).ToString(P2) vbCrLf Next txtOutput.Text msg End Using Catch ex As Exception MessageBox.Show(预测失败: ex.Message vbCrLf ex.StackTrace) End Try End Using End Sub5、收一下尾巴Private Sub Form1_Closing(sender As Object, e As EventArgs) Handles MyBase.Closing If _session IsNot Nothing Then _session.Dispose() End If End Sub6、完整代码Imports Microsoft.ML.OnnxRuntime Imports Microsoft.ML.OnnxRuntime.Tensors Imports System.IO Public Class Form1 Private _session As InferenceSession Private _modelLoaded As Boolean False Private _inputName As String input Private _outputName As String output_layer_2 ✅ 标签映射按顺序健康 → 早疫病 → 晚疫病 → 白粉病 → 花叶病 → 黄化曲叶病 Private ReadOnly _classNames As String() { 健康, 早疫病, 晚疫病, 白粉病, 花叶病, 黄化曲叶病 } Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Try Dim modelPath Path.Combine(AppDomain.CurrentDomain.BaseDirectory, models, model_2026-07-07_01-56-55_6a4c5ceb38a349.54749119_95f5e4230d3348ce.onnx) If Not File.Exists(modelPath) Then MessageBox.Show(找不到模型文件: modelPath) btnPredict.Enabled False Return End If 直接加载 ONNX 模型 Dim options As New SessionOptions() options.AppendExecutionProvider_CPU(0) _session New InferenceSession(modelPath, options) _modelLoaded True lblStatus.Text 模型加载成功 lblStatus.ForeColor System.Drawing.Color.Green btnPredict.Enabled True Catch ex As Exception MessageBox.Show(加载失败: ex.Message) lblStatus.Text 加载失败 btnPredict.Enabled False End Try End Sub Private Sub btnPredict_Click(sender As Object, e As EventArgs) Handles btnPredict.Click If Not _modelLoaded OrElse _session Is Nothing Then MessageBox.Show(模型未加载) Return End If Using openDlg As New OpenFileDialog() openDlg.Filter 图像文件|*.jpg;*.jpeg;*.png;*.bmp If openDlg.ShowDialog() DialogResult.OK Then Return Try picBox.Image Image.FromFile(openDlg.FileName) 1. 预处理图像 Dim inputData ProcessImage(openDlg.FileName) 2. 创建输入张量 Dim inputTensor As New DenseTensor(Of Single)(inputData, New Integer() {1, 128, 128, 3}) Dim inputs As New List(Of NamedOnnxValue)() inputs.Add(NamedOnnxValue.CreateFromTensor(_inputName, inputTensor)) 3. 执行推理 Using results _session.Run(inputs) 获取输出 Dim outputTensor results.First(Function(x) x.Name _outputName).AsTensor(Of Single)() Dim scores outputTensor.ToArray() 4. 找到最高概率的类别 Dim maxIdx As Integer 0 For i As Integer 1 To scores.Length - 1 If scores(i) scores(maxIdx) Then maxIdx i Next 5. 显示结果使用中文标签 lblResult.Text 预测结果: _classNames(maxIdx) lblConfidence.Text 置信度: scores(maxIdx).ToString(P2) 6. 显示所有类别概率 Dim msg As String 各类别概率: vbCrLf vbCrLf For i As Integer 0 To scores.Length - 1 msg _classNames(i) : scores(i).ToString(P2) vbCrLf Next txtOutput.Text msg End Using Catch ex As Exception MessageBox.Show(预测失败: ex.Message vbCrLf ex.StackTrace) End Try End Using End Sub 图像预处理 Private Function ProcessImage(imagePath As String) As Single() Using original As New Bitmap(imagePath) Using resized As New Bitmap(128, 128) Using g As Graphics Graphics.FromImage(resized) g.InterpolationMode Drawing2D.InterpolationMode.HighQualityBicubic g.DrawImage(original, 0, 0, 128, 128) End Using Dim data(128 * 128 * 3 - 1) As Single Dim idx As Integer 0 For y As Integer 0 To 127 For x As Integer 0 To 127 Dim c As Color resized.GetPixel(x, y) data(idx) c.R / 255.0F data(idx 1) c.G / 255.0F data(idx 2) c.B / 255.0F idx 3 Next Next Return data End Using End Using End Function Private Sub Form1_Closing(sender As Object, e As EventArgs) Handles MyBase.Closing If _session IsNot Nothing Then _session.Dispose() End If End Sub End Class本文所使用的资源可以在上一篇下载或在AeEduLab.tech上自己生成。在AI创想实验室中我们无需编程基础不用学习框架不用配置环境无需购买费用高昂的显卡更不用为云端算力付费使用当前已有的各种硬件仅有核显的个人、办公、机房电脑希沃白板等都能达到理想的教学效果。操作简单但AI核心知识样样俱全无需师资培训就可以进行教学且能取得理想的教学效果。如果加入试点或合作方那么只需要一台局域网服务器无需显卡、服务器不用供算力即可一次投入永久使用全部项目和功能通过后台管理一分钟即可创建一个本地化、校本化的项目实例。演示版本地址www.AiEduLab.tech有任何问题欢迎留言或发送邮件至helloAiEduLab.tech