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

更多推荐