嵌入式 AI 入门第一问:AI 训练和推理到底有啥区别?
最近不少玩 STM32、ESP32 的朋友跟我说想试试在单片机、RK3588 这些板子上跑 AI 功能但上来就被「训练」「推理」两个词搞懵了这不都是跑 AI 模型吗有啥不一样我写 C 代码几十年怎么就没见过程序还要分「训练版」和「运行版」别急咱们先从大家最熟悉的场景切入你平时用的智能门锁里的人脸识别功能本质就是个典型的 AI 应用而它从无到有的过程刚好把「训练」和「推理」的区别讲得明明白白。一、先给个大白话定义训练是上学刷题推理是毕业干活咱们先拿考驾照的过程打个比方你一下子就能懂训练就像你在驾校练车给你几千道科目一题库带正确答案的标注数据你反复做题、错题就纠正算法迭代调整参数练到模拟考试次次 90 分以上模型精度达标最后你脑子里就记住了所有交规知识得到训练完成的模型参数。推理就像你拿到驾照后上路开车遇到具体的路况实际输入数据比如人脸、语音指令用你之前学到的交规知识直接做出判断模型用训练好的参数计算得到结果不需要再回去看题库。回到 AI 的官方定义咱们对应上就好理解了根据 NVIDIA 和 IBM 的官方解释AI 的完整流程分为两个完全独立的阶段AI 训练是让模型「学会知识」的过程通过海量带标注的样本数据反复迭代调整模型内部的参数直到模型对已知样本的判断准确率达到要求最终输出一套可用的参数文件就是我们常说的「AI 模型」。AI 推理是把训练好的模型部署到实际设备上输入真实的业务数据直接用已经学好的参数计算出结果是 AI 真正落地解决问题的阶段。核心术语通俗解释第一次接触 AI 必看首先给第一次接触 AI 的朋友补充几个核心术语的通俗解释避免后面看懵神经网络模型你可以理解为一套预设了计算规则的「答题模板」训练就是给这个模板填充从数据里学到的「解题参数」推理就是用填好参数的模板直接计算新问题的答案。参数就是模型从数据里学到的「知识」比如人脸识别模型里存储的人脸特征值类似你脑子里记的同事的长相特点。标注数据就是带正确答案的训练样本比如人脸识别训练里的每一张人脸照片都会标注对应的人名相当于考驾照时的题库答案。很多新手上来就问我能不能在单片机上自己训练模型答案几乎是「几乎不可能」就像你不可能一边上路开车一边学交规一样 —— 两个阶段的要求、资源消耗天差地别咱们往下看。二、看懂核心差异嵌入式工程师只需要关心推理吗我把两个阶段的核心要求整理成了对比表大家一眼就能看明白对比维度AI 训练AI 推理核心目标得到准确率足够高的模型参数快速、稳定地输出预测结果资源消耗极高通常需要几十上百张 GPU 集群跑几天甚至几个月显存、带宽要求极高极低嵌入式场景下甚至可以在几十 KB 内存的单片机上运行运行环境几乎都是离线云端服务器对功耗不敏感边缘设备、嵌入式板卡优先考虑低延迟、低功耗数据要求需要海量带标注的训练集比如做人脸识别需要几十万张带人名标注的人脸照片只需要实际业务的输入数据比如门锁摄像头拍到的某一张人脸迭代频率几个月甚至几年更新一次模型参数每次输入新数据就运行一次比如智能门锁每次有人按门铃就跑一次推理精度要求优先保证准确率通常用 32 位浮点数计算可以接受微小精度损失优先保证速度和资源占用看到这里嵌入式的朋友应该就懂了咱们平时在嵌入式设备上做的绝大多数 AI 部署工作都属于推理阶段的范畴训练阶段基本都是算法工程师在云端完成的我们拿到手的就是已经训练好的模型文件只需要想办法把它移植到板子上跑起来就行。举个真实的例子智能门锁的人脸识别流程咱们用大家天天见的智能门锁来拆解整个流程你就完全懂了训练阶段云端完成绝大多数场景下和嵌入式工程师无关算法工程师收集几十万张不同年龄、不同光线、不同角度的人脸照片每一张都标注好对应的人名放到 GPU 集群里训练几周得到一个几 MB 大小的人脸识别模型文件在标准测试集下的识别准确率可达到 99.9% 以上具体实际准确率需结合部署场景验证。推理阶段嵌入式端实现就是我们要做的工作我们把这个几 MB 的模型烧录到门锁的 MCU/NPU 里有人按门铃的时候摄像头拍一张人脸照片输入给模型模型在百毫秒级以内计算出「这是住户张三」还是「陌生人」直接控制门锁开不开。这里提一下大家常听到的NPU神经网络处理器它就是专门给推理阶段设计的硬件砍掉了 CPU、GPU 的通用计算能力只保留了 AI 推理最常用的矩阵计算加速就像专门算算术的计算器比通用的算盘快很多一样根据主流嵌入式 NPU 厂商公开参数同等功耗下推理速度通常可达通用 CPU 的数倍到数十倍。三、嵌入式做 AI 推理的 3 个常见避坑点 排查建议我接触过不少新手刚做嵌入式 AI 的时候容易把训练阶段的要求套到推理上踩了很多没必要的坑这里给大家列 3 个最常见的以及对应的排查方法坑 1盲目追求大模型忽略嵌入式资源限制很多新手上来就想用手机上几 GB 的大模型跑在单片机上完全忘了训练阶段的模型是「浮点数全精度」的参数体积大、计算量高根本不适合嵌入式。这里给新手补充下「量化」的通俗解释就是把模型里原本用 32 位浮点数存储的参数压缩成 8 位甚至 4 位的整数就像把高清照片压缩成小体积的普通照片精度损失很小但体积能缩小到原来的 1/4 甚至 1/8计算速度也能有明显提升刚好适合嵌入式的低资源场景。排查建议拿到模型先看两个参数①模型体积超过 10MB 的基本不适合普通单片机②计算量单位是 MAC也就是乘加运算次数STM32H7 这类单片机建议控制在 100MAC 以内。如果太大先要求算法工程师做量化或者换轻量级模型架构比如 MobileNet、Yolo-Fastest 等。坑 2把训练的准确率当成推理的实际准确率云端训练的时候准确率 99%部署到板子上实际跑只有 90%这太正常了训练用的公开数据集大多是经过筛选的光线好、角度正的高质量样本部分训练流程也会加入模拟复杂场景的增强数据但嵌入式端实际采集的图像可能过曝、模糊、角度歪这些都会影响准确率。排查建议拿到模型之后一定要做两步测试①先用和训练集同质量的标准测试集跑一遍确认移植过程没有引入精度损失②再用实际场景采集的 1000 张以上本地数据测试准确率达不到要求就反馈给算法工程师用本地数据重新微调训练模型。坑 3推理只看 FPS 不看延迟很多新手看性能只看FPS每秒能处理多少帧数据是衡量批量处理能力的吞吐量指标但嵌入式场景下 ** 延迟处理一帧数据需要多久** 往往更重要比如智能门锁的人脸识别你 1 秒出结果和 0.1 秒出结果用户体验天差地别哪怕你 FPS 能到 100但是单帧延迟超过 200ms实际用起来就会觉得卡。排查建议测试性能的时候一定要同时测两个指标①单帧推理延迟从输入数据到输出结果的时间实时场景建议控制在 100ms 以内②FPS连续跑多帧的平均速度用于评估满负载下的功耗。如果延迟太高先检查有没有做量化有没有用硬件 NPU 加速有没有不必要的预处理 / 后处理操作。给大家放一个最简单的 TFLite-Micro 推理代码示例一看就懂#include tensorflow/lite/micro/micro_interpreter.h #include tensorflow/lite/micro/micro_mutable_op_resolver.h #include tensorflow/lite/schema/schema_generated.h #include model_data.h // 训练好的量化模型文件已经转成了C数组 // 定义模型需要用到的算子这里只用了最基础的卷积和激活函数 static tflite::MicroMutableOpResolver5 resolver; const tflite::Model* model nullptr; tflite::MicroInterpreter* interpreter nullptr; TfLiteTensor* input nullptr; TfLiteTensor* output nullptr; // 给模型分配内存嵌入式场景下都是静态分配避免堆溢出 constexpr int kTensorArenaSize 64 * 1024; // 64KB内存足够跑轻量级关键词识别模型 uint8_t tensor_arena[kTensorArenaSize]; void ai_init() { // 1. 加载模型已经是训练好、量化完成的参数 model tflite::GetModel(g_model_data); if (model-version() ! TFLITE_SCHEMA_VERSION) { printf(模型版本不匹配\n); return; } // 2. 注册需要用到的算子 resolver.AddConv2D(); resolver.AddMaxPool2D(); resolver.AddFullyConnected(); resolver.AddSoftmax(); resolver.AddReshape(); // 3. 初始化解释器 static tflite::MicroInterpreter static_interpreter( model, resolver, tensor_arena, kTensorArenaSize); interpreter static_interpreter; // 4. 分配张量内存 TfLiteStatus allocate_status interpreter-AllocateTensors(); if (allocate_status ! kTfLiteOk) { printf(内存分配失败\n); return; } // 5. 获取输入输出指针 input interpreter-input(0); output interpreter-output(0); printf(AI模型初始化完成\n); } void ai_infer(const uint8_t* input_data) { // 1. 填充输入数据比如麦克风采集的音频特征、摄像头采集的图像数据 memcpy(input-data.uint8, input_data, input-bytes); // 2. 执行推理就是用训练好的参数计算结果不需要改任何参数 TfLiteStatus invoke_status interpreter-Invoke(); if (invoke_status ! kTfLiteOk) { printf(推理失败\n); return; } // 3. 处理输出结果比如0没检测到关键词1检测到“开门”指令 uint8_t result output-data.uint8[0]; if (result 200) { // 置信度阈值根据实际场景调整 printf(检测到开门指令正在开锁...\n); } }你看整个推理过程其实就是个普通的函数和你平时写的传感器数据处理函数没有本质区别只是内部计算逻辑是模型训练时确定好的而已。四、新手必记的 4 条核心结论最后给大家提炼几个最关键的结论搞懂了这些你就不会在 AI 入门的时候被概念绕晕了训练是造模型推理是用模型嵌入式工程师绝大多数日常工作都是处理推理阶段的部署入门阶段不需要你自己训练模型先把推理搞明白再碰训练也不迟。训练看精度、看算力推理看速度、看功耗两个阶段的优化目标完全不一样不要用训练的要求去衡量推理的效果也不要盲目追求训练时的高精度而忽略嵌入式端的资源限制。嵌入式跑 AI 不用怕资源不够现在很多量化后的轻量级模型只需要几百 KB 内存、几十 MHz 的 MCU 就能跑比如关键词识别、人脸检测这些基础功能STM32H7 这类单片机完全可以适配甚至 ESP32-S3 都能跑简单的关键词识别。不要纠结模型原理先跑起来再说很多新手一上来就想搞懂神经网络的数学原理其实完全没必要你就把模型当成一个「输入数据、输出结果」的黑盒函数先把它移植到板子上跑通再慢慢优化效果就好。如果大家想试试在单片机上跑第一个 AI 推理应用推荐可以先玩一下 GitHub 上的TensorFlow Lite Micro项目官方提供了很多 STM32、RP2040 的示例几行代码就能跑关键词识别、人员检测的 demo入门非常友好。

