基于深度学习YOLOv12的葡萄叶病害识别检测系统(YOLOv12+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)
一、项目介绍葡萄叶病害严重影响葡萄产量与品质传统人工检测方法效率低且依赖经验。本文基于深度学习技术提出一种基于YOLOv12的葡萄叶病害智能识别检测系统实现Black_rot、Esca和Healthy三类叶片的高效分类与定位。系统采用改进的YOLOv12模型在包含5370张图像的自建数据集训练集3758张、验证集538张、测试集1074张上进行训练与评估结合PyTorch框架及Python开发的交互式UI界面支持用户登录注册、图像上传及实时检测功能。实验表明该系统在测试集上平均精度mAP达99.4%单张图像推理速度≤50ms兼具高准确性与实时性为葡萄病害精准防控提供了智能化解决方案。引言葡萄种植业面临叶部病害如Black_rot和Esca的严重威胁传统检测依赖人工观察存在主观性强、耗时长等问题。近年来基于深度学习的目标检测技术如YOLO系列在农业病害识别中展现出显著优势但现有研究多聚焦于复杂背景下的多病害细分场景针对葡萄叶病害的轻量化高精度检测系统仍待优化。本文基于YOLOv12模型结合迁移学习与数据增强技术构建端到端的葡萄叶病害检测系统。通过设计用户友好的UI界面与权限管理模块降低技术使用门槛实现病害识别的便捷化与普及化。研究旨在解决三个核心问题1提升小样本数据下模型泛化能力2平衡检测速度与精度3开发适用于实际种植场景的交互工具。该系统为智慧农业提供了可落地的技术参考。目录一、项目介绍二、项目功能展示2.1 用户登录系统2.2 检测功能2.3 检测结果显示2.4 参数配置2.5 其他功能3. 技术特点4. 系统流程三、数据集介绍数据集配置文件四、项目环境配置创建虚拟环境安装所需要库五、模型训练训练代码训练结果六、核心代码登录注册验证 多重检测模式️ 沉浸式可视化⚙️ 参数配置系统✨ UI美学设计 智能工作流七、项目源码(视频简介)基于深度学习YOLOv12的葡萄叶病害识别检测系统YOLOv12YOLO数据集UI界面登录注册界面Python项目源码模型_哔哩哔哩_bilibili基于深度学习YOLOv12的葡萄叶病害识别检测系统YOLOv12YOLO数据集UI界面登录注册界面Python项目源码模型二、项目功能展示✅ 用户登录注册支持密码检测和安全性验证。✅ 三种检测模式基于YOLOv12模型支持图片、视频和实时摄像头三种检测精准识别目标。✅ 双画面对比同屏显示原始画面与检测结果。✅ 数据可视化实时表格展示检测目标的类别、置信度及坐标。✅智能参数调节提供置信度滑块动态优化检测精度适应不同场景需求。✅科幻风交互界面深色主题搭配动态光效减少视觉疲劳提升操作体验。✅多线程高性能架构独立检测线程保障流畅运行实时状态提示响应迅速无卡顿。2.1 用户登录系统提供用户登录和注册功能用户名和密码验证账户信息本地存储(accounts.json)密码长度至少6位的安全要求2.2 检测功能图片检测支持JPG/JPEG/PNG/BMP格式图片的火焰烟雾检测视频检测支持MP4/AVI/MOV格式视频的逐帧检测摄像头检测实时摄像头流检测(默认摄像头0)检测结果保存到results目录2.3 检测结果显示显示原始图像和检测结果图像检测结果表格展示包含检测到的类别置信度分数物体位置坐标(x,y)、2.4 参数配置模型选择置信度阈值调节(0-1.0)IoU(交并比)阈值调节(0-1.0)实时同步滑块和数值输入框2.5 其他功能检测结果保存功能视频检测时自动保存结果视频状态栏显示系统状态和最后更新时间无边框窗口设计可拖动和调整大小3. 技术特点采用多线程处理检测任务避免界面卡顿精美的UI设计具有科技感的视觉效果发光边框和按钮悬停和按下状态效果自定义滑块、表格和下拉框样式检测结果保存机制响应式布局适应不同窗口大小4. 系统流程用户登录/注册选择检测模式(图片/视频/摄像头)调整检测参数(可选)开始检测并查看结果可选择保存检测结果停止检测或切换其他模式三、数据集介绍本研究采用自建的葡萄叶病害数据集共包含5,370 张高分辨率图像涵盖3 个类别Black_rot黑腐病、Esca埃斯卡病和Healthy健康叶片。数据集按照8:1:1的比例划分为训练集3,758 张、验证集538 张和测试集1,074 张以确保模型的泛化能力和评估可靠性。数据集配置文件数据集采用标准化YOLO格式组织train: F:\葡萄叶病害数据集\葡萄叶病害数据集\images\train val: F:\葡萄叶病害数据集\葡萄叶病害数据集\images\val test: F:\葡萄叶病害数据集\葡萄叶病害数据集\images\test nc: 3 names: [Black_rot, Esca, Healthy]四、项目环境配置创建虚拟环境首先新建一个Anaconda环境每个项目用不同的环境这样项目中所用的依赖包互不干扰。终端输入conda create -n yolov12 python3.9激活虚拟环境conda activate yolov12安装cpu版本pytorchpip install torch torchvision torchaudio安装所需要库pip install -r requirements.txtpycharm中配置anaconda五、模型训练训练代码from ultralytics import YOLO model_path yolo12s.pt data_path data.yaml if __name__ __main__: model YOLO(model_path) results model.train(datadata_path, epochs100, batch8, device0, workers0, projectruns, nameexp, )根据实际情况更换模型 # yolov12n.yaml (nano)轻量化模型适合嵌入式设备速度快但精度略低。 # yolov12s.yaml (small)小模型适合实时任务。 # yolov12m.yaml (medium)中等大小模型兼顾速度和精度。 # yolov12b.yaml (base)基本版模型适合大部分应用场景。 # yolov12l.yaml (large)大型模型适合对精度要求高的任务。--batch 8每批次8张图像。--epochs 100训练100轮。--datasets/data.yaml数据集配置文件。--weights yolov12s.pt初始化模型权重yolov12s.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 YOLO from UiMain import UiMainWindow import time import os from PyQt5.QtWidgets import QDialog from LoginWindow import LoginWindow 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 YOLO(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(正在从摄像头检测...)登录注册验证对应文件LoginWindow.py# 账户验证核心逻辑 def handle_login(self): username self.username_input.text().strip() password self.password_input.text().strip() if not username or not password: QMessageBox.warning(self, 警告, 用户名和密码不能为空) return if username in self.accounts and self.accounts[username] password: self.accept() # 验证通过 else: QMessageBox.warning(self, 错误, 用户名或密码错误) # 密码强度检查注册时 def handle_register(self): if len(password) 6: # 密码长度≥6位 QMessageBox.warning(self, 警告, 密码长度至少为6位)多重检测模式对应文件main.py图片检测def detect_image(self): file_path, _ QFileDialog.getOpenFileName( self, 选择图片, , 图片文件 (*.jpg *.jpeg *.png *.bmp)) if file_path: self.detection_thread DetectionThread(self.model, file_path, conf, iou) self.detection_thread.start() # 启动检测线程视频检测def detect_video(self): file_path, _ QFileDialog.getOpenFileName( self, 选择视频, , 视频文件 (*.mp4 *.avi *.mov)) if file_path: self.video_writer cv2.VideoWriter() # 初始化视频写入器 self.detection_thread DetectionThread(self.model, file_path, conf, iou)实时摄像头def detect_camera(self): self.detection_thread DetectionThread(self.model, 0, conf, iou) # 摄像头设备号0 self.detection_thread.start()️沉浸式可视化对应文件UiMain.py双画面显示def display_image(self, label, image): q_img QImage(image.data, w, h, bytes_per_line, QImage.Format_RGB888) pixmap QPixmap.fromImage(q_img) label.setPixmap(pixmap.scaled(label.size(), Qt.KeepAspectRatio)) # 自适应缩放结果表格def add_detection_result(self, class_name, confidence, x, y): self.results_table.insertRow(row) items [ QTableWidgetItem(class_name), # 类别列 QTableWidgetItem(f{confidence:.2f}), # 置信度 QTableWidgetItem(f{x:.1f}), # X坐标 QTableWidgetItem(f{y:.1f}) # Y坐标 ]⚙️参数配置系统对应文件UiMain.py双阈值联动控制# 置信度阈值同步 def update_confidence(self, value): confidence value / 100.0 self.confidence_spinbox.setValue(confidence) # 滑块→数值框 self.confidence_label.setText(f置信度阈值: {confidence:.2f}) # IoU阈值同步 def update_iou(self, value): iou value / 100.0 self.iou_spinbox.setValue(iou)✨UI美学设计对应文件UiMain.py科幻风格按钮def create_button(self, text, color): return f QPushButton {{ border: 1px solid {color}; color: {color}; border-radius: 6px; }} QPushButton:hover {{ background-color: {self.lighten_color(color, 10)}; box-shadow: 0 0 10px {color}; # 悬停发光效果 }} 动态状态栏def update_status(self, message): self.status_bar.showMessage( f状态: {message} | 最后更新: {time.strftime(%H:%M:%S)} # 实时时间戳 )智能工作流对应文件main.py线程管理class DetectionThread(QThread): frame_received pyqtSignal(np.ndarray, np.ndarray, list) # 信号量通信 def run(self): while self.running: # 多线程检测循环 results self.model(frame, confself.conf, iouself.iou) self.frame_received.emit(original_frame, result_frame, detections)七、项目源码(视频简介)演示与介绍视频基于深度学习YOLOv12的葡萄叶病害识别检测系统YOLOv12YOLO数据集UI界面登录注册界面Python项目源码模型_哔哩哔哩_bilibili基于深度学习YOLOv12的葡萄叶病害识别检测系统YOLOv12YOLO数据集UI界面登录注册界面Python项目源码模型

