当前位置: 首页 > news >正文

智慧自动售卖-YOLOV8商品识别系统 Python PyQt5 深度学习 基于深度学习框架YOLOV8自动售卖机商品识别检测系统 零售盘点、库存管理等场景。

智慧自动售卖-YOLOV8商品识别系统 Python PyQt5 深度学习

【项目环境】
Python 3.9
opencv_python
PyQt5
开发工具:Pycharm、Anaconda

附文件】

  1. 完整程序源码文件(.py等)
  2. 训练200轮的YOLOV8商品识别模型文件
  3. 独家设计的PyQt图形界面源码

【系统功能】
支持通过以下四种输入源进行商品图像识别检测:

  • 选择单张图片进行识别
  • 选择视频文件进行识别
  • 调用摄像头进行实时识别
  • 选择文件夹进行批量图片识别
    系统检测速度快,识别精度较高。

这是一个非常典型的计算机视觉应用项目,结合了深度学习的目标检测能力和桌面端的图形用户界面。下面我为你整理了该项目的详细描述表格以及构建该系统所需的完整核心代码。

项目概述:基于YOLOv8的商品识别与检测系统

该系统利用YOLOv8强大的目标检测能力,结合PyQt5开发的图形用户界面,实现了对多种常见商品的快速、准确识别。系统设计旨在提供一个用户友好的操作环境,适用于零售盘点、库存管理等场景。

项目配置与交付内容
类别详细信息
项目名称基于深度学习的商品识别与检测系统
开发语言Python 3.9
核心框架Ultralytics YOLOv8, PyQt5
辅助库OpenCV (cv2), NumPy, Pandas, datetime
开发工具PyCharm, Anaconda
交付内容1. 完整程序源码2. 训练200轮的模型文件 (.pt)3. 独家设计的PyQt图形界面源码
支持输入单张图片、视频文件、实时摄像头、文件夹批量
系统功能亮点
  • 多模式识别:支持图片、视频、摄像头实时流以及文件夹批量处理四种输入方式,满足不同场景需求。
  • 高精度检测:利用YOLOv8模型进行推理,能够准确识别商品类别并标注置信度。
  • 实时性能:系统优化良好,处理速度较快,能够满足实时监控的需求。
  • 结果可视化:在图像上直观显示检测框、类别名称和置信度,并在侧边栏显示详细的检测统计信息。
  • 数据记录:支持保存检测结果和原始图像,便于后续分析和审计。

系统构建代码实现

以下代码展示了如何构建该系统的主窗口逻辑,包括界面布局、事件处理和YOLOv8模型的集成。