相关新闻

如何快速掌握代谢组学数据分析:MetaboAnalystR R包终极指南

如何快速掌握代谢组学数据分析:MetaboAnalystR R包终极指南

如何快速掌握代谢组学数据分析:MetaboAnalystR R包终极指南 【免费下载链接】MetaboAnalystR R package for MetaboAnalyst 项目地址: https://gitcode.com/gh_mirrors/me/MetaboAnalystR 你是否正在寻找一款能够简化代谢组学数据分析流程的强大工具&#xf…

2026/10/11 22:17:23 阅读更多 →
STM32 HAL库GPIO开发全解析:从LED驱动到工程实践

STM32 HAL库GPIO开发全解析:从LED驱动到工程实践

1. 项目概述:从点灯开始,理解STM32 HAL库的编程范式 对于每一位嵌入式开发者而言,点亮一颗LED灯,是踏入STM32世界最具仪式感的第一步。这看似简单的“Hello World”,背后却串联起了从硬件连接到软件驱动,再…

2026/10/7 16:23:49 阅读更多 →
KMS_VL_ALL_AIO 激活工具使用全攻略:5个步骤让Windows与Office一次激活到位

KMS_VL_ALL_AIO 激活工具使用全攻略:5个步骤让Windows与Office一次激活到位

KMS_VL_ALL_AIO 激活工具使用全攻略:5个步骤让Windows与Office一次激活到位 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 深夜加班赶方案,双击打开文档,却发…

