基于YOLOv8的商场货架商品陈列识别系统实战
简介这份资源是面向计算机、人工智能、通信工程、自动化等专业学生与教师的YOLOv8目标检测实战项目聚焦商场货架商品陈列识别场景可用于毕业设计、课程设计、大作业或项目立项演示也适合具备一定基础的学习者进阶练手。压缩包共8个文件约15.91MB以3个py源码脚本、3个pt模型权重和2个txt说明文档为主涵盖模型训练、可视化界面与检测推理等核心模块部署流程简单按说明操作即可运行。目前已有52人学习下载。项目提供从数据集、源码到可视化页面的完整方案可生成核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果及标签分布图便于答辩展示与结果分析代码经过实际运行验证读者既能直接复现完整流程也可在此基础上修改扩展实现其他检测功能。1. 商场货架商品陈列识别从一张货架图到可交付的 YOLOv8 系统逛超市时你可能没注意货架上的商品摆放本身就是一门生意。缺货、错位、排面被竞品挤占这些陈列问题直接影响销量但靠人工巡店效率极低。基于 YOLOv8 的商场货架商品陈列识别系统要解决的就是这件事用目标检测模型自动识别货架上的商品类别和位置输出陈列合规性判断。这类系统在零售巡检、无人货柜、智能货架等场景都有实际需求也是毕设和课程设计里高频出现的选题。它适合有 Python 基础、想跑通一个完整检测项目的人不需要你从零造轮子但需要你理解数据、训练和部署这条链路。下面按「是什么 → 怎么做 → 坑在哪」的顺序拆开讲。2. 商品陈列识别的技术选型为什么是 YOLOv8 而不是别的2.1 检测任务的技术路线对比商品陈列识别本质上是目标检测任务输入一张货架照片输出每个商品的边界框和类别。可选的技术路线有几条两阶段检测器如 Faster R-CNN精度高但速度慢单阶段检测器如 YOLO 系列、SSD、RetinaNet速度优先还有基于 Transformer 的 DETR 系列结构优雅但训练收敛慢。在货架场景下一张图里可能有几十甚至上百个商品实例且商品排列密集、相互遮挡。Faster R-CNN 在这种密集小目标场景下推理速度很难满足实时巡检需求而 DETR 系列对小目标的检测效果在早期版本中并不理想。YOLOv8 作为单阶段检测器在精度和速度之间取得了较好的平衡尤其是它的 Anchor-Free 设计和 C2f 模块对密集排列的商品检测比较友好。另一个现实考量是生态。YOLOv8 由 Ultralytics 维护提供了统一的训练、验证、导出接口一行命令就能完成从训练到 ONNX 导出的全流程。对于毕设或课程设计来说这意味着你可以把精力放在数据标注和业务逻辑上而不是花大量时间调框架。2.2 数据集构建商品陈列标注的实操要点数据集是整个系统的地基。商品陈列识别的数据集通常有两种来源一是自己拍摄货架照片标注二是使用公开的零售商品数据集。自己标注的好处是贴合实际场景坏处是工作量大。常见做法是每个类别至少标注 200 到 500 个实例类别数控制在 10 到 30 之间太多类别会导致模型难以收敛。标注工具推荐 LabelImg 或 Roboflow。标注格式用 YOLO 格式每张图对应一个 txt 文件每行是class_id x_center y_center width height坐标都归一化到 0 到 1 之间。下面是一个把 VOC 格式转成 YOLO 格式的脚本很多公开数据集是 VOC 格式需要转换后才能用。import xml.etree.ElementTree as ET import os # 类别映射根据你的数据集修改 classes [cola, chips, water, juice, biscuit] def convert_annotation(xml_path, output_dir, img_w, img_h): tree ET.parse(xml_path) root tree.getroot() txt_name os.path.splitext(os.path.basename(xml_path))[0] .txt with open(os.path.join(output_dir, txt_name), w) as f: for obj in root.iter(object): cls obj.find(name).text if cls not in classes: continue cls_id classes.index(cls) bbox obj.find(bndbox) # VOC 坐标是左上角和右下角需要转成中心点加宽高 xmin float(bbox.find(xmin).text) ymin float(bbox.find(ymin).text) xmax float(bbox.find(xmax).text) ymax float(bbox.find(ymax).text) x_center (xmin xmax) / 2.0 / img_w y_center (ymin ymax) / 2.0 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h f.write(f{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}\n)这段代码的核心逻辑是坐标转换。VOC 用的是绝对像素坐标的左上角和右下角YOLO 用的是归一化后的中心点和宽高。img_w和img_h是原图尺寸必须和标注时一致否则框会偏移。classes列表的顺序要和后续训练配置文件里的names完全对应顺序错了模型学到的类别就是乱的。2.3 环境配置与训练参数怎么设环境配置是新手最容易翻车的地方。YOLOv8 依赖 PyTorch建议用 Python 3.8 到 3.10PyTorch 版本选 1.13 以上。如果你用的是 GTX 1660 Ti 这类 6GB 显存的卡训练时 batch size 不要超过 8否则会爆显存。安装命令如下# 创建虚拟环境 python -m venv yolov8_env source yolov8_env/bin/activate # Windows 用 yolov8_env\Scripts\activate # 安装 PyTorch根据你的 CUDA 版本选择 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 安装 ultralytics pip install ultralytics安装完成后用yolo checks验证环境是否正常。如果提示 CUDA 不可用检查显卡驱动和 CUDA 版本是否匹配。训练配置文件data.yaml的结构如下path: ./dataset train: images/train val: images/val nc: 5 names: [cola, chips, water, juice, biscuit]nc是类别数names是类别名称列表。训练命令yolo detect train datadata.yaml modelyolov8n.pt epochs100 imgsz640 batch8 patience20modelyolov8n.pt用的是预训练权重迁移学习能大幅缩短收敛时间。imgsz640是输入尺寸货架图通常分辨率较高如果商品很小可以调到 1280但显存占用会翻倍。patience20表示 20 轮验证集指标不提升就早停防止过拟合。3. 可视化界面与推理部署让系统真正能跑起来3.1 用 Gradio 搭一个商品陈列识别界面训练完模型只是第一步要让别人能用得有个界面。Gradio 是最快的方式几十行代码就能搭一个上传图片、显示检测结果的 Web 界面。import gradio as gr from ultralytics import YOLO import cv2 import numpy as np model YOLO(runs/detect/train/weights/best.pt) def detect(image): results model(image, conf0.4, iou0.5) # 在原图上绘制检测框 annotated results[0].plot() # 统计每个类别的数量 boxes results[0].boxes counts {} for cls_id in boxes.cls.tolist(): name model.names[int(cls_id)] counts[name] counts.get(name, 0) 1 summary \n.join([f{k}: {v} for k, v in counts.items()]) return annotated, summary demo gr.Interface( fndetect, inputsgr.Image(typenumpy), outputs[gr.Image(typenumpy, label检测结果), gr.Textbox(label商品统计)], title商场货架商品陈列识别 ) demo.launch(server_name0.0.0.0, server_port7860)conf0.4是置信度阈值低于这个值的检测框会被过滤。货架场景下商品密集阈值设太高会漏检设太低会误检0.4 是一个比较稳的起点。iou0.5是 NMS 的 IoU 阈值控制重叠框的合并程度。results[0].plot()返回的是画好框的 numpy 数组可以直接传给 Gradio 显示。3.2 模型导出与边缘设备部署如果要把模型部署到 RK3588 这类边缘设备上需要先把 PyTorch 模型导出成 ONNX 或 RKNN 格式。导出 ONNX 的命令yolo export modelbest.pt formatonnx imgsz640 simplifyTruesimplifyTrue会对 ONNX 计算图做简化去掉冗余算子提升推理速度。导出后在 RK3588 上还需要用 RKNN Toolkit 转成 rknn 格式这一步需要在 x86 主机上完成因为 RKNN Toolkit 不支持在 ARM 设备上直接转换。转换脚本的核心步骤是加载 ONNX 模型、配置量化参数、导出 RKNN 模型。量化时建议用训练集里的部分图片做校准通常 100 到 200 张就够。量化后的模型精度会有轻微下降如果发现某些类别漏检严重可以改用混合量化对敏感层保持浮点。3.3 推理速度优化从 30 FPS 到 60 FPS 的几个手段推理速度直接影响用户体验。在 GTX 1660 Ti 上YOLOv8n 跑 640 尺寸大约能到 60 FPS但如果你用的是更大的模型或者更高的输入分辨率速度会明显下降。几个实用的优化手段第一降低输入分辨率。从 1280 降到 640速度大约翻倍但小目标检测能力会下降。第二用半精度推理。model.half()可以把模型转成 FP16速度提升 30% 左右精度损失很小。第三用 TensorRT 加速。导出 TensorRT 引擎后推理速度通常能再提升 50% 以上但 TensorRT 引擎和硬件绑定换设备需要重新导出。提示半精度推理在部分老显卡上可能不支持如果报错就回退到 FP32。4. 避坑与排查商品陈列识别项目里最容易翻车的 5 个地方4.1 现象训练 loss 不下降mAP 一直是 0原因通常是标注格式错误。YOLO 格式要求坐标归一化到 0 到 1如果标注时用了绝对像素坐标模型学不到任何有效信息。另一个常见原因是data.yaml里的nc和names数量不一致或者类别 id 从 1 开始而不是从 0 开始。解决方法是先用yolo detect train跑一个 epoch看输出里的Class统计是否正常。如果所有类别都是 0 个实例说明标注路径或格式有问题。可以用labelimg打开几张图确认标注框是否显示正常。4.2 现象验证集 mAP 很高但实际推理时漏检严重这是典型的过拟合或数据分布不一致。训练集和验证集如果来自同一批照片模型可能只是记住了背景特征。实际场景里光照、角度、货架布局都可能不同模型泛化能力不足。解决办法是增加数据增强YOLOv8 默认开启了 mosaic 和 mixup可以再手动加一些随机亮度、对比度扰动。另外验证集要尽量从不同时间段、不同货架拍摄不要和训练集用同一批图。4.3 现象RK3588 上推理结果和 PC 上不一致原因通常是量化误差。RKNN 默认用 INT8 量化如果校准集不能代表实际数据分布量化后的模型精度会明显下降。另一个原因是预处理不一致PC 上用 OpenCV 读图是 BGR 格式RKNN 可能要求 RGB通道顺序错了结果就全乱。解决办法是检查预处理代码确保 resize、归一化、通道顺序和训练时完全一致。量化校准集要从训练集里随机抽取覆盖所有类别和光照条件。如果精度仍然不达标改用 FP16 量化速度会慢一些但精度更稳。4.4 现象Gradio 界面传图后报错「Expected 4D input」这是输入维度问题。YOLOv8 的model()接口接受 numpy 数组或 PIL 图片但如果你传的是灰度图或者带 alpha 通道的 PNG维度就不对。灰度图是 2 维RGBA 是 4 通道模型期望的是 3 通道 RGB。解决办法是在传入模型前统一转成 RGB 三通道if len(image.shape) 2: image cv2.cvtColor(image, cv2.COLOR_GRAY2RGB) elif image.shape[2] 4: image cv2.cvtColor(image, cv2.COLOR_RGBA2RGB)4.5 现象训练到一半显存爆了报 CUDA out of memory原因可能是 batch size 太大、输入分辨率太高或者 dataloader 的 worker 数太多导致内存泄漏。GTX 1660 Ti 只有 6GB 显存batch8加imgsz640已经是上限。解决办法是先把 batch 降到 4如果还爆就降到 2。同时把workers设为 2 或 0减少数据加载的并行度。如果必须用大 batch可以开启梯度累积yolo detect train ... batch4 accumulate2等效于 batch8 但显存占用不变。5. 进阶技巧用热力图和损失曲线判断模型到底学到了什么模型训练完mAP 只是一个数字你并不知道它到底关注了商品的哪些特征。YOLOv8 支持导出热力图可以直观看到模型的注意力分布。如果热力图集中在货架背景而不是商品本身说明模型学偏了需要检查标注质量或增加商品区域的权重。生成热力图的代码from ultralytics import YOLO import cv2 model YOLO(best.pt) results model(shelf.jpg, conf0.4) # 获取特征图并生成热力图 for result in results: # 用检测框的置信度作为热力值 boxes result.boxes heatmap np.zeros(result.orig_shape[:2], dtypenp.float32) for box in boxes: x1, y1, x2, y2 map(int, box.xyxy[0].tolist()) conf float(box.conf[0]) heatmap[y1:y2, x1:x2] conf # 归一化并叠加到原图 heatmap cv2.normalize(heatmap, None, 0, 255, cv2.NORM_MINMAX) heatmap cv2.applyColorMap(heatmap.astype(np.uint8), cv2.COLORMAP_JET) overlay cv2.addWeighted(result.orig_img, 0.6, heatmap, 0.4, 0) cv2.imwrite(heatmap_result.jpg, overlay)这段代码的逻辑是把每个检测框的置信度累加到对应区域再归一化成热力图。置信度高的区域颜色偏红低的偏蓝。如果热力图显示模型只关注了货架边缘或者价签区域说明训练数据里这些区域的标注可能有问题或者商品本身特征不够明显。损失曲线同样重要。YOLOv8 训练完成后会在runs/detect/train/目录下生成results.csv里面记录了每轮的 box_loss、cls_loss、dfl_loss 和 mAP。用 pandas 读出来画图import pandas as pd import matplotlib.pyplot as plt df pd.read_csv(runs/detect/train/results.csv) df.columns df.columns.str.strip() fig, axes plt.subplots(1, 2, figsize(12, 4)) axes[0].plot(df[epoch], df[train/box_loss], labelbox_loss) axes[0].plot(df[epoch], df[train/cls_loss], labelcls_loss) axes[0].set_xlabel(Epoch) axes[0].set_ylabel(Loss) axes[0].legend() axes[1].plot(df[epoch], df[metrics/mAP50(B)], labelmAP50) axes[1].plot(df[epoch], df[metrics/mAP50-95(B)], labelmAP50-95) axes[1].set_xlabel(Epoch) axes[1].set_ylabel(mAP) axes[1].legend() plt.tight_layout() plt.savefig(training_curve.png)正常的损失曲线应该是 box_loss 和 cls_loss 在前 20 轮快速下降之后缓慢收敛。如果 cls_loss 震荡剧烈说明学习率可能太大可以调小lr0参数。如果 mAP 在某个 epoch 后突然下降大概率是过拟合早停机制应该已经生效。我自己的习惯是每次训练完先看损失曲线再看几张验证集的预测结果最后才看 mAP 数字。数字好看但预测框乱飘的情况我遇到过不止一次血泪经验就是不要迷信指标要亲眼看看模型到底框了什么。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