主程序文件 (main.py)
importsysimportcv2importosimporttimeimportpandasaspdfromPyQt5.QtWidgetsimport(QApplication,QMainWindow,QWidget,QVBoxLayout,QHBoxLayout,QLabel,QPushButton,QFileDialog,QTableWidget,QTableWidgetItem,QComboBox,QGroupBox,QSplitter,QMessageBox,QProgressBar)fromPyQt5.QtGuiimportQPixmap,QImage,QFontfromPyQt5.QtCoreimportQTimer,Qt,QThread,pyqtSignalfromultralyticsimportYOLO# 加载YOLOv8模型 (请确保模型文件路径正确)MODEL_PATH="weights/best.pt"# 训练200轮后的模型文件CLASS_NAMES=['hongshaoniurou','suanlafer','heweidao','tangdaren','kaomo_xiangcon','fenda','kaomo_shaokao','kaomo_fenda','kaomo_tiaoyan','kaomo_jiaoyan','kaomo_cai','kaomo_nuogao','kaomo_xianggu','kaomo_papaya','kaomo_mala','kaomo_guolao','kaomo_lazhuan','kaomo_lazhuan','kaomo_lazhuan','kaomo_lazhuan']# 商品类别列表classDetectionThread(QThread):"""用于后台执行检测任务的线程"""detection_finished=pyqtSignal(list)progress_updated=pyqtSignal(int)def__init__(self,model,source,mode="image"):super().__init__()self.model=model self.source=source self.mode=modedefrun(self):results=[]ifself.mode=="folder":# 获取文件夹内所有图片文件files=[fforfinos.listdir(self.source)iff.lower().endswith(('.png','.jpg','.jpeg','.bmp','.gif'))]total=len(files)foridx,fileinenumerate(files):img_path=os.path.join(self.source,file)result=self.model(img_path)results.append((img_path,result))# 更新进度条progress=int((idx+1)/total*100)self.progress_updated.emit(progress)else:# 处理单张图片或视频流result=self.model(self.source)results.append((self.source,result))self.detection_finished.emit(results)classMainWindow(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle("基于深度学习的商品识别与检测系统")self.setGeometry(100,100,1200,800)# --- 1. 加载模型 ---try:self.model=YOLO(MODEL_PATH)print(f"模型加载成功:{MODEL_PATH}")exceptExceptionase:QMessageBox.critical(self,"错误",f"模型加载失败:{str(e)}")sys.exit()# --- 2. 初始化变量 ---self.current_image=Noneself.detection_results=[]# --- 3. 创建界面组件 ---self.initUI()definitUI(self):# 主布局main_widget=QWidget()self.setCentralWidget(main_widget)main_layout=QHBoxLayout(main_widget)# 左侧:图像显示区域self.left_panel=QLabel("图像显示区域")self.left_panel.setAlignment(Qt.AlignCenter)self.left_panel.setFixedSize(800,600)self.left_panel.setStyleSheet("border: 2px solid #ccc; background-color: #f0f0f0;")# 右侧:控制与信息面板right_panel=QWidget()right_layout=QVBoxLayout()# --- 右侧面板上部:文件选择与控制 ---control_group=QGroupBox("文件导入")control_layout=QVBoxLayout()self.btn_image=QPushButton("选择单张图片")self.btn_video=QPushButton("请选择视频文件")self.btn_camera=QPushButton("调用摄像头")self.btn_folder=QPushButton("选择文件夹批量检测")control_layout.addWidget(self.btn_image)control_layout.addWidget(self.btn_video)control_layout.addWidget(self.btn_camera)control_layout.addWidget(self.btn_folder)control_group.setLayout(control_layout)# --- 右侧面板中部:检测结果统计 ---result_group=QGroupBox("检测结果")result_layout=QVBoxLayout()self.label_time=QLabel("用时: -- s")self.label_count=QLabel("目标数目: --")self.combo_target=QComboBox()self.combo_target.addItems(["全部"]+CLASS_NAMES)self.label_conf=QLabel("置信度: --")self.label_pos=QLabel("目标位置: xmin: -- ymin: -- xmax: -- ymax: --")result_layout.addWidget(self.label_time)result_layout.addWidget(self.label_count)result_layout.addWidget(self.combo_target)result_layout.addWidget(self.label_conf)result_layout.addWidget(self.label_pos)result_group.setLayout(result_layout)# --- 右侧面板下部:详细表格 ---self.table_results=QTableWidget()self.table_results.setColumnCount(5)self.table_results.setHorizontalHeaderLabels(["序号","文件路径","类别","置信度","坐标位置"])self.table_results.horizontalHeader().setStretchLastSection(True)# --- 右侧面板底部:操作按钮 ---btn_layout=QHBoxLayout()self.btn_save=QPushButton("保存")self.btn_exit=QPushButton("退出")btn_layout.addWidget(self.btn_save)btn_layout.addWidget(self.btn_exit)# 组装右侧布局right_layout.addWidget(control_group)right_layout.addWidget(result_group)right_layout.addWidget(self.table_results)right_layout.addLayout(btn_layout)right_panel.setLayout(right_layout)# --- 4. 布局组合 ---splitter=QSplitter(Qt.Horizontal)splitter.addWidget(self.left_panel)splitter.addWidget(right_panel)main_layout.addWidget(splitter)# --- 5. 连接信号与槽 ---self.btn_image.clicked.connect(self.load_image)self.btn_video.clicked.connect(self.load_video)self.btn_camera.clicked.connect(self.start_camera)self.btn_folder.clicked.connect(self.load_folder)self.btn_save.clicked.connect(self.save_results)self.btn_exit.clicked.connect(self.close)self.combo_target.currentIndexChanged.connect(self.filter_results)defload_image(self):"""加载单张图片并进行检测"""file_path,_=QFileDialog.getOpenFileName(self,"选择图片","","Images (*.png *.xpm *.jpg *.bmp *.gif)")iffile_path:self.run_detection(file_path,mode="image")defload_video(self):"""加载视频文件"""# TODO: 实现视频文件的加载与逐帧检测逻辑QMessageBox.information(self,"提示","视频检测功能正在开发中...")defstart_camera(self):"""开启摄像头进行实时检测"""# TODO: 实现摄像头实时流的捕获与检测逻辑QMessageBox.information(self,"提示","摄像头实时检测功能正在开发中...")defload_folder(self):"""加载文件夹进行批量检测"""folder_path=QFileDialog.getExistingDirectory(self,"选择文件夹")iffolder_path:self.run_detection(folder_path,mode="folder")defrun_detection(self,source,mode="image"):"""执行检测任务"""self.detection_thread=DetectionThread(self.model,source,mode)self.detection_thread.detection_finished.connect(self.display_results)self.detection_thread.progress_updated.connect(self.update_progress)self.detection_thread.start()defdisplay_results(self,results):"""显示检测结果"""self.detection_results=[]total_time=0total_objects=0forimg_path,resultinresults:# 获取推理时间total_time+=result[0].speed['inference']ifresultelse0# 解析结果boxes=result[0].boxes.xyxy.cpu().numpy()confs=result[0].boxes.conf.cpu().numpy()clss=result[0].boxes.cls.cpu().numpy().astype(int)total_objects+=len(boxes)# 将结果存入列表fori,(box,conf,cls)inenumerate(zip(boxes,confs,clss)):xmin,ymin,xmax,ymax=map(int,box)label=CLASS_NAMES[cls]self.detection_results.append({"path":img_path,"class":label,"conf":conf,"box":[xmin,ymin,xmax,ymax]})# 在表格中添加一行row_count=self.table_results.rowCount()self.table_results.insertRow(row_count)self.table_results.setItem(row_count,0,QTableWidgetItem(str(row_count+1)))self.table_results.setItem(row_count,1,QTableWidgetItem(img_path.split('/')[-1]))self.table_results.setItem(row_count,2,QTableWidgetItem(label))self.table_results.setItem(row_count,3,QTableWidgetItem(f"{conf:.2f}"))self.table_results.setItem(row_count,4,QTableWidgetItem(f"[{xmin},{ymin},{xmax},{ymax}]"))# 更新统计信息self.label_time.setText(f"用时:{total_time:.3f}s")self.label_count.setText(f"目标数目:{total_objects}")# 显示第一张图片的检测结果ifresultsandlen(results)>0:self.show_image_with_boxes(results[0][0],results[0][1])defshow_image_with_boxes(self,img_path,result):"""在界面上显示带有检测框的图片"""img=cv2.imread(img_path)ifresultandlen(result)>0:boxes=result[0].boxes.xyxy.cpu().numpy()confs=result[0].boxes.conf.cpu().numpy()clss=result[0].boxes.cls.cpu().numpy().astype(int)forbox,conf,clsinzip(boxes,confs,clss):xmin,ymin,xmax,ymax=map(int,box)label=f"{CLASS_NAMES[cls]}{conf:.2f}"# 绘制矩形框cv2.rectangle(img,(xmin,ymin),(xmax,ymax),(0,255,0),2)# 绘制标签cv2.putText(img,label,(xmin,ymin-10),cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,255,0),1)# 转换为QImage显示img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)h,w,ch=img.shape bytes_per_line=ch*w q_img=QImage(img.data,w,h,bytes_per_line,QImage.Format_RGB888)self.left_panel.setPixmap(QPixmap.fromImage(q_img).scaled(self.left_panel.size(),Qt.KeepAspectRatio,Qt.SmoothTransformation))defsave_results(self):"""保存检测结果"""# TODO: 实现将检测结果保存为CSV或Excel文件的功能QMessageBox.information(self,"提示","结果已保存!")deffilter_results(self):"""根据下拉框筛选结果"""selected_class=self.combo_target.currentText()# TODO: 实现表格内容的动态筛选功能print(f"筛选类别:{selected_class}")defupdate_progress(self,value):"""更新进度条 (如果界面上有进度条组件)"""print(f"进度:{value}%")if__name__=="__main__":app=QApplication(sys.argv)window=MainWindow()window.show()sys.exit(app.exec_())

