二、模型训练与优化(5):验证优化后的模型

目录

一、在 PC 上使用 TFLite Python Interpreter 进行推理

1. 安装 TFLite Python Interpreter

2. 编写推理验证脚本

脚本说明:

3. 性能测试(可选)

二、在嵌入式平台(STM32Cube.AI)上验证

在嵌入式平台上对比准确率的方法

三、总结


下面将以 PC 上使用 TFLite Python Interpreter嵌入式平台(STM32Cube.AI) 两个典型场景为例,详细说明如何验证量化后(.tflite)的模型推理精度与性能。


一、在 PC 上使用 TFLite Python Interpreter 进行推理

1. 安装 TFLite Python Interpreter

  1. 使用 pip 安装(适用于常见的 Windows/macOS/Linux 环境):

    pip install tflite-runtime
    
    • 或者安装 tensorflow 本身就可以使用内置的 tensorflow.lite.Interpreter(2.5+ 版本的 TF 通常都包含该功能)。
  2. 验证安装

    python -c "import tflite_runtime; print(tflite_runtime.__version__)"
    

    如果没有报错且输出相应版本,说明安装成功。

2. 编写推理验证脚本

我们可以编写如下 Python 脚本(例如 test_tflite_inference.py)来加载并推理。

import numpy as np
import tflite_runtime.interpreter as tflite# 如果是使用 TensorFlow 2.x 的 tf.lite.Interpreter:
# from tensorflow.lite import Interpreterdef load_mnist_data():# 加载 MNIST 测试集(_, _), (x_test, y_test) = tf.keras.datasets.mnist.load_data()x_test = x_test.astype("float32") / 255.0x_test = x_test.reshape(-1, 28 * 28)return x_test, y_testdef evaluate_tflite_model(tflite_model_path):# 1. 加载 TFLite Interpreterinterpreter = tflite.Interpreter(model_path=tflite_model_path)interpreter.allocate_tensors()# 2. 获取输入、输出张量的索引input_details = interpreter.get_input_details()output_details = interpreter.get_output_details()# 3. 加载 MNIST 测试数据x_test, y_test = load_mnist_data()correct = 0total = len(x_test)for i in range(total):# 取出第 i 个测试样本input_data = x_test[i].reshape(1, 28 * 28).astype(np.float32)  # 有些量化模型需要 np.uint8,这要看具体 input_details['dtype']# 例如:#   input_dtype = input_details[0]['dtype']  # e.g. np.uint8#   input_data = input_data.astype(input_dtype)# 4. 将数据拷入 TFLite 模型的输入张量interpreter.set_tensor(input_details[0]['index'], input_data)# 5. 推理interpreter.invoke()# 6. 获取输出张量并预测标签output_data = interpreter.get_tensor(output_details[0]['index'])  # shape: [1,10]predicted_label = np.argmax(output_data[0])true_label = y_test[i]if predicted_label == true_label:correct += 1accuracy = correct / totalprint(f"TFLite 模型测试集准确率: {accuracy:.4f}")if __name__ == "__main__":import tensorflow as tf  # 用于加载 MNISTevaluate_tflite_model("mnist_model_quant.tflite")
脚本说明
  1. 导入 TFLite Interpreter

    • 如果我们安装了 tflite_runtime,则 import tflite_runtime.interpreter as tflite 就能使用。
    • 如果我们 安装了完整的 TensorFlow,注释掉上面并使用 from tensorflow.lite import Interpreter 即可。
  2. 载入测试数据

    • 这里直接在脚本里用 tf.keras.datasets.mnist 加载了 MNIST 测试集,并做简单归一化 (x_test / 255.0)
  3. 循环测试

    • 逐条将 x_test[i] 输入到 TFLite Interpreter,获取输出并比较预测标签和真实标签。
  4. 查看准确率

    • 最后打印出 “TFLite 模型测试集准确率”,和我们原先的 Keras float32 模型做对比,可以看到量化引起的精度损失大小。
  5. 运行脚本

    python test_tflite_inference.py
    
    • 若一切正常,会输出一个准确率值,比如 0.9740。