CT岩心裂缝语义分割实战:从数据预处理到U-Net训练避坑指南

CT岩心裂缝语义分割实战:从数据预处理到U-Net训练避坑指南

简介:面向Python计算机视觉与地质图像分析领域的课程设计、期末大作业场景,这份资源围绕岩石裂缝与CT岩心裂缝的语义分割问题,提供了一套可运行的Python源码及配套数据集。语义分割需对图像逐像素分类,项目涉及PIL、OpenCV、Tenso…

2026/10/11 11:46:15 阅读更多 →
VitePress 自定义主题实战指南:从零构建 Theme、Layout 与运行时 API

VitePress 自定义主题实战指南:从零构建 Theme、Layout 与运行时 API

AI 技能人工智能 【免费下载链接】skills Anthony Fus curated collection of agent skills. 项目地址: https://gitcode.com/gh_mirrors/skills11/skills 点击查看 免费下载 当 VitePress 默认主题的导航、侧边栏、首页版式无法满足项目需要时,不必修改…

2026/10/11 11:46:15 阅读更多 →
第三方软件测评:独立视角下的软件质量保障

第三方软件测评:独立视角下的软件质量保障

最近接手了一个很有意思的项目,是以第三方视角给一套企业级管理软件做全面测评。这个项目让我不得不重新思考一个老问题:为什么软件行业需要"裁判员"?我们常说"既当运动员又当裁判员"是比赛的大忌,但放到软件…