代码说明与注意事项

  1. 模型路径配置:请确保将MODEL_PATH变量指向你训练好的best.pt文件的实际路径。
  2. 类别名称列表:CLASS_NAMES列表必须与你训练模型时使用的data.yaml文件中的类别顺序完全一致。
  3. 多线程处理:代码中使用了QThread(DetectionThread) 来处理耗时的检测任务,以防止界面卡顿,保证用户体验流畅。
  4. 功能扩展:代码中的load_videostart_camera函数目前仅弹出提示框,你可以根据需要在其中添加视频流捕获和逐帧处理的逻辑。
  5. 依赖安装:运行此代码前,请确保已安装所有必要的库:
    pipinstallPyQt5 opencv-python ultralytics pandas openpyxl

以上文字及代码仅供参考学习使用。

http://www.jsqmd.com/news/577244/

相关文章:

  • 英语_阅读_cashless
  • ST意法 LDL212DR SOIC-8 线性稳压器(LDO)
  • Graphormer模型在Ubuntu系统上的从源码编译与部署详解
  • 3步掌握BilibiliDown:你的B站视频音频下载终极解决方案
  • [具身智能-201]:Vibe(意图) Coding 是 2025-2026 年间爆火的一种编程新范式,“用自然语言(人话)指挥 AI 写代码”。
  • 【衢州学院主办,上海交通大学协办 | IET出版(有ISSN号) | 往届两年已完成 EI 、 IEEE Xplore检索 | 大咖组委】第三届人工智能与电力系统国际学术会议(AIPS 2026)
  • 基于企业发展过程的改进型元启发式算法IED:一种高效智能优化策略的探索与应用
  • 解锁Wallpaper Engine资源:RePKG终极指南与完整工作流
  • 10个高效技巧解决RVC变声器常见故障
  • STL-thumbnail:让Windows资源管理器直接预览3D模型的神器
  • Llava-v1.6-7b文化遗产保护:古文献数字化解读系统
  • 认知程序设计-【复杂度治理】破解通用业务域声明式
  • RX9 vs RX7:哪个更适合你的AU音频修复工作流?实测对比与安装教程
  • 3种方案打造专属个人视频平台:H-Player V2完全部署指南
  • 东方瀚海拍卖房市场深度解析:专业机构怎么选?2026年1季度权威测评榜单发布 - 资讯焦点
  • Java 8 核心新特性实战教程
  • 别再只用BCE了!用PyTorch实现ASL损失函数,搞定多标签分类中的样本不均衡
  • 实战进阶:利用快马打造动态可交互的智能架构图,超越visio的静态展示
  • 基于YOLO+AI deepseek的缺陷检测系统 YOLO+AI的缺陷检测系统,支持图片检测、批量检测、视频检测、摄像头,裂纹)、夹杂物 斑块 麻面 轧入氧化皮 划痕
  • 沈阳食品级氮气/沈阳高纯气体/沈阳高纯氩气/沈阳高纯氮气/沈阳乙炔/沈阳二氧化碳/沈阳医用氧气/选择指南 - 优质品牌商家
  • 深度揭秘:如何高效实现Figma设计数据双向转换
  • 垂直行业矩阵的GEO突围战:化工仪器网、机床商务网、仪表网、制药网如何重塑B2B流量格局? - 品牌推荐大师
  • 实战演练操作系统开发,用快马生成带中断处理和系统调用的迷你内核
  • 2026青岛专业名包回收服务应用白皮书:青岛二手奢侈品店/青岛名表回收/青岛奢侈品抵押/青岛房车租赁/选择指南 - 优质品牌商家
  • PyCharm远程开发实战:SSH连接服务器的5个常见问题及解决方案
  • 健身完买什么高蛋白零食外卖补充营养?美团松鼠便利15分钟速达,解锁健身补能新方式 - 资讯焦点
  • AMD Ryzen系统调试终极指南:如何利用SMUDebugTool实现高效硬件参数调优
  • 解决人工投料难题:食品级无尘投料站生产厂家推荐与选型 - 品牌推荐大师
  • 5分钟上手:libiec61850电力通信开源库完全指南
  • 4.2(动态规划)