3. 性能测试(可选)

  • 如果我们想对比推理速度,可在 for-loop 外部记录时间,然后观察每张图片平均推理时间整段推理耗时
  • 在 CPU、GPU 或特定加速器环境下,TFLite 的性能也会有所不同。

二、在嵌入式平台(STM32Cube.AI)上验证

当需要在 STM32 等微控制器上部署量化后的 .tflite 模型,主要流程是:

  1. 安装并使用 STM32CubeMX 或 STM32CubeIDE

    • 在“Additional Software”中选择并安装 STM32Cube.AI 插件。
  2. 创建或打开 STM32CubeMX 工程

    • 选择目标 MCU 或开发板(如 STM32F4、STM32H7、STM32L4 等)。
    • 启用相关外设(如 UART 调试、SD 卡接口等)。
    • 打开 AI 选项卡,导入您的 .tflite 模型。
  3. STM32Cube.AI 转换与生成 C 代码

    • 在 STM32CubeMX 中的 AI 选项里点击 “Import Model”,选择 mnist_model_quant.tflite
    • 选择量化选项(如 8-bit),或者保留默认。
    • 点击 “Generate Code” 生成对应的 C 源文件和头文件(例如 network.c/hnetwork_data.c/h 等),并自动在工程里包含 AI 推理接口(如 MX_X_Cube_AI_Init()MX_X_Cube_AI_Process())。
  4. 集成到 STM32 工程

    • 在生成的 CubeIDE 工程中,我们会看到 AI 推理函数和模型数据文件已经添加;
    • 编写应用层代码,调用 AI 推理 API,如:
      #include "network.h"
      #include "network_data.h"// 输入/输出 buffer
      static ai_float in_data[784];    // MNIST 28x28
      static ai_float out_data[10];    // 10 classesvoid MX_X_Cube_AI_Process(void)
      {// 准备输入数据 (这里只是演示, 实际上要填入真实的像素值)for(int i=0; i<784; i++){in_data[i] = 0.0f; // 0~1 scale}// 调用推理函数if (ai_run(in_data, out_data) != AI_HANDLE_OK) {// error handle}// 寻找最大概率标签int max_i = 0;float max_val = out_data[0];for(int i=1; i<10; i++){if(out_data[i] > max_val){max_val = out_data[i];max_i = i;}}// 通过串口或 LED 显示分类结果 max_i
      }
      
    • ai_run 通常是 STM32Cube.AI 生成的模型推理函数(或 ai_network_run / ai_mnist_model_run 等名称,根据工程不同而定)。
  5. 编译并下载到开发板

    • 在 STM32CubeIDE 中点击 Build & Run,使用 ST-Link 下载程序到板子上。
    • 程序运行后,会对输入的 784 个 float 数据进行量化的模型推理,并输出预测结果。
  6. 推理速度和内存占用

    • 可以通过在 main 循环中多次调用 ai_run() 并记录时间戳,对比量化前和量化后的推理耗时;
    • 使用 arm_math.h or HAL_GetTick() 等方法统计推理时间,或者在 SWV/ITM Trace 里查看任务执行时间。
    • 也可查看 .map 文件或者调试器,了解 RAM/Flash 占用情况。

在嵌入式平台上对比准确率的方法

  • 通常,我们不会在实际硬件上跑 10,000 张 MNIST 图片,因为存储和时间有限。可以:
    1. 随机抽取几十张或几百张图片,通过 UART 或外部存储传给 STM32,观察每张的推理结果,计算准确率。
    2. 单张测试作为 Demo,验证实际是否能正确识别各个数字。
    3. 离线:在 PC 上已经得到大概率估计 97%+ 的准确率;嵌入式平台只做部分验证确认是否一致(可能略有浮动)。

三、总结

  1. PC 上验证

    • 安装 tflite_runtime 或使用 tensorflow.lite.Interpreter
    • 编写脚本加载 .tflite 模型并推理测试集,以查看准确率推理速度
    • 适合快速验证,不依赖目标硬件特性。
  2. STM32 或其他 MCU 上验证

    • 使用 STM32Cube.AI 导入 .tflite.h5
    • 生成 C 代码并集成到固件工程;
    • 在真实硬件上测试资源占用推理速度、以及预测结果是否符合预期。