2026/10/11 11:45:15 阅读更多 →

最新新闻

MySQL进程与操作系统内核的亲密接触:从启动到崩溃恢复的全程拆解

MySQL进程与操作系统内核的亲密接触:从启动到崩溃恢复的全程拆解

你有没有认真想过,一个mysqld进程从被操作系统拉起,到它最终退出,中间到底和内核打了多少次交道?重启一次数据库、做一次主从切换、甚至排查一条慢SQL,背后都藏着一长串系统调用在排队。我最早接触MySQL的时候&#xf…

2026/10/11 12:39:30 阅读更多 →
用Flask构建医院挂号就诊系统:数据库建模、并发控制与实战解析

用Flask构建医院挂号就诊系统:数据库建模、并发控制与实战解析

每年一到毕业设计和面试季节,总有人问我同一个问题:“想做一个带点实际业务逻辑的Web项目,用什么技术栈最划算?”我的回答一般都很固定:Flask配Python。如果再追问一句具体做什么,我会直接抛出一个练手与实…

2026/10/11 12:39:30 阅读更多 →
自动化流程中的表格列操作:增删改查与注解全指南

自动化流程中的表格列操作:增删改查与注解全指南

屠龙刀法这个系列写到第33期了,前32篇讲了各种流程搭建、数据清洗、自动化分支的套路,但一直没有专门把"表格列的增删改查"单独拎出来讲。原因是我之前觉得这玩意儿太基础,谁还不会右键添加一列?直到上个月,…