2026/10/4 18:33:13 阅读更多 →

最新新闻

关于C语⾔输⼊/输出语句的⽤法

关于C语⾔输⼊/输出语句的⽤法

头文件 #include <stdio.h> 主函数 int main() { return 0/1; } 0 表示Flase 1 表示True,目前均可表示程序的结束 定义变量 int age 18; float f 3.1234567; double d 3.123456789; char c ‘a’; char str[] “hello”; //定义字符数组来保存字符串数据 输出语句 …

2026/10/15 13:28:00 阅读更多 →
本地化AI论文降重工具开发与实践

本地化AI论文降重工具开发与实践

1. 项目背景与核心痛点去年帮学弟改论文时发现一个现象&#xff1a;现在高校普遍使用AI检测工具来筛查论文的"AI生成痕迹"。Turnitin、知网等平台都新增了"AIGC检测率"指标&#xff0c;有些院校甚至规定超过15%就直接打回。这给需要借助AI工具辅助写作的研…

2026/10/15 13:28:00 阅读更多 →
Android插件化换肤:从资源加载到动态换肤的完整实践

Android插件化换肤:从资源加载到动态换肤的完整实践

两周前&#xff0c;被运营追着问“春节皮肤什么时候能上”——新主题已经画好了&#xff0c;但按常规发版节奏&#xff0c;审核走完&#xff0c;春节也过完了。那段时间我正好在重构项目的主题模块&#xff0c;索性把“预置多套主题”的老路彻底换掉&#xff0c;改成了一套走“…

