【中小学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 Sub
4、图像预处理和预测
' 图像预处理
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 Sub
5、收一下尾巴
Private Sub Form1_Closing(sender As Object, e As EventArgs) Handles MyBase.Closing
If _session IsNot Nothing Then
_session.Dispose()
End If
End Sub
6、完整代码
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
有任何问题欢迎留言或发送邮件至:hello@AiEduLab.tech
更多推荐


所有评论(0)