2026/10/11 12:39:30 阅读更多 →
Oracle 11gR2 Gateways异构数据库连接实战指南

Oracle 11gR2 Gateways异构数据库连接实战指南

简介:本资源是Oracle Database 11gR2 Gateways(11.2.0.1.0)官方安装包,专为Linux x86-64平台设计,面向数据库管理员、中间件工程师及企业级异构系统集成开发者,用于构建Oracle与非Oracle数据库(…

2026/10/11 12:39:30 阅读更多 →
fish-shell 文档本地化实战:Sphinx + sphinx-intl 自动翻译工作流

fish-shell 文档本地化实战:Sphinx + sphinx-intl 自动翻译工作流

1. 先把背景交代清楚:fish-shell-docs-l10n 到底在做什么最近我把一个叫 fish-shell-docs-l10n 的项目从想法推进到了基本可用状态,过程比想象中曲折,也踩了不少坑。这篇文章不打算写什么宏大叙事,就是把我在做 fish-shell 文档本…

2026/10/11 12:39:30 阅读更多 →
汉字简繁转换映射表:数据建模、SQL导入与避坑指南

汉字简繁转换映射表:数据建模、SQL导入与避坑指南

简介:这是一套提供约4792条汉字简体与繁体映射关系的参照数据库,覆盖常见高频用字,面向需要实现简繁转换、多语言支持或汉字文本处理的开发人员、数据挖掘与语言研究者,可直接用于软件界面切换、语料预处理及汉字演变研究。压缩包…

2026/10/11 12:38:30 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →