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 元

七、给你的建议

  1. 数据比模型重要。多花时间在数据采集和标注上,模型那部分用 YOLOv8 默认配置就能出好结果
  2. 先用云 GPU 验证,别一上来买显卡
  3. RKNN 转换是最难的一步,做好踩坑一周的心理准备
  4. 建立持续迭代机制,模型不是训一次就完事的

下一篇预告

下一篇讲 《纯视觉售货柜:如何解决「拿错商品」的 99% 误判?》——重力传感器双校验、ROI 区域提取、时序帧对比,把误判率从 10% 降到 0.1%。


💬 互动:你做目标检测踩过什么坑?评论区分享,我汇总进下一篇!

👉 关注我,下周二晚八点更新。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