
1. 先搞清楚这个系统到底解决什么实际问题超市货架管理最头疼的就是补货不及时。顾客看到空货架要么放弃购买要么直接去竞争对手那里。传统的人工巡检方式一天最多能检查几次而且高峰期店员根本顾不上。这个YOLOv8空货架检测系统就是用摄像头深度学习算法实现7x24小时自动监控。核心价值就三点自动识别不用人盯着看、实时报警发现空货架马上通知补货、数据记录哪个货架经常空什么时间段容易空。实测下来模型在验证集上的mAP50能达到0.937意味着10次检测有9次以上能准确定位空货架区域。适合两类人看这个项目一是零售行业的IT或运营人员想了解计算机视觉怎么落地到实际场景二是做目标检测的开发者需要完整的YOLOv8项目参考包括数据集、训练代码和UI界面。2. 环境配置别在依赖版本上踩坑项目基于Python 3.8主要依赖PyTorch和Ultralytics的YOLOv8包。我最建议先用conda创建独立环境避免和现有项目冲突。conda create -n yolov8-shelf python3.8 conda activate yolov8-shelf关键依赖版本要盯住这几个torch1.7.0GPU版需要对应CUDA版本ultralytics8.0.0YOLOv8核心库opencv-python4.5.0图像处理PyQt5UI界面如果要用GPU加速先确认CUDA版本。用nvidia-smi看驱动支持的CUDA版本然后装对应的PyTorch。常见组合是CUDA 11.3配torch 1.12.0但具体看你的显卡型号。新手最容易栽在OpenCV版本上——版本太高可能和PyQt5冲突版本太低又缺少某些功能。我一般先装4.5.x系列稳定性最好。3. 数据集准备497张图到底够不够用项目提供的数据集只有497张图像标注类别就一个100-O-O-S空货架。训练集350张、验证集97张、测试集50张。这个量级对demo学习足够但真要部署到实际超市还得补充更多场景。数据集结构是标准YOLO格式dataset/ images/ train/ # 训练图片 val/ # 验证图片 labels/ train/ # 对应标注文件 val/每个标注文件是txt格式每行表示一个目标class_id x_center y_center width_height。因为只有一个类别所以class_id全是0。如果要用自己的图片扩增数据集推荐用LabelImg或CVAT标注。标注时注意空货架指的是整排货架完全空置或者商品稀疏到无法正常销售的状态。部分缺货的情况需要另外定义类别。4. 模型训练小数据集怎么避免过拟合497张图训练YOLOv8最大的风险就是过拟合。项目提供的训练配置已经做了优化但你自己训练时还要注意几点。首先用预训练权重起步from ultralytics import YOLO model YOLO(yolov8n.pt) # 用nano版本小数据集够用了训练参数关键设置results model.train( datadataset.yaml, epochs100, imgsz640, batch16, # 根据显存调整8G显存建议设8-12 patience10, # 早停防止过拟合 lr00.01, # 学习率不宜过大 cos_lrTrue, # 余弦退火调度 )小数据集一定要开数据增强mosaic: 0.5随机四图拼接mixup: 0.1图像混合hsv_h: 0.015色调变化hsv_s: 0.7饱和度变化hsv_v: 0.4亮度变化训练过程中盯着验证集指标mAP50和mAP50-95如果开始下降而训练损失还在降就是过拟合的信号。5. UI界面操作从单张测试到实时监控系统用PyQt5做了图形界面核心功能都封装好了。启动方式python main.py图片检测是最先要试的。选一张测试集外的超市图片调置信度阈值默认0.25。如果画面干净、光线好可以调到0.4-0.5减少误检如果货架杂乱、有阴影降到0.2-0.3避免漏检。视频检测用来验证连续性。拖一个超市监控视频看帧率是否稳定。普通CPU大概3-5fpsGPU能到20-30fps。如果卡顿先检查是不是视频分辨率太高1080p以上建议先缩放到720p再检测。摄像头实时最考验性能。USB摄像头接上后系统会自动检测/dev/video0。如果没画面检查摄像头权限ls -l /dev/video0。在Linux下可能需要加用户到video组。实时检测时关注右侧信息栏FPS低于10帧会感觉卡顿需要优化模型或降低输入分辨率目标数量连续多帧检测到空货架才触发报警避免闪烁误报置信度波动太大说明光照或角度变化影响模型稳定性6. 参数调优置信度和IoU阈值怎么配界面上两个滑动条最影响检测效果置信度阈值Confidence控制模型多自信才认为是空货架。调这个参数要看实际场景新环境部署先从0.3开始观察一天误报和漏报情况光线稳定的室内可以提到0.4-0.5减少影子、反光的干扰夜间或光线复杂降到0.2-0.25确保能抓到真实空货架IoU阈值Intersection over Union处理重叠检测框默认0.45一般不用动。只有当同一个空货架被重复框出时才需要调高到0.6-0.7合并检测框。调参时不要只看单张效果要跑一段连续视频。我习惯录5分钟不同时段的监控画面分别用不同参数测试记录误报次数和漏报次数。7. 结果保存与日志分析系统支持检测结果保存但要注意文件命名规则detection_result_年月日_时分秒.jpg。批量处理时建议按货架分区建立子目录方便后续统计哪个区域空置率最高。日志文件是排查问题的关键记录这些信息模型加载状态CPU/GPU每帧处理耗时检测到的目标数和置信度错误信息文件读取失败、摄像头断开等如果发现检测效果突然变差先查日志看是不是摄像头焦距变化、或者有人调整了摄像头角度。模型对拍摄角度很敏感同一货架从正面和斜45度拍摄检测效果可能差很多。8. 实际部署要考虑的边界情况这个demo项目在理想环境下表现很好但真用到超市现场有几个坑要提前避开光照变化早晚光线差异、灯光开关、货架补光灯都会影响检测。解决方案是训练集要包含不同光照条件下的图片或者部署时固定摄像头曝光参数。遮挡问题顾客站在货架前、推车遮挡、海报张贴都可能被误判为空货架。需要在业务逻辑层加过滤规则比如连续10帧检测到空货架才报警。摄像头角度广角镜头边缘畸变会影响边界框精度。尽量用焦距长一点的镜头离货架远一些拍摄减少透视变形。多货架识别一个画面包含多个货架时系统会把整个区域标为一个空货架。需要先用分割算法分离各个货架再分别检测。性能优化如果部署到边缘设备如Jetson Nano、RK3588需要转换模型格式、量化精度。YOLOv8s或nano版本在嵌入式设备上能跑到15-20fps满足实时要求。9. 项目扩展方向基础功能跑通后可以考虑这些增强功能缺货程度量化不只是判断空/非空而是计算货架填充率30%、50%、70%等给补货优先级排序。商品识别结合空货架检测商品识别能知道具体缺的是什么商品自动生成补货单。多摄像头管理一个超市有几十上百个摄像头需要设计集中管理界面支持摄像头分组、轮巡检测。历史数据分析记录每个货架的空置时间分布找出高频缺货时段和商品优化库存策略。报警集成检测到空货架后通过企业微信、钉钉或短信通知相关负责人缩短响应时间。这个项目最大的价值不是算法多先进而是给出了完整的落地路径——从数据标注、模型训练到界面开发、参数调优。真正要用的时候最费时间的往往是这些工程细节而不是模型本身。