YOLOv8 商品识别:从标注到部署,我踩了这 10 个坑
YOLOv8 商品识别:从标注到部署,我踩了这 10 个坑
这是整个售货柜系统最核心的一环。摄像头拍到的画面里,哪一瓶是可乐、哪一瓶是雪碧、用户到底拿了什么——全靠 YOLOv8。这篇文章从数据标注到模型部署全部讲清楚,附带我踩过的十个坑。
大家好,我是黒漂技术佬。
前三篇聊了决策、架构和硬件。这一篇正式进入 AI 算法——用 YOLOv8 做商品识别。如果你做过目标检测,这篇文章能帮你省掉两周踩坑时间;如果你没做过,我尽量用大白话讲清楚。
一、先看结果:模型到底能做到什么水平?
训练完的 YOLOv8n 模型,部署到 RK3588 上:
| 指标 | 数值 |
|---|---|
| 准确率(mAP@0.5) | 98.7% |
| 推理速度(RK3588 NPU) | 30fps |
| 支持商品种类 | 20 种(可乐、雪碧、矿泉水、红牛……) |
| 模型大小 | 6.2MB(.rknn 格式) |
| 单帧推理耗时 | 3ms |
在真实场景(柜内灯光、不同角度、部分遮挡)下,识别准确率稳定在 95% 以上。足够商用。
二、完整流程:从零到部署
数据采集 → 数据标注 → 模型训练 → 模型转换(ONNX → RKNN)→ 边缘部署
每一步都有坑,我一个一个讲。
三、踩坑 1-3:数据采集和标注
坑 1:照片不是随便拍的
我一开始拿手机对着货架拍了 200 张照片就开训,结果模型在实际柜子上一塌糊涂——因为柜子里的灯光角度和手机拍的不一样。
正确做法:把摄像头装进柜子里,用程序自动采集。写个脚本每隔 2 秒拍一张,换不同商品摆放位置、不同光照条件,采够 1000 张。
import cv2
import time
cap = cv2.VideoCapture(0)
for i in range(1000):
ret, frame = cap.read()
cv2.imwrite(f'images/{i:04d}.jpg', frame)
time.sleep(2)
坑 2:标注工具选错,白干两天
我一开始用的 LabelImg,手动框了 1000 张图,手都酸了。后来发现用 Roboflow 在线标注,AI 辅助预标注,效率提升十倍。更重要的是 Roboflow 能直接导出 YOLO 格式,不用自己写转换脚本。
坑 3:标注标准不统一
同一瓶可乐,横放、竖放、被遮挡一半——怎么框?团队里两个人标注,标准不一样,模型训练出来一团糟。
规范:
- 只框可见部分,被遮挡超过 50% 的不标
- 紧贴商品边缘,不要留白
- 每个类别至少 100 个标注框
四、踩坑 4-6:模型训练
坑 4:用 3090 还是云服务器?
我第一反应是买张 3090——但一张一万多,原型验证阶段不值得。最后用的是 AutoDL 云 GPU,A5000 一小时两块五,训练一个模型总共花了不到 50 块钱。
推荐方案:先用云 GPU 跑通,批量训练时再考虑买卡。
坑 5:不调参直接跑,模型过拟合
第一次训练,看 loss 降到 0.01,高兴坏了。结果测试集上一跑,准确率只有 60%。
调参经验:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| epochs | 100-150 | 多了过拟合,少了欠拟合 |
| batch size | 16 | RK3588 推理对 batch size 不敏感 |
| learning rate | 0.01 → 0.001 | 余弦退火衰减 |
| mosaic | 1.0 | 数据增强,增强泛化能力 |
坑 6:类别不均衡
20 种商品,可乐卖了 200 瓶,气泡水卖了 5 瓶。训练数据如果不均衡,模型会对稀有商品完全瞎猜。
解决方案:对低频商品做过采样,保证每个类别训练样本不少于 100 张。
五、踩坑 7-10:模型转换和部署
坑 7:ONNX 导出算子不兼容
YOLOv8 默认导出的 ONNX 包含一些算子(比如 Swish 激活函数),RKNN 工具链不支持。
解决方案:用 Ultralytics 官方导出脚本,指定 opset=12,关闭动态输入:
yolo export model=yolov8n.pt format=onnx opset=12 imgsz=640 dynamic=False
坑 8:RKNN 量化精度损失
FP32 转 INT8 量化后,准确率从 98% 掉到 85%——因为校准数据集没选好。
解决方案:用柜内真实拍的照片做校准数据集,200 张就够。量化后准确率恢复到 97%。
坑 9:NPU 推理线程安全
RK3588 有三个 NPU 核心,我开了多线程同时推理,结果程序随机崩溃——RKNN 的 Python API 不是线程安全的。
解决方案:用单线程 + 队列模式,或者每个线程绑定不同的 NPU 核心:
rknn.init_runtime(core_mask=RKNNLite.NPU_CORE_0) # 绑核 0
坑 10:部署后模型不更新
模型训好了部署到柜子上,结果三个月后换了新包装的商品,识别率暴跌。
解决方案:建立持续迭代机制——每周从柜子上收集低置信度的图片,补充进训练集,每月发一版新模型,OTA 推送到设备。
六、成本和时间
| 环节 | 时间 | 成本 |
|---|---|---|
| 数据采集 | 3 天 | 0(柜子已有) |
| 数据标注 | 2 天 | 0(Roboflow 免费版够用) |
| 模型训练 | 1 天 | 50 元(云 GPU) |
| 模型转换 | 3 天 | 踩坑时间 |
| 边缘部署 | 1 天 | 0 |
| 合计 | 10 天 | 50 元 |
七、给你的建议
- 数据比模型重要。多花时间在数据采集和标注上,模型那部分用 YOLOv8 默认配置就能出好结果
- 先用云 GPU 验证,别一上来买显卡
- RKNN 转换是最难的一步,做好踩坑一周的心理准备
- 建立持续迭代机制,模型不是训一次就完事的
下一篇预告
下一篇讲 《纯视觉售货柜:如何解决「拿错商品」的 99% 误判?》——重力传感器双校验、ROI 区域提取、时序帧对比,把误判率从 10% 降到 0.1%。
💬 互动:你做目标检测踩过什么坑?评论区分享,我汇总进下一篇!
👉 关注我,下周二晚八点更新。
更多推荐




所有评论(0)