通过这两种方式,就能完整地验证量化后模型在不同平台的推理结果与性能。

  • 对于 PC 测试而言,上述 Python 脚本非常直接;
  • 对于嵌入式,则需运用目标厂商的工具(如 STM32Cube.AI)或 TensorFlow Lite for Microcontrollers 并进行 C/C++ 级别的编写、调试。

这样,我们就有了量化后模型的准确率对比部署测试过程。

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

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

相关文章

【C++】结构体(下)

4、结构体指针 作用&#xff1a;通过指针访问结构体中的成员 利用操作符“----->”可以通过结构体指针访问结构体成员。 示例&#xff1a; #include<iostream> #include<string> using namespace std; struct student {//姓名string name;//年龄int age;//分数…

道格拉斯-普克算法(DP)轮廓点精简(Python)

1、介绍 道格拉斯-普克算法由David H. Douglas和Thomas K. Peucker于1973年提出&#xff0c;主要用于简化曲线或折线。而实际中&#xff0c;激光点云的边缘点非常粗糙&#xff0c;如果直接将点进行连接&#xff0c;锯齿问题严重。经过DP算法处理后&#xff0c;数据显示会比较光…

【机器学习实战入门项目】使用深度学习创建您自己的表情符号

深度学习项目入门——让你更接近数据科学的梦想 表情符号或头像是表示非语言暗示的方式。这些暗示已成为在线聊天、产品评论、品牌情感等的重要组成部分。这也促使数据科学领域越来越多的研究致力于表情驱动的故事讲述。 随着计算机视觉和深度学习的进步&#xff0c;现在可以…

【unity进阶篇】不同Unity版本对应的C# 版本和API 兼容级别(Api Compatibility Level)选择

考虑到每个人基础可能不一样&#xff0c;且并不是所有人都有同时做2D、3D开发的需求&#xff0c;所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】&#xff1a;主要讲解C#的基础语法&#xff0c;包括变量、数据类型、运算符、…

线段树优化dp,abc389F - Rated Range

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 F - Rated Range 二、解题报告 1、思路分析 考虑定义 f(i, j) 为 初始分…

MySQL 主从复制原理及其工作过程的配置

一、MySQL主从复制原理 MySQL 主从同步是一种数据库复制技术&#xff0c;它通过将主服务器上的数据更改复制到一个或多个从服务器&#xff0c;实现数据的自动同步。 主从同步的核心原理是将主服务器上的二进制日志复制到从服务器&#xff0c;并在从服务器上执行这些日志中的操作…

Linux——线程条件变量(同步)

Linux——多线程的控制-CSDN博客 文章目录 目录 文章目录 前言 一、条件变量是什么&#xff1f; 1、死锁的必要条件 1. 互斥条件&#xff08;Mutual Exclusion&#xff09; 2. 请求和保持条件&#xff08;Hold and Wait&#xff09; 3. 不可剥夺条件&#xff08;No Preemption&…

【Android】蓝牙电话HFP连接源码分析

一、概述 在Android系统中&#xff0c;HF&#xff08;Hands-Free Profile&#xff09;客户端与AG&#xff08;Audio Gateway&#xff09;端之间的HFP&#xff08;Hands-Free Profile&#xff09;连接是蓝牙音频通信的重要组成部分。这一过程涉及多个层次和组件的协同工作&…

【机器学习实战入门】使用Pandas和OpenCV进行颜色检测

Python 颜色检测项目 今天的项目将非常有趣和令人兴奋。我们将与颜色打交道&#xff0c;并在项目过程中学习许多概念。颜色检测对于识别物体来说是必要的&#xff0c;它也被用作各种图像编辑和绘图应用的工具。 什么是颜色检测&#xff1f; 颜色检测是检测任何颜色名称的过程…

动手学大数据-3社区开源实践

目录 数据库概览&#xff1a; MaxComput&#xff1a; HAWQ&#xff1a; Hologres&#xff1a; TiDB&#xff1a; Spark&#xff1a; ClickHouse&#xff1a; Apache Calcite 概览 Calcite RBO HepPlanner 优化规则&#xff08;Rule&#xff09; 内置有100优化规则 …