相关新闻

别再让你的客服机器人“机械回复”了:三步调教,教AI学会读心术

别再让你的客服机器人“机械回复”了:三步调教,教AI学会读心术

大家好,我是你们的AI技术博主。 在电商、金融、旅游等行业,大家一定都和智能客服打过交道。但令人遗憾的是,很多客服机器人的焦距往往像个“人工智障”:当一位焦急流程的顾客输入:“我的订单U2942怎么还没到&#xff…

2026/7/3 14:38:15 阅读更多 →
java+vue基于springboot框架的校友信息管理系统的设计与实现

java+vue基于springboot框架的校友信息管理系统的设计与实现

目录校友信息管理系统设计与实现摘要开发技术源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!校友信息管理系统设计与实现摘要 该系统采用前后端分离架构,后端基于SpringBoot框架,前端使用Vue.js技术栈&#xff…

2026/5/17 3:10:50 阅读更多 →
【GitHub项目推荐--OpenWork:开源AI代理工作流平台】⭐⭐⭐⭐⭐

【GitHub项目推荐--OpenWork:开源AI代理工作流平台】⭐⭐⭐⭐⭐

简介 OpenWork​ 是一个开源的企业级AI代理工作流平台,由different-ai团队开发,作为Claude Cowork的开源替代方案。该项目基于opencode技术栈构建,旨在为企业团队提供智能化的AI助手和工作流自动化解决方案。OpenWork通过将AI代理与团队日常…

