深度学习基于YOLOv8的水果蔬菜新鲜度检测系统 基于 YOLOv8 的水果蔬菜新鲜度智能检测系统 —— 25类全场景识别平台

发布时间:2026/7/5 5:46:39

深度学习基于YOLOv8的水果蔬菜新鲜度检测系统 基于 YOLOv8 的水果蔬菜新鲜度智能检测系统 —— 25类全场景识别平台 智慧农业-基于YOLOv8的水果蔬菜新鲜度检测系统 基于 YOLOv8 的水果蔬菜新鲜度智能检测系统 —— 25类全场景识别平台一、项目概览表项目维度内容描述项目名称基于YOLOv8的水果蔬菜新鲜度检测系统核心算法YOLOv8 (Ultralytics)检测类别25类涵盖新鲜、成熟、腐烂、未成熟四种状态包括黄瓜、葫芦、生菜、洋葱、土豆、苹果、香蕉、葡萄、芒果、橙子数据集规模8164张高质量标注图片输入支持单张图片 / 图片文件夹(批量) / 视频文件 / 实时摄像头输出形式可视化标注界面 实时统计面板 结果保存 (图片/文本)前端框架PyQt5 (桌面GUI支持拖拽、实时预览、多线程)深度学习PyTorch 1.9 Ultralytics YOLOv8图像处理OpenCV-python开发环境PyCharm / VSCode Anaconda (Python 3.9)适用场景智慧农业、超市质检、冷链物流、食品溯源、毕业设计、AI竞赛二、系统功能矩阵表功能模块子功能描述图像检测单图识别选择单张图片实时显示检测框、类别、置信度批量检测选择文件夹自动遍历所有图片列表展示每张结果支持导出视频检测文件播放加载本地视频逐帧检测实时显示进度与统计摄像头实时调用本地摄像头毫秒级响应适合现场演示参数配置阈值调节滑动条自定义置信度 (Conf)和IOU阈值显示选项勾选“显示标签”、“显示原图对比”模型管理模型切换下拉菜单选择不同的.pt权重文件 (如best.pt,yolov8n.pt)结果展示实时统计界面右侧实时显示目标总数、各类别数量分布详情查看批量检测时点击列表项可查看单张大图及详细数据数据导出结果保存保存标注后的图片、检测结果文本文件 (JSON/TXT)三、技术架构蓝图表层级技术组件作用说明表现层 (UI)PyQt5构建桌面图形界面包含菜单栏、工具栏、绘图区、控制区、状态栏QThread多线程处理视频/摄像头流防止界面卡顿业务逻辑层Python Controller响应用户操作调度检测任务更新UI数据AI引擎层YOLOv8 (Ultralytics)核心检测引擎加载25类训练好的权重执行推理PyTorch深度学习后端支持CPU/GPU加速数据处理层OpenCV图像读取、缩放、格式转换 (BGR-RGB)、视频帧提取存储层文件系统存储原始数据、模型权重、检测结果图片JSON/TXT结构化存储检测坐标、类别、置信度四、25类检测类别详解表状态分类涉及蔬果具体类别名称 (Class Names)新鲜黄瓜, 葫芦, 生菜, 洋葱, 土豆新鲜黄瓜,新鲜葫芦,新鲜生菜,新鲜洋葱,新鲜土豆成熟苹果, 香蕉, 葡萄, 芒果, 橙子成熟苹果,成熟香蕉,成熟葡萄,成熟芒果,成熟橙子腐烂苹果, 香蕉, 黄瓜, 葫芦, 葡萄, 生菜, 芒果, 洋葱, 橙子, 土豆腐烂苹果,腐烂香蕉,腐烂黄瓜,腐烂葫芦,腐烂葡萄,腐烂生菜,腐烂芒果,腐烂洋葱,腐烂橙子,腐烂土豆未成熟苹果, 香蕉, 葡萄, 芒果, 橙子未成熟苹果,未成熟香蕉,未成熟葡萄,未成熟芒果,未成熟橙子数据价值该数据集覆盖了从采摘到销售的全生命周期状态能有效辅助分级分拣和损耗预警。五、最简易完整代码实现 (PyQt5 YOLOv8 单文件版)说明这是一个精简但功能完整的单文件示例实现了图片检测、摄像头实时检测、阈值调节、结果显示。你可以直接保存为main.py运行。importsysimportosfromPyQt5.QtWidgetsimportQApplication,QMainWindow,QPushButton,QLabel,QVBoxLayout,QHBoxLayout,QWidget,QFileDialog,QSlider,QGroupBox,QComboBox,QTextEdit,QScrollAreafromPyQt5.QtCoreimportQt,QTimer,QThread,pyqtSignalfromPyQt5.QtGuiimportQImage,QPixmap,QFontfromultralyticsimportYOLOimportcv2importnumpyasnpclassDetectionThread(QThread):frame_signalpyqtSignal(QImage,dict)def__init__(self,model,conf0.25):super().__init__()self.modelmodel self.confconf self.runningFalseself.capNonedefrun(self):self.runningTruewhileself.runningandself.cap:ret,frameself.cap.read()ifnotret:break# 执行检测resultsself.model.predict(frame,confself.conf,verboseFalse)resultresults[0]# 绘制结果annotated_frameresult.plot()# 统计信息stats{}ifresult.boxesisnotNone:forcls_idinresult.boxes.cls:nameself.model.names[int(cls_id)]stats[name]stats.get(name,0)1# 转换格式供QT显示 (BGR - RGB)rgb_imagecv2.cvtColor(annotated_frame,cv2.COLOR_BGR2RGB)h,w,chrgb_image.shape bytes_per_linech*w q_imageQImage(rgb_image.data,w,h,bytes_per_line,QImage.Format_RGB888)self.frame_signal.emit(q_image,stats)self.stop_camera()defstart_camera(self,source0):self.capcv2.VideoCapture(source)ifnotself.cap.isOpened():print(无法打开摄像头)returnself.start()defstop_camera(self):self.runningFalseifself.cap:self.cap.release()self.wait()classMainWindow(QMainWindow):def__init__(self):super().__init__()self.setWindowTitle( 水果蔬菜新鲜度检测系统 (YOLOv8))self.setGeometry(100,100,1200,800)# 加载模型 (请确保目录下有 best.pt 或使用默认 yolov8n.pt)try:# 优先尝试加载用户训练好的模型ifos.path.exists(best.pt):self.modelYOLO(best.pt)print(已加载自定义模型 best.pt)else:self.modelYOLO(yolov8n.pt)print(未找到 best.pt已加载默认模型 yolov8n.pt (类别可能不匹配请替换模型))exceptExceptionase:print(f模型加载失败:{e})self.modelNoneself.threadNoneself.current_stats{}self.init_ui()definit_ui(self):central_widgetQWidget()self.setCentralWidget(central_widget)main_layoutQHBoxLayout(central_widget)# --- 左侧控制与统计面板 ---left_panelQVBoxLayout()# 1. 模型选择model_groupQGroupBox(模型选择)model_layoutQVBoxLayout()self.model_comboQComboBox()self.model_combo.addItems([best.pt,yolov8n.pt,yolov8s.pt])self.model_combo.currentTextChanged.connect(self.change_model)model_layout.addWidget(self.model_combo)model_group.setLayout(model_layout)left_panel.addWidget(model_group)# 2. 参数设置param_groupQGroupBox(参数设置)param_layoutQVBoxLayout()# 置信度conf_labelQLabel(f置信度阈值: 0.25)self.conf_sliderQSlider(Qt.Horizontal)self.conf_slider.setMinimum(10)self.conf_slider.setMaximum(90)self.conf_slider.setValue(25)self.conf_slider.valueChanged.connect(lambdav:conf_label.setText(f置信度阈值:{v/100:.2f}))param_layout.addWidget(conf_label)param_layout.addWidget(self.conf_slider)param_group.setLayout(param_layout)left_panel.addWidget(param_group)# 3. 操作按钮btn_groupQGroupBox(检测模式)btn_layoutQVBoxLayout()self.btn_imgQPushButton( 选择图片检测)self.btn_img.clicked.connect(self.detect_image)btn_layout.addWidget(self.btn_img)self.btn_camQPushButton( 开启摄像头)self.btn_cam.clicked.connect(self.toggle_camera)btn_layout.addWidget(self.btn_cam)self.btn_videoQPushButton( 选择视频检测 (暂未实现))self.btn_video.setEnabled(False)# 简化版暂不开启btn_layout.addWidget(self.btn_video)btn_group.setLayout(btn_layout)left_panel.addWidget(btn_group)# 4. 统计信息stat_groupQGroupBox(实时统计)stat_layoutQVBoxLayout()self.stat_textQTextEdit()self.stat_text.setReadOnly(True)self.stat_text.setFont(QFont(Arial,10))stat_layout.addWidget(self.stat_text)stat_group.setLayout(stat_layout)left_panel.addWidget(stat_group)left_panel.addStretch()main_layout.addLayout(left_panel,1)# --- 右侧结果显示区域 ---right_panelQVBoxLayout()self.image_labelQLabel(请点击按钮开始检测)self.image_label.setAlignment(Qt.AlignCenter)self.image_label.setStyleSheet(QLabel { background-color: #f0f0f0; border: 2px dashed #ccc; color: #888; })self.image_label.setMinimumSize(640,480)right_panel.addWidget(self.image_label)main_layout.addLayout(right_panel,3)defchange_model(self,model_name):ifos.path.exists(model_name):self.modelYOLO(model_name)self.stat_text.append(f✅ 模型已切换至:{model_name})else:self.stat_text.append(f❌ 未找到模型文件:{model_name})defdetect_image(self):ifnotself.model:returnfile_path,_QFileDialog.getOpenFileName(self,选择图片,,Images (*.jpg *.png *.bmp))iffile_path:imgcv2.imread(file_path)ifimgisNone:returnconfself.conf_slider.value()/100.0resultsself.model.predict(img,confconf,verboseFalse)resultresults[0]annotated_imgresult.plot()self.show_image(annotated_img)# 更新统计self.update_stats(result)deftoggle_camera(self):ifself.threadandself.thread.running:self.thread.stop_camera()self.btn_cam.setText( 开启摄像头)self.image_label.setText(摄像头已停止)self.image_label.setStyleSheet(QLabel { background-color: #f0f0f0; border: 2px dashed #ccc; color: #888; })else:ifnotself.model:returnself.threadDetectionThread(self.model,confself.conf_slider.value()/100.0)self.thread.frame_signal.connect(self.update_camera_frame)self.thread.start_camera(0)# 0表示默认摄像头self.btn_cam.setText(⏹ 停止摄像头)defupdate_camera_frame(self,q_image,stats):pixmapQPixmap.fromImage(q_image)# 自适应大小scaled_pixmappixmap.scaled(self.image_label.size(),Qt.KeepAspectRatio,Qt.SmoothTransformation)self.image_label.setPixmap(scaled_pixmap)self.image_label.setStyleSheet()# 移除背景色# 更新统计文本stat_strtotalsum(stats.values())stat_strf总目标数:{total}\n-*20\nfork,vinsorted(stats.items()):stat_strf{k}:{v}\nself.stat_text.setText(stat_str)defshow_image(self,cv_image):rgb_imagecv2.cvtColor(cv_image,cv2.COLOR_BGR2RGB)h,w,chrgb_image.shape bytes_per_linech*w q_imageQImage(rgb_image.data,w,h,bytes_per_line,QImage.Format_RGB888)pixmapQPixmap.fromImage(q_image)scaled_pixmappixmap.scaled(self.image_label.size(),Qt.KeepAspectRatio,Qt.SmoothTransformation)self.image_label.setPixmap(scaled_pixmap)self.image_label.setStyleSheet()defupdate_stats(self,result):stats{}ifresult.boxesisnotNone:forcls_idinresult.boxes.cls:nameself.model.names[int(cls_id)]stats[name]stats.get(name,0)1stat_strf总目标数:{sum(stats.values())}\n-*20\nfork,vinsorted(stats.items()):stat_strf{k}:{v}\nself.stat_text.setText(stat_str)if__name____main__:appQApplication(sys.argv)windowMainWindow()window.show()sys.exit(app.exec_())六、简易运行文档 水果蔬菜新鲜度检测系统 - 快速上手指南版本: 1.0适用环境: Windows 10/11, Python 3.9, Anaconda第1步环境准备安装 Anaconda(如果尚未安装)。创建虚拟环境conda create-nfruit_detectpython3.9conda activate fruit_detect安装依赖库pipinstallultralytics opencv-python PyQt5 torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118(注如果没有NVIDIA显卡去掉--index-url...部分即可安装CPU版)第2步文件准备确保你的项目文件夹包含以下结构Project_Root/ ├── main.py # 上面提供的代码 ├── best.pt # 【关键】训练好的25类水果蔬菜模型权重 ├── dataset/ # (可选) 8164张数据集图片 └── requirements.txt # 依赖列表⚠️注意必须将训练好的best.pt文件放在同一目录下否则系统会加载默认的COCO模型只能检测人、车等无法检测水果。第3步运行系统在终端中运行python main.py第4步功能使用图片检测点击“ 选择图片检测”。选择一张包含水果/蔬菜的图片。右侧窗口显示标注结果左侧显示各类别数量如腐烂苹果 x2, 新鲜香蕉 x1。摄像头实时检测拿一个水果或打印图片对着摄像头。点击“ 开启摄像头”。系统实时框选并分类统计面板动态刷新。拖动“置信度阈值”滑块可过滤低概率检测。切换模型如果你有不同的权重文件如yolov8m.pt放入目录后在下拉框选择即可热切换。第5步结果保存 (扩展建议)当前简易版直接在界面显示。若需保存图片在代码detect_image函数末尾添加cv2.imwrite(result.jpg, annotated_img)。数据将stats字典写入 TXT 或 CSV 文件。祝你的项目在智慧农业、食品安全领域大放异彩内含8164张水果蔬菜新鲜度数据集包括[‘新鲜黄瓜’, ‘新鲜葫芦’, ‘新鲜生菜’, ‘新鲜洋葱’, ‘新鲜土豆’, ‘成熟苹果’, ‘成熟香蕉’, ‘成熟葡萄’, ‘成熟芒果’, ‘成熟橙子’, ‘腐烂苹果’, ‘腐烂香蕉’, ‘腐烂黄瓜’, ‘腐烂葫芦’, ‘腐烂葡萄’, ‘腐烂生菜’, ‘腐烂芒果’, ‘腐烂洋葱’, ‘腐烂橙子’, ‘腐烂土豆’, ‘未成熟苹果’, ‘未成熟香蕉’, ‘未成熟葡萄’, ‘未成熟芒果’, ‘未成熟橙子’]25类本项目已经训练好模型软件PycharmAnaconda或者VSCodeAnaconda环境python3.9 opencv-python PyQt5 ultralytics torch1.9等文件①完整程序文件.py等②UI界面源文件、图标.ui、.qrc、.py等③数据集图片项目运行教程.jpg、.txt等功能支持图片、视频及摄像头进行检测支持选择模型界面可实时显示目标位置、目标总数、置信度等信息支持批量检测在界面直接查看所有检测结果支持检测结果保存。①选择单张图片或者图片文件夹进行识别②选择视频文件进行识别③调用本地摄像头进行识别④自定义置信度IOU阈值⑤选择显示标签和原图⑥选择检测模型⑦查看批量检测每一张检测结果

相关新闻