ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

YOLOv8商品识别系统实战:从数据集到Gradio界面部署

YOLOv8商品识别系统实战:从数据集到Gradio界面部署 简介这份资源面向计算机、人工智能、通信工程等专业的在校学生与教师也适合作为毕业设计、课程设计或大作业的参考项目核心是基于YOLOv8搭建的跨境电商商品识别系统解决目标检测场景下的商品分类与定位问题。压缩包共97个文件约24.21MB以70个Python源码为主体辅以4个pt权重文件、5个xml配置、12个pyc缓存及txt说明等涵盖模型训练、推理检测、可视化界面与部署脚本等模块。资源内附完整数据集、可视化页面和部署说明可生成核心指标曲线、混淆矩阵、F1分数曲线、精确率-召回率曲线及验证集预测结果并配有视频检测示例与多份预训练权重方便直接运行与二次修改。目前已有42人学习下载适合希望快速上手目标检测项目、完成毕设答辩或课程实践的学习者参考使用。1. 从一份 zip 到能跑的商品识别系统这套 YOLOv8 方案到底解决了什么电商仓库里最常见的场景不是「识别不出来」而是「识别出来了但没人会用」。一份标注好的商品数据集、一个训练好的权重、一段推理脚本散落在三个文件夹里换台机器就报错换个同事就卡在环境配置。这套基于 YOLOv8 的跨境电商商品识别系统核心价值不在于模型多先进而在于把数据、训练、推理、可视化界面打包成一条能复现的链路解压后按步骤走就能跑起来。它适合三类人做毕设或课程设计、需要一套完整可演示系统的学生想快速验证商品识别可行性、不想从零搭环境的工程师以及需要给非技术同事一个能点开就用的界面、自己只维护后端的开发者。跨境电商的商品图有个特点——背景杂、多语言标签、同类商品外观差异大通用检测模型直接拿来用召回率往往不够看所以「用自己的数据集微调」这一步绕不开。下面从数据准备讲到界面部署把每一步的参数和坑都摊开说。2. 数据集怎么组织从原始商品图到 YOLOv8 可训练的目录结构2.1 为什么商品识别不能直接套 COCO 预训练权重COCO 里没有「蓝牙耳机」「保温杯」这种细分类它的 80 类是大类划分商品识别要的是 SKU 级别的区分。直接拿 COCO 权重推理模型会把你的商品框成「bottle」「cup」这类粗类类别对不上业务就没法用。所以标准做法是用 COCO 或 ImageNet 预训练权重做 backbone 初始化再用自己的商品数据集微调检测头。跨境电商场景还有两个额外麻烦。一是商品图常带水印、促销文字、多语言标签这些文字区域容易被误检成目标二是同一商品在不同光照、不同拍摄角度下外观差异大数据增强必须开得比常规检测更激进。我一般会把 mosaic 增强概率调到 1.0mixup 开到 0.15让模型见过更多组合形态。2.2 目录结构images 和 labels 必须严格对应YOLOv8 对目录结构有硬性要求图片和标签文件名必须一一对应只是扩展名不同。常见做法是建一个 datasets 根目录下面按 train/val/test 分每个子集里再分 images 和 labels。datasets/ ├── images/ │ ├── train/ # 训练图片jpg/png │ ├── val/ # 验证图片 │ └── test/ # 测试图片 ├── labels/ │ ├── train/ # 与 train 图片同名的 .txt │ ├── val/ │ └── test/ └── data.yaml # 数据集配置文件这里有个血泪经验很多人把图片放images/train标签却放labels/train路径没错但文件名如果带了_aug后缀而图片没有训练时就会报「找不到标签」。建议用脚本批量校验一遍文件名匹配。2.3 data.yaml 的四个必填字段path: ./datasets # 数据集根目录相对或绝对路径 train: images/train # 训练集路径相对 path val: images/val # 验证集路径 test: images/test # 测试集路径可选 nc: 12 # 类别数量必须和 names 长度一致 names: # 类别名顺序即类别 id 0: bluetooth_earphone 1: thermos_bottle 2: phone_case # ... 其余类别nc和names长度不一致是最常见的翻车点训练启动时会直接抛错。另外names的顺序决定了标签文件里类别 id 的含义如果标注时用的是 0 代表耳机、1 代表保温杯这里就必须一致否则模型学出来的类别全是错的。2.4 标签格式归一化中心点坐标YOLO 格式的标签每行是class_id x_center y_center width height全部归一化到 0~1。用 LabelImg 或 Roboflow 导出时选 YOLO 格式即可。如果拿到的是 VOC 的 XML需要转换import xml.etree.ElementTree as ET import os def voc_to_yolo(xml_path, img_w, img_h, class_map): tree ET.parse(xml_path) root tree.getroot() lines [] for obj in root.iter(object): cls obj.find(name).text if cls not in class_map: continue bbox obj.find(bndbox) x1 float(bbox.find(xmin).text) y1 float(bbox.find(ymin).text) x2 float(bbox.find(xmax).text) y2 float(bbox.find(ymax).text) # 归一化并转为中心点宽高 xc (x1 x2) / 2.0 / img_w yc (y1 y2) / 2.0 / img_h w (x2 - x1) / img_w h (y2 - y1) / img_h lines.append(f{class_map[cls]} {xc:.6f} {yc:.6f} {w:.6f} {h:.6f}) return lines转换后务必抽查几张用可视化脚本把框画回原图确认坐标没偏。归一化时如果用了错误的图片尺寸比如实际是 1920 宽却按 640 算框会整体缩小到左上角这种错误肉眼一看就能发现。3. 训练自己的商品数据集参数怎么设、损失曲线怎么看3.1 环境配置ultralytics 装完先验证conda create -n yolo8 python3.10 -y conda activate yolo8 pip install ultralytics opencv-python matplotlib yolo checks # 验证环境会打印 torch、cuda 版本yolo checks会输出 CUDA 是否可用。如果显示 CPU only训练会慢到无法接受。GTX 1660Ti 这类 6G 显存的卡跑 YOLOv8n 是够的batch 设 8 或 16imgsz 设 640基本不会爆显存。显存更小就把 batch 降到 4配合accumulate参数做梯度累积。3.2 启动训练一条命令和关键参数yolo detect train \ datadatasets/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ patience20 \ projectruns/train \ namegoods_v1modelyolov8n.pt会自动下载预训练权重n 是最小版本速度快适合毕设演示如果精度不够再换 s 或 m。patience20表示 20 轮验证指标不提升就早停避免过拟合。lr00.01是初始学习率微调任务可以降到 0.001防止把预训练特征冲掉。3.3 损失曲线怎么读三个 box 要看懂训练完在runs/train/goods_v1/下会有results.csv和results.png。画曲线import pandas as pd import matplotlib.pyplot as plt df pd.read_csv(runs/train/goods_v1/results.csv) df.columns df.columns.str.strip() # 列名可能带空格 plt.plot(df[epoch], df[train/box_loss], labeltrain box) plt.plot(df[epoch], df[val/box_loss], labelval box) plt.plot(df[epoch], df[metrics/mAP50], labelmAP50) plt.legend() plt.savefig(loss_curve.png)box_loss 是定位损失cls_loss 是分类损失dfl_loss 是分布焦点损失。正常情况三条都下降并趋于平稳。如果 train 一直降而 val 开始上升就是过拟合加数据或加增强。如果 mAP50 卡在 0.3 上不去先检查标签有没有错再考虑换更大模型。3.4 验证与导出拿到能部署的权重yolo detect val modelruns/train/goods_v1/weights/best.pt datadatasets/data.yaml yolo export modelruns/train/goods_v1/weights/best.pt formatonnxbest.pt是验证集上表现最好的权重部署用它而不是last.pt。导出 ONNX 是为了后续在 RK3588 这类嵌入式平台部署ONNX 是中间格式再转 RKNN 就能跑在 NPU 上。导出时注意 opset 版本RKNN 工具链对 opset 11 或 12 支持较好。4. 可视化界面与推理服务从脚本到能点开的系统4.1 界面选型Gradio 还是 PyQt毕设和课程设计场景我一般推荐 Gradio原因是它跑在浏览器里跨平台代码量少老师或答辩评委扫个二维码就能看。PyQt 适合做桌面单机版但打包和跨平台麻烦。Gradio 的核心就是一个gr.Interface把推理函数挂上去即可。import gradio as gr from ultralytics import YOLO model YOLO(runs/train/goods_v1/weights/best.pt) def detect(image, conf): results model.predict(image, confconf, imgsz640) # results[0].plot() 返回画好框的 numpy 图 return results[0].plot() demo gr.Interface( fndetect, inputs[gr.Image(typenumpy), gr.Slider(0.1, 0.9, value0.25, label置信度阈值)], outputsgr.Image(typenumpy), title跨境电商商品识别系统 ) demo.launch(server_name0.0.0.0, server_port7860)conf参数暴露成滑块很实用因为不同商品的最佳阈值不一样演示时现场调一下效果更直观。server_name0.0.0.0让局域网内其他设备也能访问答辩时用手机就能演示。4.2 推理加速batch 推理和半精度单张推理在 CPU 上大概 200msGPU 上 20ms 以内。如果要处理批量商品图用 batch 推理results model.predict( sourcetest_images/, conf0.25, imgsz640, batch8, halfTrue, # GPU 上半精度速度提升约 30% saveTrue, projectruns/detect )halfTrue只在 GPU 上有效CPU 上会报错。saveTrue会把画框结果存到runs/detect/下方便批量出图。4.3 部署到 RK3588 的路径如果要把系统落到边缘设备RK3588 是常见选择。路径是PyTorch 权重 → ONNX → RKNN。用 RKNN Toolkit2 转换# 在 x86 主机上执行需要安装 rknn-toolkit2 python -m rknn.api.rknn_converter \ --model best.onnx \ --target_platform rk3588 \ --quantize \ --dataset dataset.txt # 量化校准图片列表量化校准集要放 100~200 张真实商品图否则量化后精度掉得厉害。转换完在板子上用 RKNN Runtime 推理单帧能压到 30ms 以内。这一步坑最多的是算子不支持YOLOv8 的某些激活函数需要替换具体看转换日志的 warning。5. 避坑与排查训练和部署中最容易翻车的五件事5.1 现象训练 loss 为 nan几轮后中断原因通常是学习率过大或标签坐标越界。归一化时如果某个框的 x_center 算出来大于 1就会导致 loss 爆炸。解决写脚本遍历所有标签文件检查每个值是否在 0~1 之间越界的直接修正或剔除。同时把lr0降到 0.001 再试。5.2 现象mAP 一直很低但 loss 在降大概率是类别 id 对不上。标注时类别顺序和data.yaml里的names不一致模型学的是错位的映射。解决打印data.yaml的 names再抽查几个标签文件的第一列数字确认 id 对应的类别名一致。另一个可能是验证集和训练集图片重复导致验证指标虚高或虚低用 md5 去重检查。5.3 现象Gradio 界面能打开但推理报错常见原因是模型路径写成了相对路径而启动目录不对。解决用os.path.abspath把权重路径转成绝对路径。另一个原因是 Gradio 版本和 ultralytics 版本不兼容results[0].plot()返回格式变了锁定版本pip install gradio4.x ultralytics8.1.x能规避大部分问题。5.4 现象RK3588 上推理结果框全错位这是量化或输入尺寸不匹配导致的。ONNX 导出时 imgsz 是 640RKNN 推理时如果传了 416 的图框就会错。解决推理前统一 resize 到 640并确认 letterbox 的填充方式一致。量化时校准集也要用同样预处理否则量化参数偏了框会整体偏移。5.5 现象显存不足训练中途 OOMbatch 设太大或 imgsz 设太高。GTX 1660Ti 6G 显存跑 YOLOv8n 时batch16 imgsz640 是安全线。如果换 YOLOv8mbatch 要降到 8。解决用batch-1让 ultralytics 自动选或者开ampTrue混合精度训练显存占用能降三成。6. 进阶技巧用 TTA 和模型集成把召回率再拉一截商品识别最怕漏检尤其是小目标商品。单模型跑完如果召回率不理想有两个低成本提升手段TTA测试时增强和模型集成。TTA 是在推理时对同一张图做多种变换翻转、缩放把结果融合。ultralytics 内置了 TTA 开关results model.predict( sourcetest_images/, augmentTrue, # 开启 TTA conf0.2, iou0.5 )augmentTrue会做水平翻转和多尺度推理召回率通常能涨 2~5 个点代价是推理时间翻倍。演示场景可以开实时场景慎用。模型集成是把 YOLOv8n 和 YOLOv8s 的预测结果做 WBF加权框融合。思路是各自推理再用ensemble-boxes库融合from ensemble_boxes import weighted_boxes_fusion # boxes_list 是每个模型的框列表scores_list 是分数labels_list 是类别 boxes, scores, labels weighted_boxes_fusion( boxes_list, scores_list, labels_list, weights[1, 1], iou_thr0.55, skip_box_thr0.1 )iou_thr0.55是融合阈值两个模型框重叠超过这个值就合并。skip_box_thr过滤低分框。集成后 mAP 一般能涨 3~8 个点但推理要跑两个模型适合对精度要求高、对速度不敏感的场景。我自己的习惯是先用 YOLOv8n 快速跑通全流程确认数据和标签没问题再换 YOLOv8s 或加 TTA 提精度。不要一上来就堆大模型数据质量不过关模型再大也是白搭。这套系统真正值钱的地方不是模型本身而是那条从数据到界面的完整链路——把它跑通一次后面换商品、换场景都是改配置的事。希望帮到你。本文还有配套的精品资源点击获取
返回列表