2026/5/17 3:10:49 阅读更多 →

最新新闻

AI提示词四要素法:参考信息、动作、目标、要求

AI提示词四要素法:参考信息、动作、目标、要求

1. 为什么“1分钟学会”是个误导,但“1分钟上手专业指令”真能做到?你点开这篇内容,大概率是被标题里的“1分钟”勾住了——这很真实。我也试过,在刚接触文心一言那会儿,翻遍官方文档、看十几条短视频、收藏五六个“万…

2026/7/4 11:56:46 阅读更多 →
基于YOLOv5的养殖场猪只行为AI监测系统开发

基于YOLOv5的养殖场猪只行为AI监测系统开发

1. 项目背景与核心价值去年帮农学院做毕设指导时,发现养殖场每天要安排4个工人轮班盯着监控屏幕,用肉眼判断母猪是否出现异常行为。这种传统监测方式不仅效率低下,夜间漏检率更是高达30%。这正是我们开发这套系统的初衷——用AI视觉技术实现猪…

2026/7/4 11:56:46 阅读更多 →
直流有刷电机驱动方案选型与STM32控制实现

直流有刷电机驱动方案选型与STM32控制实现

1. 直流有刷电机驱动方案选型思考 去年在开发一款工业级AGV小车时,我遇到了一个经典问题:如何用最精简的方案驱动24V/5A的直流有刷电机?当时测试了三种主流方案:分立MOSFET搭建H桥、L298N模块以及集成驱动IC。最终选择了罗姆的TC7…

2026/7/4 11:56:46 阅读更多 →
2026年AI论文写作工具TOP10:科研效率提升指南

2026年AI论文写作工具TOP10:科研效率提升指南

1. 项目概述 作为一名在科研领域摸爬滚打多年的老鸟,我深知研究生阶段最头疼的两件事:一是选题开题,二是论文写作。特别是当deadline临近,而实验数据还不理想时,那种焦虑感简直能把人逼疯。今天要分享的这个"导师…

2026/7/4 11:52:44 阅读更多 →
2022实战型机器学习书单:理论-工具-工程三层认知地图

2022实战型机器学习书单:理论-工具-工程三层认知地图

1. 这份书单不是“随便搜来的”,而是我用三年时间在真实教学、项目攻坚和团队带教中反复验证过的硬核推荐 你点开这个标题,大概率正站在机器学习的门口犹豫:是先啃《统计学习方法》,还是直接上手《Hands-On ML》?是花3…

2026/7/4 11:50:43 阅读更多 →
机械键盘终极防抖解决方案:KeyboardChatterBlocker完全指南

机械键盘终极防抖解决方案:KeyboardChatterBlocker完全指南

机械键盘终极防抖解决方案:KeyboardChatterBlocker完全指南 【免费下载链接】KeyboardChatterBlocker A handy quick tool for blocking mechanical keyboard chatter. 项目地址: https://gitcode.com/gh_mirrors/ke/KeyboardChatterBlocker 你是否曾因机械键…

2026/7/4 11:48:42 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布,这是一个关键的安全修复版本,修复了多个方面的问题,还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出,mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器,与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