这个领域是过去三年嵌入式工程师的新增技能要求。以前你只要会写驱动,现在客户问"能不能在我这块板子上跑个 YOLO"。会回答这个问题、并真的把它做出来的人,议价能力翻倍。
一、嵌入式 AI 部署的难点全景图
1. 平台多样性
| 平台 | 算力 | 内存 | 典型场景 |
|---|---|---|---|
| Cortex-M4/M7(无加速) | 50-300 MOPS | 64-512KB RAM | 关键词唤醒 / 简单时序分析 |
| Cortex-M55 + Helium | 1-5 GOPS | 256KB-2MB | 简单 CV / 多通道传感器融合 |
| Cortex-M85 + Ethos-U55 | 250 GOPS | 1-2MB | 实时小图像分类 |
| Cortex-A53 + 软件 NN | 5-20 GOPS | 256MB+ | 中等模型推理(不实时) |
| Cortex-A + NPU(i.MX 8M+ / RK3588 / RZ/V2L) | 1-6 TOPS | 1GB+ | 实时检测 / 分割 |
| Jetson 系列 | 20-275 TOPS | 4-64GB | 多模型并发 / 大模型 |
每种平台的工具链、量化方案、部署框架都不一样。
2. 模型 → 硬件适配
PyTorch / TF 训练的模型要经过:
PyTorch / TF
↓ export
ONNX
↓ convert
TFLite / ONNX Runtime / 厂商专用格式(NPU)
↓ optimize
Quantize(INT8 / INT4)
↓ compile
平台 binary
↓ deploy
板子
每一步都可能掉精度、掉性能、出 bug。
3. 量化是黑科技
INT8 量化精度可能掉 0.5%,也可能掉 30%——取决于模型结构 / 校准数据 / 量化策略。没有"按一个按钮就行"的方案。
4. 实时性 vs 精度 trade-off
跑一帧 100ms 还是 30ms?精度差 5% 还是 1%?这些不是技术问题,是产品决策——但它决定了所有技术选择。
5. 工具链不友好
ST 的 X-Cube-AI、NXP 的 eIQ、瑞萨的 DRP-AI、瑞芯微的 RKNN——每家工具都自成一派,文档质量参差。
AI 在每一步都帮得上忙,但角色不同。下面分阶段讲。
二、阶段 1:选平台 + 选模型
让 AI 做平台 / 模型可行性评估
新需求来了,第一个问题是"这个能不能做"。
Prompt:
需求:在边缘设备上做实时人体检测
- 输入:1080p @ 30fps 摄像头
- 输出:人体 bbox + 置信度
- 延迟要求:< 50ms / frame
- 功耗预算:板子总功耗 < 5W
- 场景:户外,室外光照强烈
- 量产成本:BOM 主控 < $30
我考虑这几个平台,请评估各自可行性:
1. STM32H747 + Himax HM01B0
2. i.MX 8M Plus(Cortex-A53 + 2.3 TOPS NPU)
3. RK3566(A55 + 0.8 TOPS NPU)
4. 瑞萨 RZ/V2L(A55 + DRP-AI 1 TOPS)
每个平台给:
- 是否可行
- 推荐模型(YOLOv5n / YOLOv8n / NanoDet / PicoDet 等)
- 预期延迟 / mAP / 功耗
- 主要风险
AI 输出大致:
STM32H747 + HM01B0:不可行。Cortex-M7 算力远不够 1080p 实时处理。即使降到 96x96 跑 PicoDet,延迟也 200ms+。
i.MX 8M Plus:可行。推荐 YOLOv5n(INT8 量化),1080p resize 到 640x640 后预期 35-45ms / frame,mAP@50 约 0.55。功耗 NPU 满载约 2.5W + SoC 1W = 3.5W,达标。风险:NXP eIQ 对 YOLOv5 的支持成熟度 OK 但要小心后处理(NMS)耗时。
RK3566:可行但紧。0.8 TOPS NPU 跑 YOLOv5n 预期 60-80ms。可降到 320x320 输入或换 NanoDet-Plus 才能达 50ms。
RZ/V2L:可行。DRP-AI 是瑞萨私有架构,要用瑞萨 translator 转模型。文档中文资料少,开发周期会长。
推荐:i.MX 8M Plus。生态最成熟、风险最低。
这种分析以前要找 vendor FAE 三家比较——光开会就好几天。AI 5 分钟给完。
注意:AI 给的延迟数字要验证
AI 给的"预期 35-45ms"是基于训练数据的统计估计,实际跑出来可能差 30%-50%。一定要拿样品板真测一遍再下决定。
我有过一次教训:AI 说某 NPU 跑 YOLOv5n "约 25ms",结果实测 70ms——因为它的量化工具不支持某个 layer,那个 layer 自动 fallback 到 CPU。fallback 一发生延迟就爆。
三、阶段 2:模型训练 / 微调
这一步 AI 帮助有限——主要是让 AI 帮你做"嵌入式友好的模型设计 / 选型"。
Prompt
我要训一个语音关键词唤醒模型:
- 唤醒词:"你好小明"
- 部署到 STM32U585(Cortex-M33,128KB RAM,MVE 加速)
- 总模型 size < 30KB
- 推理延迟 < 50ms
- false accept rate < 1次/24小时
请给出:
1. 推荐的网络结构(DS-CNN / TC-ResNet / Conformer-tiny)
2. 输入 feature 推荐(MFCC vs MelSpec,多少帧、多少 mel bin)
3. 训练数据建议(多少正样本 / 负样本、噪声覆盖)
4. 量化前 / 量化后预期 size
5. 关键的训练 trick(focal loss / hard negative mining / data aug)
AI 在 KWS 这种成熟领域给的建议很专业——它读过 ARM 的 ML Zoo + Google 的 KWS 论文,知道哪些 trick work。
我用 AI 推荐的 DS-CNN-S(Depthwise Separable CNN small)+ MFCC 40 dim × 49 帧 + INT8 量化,模型 23KB,FAR 0.3 次 / 24h,FRR 4%。比自己摸索快了 2-3 周。
数据增强代码生成
给我一个音频数据增强 pipeline:
- 输入:干净的关键词录音
- 增强:加高斯噪声、白噪声、背景音(餐厅 / 街道 / 办公室)、reverb、speed perturbation、pitch shift
- 每个原始样本生成 20 个增强样本
- 输出 wav 文件
- 用 librosa + numpy
AI 一次给完 200 行代码可用。
四、阶段 3:模型转换(PyTorch → ONNX → 平台格式)
这一步最容易踩坑。
Pre-conversion sanity check
Prompt:
我有一个 PyTorch YOLOv5n 模型要导出 ONNX 部署到 NPU。
模型 forward 关键代码:
<贴 model.py 关键部分>
请检查:
1. 哪些 op / layer 可能在 ONNX export 时出问题
2. 哪些 op 可能不被典型 NPU 支持
3. 哪些动态 shape 操作要改静态
4. 推荐的 export 参数(opset / dynamic_axes / do_constant_folding)
5. export 后用 onnxruntime 验证的 sanity check 代码
AI 输出:
风险点:
Detect layer 的 grid 计算:YOLOv5 在 forward 里动态生成 grid,ONNX 导出时会变成一堆 op。NPU 通常不支持。建议:导出时用
model.model[-1].export = True把后处理拆出去,CPU 上做。SiLU 激活:早期 NPU 不支持 SiLU,会 fallback 到 CPU。确认:你的目标 NPU 支持吗?不支持的话考虑换 ReLU6 重新训练。
Focus 层(Slice + Concat):NPU 通常会 fallback。建议:换成 6x6 conv with stride=2(数学等效,NPU 友好)。
NMS:NPU 不做。后处理 CPU。
Export 参数:
torch.onnx.export(model, dummy, "yolov5n.onnx", opset_version=12, # NPU 工具链兼容性最好 do_constant_folding=True, dynamic_axes=None, # 必须静态 shape input_names=["images"], output_names=["output"])Sanity check:
[代码省略]
我以前 export 一次踩三个坑,每个坑修一天。有 AI 提前 review 一次省两周。
Convert 后的精度对比
转换后要对比 PyTorch / ONNX / 平台格式的输出是否一致:
给我一个脚本:
- 输入:100 张验证图
- 跑 PyTorch 原模型 → 输出 A
- 跑 ONNX 模型(onnxruntime) → 输出 B
- 跑 RKNN 模型(rknn-toolkit2) → 输出 C
- 计算 A vs B 的 max diff、mean diff
- 计算 B vs C 的 max diff、mean diff
- 如果 diff 超过阈值,dump 对应图片 + 输出
AI 给的脚本拿来就能用。这种"流水线脚本"AI 写得贼快。
五、阶段 4:量化(最难的一步)
INT8 量化是嵌入式 AI 的核心 + 最大坑。
选量化策略
Prompt:
我要把 YOLOv5n(PyTorch)量化到 INT8 部署在 RK3588。
训练数据:COCO + 我们自定义 5000 张工业图片。
要求:mAP@50 量化后下降 < 2%。
请:
1. 推荐量化策略(PTQ vs QAT)
2. PTQ 校准数据集应该选什么、多少张
3. 哪些 layer 应该保留 FP(quantization-friendly check)
4. 推荐的量化工具(rknn-toolkit2 / ONNX QAT / Brevitas)
5. 量化失败时 debug 流程
AI 输出会包含:
推荐:先试 PTQ(Post-Training Quantization),如果掉点 > 2% 再上 QAT(Quantization-Aware Training)。
校准数据:100-500 张,必须覆盖部署场景——COCO 和工业图片混着选,不要只用 COCO(domain mismatch)。
保留 FP 的 layer:通常 detection head 最后一层 + sigmoid 之前的 layer。RKNN 可以用 hybrid_quantization 指定。
Debug 流程:
跑全量 INT8 → 测 mAP,如果掉太多继续:找出 quantization error 最大的 layer(layer-wise 对比 FP vs INT8 输出)把这些 layer 设为 FP16 或 FP32重新评估还不行 → 上 QAT
按这个流程走,我做的工业检测项目 mAP 从量化前 0.78 → INT8 PTQ 0.71(掉 7% 太多)→ 找出 backbone 末尾 + neck 首层 hybrid 之后 0.76(掉 2% 可接受)。
Layer-wise quantization analysis
让 AI 写脚本:
# 比较每个 layer 的 FP32 vs INT8 输出,找误差大的 layer
for layer_name in layers:
fp_out = run_fp32(model, input, layer_name)
int_out = run_int8(model, input, layer_name)
diff = np.abs(fp_out - int_out).mean()
print(f"{layer_name}: diff={diff:.6f}, range={fp_out.min():.3f}~{fp_out.max():.3f}")
跑出来排序,diff 最大的 top 5 layer 就是"量化敏感层"——hybrid quantization 重点保护对象。
六、阶段 5:平台部署 + 性能优化
让 AI 写部署脚手架
平台:i.MX 8M Plus + NXP eIQ TIM-VX backend
要部署:YOLOv5n INT8 + 后处理(NMS 在 CPU)
需要:
1. C++ 推理框架代码(加载模型 / 输入预处理 / 调用 NPU / 后处理)
2. 输入:V4L2 抓的 YUV422 1920x1080
3. 输出:bbox 列表 + 类别 + 置信度
4. 性能 profiling:每帧耗时 breakdown(capture / preprocess / NPU infer / postprocess / draw)
5. 用 GStreamer 显示结果
约束:
- 单线程版本先做
- 用 OpenCV 4.5 做 preprocess + draw
- C++17
AI 给的 800 行代码大约 80% 直接能用。剩 20% 是平台特定的小问题:
- TIM-VX 的初始化顺序DMA buffer 的映射GStreamer pipeline 的 caps 协商
我手改了几个小时跑通。从零写至少一周。
性能 profiling + 优化建议
跑通后做 profiling:
当前性能(每帧):
- V4L2 capture: 33ms(1 frame 时间,正常)
- YUV → RGB resize 640: 18ms (CPU 单线程)
- NPU inference: 27ms
- NMS: 8ms
- Draw + display: 5ms
总延迟(capture 到显示):~90ms
请给优化建议,按 ROI 排序。
目标:< 50ms(不算 capture)
AI 输出:
YUV → RGB resize:18ms 太长。i.MX 8M Plus 有硬件 PXP(Pixel Pipeline)做 colorspace + scale,5ms 内能搞定。集成 PXP API 替换 OpenCV。预期省 13ms。
NPU + CPU pipeline:NPU 推理时 CPU 闲着、CPU 后处理时 NPU 闲着。改成双 buffer:
Frame N 的 NPU 推理 + Frame N-1 的 NMS 并行预期总延迟降 20%
NMS:用平台 SIMD(NEON)优化,预期从 8ms → 3ms。
Display:GStreamer 已经异步,没优化空间。
综合:预计能做到 35-40ms。
我按 1 + 2 实现,做到 42ms。3 没做(够用了)。优化时间从一周缩到 2 天。
七、阶段 6:上线监控
部署到产线后还要监控模型表现。
让 AI 设计 monitoring
模型已部署到 100 台工业相机。
我想监控:
- 每台设备的推理延迟分布
- 每台设备的检测结果(数量 / 类别分布)
- 模型置信度分布的偏移(domain shift 早期信号)
- 异常情况:延迟突增 / 检测数突变 / 置信度集体下降
请设计:
1. 设备端要采集什么 metric
2. 上报频率 / 协议(要节省带宽)
3. 服务端怎么聚合、报警阈值怎么定
4. 怎么发现"模型该 retrain 了"的信号
AI 给的方案我大致照搬。最有用的是"模型 retrain 信号"那部分——
信号 1:相邻一周的置信度 P50 偏移 > 0.05 → domain shift
信号 2:某类别检测数从历史均值偏离 3σ → 真实分布变了 or 模型衰退
信号 3:某固定场景(同位置同时段)的检测稳定性下降 → 模型本身退化(可能是温度 / 老化导致 NPU 性能漂移)
这种"系统性 monitoring 思维"以前要靠老 MLOps 工程师,现在 AI 给的方案 80 分起步。
八、几个真实案例
案例 1:STM32 上跑 KWS(关键词唤醒)
平台:STM32U585,128KB RAM,160MHz。 模型:DS-CNN small,INT8 量化后 23KB。 框架:X-Cube-AI 7.3。
工作流:
- AI 帮选模型结构 + 推荐数据集 + 训练 trick → 1 天 spec out我自己训模型(4 天,主要是收集中文 wakeword 数据)AI 帮做 ONNX export + sanity check → 0.5 天AI 帮 X-Cube-AI 配置 + 生成 C 代码 → 0.5 天AI 帮写 ring buffer + MFCC 实时计算 + ISR 集成 → 1 天真机调试 + 调阈值 → 1 天
总耗时 8 天。同事不用 AI 做类似项目花了 3 周。
案例 2:i.MX 8M Plus 上跑 YOLOv8n(人脸检测)
平台:i.MX 8M Plus,2.3 TOPS NPU。 模型:YOLOv8n 量化 INT8。 框架:NXP eIQ + TIM-VX。
工作流:
- AI 帮做平台可行性评估 + 模型选型 → 0.5 天我们 ML team 训模型 → 2 周(不算我的时间)AI 帮做 Pytorch → ONNX → eIQ 转换 + 量化诊断 → 2 天(折腾 SiLU fallback)AI 帮写 C++ 部署框架 + GStreamer 集成 → 3 天AI 帮做性能优化(PXP + double buffer)→ 2 天量产前测试 + bug 修复 → 1 周
我自己的工时约 3 周。如果不用 AI 估计 6-8 周。
案例 3:把 LLM 塞进 RK3588(小尝试)
试着把 Qwen-1.8B-Chat 量化部署到 RK3588。
工作流:
- AI 评估可行性:4-bit 量化后约 1GB weight,prefill ~5 tok/s,decode ~10 tok/s。可行但很慢。用 RKLLM-Toolkit 转换(vendor 工具)AI 帮调推理 schedule(batch size / max_new_tokens)
最终跑通,但 decode 7 token/s,不实用。结论:当前 NPU 跑 1B 级 LLM 还不实用——但等 2026 年新一代 NPU(10+ TOPS)会改善。
这个案例的价值是:让我对"边缘 LLM"有 hands-on 认知。客户问"能不能在板子上跑 GPT"我能给出有数据支撑的答案。
九、几个经验
1. 不要先写代码,先做平台 PoC
新平台 / 新模型组合,先用 vendor demo + 你的模型跑通最小可用版本。看实测延迟、精度、功耗——这些数据决定项目可行性。
代码漂亮但平台跑不动 = 0 价值。
2. 量化不是越激进越好
PTQ INT8 → INT4 → 二值化——精度衰减是非线性的。INT8 是大多数项目的甜点。INT4 只在特殊场景(边缘 LLM)才值得。
3. NPU 不是万能
NPU 强项:conv / matmul / 激活。
NPU 弱项:动态 shape / 复杂控制流 / 后处理(NMS)/ 前处理(resize)。
完整 pipeline 要 NPU + CPU + 硬件 ISP / PXP 配合。把所有东西塞进 NPU 不现实。
4. 训练框架版本影响巨大
PyTorch 1.13 export 的 ONNX 跟 2.1 export 的不一样。eIQ 5.x 跟 7.x 接受的 ONNX op set 不一样。部署成功的 toolchain 版本要锁死——任何升级都要回归测试。
5. AI 给的"经典模型推荐"经常过时
AI 推荐 YOLOv5——但现在 YOLOv8 / YOLO-NAS / RT-DETR 在某些场景更好。AI 的训练数据可能是 2023 年以前的——前沿模型选型要自己查 papers / leaderboard。
6. 客户要"AI 功能",但客户其实要"业务效果"
不要被"客户要 AI"绑架。很多场景传统 CV(OpenCV + 阈值)就够用——比 NN 更快、更稳、更省。
有个客户要"AI 检测螺栓松动"——分析后发现就是检查"螺栓位置和初始位置的偏移",模板匹配 5ms 搞定。客户开心,我也轻松。AI 不是必须的。
十、ROI 排序
高 ROI
平台 / 模型可行性评估
-
- (AI 5 分钟搞定,省一周开会)
PyTorch → ONNX export sanity check
-
- (避免 export 后才发现 NPU 不支持)
量化 layer-wise 分析脚本
-
- (找量化敏感 layer)
C++ 部署框架脚手架
- (V4L2 + NN + GStreamer)
中 ROI
训练数据增强代码monitoring 设计建议性能 profiling 优化建议
低 ROI
AI 帮你训模型
-
- (作用有限,主要还是 data + 算力)
AI 直接生成 NPU 驱动代码
-
- (vendor SDK 已经包了,再写无意义)
追前沿 LLM-on-edge
- (生态不成熟,2025 年大概率投入产出比低)
十一、什么场景不该上 NN
传统算法可解决
-
- → 用 OpenCV / 信号处理
训练数据 < 1000 张
-
- → 数据不够,效果不会好
场景每月变化
-
- → NN 跟不上,规则系统更稳
必须可解释(医疗 / 法律)
-
- → 黑盒不行,用决策树 / SVM
超低功耗(uA 级)
- → 任何 NN 都耗,先找非 NN 方案
198