多平台下Informatica在医疗数据抽取中的应用

一、引言 1.医疗数据抽取与 Informatica 概述 1.1 医疗数据的特点与来源 1.1.1 数据特点 医疗数据具有显著的多样性特点。从数据类型来看&#xff0c;涵盖了结构化数据&#xff0c;如患者的基本信息、检验检查结果等&#xff0c;这些数据通常以表格形式存储&#xff0c;便于…

HTTP / 2

序言 在之前的文章中我们介绍过了 HTTP/1.1 协议&#xff0c;现在再来认识一下迭代版本 2。了解比起 1.1 版本&#xff0c;后面的版本改进在哪里&#xff0c;特点在哪里&#xff1f;话不多说&#xff0c;开始吧⭐️&#xff01; 一、 HTTP / 1.1 存在的问题 很多时候新的版本的…

BUUCTF_Web(October 2019 Twice SQL injection)

October 2019 Twice SQL injection 知识点&#xff1a; 二次注入&#xff1a; 当用户提交的恶意数据被存入数据库后&#xff0c;应用程序再把它读取出来用于生成新的SQL语句时&#xff0c;如果没有相应的安全措施&#xff0c;是有可能发生SQL注入的&#xff0c;这种注入就叫…

电商项目高级篇08-springCache

电商项目高级篇08-springCache 1、整合springCache2、Cacheable细节设置 1、整合springCache 1、引入依赖 <!--引入springCache--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifa…

【tailscale 和 ssh】当服务器建立好节点,但通过客户端无法通过 ssh 连接

背景 当服务器建立好节点&#xff0c;一切显示正常但通过客户端无法通过 vs code 中的 ssh 连接到服务器 问题解决 因为服务器是重装过的&#xff0c;所以忘记在服务器上下载 ssh 了。。。安装完成并启动 SSH 服务后便可正常连接&#xff01; sudo apt update sudo apt in…

python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)边缘检测

OpenCV中边缘检测四种常用算子&#xff1a; &#xff08;1&#xff09;Sobel算子 Sobel算子是一种基于梯度的边缘检测算法。它通过对图像进行卷积操作来计算图像的梯度&#xff0c;并将梯度的大小作为边缘的强度。它使用两个3x3的卷积核&#xff0c;分别用于计…

[实现Rpc] 环境搭建 | JsonCpp | Mudou库 | callBack()

目录 1. 项目介绍 2. 技术选型 3. 开发环境和环境搭建 Ubuntu-22.04环境搭建 1. 安装 wget&#xff08;一般情况下默认会自带&#xff09; 2. 更换国内软件源 ① 备份原始 /etc/apt/sources.list 文件 ② 编辑软件源文件 ③ 更新软件包列表 3. 安装常用工具 3.1 安装…

Golang Gin系列-1:Gin 框架总体概述

本文介绍了Gin框架&#xff0c;探索了它的关键特性&#xff0c;并建立了简单入门的应用程序。在这系列教程里&#xff0c;我们会探索Gin的主要特性&#xff0c;如路由、中间件、数据库集成等&#xff0c;最终能使用Gin框架构建健壮的web应用程序。 总体概述 Gin是Go编程语言的…

游戏引擎学习第81天

仓库:https://gitee.com/mrxiao_com/2d_game_2 或许我们应该尝试在地面上添加一些绘图 在这段时间的工作中&#xff0c;讨论了如何改进地面渲染的问题。虽然之前并没有专注于渲染部分&#xff0c;因为当时主要的工作重心不在这里&#xff0c;但在实现过程中&#xff0c;发现地…

IO多路复用详解-selectpollepoll

目录 1.IO多路复用概念 2.系统调用函数 2.1select 2.1.1select函数细节 2.2基于select实现并发处理 2.2.1处理流程 2.2.2服务端通信代码 2.2.3客户端通信代码 2.3基于poll函数实现并发处理 2.3.1select与poll函数区别 2.3.2poll函数 2.3.3服务器端代码实现 2.3.4客…