2026/2/18 10:36:07
网站建设
项目流程
怎么制作企业网站,中关村在线app,使用django建设一个网站,百度开发者一、项目介绍
摘要
本项目基于YOLOv10目标检测框架#xff0c;开发了一套专门针对零售行业的智能空货架识别系统#xff0c;能够准确检测超市货架上的缺货状态#xff08;标注为100- O-O-S#xff09;。系统使用货架图像的专业数据集进行训练和评估#xff…一、项目介绍摘要本项目基于YOLOv10目标检测框架开发了一套专门针对零售行业的智能空货架识别系统能够准确检测超市货架上的缺货状态标注为100- O-O-S。系统使用货架图像的专业数据集进行训练和评估通过针对零售场景的特殊优化本系统实现了对超市货架缺货状态的高精度实时检测为零售商的库存管理、补货优化和销售分析提供了智能化解决方案。系统在复杂超市环境下仍能保持稳定的检测性能可适应不同货架类型、商品品类和店面照明条件显著提升了传统人工巡检的效率与准确性。项目意义超市空货架识别系统在现代零售运营中具有重要的商业价值和管理意义库存管理革新实时监控货架商品存量将传统周期性盘点转变为持续智能监控有效预防缺货损失。补货效率提升通过精准识别空货架位置优化补货路线和优先级减少员工无效走动时间可提高补货效率。销售数据分析长期积累的缺货数据可分析商品畅销时段、位置效应等为品类管理和陈列优化提供数据支持。顾客体验改善减少顾客遇到空货架的负面体验提升购物满意度和店铺形象。人力成本节约替代传统人工巡检方式单店每年可节省数百小时的人力成本特别适用于大型连锁超市。智能零售基础为未来自动补货机器人、智能货架等创新应用提供核心技术支撑。管理决策支持通过缺货模式分析优化供应链响应速度和库存水平设置。相比通用物体检测系统本方案专注于零售货架这一特定场景通过单一类别空货架的专注检测在准确率和实时性上达到商用要求且易于集成到现有零售管理系统中。目录一、项目介绍摘要项目意义二、项目功能展示系统功能图片检测视频检测摄像头实时检测三、数据集介绍数据集概述数据集特点数据集配置文件数据集制作流程四、项目环境配置创建虚拟环境pycharm中配置anaconda安装所需要库五、模型训练训练代码训练结果六、核心代码七、项目源码视频下方简介内基于深度学习YOLOv10的超市空货架识别检测系统YOLOv10YOLO数据集UI界面Python项目源码模型_哔哩哔哩_bilibili基于深度学习YOLOv10的超市空货架识别检测系统YOLOv10YOLO数据集UI界面Python项目源码模型二、项目功能展示系统功能✅图片检测可对图片进行检测返回检测框及类别信息。✅视频检测支持视频文件输入检测视频中每一帧的情况。✅摄像头实时检测连接USB 摄像头实现实时监测。✅参数实时调节置信度和IoU阈值图片检测该功能允许用户通过单张图片进行目标检测。输入一张图片后YOLO模型会实时分析图像识别出其中的目标并在图像中框出检测到的目标输出带有目标框的图像。视频检测视频检测功能允许用户将视频文件作为输入。YOLO模型将逐帧分析视频并在每一帧中标记出检测到的目标。最终结果可以是带有目标框的视频文件或实时展示适用于视频监控和分析等场景。摄像头实时检测该功能支持通过连接摄像头进行实时目标检测。YOLO模型能够在摄像头拍摄的实时视频流中进行目标检测实时识别并显示检测结果。此功能非常适用于安防监控、无人驾驶、智能交通等应用提供即时反馈。核心特点高精度基于YOLO模型提供精确的目标检测能力适用于不同类型的图像和视频。实时性特别优化的算法使得实时目标检测成为可能无论是在视频还是摄像头实时检测中响应速度都非常快。批量处理支持高效的批量图像和视频处理适合大规模数据分析。三、数据集介绍数据集概述本项目构建了一个专业级的超市货架检测数据集主要特性如下总规模497张高分辨率货架图像训练集350张验证集97张测试集50张类别定义100- O-O-SOut-Of-Stock指商品完全缺货的货架位置包括空空如也的货架格子仅有价格标签无商品的位点商品数量极少≤1件的濒临缺货状态数据来源合作超市连锁的真实货架拍摄不同时段早晨补货后、下午高峰后、晚间多种商品品类食品、日化、生鲜等不同门店类型标准超市、便利店、仓储店标注标准采用YOLO格式的txt标注文件每个空货架位置标注为一个边界框标注到单个SKU的陈列单元级别记录相邻商品的视觉干扰情况数据集特点场景多样性覆盖10余家不同品牌的门店环境包含普通货架、端架、促销堆头等多种陈列形式采集于不同照明条件自然光、店内灯光、混合光包含节假日高峰期的混乱场景专业挑战性复杂背景干扰如价格牌、促销海报商品包装反光或透明材质造成的识别困难货架层板边缘与空货架的视觉混淆部分遮挡的空货架被价签、分隔板等遮挡标注精细度边界框精确到单个SKU陈列单元区分完全缺货与濒临缺货状态标注货架的结构特征层数、分区等记录商品类别信息食品/非食品质量控制每张图像由零售专家验证标注准确性确保覆盖各种困难样本如半空货架平衡不同商品品类的代表性定期进行数据集迭代更新实用考量包含故意拍摄的模糊、过曝等不完美样本模拟手机拍摄的角度和画质考虑实际部署时的拍摄距离限制数据集配置文件数据集采用YOLO格式train: F:\超市空货架识别检测数据集\train\images val: F:\超市空货架识别检测数据集\valid\images test: F:\超市空货架识别检测数据集\test\images nc: 1 names: [100- O-O-S]数据集制作流程需求分析与规划阶段与零售运营团队深入沟通明确实际业务需求制定覆盖各类缺货场景的数据采集计划设计包含不同难度等级的样本构成确定标注标准和验收流程专业数据采集过程在合作门店进行系统性拍摄覆盖开店前、营业中、闭店前等多个时段包含高销量和低销量商品区域记录货架位置信息通道、方位等使用标准化拍摄设备智能手机模拟实际应用场景专业相机高画质参考样本固定高度支架保持拍摄一致性采集环境元数据光照条件记录时间段和客流量信息特定促销活动信息数据预处理流程统一调整为标准尺寸曝光补偿和色彩平衡处理生成多分辨率版本适应不同部署设备去除敏感信息顾客面孔、员工工牌等专业标注工作流第一阶段零售专家识别真实缺货位点第二阶段标注团队使用CVAT进行精细标注精确到单个SKU的陈列单元标注货架结构辅助识别标记困难案例如透明包装商品缺货第三阶段质量团队进行三重验证标注准确性检查业务逻辑验证模型训练效果反馈数据增强策略基础增强随机裁剪模拟不同拍摄距离色彩扰动适应不同门店灯光透视变换模拟各种拍摄角度高级增强合成遮挡模拟价签、海报等添加合理程度的运动模糊模拟手机拍摄的噪声和压缩伪影对抗样本生成创建边缘案例如半空货架模拟各种商品包装反光数据集划分与评估按门店进行分层划分确保各门店数据分布在所有子集保持各类商品缺货样本的比例一致通过基线模型进行数据质量验证由零售专家进行业务相关性评估持续优化机制建立用户反馈通道收集实际应用问题定期添加新商品类别的样本根据季节变化更新促销场景数据维护数据集版本更新日志四、项目环境配置创建虚拟环境首先新建一个Anaconda环境每个项目用不同的环境这样项目中所用的依赖包互不干扰。终端输入conda create -n yolov10 python3.9激活虚拟环境conda activate yolov10安装cpu版本pytorchpip install torch torchvision torchaudiopycharm中配置anaconda安装所需要库pip install -r requirements.txt五、模型训练训练代码from ultralytics import YOLOv10 model_path yolov10s.pt data_path datasets/data.yaml if __name__ __main__: model YOLOv10(model_path) results model.train(datadata_path, epochs500, batch64, device0, workers0, projectruns/detect, nameexp, )根据实际情况更换模型 yolov10n.yaml (nano)轻量化模型适合嵌入式设备速度快但精度略低。 yolov10s.yaml (small)小模型适合实时任务。 yolov10m.yaml (medium)中等大小模型兼顾速度和精度。 yolov10b.yaml (base)基本版模型适合大部分应用场景。 yolov10l.yaml (large)大型模型适合对精度要求高的任务。--batch 64每批次64张图像。--epochs 500训练500轮。--datasets/data.yaml数据集配置文件。--weights yolov10s.pt初始化模型权重yolov10s.pt是预训练的轻量级YOLO模型。训练结果六、核心代码import sys import cv2 import numpy as np from PyQt5.QtWidgets import QApplication, QMessageBox, QFileDialog from PyQt5.QtCore import QThread, pyqtSignal from ultralytics import YOLOv10 from UiMain import UiMainWindow import time import os class DetectionThread(QThread): frame_received pyqtSignal(np.ndarray, np.ndarray, list) # 原始帧, 检测帧, 检测结果 finished_signal pyqtSignal() # 线程完成信号 def __init__(self, model, source, conf, iou, parentNone): super().__init__(parent) self.model model self.source source self.conf conf self.iou iou self.running True def run(self): try: if isinstance(self.source, int) or self.source.endswith((.mp4, .avi, .mov)): # 视频或摄像头 cap cv2.VideoCapture(self.source) while self.running and cap.isOpened(): ret, frame cap.read() if not ret: break # 保存原始帧 original_frame frame.copy() # 检测 results self.model(frame, confself.conf, iouself.iou) annotated_frame results[0].plot() # 提取检测结果 detections [] for result in results: for box in result.boxes: class_id int(box.cls) class_name self.model.names[class_id] confidence float(box.conf) x, y, w, h box.xywh[0].tolist() detections.append((class_name, confidence, x, y)) # 发送信号 self.frame_received.emit( cv2.cvtColor(original_frame, cv2.COLOR_BGR2RGB), cv2.cvtColor(annotated_frame, cv2.COLOR_BGR2RGB), detections ) # 控制帧率 time.sleep(0.03) # 约30fps cap.release() else: # 图片 frame cv2.imread(self.source) if frame is not None: original_frame frame.copy() results self.model(frame, confself.conf, iouself.iou) annotated_frame results[0].plot() # 提取检测结果 detections [] for result in results: for box in result.boxes: class_id int(box.cls) class_name self.model.names[class_id] confidence float(box.conf) x, y, w, h box.xywh[0].tolist() detections.append((class_name, confidence, x, y)) self.frame_received.emit( cv2.cvtColor(original_frame, cv2.COLOR_BGR2RGB), cv2.cvtColor(annotated_frame, cv2.COLOR_BGR2RGB), detections ) except Exception as e: print(fDetection error: {e}) finally: self.finished_signal.emit() def stop(self): self.running False class MainWindow(UiMainWindow): def __init__(self): super().__init__() # 初始化模型 self.model None self.detection_thread None self.current_image None self.current_result None self.video_writer None self.is_camera_running False self.is_video_running False self.last_detection_result None # 新增保存最后一次检测结果 # 连接按钮信号 self.image_btn.clicked.connect(self.detect_image) self.video_btn.clicked.connect(self.detect_video) self.camera_btn.clicked.connect(self.detect_camera) self.stop_btn.clicked.connect(self.stop_detection) self.save_btn.clicked.connect(self.save_result) # 初始化模型 self.load_model() def load_model(self): try: model_name self.model_combo.currentText() self.model YOLOv10(f{model_name}.pt) # 自动下载或加载本地模型 self.update_status(f模型 {model_name} 加载成功) except Exception as e: QMessageBox.critical(self, 错误, f模型加载失败: {str(e)}) self.update_status(模型加载失败) def detect_image(self): if self.detection_thread and self.detection_thread.isRunning(): QMessageBox.warning(self, 警告, 请先停止当前检测任务) return file_path, _ QFileDialog.getOpenFileName( self, 选择图片, , 图片文件 (*.jpg *.jpeg *.png *.bmp)) if file_path: self.clear_results() self.current_image cv2.imread(file_path) self.current_image cv2.cvtColor(self.current_image, cv2.COLOR_BGR2RGB) self.display_image(self.original_image_label, self.current_image) # 创建检测线程 conf self.confidence_spinbox.value() iou self.iou_spinbox.value() self.detection_thread DetectionThread(self.model, file_path, conf, iou) self.detection_thread.frame_received.connect(self.on_frame_received) self.detection_thread.finished_signal.connect(self.on_detection_finished) self.detection_thread.start() self.update_status(f正在检测图片: {os.path.basename(file_path)}) def detect_video(self): if self.detection_thread and self.detection_thread.isRunning(): QMessageBox.warning(self, 警告, 请先停止当前检测任务) return file_path, _ QFileDialog.getOpenFileName( self, 选择视频, , 视频文件 (*.mp4 *.avi *.mov)) if file_path: self.clear_results() self.is_video_running True # 初始化视频写入器 cap cv2.VideoCapture(file_path) frame_width int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) frame_height int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fps cap.get(cv2.CAP_PROP_FPS) cap.release() # 创建保存路径 save_dir results os.makedirs(save_dir, exist_okTrue) timestamp time.strftime(%Y%m%d_%H%M%S) save_path os.path.join(save_dir, fresult_{timestamp}.mp4) fourcc cv2.VideoWriter_fourcc(*mp4v) self.video_writer cv2.VideoWriter(save_path, fourcc, fps, (frame_width, frame_height)) # 创建检测线程 conf self.confidence_spinbox.value() iou self.iou_spinbox.value() self.detection_thread DetectionThread(self.model, file_path, conf, iou) self.detection_thread.frame_received.connect(self.on_frame_received) self.detection_thread.finished_signal.connect(self.on_detection_finished) self.detection_thread.start() self.update_status(f正在检测视频: {os.path.basename(file_path)}) def detect_camera(self): if self.detection_thread and self.detection_thread.isRunning(): QMessageBox.warning(self, 警告, 请先停止当前检测任务) return self.clear_results() self.is_camera_running True # 创建检测线程 (默认使用摄像头0) conf self.confidence_spinbox.value() iou self.iou_spinbox.value() self.detection_thread DetectionThread(self.model, 0, conf, iou) self.detection_thread.frame_received.connect(self.on_frame_received) self.detection_thread.finished_signal.connect(self.on_detection_finished) self.detection_thread.start() self.update_status(正在从摄像头检测...) def stop_detection(self): if self.detection_thread and self.detection_thread.isRunning(): self.detection_thread.stop() self.detection_thread.quit() self.detection_thread.wait() if self.video_writer: self.video_writer.release() self.video_writer None self.is_camera_running False self.is_video_running False self.update_status(检测已停止) def on_frame_received(self, original_frame, result_frame, detections): # 更新原始图像和结果图像 self.display_image(self.original_image_label, original_frame) self.display_image(self.result_image_label, result_frame) # 保存当前结果帧用于后续保存 self.last_detection_result result_frame # 新增保存检测结果 # 更新表格 self.clear_results() for class_name, confidence, x, y in detections: self.add_detection_result(class_name, confidence, x, y) # 保存视频帧 if self.video_writer: self.video_writer.write(cv2.cvtColor(result_frame, cv2.COLOR_RGB2BGR)) def on_detection_finished(self): if self.video_writer: self.video_writer.release() self.video_writer None self.update_status(视频检测完成结果已保存) elif self.is_camera_running: self.update_status(摄像头检测已停止) else: self.update_status(图片检测完成) def save_result(self): if not hasattr(self, last_detection_result) or self.last_detection_result is None: QMessageBox.warning(self, 警告, 没有可保存的检测结果) return save_dir results os.makedirs(save_dir, exist_okTrue) timestamp time.strftime(%Y%m%d_%H%M%S) if self.is_camera_running or self.is_video_running: # 保存当前帧为图片 save_path os.path.join(save_dir, fsnapshot_{timestamp}.jpg) cv2.imwrite(save_path, cv2.cvtColor(self.last_detection_result, cv2.COLOR_RGB2BGR)) self.update_status(f截图已保存: {save_path}) else: # 保存图片检测结果 save_path os.path.join(save_dir, fresult_{timestamp}.jpg) cv2.imwrite(save_path, cv2.cvtColor(self.last_detection_result, cv2.COLOR_RGB2BGR)) self.update_status(f检测结果已保存: {save_path}) def closeEvent(self, event): self.stop_detection() event.accept() if __name__ __main__: app QApplication(sys.argv) # 设置应用程序样式 app.setStyle(Fusion) # 创建并显示主窗口 window MainWindow() window.show() sys.exit(app.exec_())七、项目源码视频下方简介内完整全部资源文件包括测试图片、视频py文件训练数据集、训练代码、界面代码等这里已打包上传至博主的面包多平台见可参考博客与视频已将所有涉及的文件同时打包到里面点击即可运行完整文件截图如下基于深度学习YOLOv10的超市空货架识别检测系统YOLOv10YOLO数据集UI界面Python项目源码模型_哔哩哔哩_bilibili基于深度学习YOLOv10的超市空货架识别检测系统YOLOv10YOLO数据集UI界面Python项目源码模型