2026/10/15 13:28:00 阅读更多 →
Flink On K8s生产实践:架构选型、配置避坑与高可用落地

Flink On K8s生产实践:架构选型、配置避坑与高可用落地

1. 项目概述&#xff1a;为什么“Flink On K8s”正在成为实时计算的事实标准你打开某公司内部技术分享会的PPT第一页&#xff0c;看到标题写着“Flink On K8s使用合集”&#xff0c;台下坐着运维、开发、数据平台工程师——没人皱眉&#xff0c;没人提问“这是什么”&#xff0…

2026/10/15 13:28:00 阅读更多 →
KT0605无线话筒调试静音故障排查与C8051F310硬件协同设计

KT0605无线话筒调试静音故障排查与C8051F310硬件协同设计

简介&#xff1a;本资源是面向嵌入式音频系统开发工程师的KT0605无线话筒硬件DEMO配套工程代码&#xff0c;聚焦C8051F310单片机在无线音频接收与信号处理中的实际应用。资源完整呈现了从射频接收、I2C/SPI外设驱动&#xff08;含I2C.c、SPI.LST等&#xff09;、音频解码控制&a…

2026/10/15 13:28:00 阅读更多 →
TileLang:GPU异构计算的声明式分块编程范式

TileLang:GPU异构计算的声明式分块编程范式

1. TileLang不是新语言&#xff0c;而是GPU编程范式的底层重构最近在几个高性能计算开源项目里反复看到tilelang这个词&#xff0c;它既不像Rust那样有语法教程&#xff0c;也不像CUDA那样带完整IDE支持&#xff0c;甚至GitHub上连个独立仓库都没有——但它频繁出现在MLIR、LLV…

2026/10/15 13:26:57 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时&#xff0c;网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上&#xff0c;依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里&#xff0c;扩缩容到底难在哪做过大模型推理服务部署的人&#xff0c;大概都经历过这样的场景&#xff1a;一个团队共用一套推理集群&#xff0c;A 业务跑的是 7B 的小模型&#xff0c;B 业务跑的是 72B 的大模型&#xff0c;C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子&#xff1a;一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减&#xff0c;为了把启动时间压进两秒以内&#xff0c;我手贱地把一串自认为“没用”的 systemd 服务给 disable 了&#xff0c;其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介&#xff1a;基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码&#xff0c;面向计算机相关专业课程设计与期末大作业学生&#xff0c;以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程&#xff0c;…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程&#xff1a;键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化&#xff0c;十个新手有八个栽在"往输入框里填东西"这件事上&#xff1a;要么填不进去&#xff0c;要么填了一半&#xff0c;要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程&#xff1a;阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀&#xff1a;什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面&#xff0c;跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →