售货柜实战:端到端优化落地全记录 售货柜实战端到端优化落地全记录最后一篇实战把前面 11 篇的知识全部串起来。从模型选型、训练优化、量化转换、推理加速、多路架构到工程化部署完整讲一遍售货柜商品识别系统是怎么从 0 到 1 落地的踩过哪些坑、每一步优化了多少。大家好我是黒漂技术佬。这是边缘AI部署系列的最后一篇也是实战篇。售货柜商品识别这个项目我做了挺久从最开始的 demo 到量产落地前前后后优化了四五版。这篇把整个过程完整记录下来模型怎么选的、训练怎么调的、量化掉点怎么解决的、推理速度怎么一步步提上来的、工程化踩了哪些坑。一、项目背景需求智能售货柜用户开门拿商品关门自动结算。靠摄像头视觉识别拿了什么商品。硬件主控RK35888G 内存版摄像头2 路 1080p IPC 摄像头主货架 副货架网络4G WiFi性能要求单路推理≥ 20fps商品识别准确率≥ 95%关门结算时间≤ 2 秒7×24 小时稳定运行支持远程模型升级商品数量初期 30 种 SKU后续扩展到 60 种。二、第一版基线版本模型选型一开始选了 YOLOv5s理由社区成熟资料多精度不错60 类以内应该够用训练数据集每种商品 200 张左右共约 6000 张增强默认 Mosaic 翻转 颜色抖动训练300 epochs默认参数部署导出 ONNX → onnxsim 简化 → 转 RKNN INT8单线程同步推理OpenCV 做预处理效果指标数值评价单路推理速度~12fps不够要求 20fpsmAP测试集91.3%一般端到端延迟~120ms慢CPU 占用~60%偏高稳定性偶尔断流崩溃不行问题总结速度不够RK3588 上才 12fps精度一般小包装商品漏检多预处理慢OpenCV 缩放占了一半时间不稳定RTSP 断流程序就崩了三、第二版模型与训练优化优化 1换 YOLOv8n把 v5s 换成 v8n参数量更小架构更新。模型大小14M → 3.2M推理速度12fps → 22fpsmAP91.3% → 90.8%几乎没掉速度几乎翻倍精度基本持平。架构升级的收益比加大模型更划算。优化 2数据增强加强加了高斯噪声、运动模糊模拟摄像头模糊加了随机遮挡模拟手挡、商品叠放Mosaic 全程开启亮度对比度抖动幅度加大mAP90.8% → 92.5%1.7%优化 3知识蒸馏用 YOLOv8m 当教师模型蒸馏 v8n温度 T4蒸馏损失比例 0.5mAP92.5% → 93.8%1.3%白嫖的精度必做。优化 4难例补充收集了一波 bad case底部货架角度偏的反光场景的商品部分露出的每个难例场景补充 50-100 张。mAP93.8% → 95.1%1.3%第二版小结指标第一版第二版提升推理速度12fps22fps83%mAP91.3%95.1%3.8%模型大小14MB3.2MB-77%模型层面的优化效果显著。四、第三版量化与推理优化优化 1量化调优默认量化掉点有点多95.1% → 92.7%掉 2.4%。调优过程校准集从 100 张扩充到 300 张覆盖各种场景检测头几层保留 FP16用非对称量化最终 INT8 mAP94.4%掉 0.7%可接受推理速度22fps → 38fpsFP16 → INT8快了 70%优化 2RGA 硬件预处理把 OpenCV 软件缩放换成 RGA 硬件加速预处理耗时~15ms → ~2ms端到端延迟大幅下降优化 3零拷贝输入用 RKNN 零拷贝接口少一次内存拷贝。推理 拷贝~26ms → ~22ms优化 4三阶段流水线拉流解码 → 预处理 → 推理 → 后处理每个阶段独立线程队列串起来。单路稳定 35fps端到端延迟 ~50ms。优化 5CPU 绑核推理和预处理线程绑 A76 大核拉流线程用小核。帧率更稳定不会被系统调度影响。第三版小结指标第二版第三版提升推理速度22fps38fps73%端到端延迟~120ms~50ms-58%INT8 mAP92.7%94.4%1.7%CPU 占用~60%~20%-67%部署侧的优化收益也很大而且精度还提升了量化调优的功劳。五、第四版多路架构与工程化多路架构两路摄像头每路独立流水线主摄像头1080p商品识别NPU 两核30fps副摄像头720p辅助检测NPU 一核15fpsNPU 独立模式分配两路并行不打架。稳定性优化RTSP 自动重连断线 3 秒重试无限重连每路独立 try-catch一路崩了不影响另一路队列长度限制满了丢旧帧保证延迟systemd 守护进程崩了自动拉起内存监控超过阈值自动重启服务业务逻辑优化待机降帧率没人的时候每秒 1 帧省电省算力开门全帧率检测到开门切全帧率识别多帧投票结算关门时取最后 10 帧结果投票准确率更高结果过滤结合商品位置、重量数据如果有二次校验工程化模型版本管理语义化版本元数据齐全远程热更新后台推送凌晨低峰自动更新灰度发布先更 5% 设备没问题再全量监控告警帧率、延迟、内存、断流全监控日志系统分级日志远程可拉取第四版最终效果指标要求实际单路推理速度≥20fps38fps识别准确率≥95%96.2%多帧投票后结算时间≤2秒~1秒CPU 占用-~20%稳定性7×24h连续运行 30 天无崩溃全部满足需求还有不少余量。六、整体优化路线回顾从第一版到第四版整体提升指标第一版最终版总提升推理速度12fps38fps3.2 倍mAP91.3%94.4%单帧/ 96.2%多帧3~5%端到端延迟~120ms~50ms快 2.4 倍CPU 占用~60%~20%降 2/3模型大小14MB3.2MB小 77%优化是一层层叠加的模型选型速度 ×1.8量化速度 ×1.7预处理加速延迟 -50%流水线吞吐 ×1.5训练优化精度 4%没有哪一步是「银弹」每一步优化一点加起来就很多了。七、踩过的坑 Top 10坑 1ONNX 导出 opset 太高一开始用 opset 17转 RKNN 各种算子不支持。换回 opset 12 就好了。坑 2RGB/BGR 搞反RKNN 默认 RGBOpenCV 默认 BGR推理结果全错。排查了半天才发现。坑 3量化校准集太单一一开始校准集全是正常光照的图暗光场景量化误差大漏检多。补充各种场景后好了。坑 4多线程共用一个 RKNN context一开始图省事多路共用一个 context偶发崩溃。改成每个线程一个 context 就稳了。坑 5RTSP 断流程序卡死没加超时断流了就一直卡着。加了 stimeout 和外层重连循环解决。坑 6预处理 letterbox 不对齐训练时的 letterbox 和推理时的实现不一样偏移差了几个像素小目标检测影响大。坑 7NPU 降频设备散热不好跑久了 NPU 降频速度越来越慢。加了散热片、设了温度策略。坑 8模型更新后格式不兼容改了输出格式老版本代码解析崩了。后来加了版本校验和向前兼容。坑 9内存泄漏C 代码里几处忘记释放 RKNN 内存跑几天内存满了。加了内存池和 valgrind 检查。坑 104G 流量超标一开始全量下载模型一次几十 MB设备多了流量费爆炸。改成差分更新 闲时下载。八、经验总结1. 先跑通再优化别一开始就追求极致性能先把基础功能跑通再一步步优化。2. 优化前先测瓶颈不知道慢在哪就瞎优化纯属浪费时间。每个阶段打点找到最慢的地方针对性优化。3. 小模型 好训练 大模型 随便训模型大小的收益很多时候不如数据和训练策略的优化大。4. 工程化和算法一样重要算法精度再高服务天天崩也没用。稳定性、可维护性、可升级性都是产品级必须的。5. 边缘部署是系统工程不是模型转完就完事了摄像头、解码、预处理、推理、后处理、业务逻辑、网络、运维每一环都影响最终效果。九、系列总结12 篇边缘AI部署系列到此结束回顾一下覆盖的内容基础篇1-2边缘部署概述、模型选型与轻量化训练优化篇3-4训练调优、知识蒸馏、模型剪枝量化篇5-7量化原理、RKNN 转换、量化调优实战推理优化篇8-9RK3588 推理优化、多路并发架构落地篇10-11精度评估与 bad case、部署工程化实战篇12售货柜端到端落地全记录从模型选型到训练优化从量化转换到推理加速从架构设计到工程落地整个边缘AI部署的链路都覆盖了。边缘部署的核心不是某一个技术点而是「在有限资源下平衡精度、速度、功耗、稳定性」的系统工程。理解了这个思路换什么平台、什么模型都能快速上手。我是黒漂技术佬这个系列就到这里。下个系列见。