【YOLO26 系列】基于YOLO26葡萄叶病害检测系统【python源码+Pyqt5界面/WEB+数据集+训练代码】 基于YOLO26的葡萄叶病害检测系统导读本文基于YOLO26目标检测模型开发了一套葡萄叶病害自动检测系统可精准识别葡萄叶片4类常见病害状态。项目包含PyQt5 GUI桌面端与Flask Web网页端双实现支持单张图片检测、文件夹批量检测、视频检测、实时摄像头检测及结果保存五大核心功能帮助农业种植人员快速识别葡萄叶病害提升病害防治效率。本项目提供完整训练代码、预训练权重、UI源码和数据集配置说明可直接部署使用也可基于该项目二次开发扩展至其他农业病害检测场景。一、软件功能演示本系统提供PyQt5 GUI桌面端和Flask Web网页端两种使用方式核心功能包含以下5类演示视频1. 单张图片检测操作流程点击 模型选择加载训练好的YOLO权重文件 → 点击️ 图片检测选择本地葡萄叶图片 → 系统自动完成推理并绘制检测框同步显示类别与置信度。检测完成后系统会自动统计检测结果并生成明细表格序号病害类别置信度检测框坐标 (xmin, ymin, xmax, ymax)1Grape__BlackRot0.89(42, 61, 328, 297)2Grape__BlackRot0.76(152, 120, 389, 315)3Grape__Healthy0.96(25, 15, 410, 425)检测结果统计总检测数3检测类别数2主要病害Grape__BlackRot2. 文件夹批量检测操作流程将待检测的多张图片放入同一文件夹 → 点击 文件夹检测选择目标文件夹 → 系统批量推理所有图片自动将检测结果保存至输出目录并生成汇总检测报告。批量检测适合对大量田间采集的葡萄叶样本进行统一分析可大幅节省人工逐个检测的时间成本。3. 视频检测操作流程点击 视频检测选择本地葡萄叶病害采集视频 → 系统逐帧进行推理实时在界面显示检测结果并绘制检测框与类别信息支持暂停、停止检测操作。4. 实时摄像头检测操作流程连接本地摄像头后点击 实时摄像头→ 系统实时读取摄像头画面并逐帧检测可对田间葡萄叶进行实地实时病害检测点击⏹️ 停止检测即可结束任务。5. 结果保存所有检测结果均支持保存图片检测点击 保存结果可将带检测框的结果图片保存至输出目录视频/摄像头检测系统自动将检测后的视频保存为MP4文件至输出目录批量检测自动导出包含所有检测结果的CSV报告文件二、环境搭建本项目基于PyTorch框架开发提供两种环境搭建方式1. pip安装方式首先手动安装PyTorch和torchvision可从官方下载对应版本的whl包torch下载地址https://download.pytorch.org/whl/torch/torchvision下载地址https://download.pytorch.org/whl/torchvision/安装完成PyTorch后切换至项目根目录执行以下命令安装其余依赖pipinstall-rrequirements.txt项目依赖包清单如下aiohttp3.14.1 albumentations2.0.8 ax0.52.0 clip0.2.0 comet_ml3.58.3 ConfigSpace1.2.2 coremltools9.0 dvclive3.49.1 dx_com2.3.0 faster_coco_eval1.7.2 Flask3.1.3 hub_sdk0.0.24 ipython8.12.3 lap0.5.13 matplotlib3.11.0 mct_quantizers1.7.0 MNN3.6.0 mobileclip0.0.1 model_compression_toolkit2.6.0 moviepy2.2.12. Conda安装方式若使用Anaconda管理环境可通过以下步骤创建并配置环境# 创建新的Python环境conda create-ngrape_diseasepython3.10conda activate grape_disease# 安装PyTorch以CUDA 11.8为例condainstallpytorch torchvision pytorch-cuda11.8-cpytorch-cnvidia# 安装其余依赖pipinstall-rrequirements.txt三、模型训练、评估、预测数据集上传说明1. 数据集格式要求本项目采用标准YOLO数据集格式目录结构如下grape_disease_dataset/ ├── images/ │ ├── train/ # 训练集图片 │ │ ├── img1.jpg │ │ ├── img2.jpg │ │ └── ... │ ├── val/ # 验证集图片 │ │ ├── img3.jpg │ │ └── ... │ └── test/ # 测试集图片可选 │ ├── img4.jpg │ └── ... └── labels/ ├── train/ # 训练集标签 │ ├── img1.txt │ ├── img2.txt │ └── ... ├── val/ # 验证集标签 │ ├── img3.txt │ └── ... └── test/ # 测试集标签可选 ├── img4.txt └── ...2. YOLO格式标签说明YOLO格式标签为每张图片对应一个同名TXT文件每一行表示一个目标标注格式为class_id x_center y_center width height所有坐标均为归一化坐标取值范围0~1示例0 0.428 0.357 0.512 0.468 2 0.125 0.214 0.236 0.389转换公式x_center (xmin xmax) / (2 * image_width)y_center (ymin ymax) / (2 * image_height)width (xmax - xmin) / image_widthheight (ymax - ymin) / image_height3. 从VOC格式转换XML转YOLO TXT若数据集标注为VOC格式XML文件可使用项目提供的xml2txt.py脚本完成格式转换完整代码如下importosimportxml.etree.ElementTreeasET# 定义类别顺序对应本项目葡萄叶病害类别categories[Grape__BlackRot,Grape__Esca,Grape__Healthy,Grape__LeafBlight]category_to_index{category:indexforindex,categoryinenumerate(categories)}# 定义输入文件夹和输出文件夹替换为实际路径input_folderr./VOCData/Annotations# XML文件夹路径output_folderr./dataset/labels# 输出TXT文件夹路径# 确保输出文件夹存在os.makedirs(output_folder,exist_okTrue)# 遍历输入文件夹中的所有XML文件forfilenameinos.listdir(input_folder):iffilename.endswith(.xml):xml_pathos.path.join(input_folder,filename)# 解析XML文件treeET.parse(xml_path)roottree.getroot()# 提取图像尺寸sizeroot.find(size)widthint(size.find(width).text)heightint(size.find(height).text)# 存储标签内容label_lines[]# 遍历XML中的object标签forobjinroot.findall(object):nameobj.find(name).textifnameincategory_to_index:category_indexcategory_to_index[name]else:continue# 若name不在指定类别中跳过该objectbndboxobj.find(bndbox)xminint(bndbox.find(xmin).text)yminint(bndbox.find(ymin).text)xmaxint(bndbox.find(xmax).text)ymaxint(bndbox.find(ymax).text)# 转换为中心点坐标和宽高归一化x_center(xminxmax)/2.0/width y_center(yminymax)/2.0/height w(xmax-xmin)/width h(ymax-ymin)/height label_lines.append(f{category_index}{x_center:.6f}{y_center:.6f}{w:.6f}{h:.6f})# 保存标签文件txt_nameos.path.splitext(filename)[0].txttxt_pathos.path.join(output_folder,txt_name)withopen(txt_path,w)asf:f.write(\n.join(label_lines))print(格式转换完成所有标签已保存到输出目录。)4. 数据集划分脚本格式转换完成后使用SplitDataset.py将数据集划分为训练集、验证集和测试集默认比例为8:1:1完整代码如下importosimportshutilimportrandom# 设置随机种子保证划分可复现random.seed(42)defsplit_data(image_root,label_root,output_root,train_rate0.8,val_rate0.1,test_rate0.1):# 获取所有图片和标签文件名imagesos.listdir(image_root)labelsos.listdir(label_root)# 匹配图片和标签通过文件名前缀匹配images_no_ext{os.path.splitext(img)[0]:imgforimginimages}labels_no_ext{os.path.splitext(lbl)[0]:lblforlblinlabels}# 只保留同时有图片和标签的数据matched_data[(img_id,images_no_ext[img_id],labels_no_ext[img_id])forimg_idinimages_no_extifimg_idinlabels_no_ext]# 输出未匹配提示unmatched_images[imgforimginimages_no_extifimgnotinlabels_no_ext]unmatched_labels[lblforlblinlabels_no_extiflblnotinimages_no_ext]ifunmatched_images:print(未匹配标签的图片:)forimginunmatched_images:print(f{images_no_ext[img]})ifunmatched_labels:print(未匹配图片的标签:)forlblinunmatched_labels:print(f{labels_no_ext[lbl]})# 打乱数据顺序random.shuffle(matched_data)totallen(matched_data)# 划分数据集train_endint(train_rate*total)val_endtrain_endint(val_rate*total)train_datamatched_data[:train_end]val_datamatched_data[train_end:val_end]test_datamatched_data[val_end:]# 处理训练集forimg_id,img_file,label_fileintrain_data:old_img_pathos.path.join(image_root,img_file)old_label_pathos.path.join(label_root,label_file)new_img_diros.path.join(output_root,train,images)new_label_diros.path.join(output_root,train,labels)os.makedirs(new_img_dir,exist_okTrue)os.makedirs(new_label_dir,exist_okTrue)shutil.copy(old_img_path,os.path.join(new_img_dir,img_file))shutil.copy(old_label_path,os.path.join(new_label_dir,label_file))# 处理验证集forimg_id,img_file,label_fileinval_data:old_img_pathos.path.join(image_root,img_file)old_label_pathos.path.join(label_root,label_file)new_img_diros.path.join(output_root,val,images)new_label_diros.path.join(output_root,val,labels)os.makedirs(new_img_dir,exist_okTrue)os.makedirs(new_label_dir,exist_okTrue)shutil.copy(old_img_path,os.path.join(new_img_dir,img_file))shutil.copy(old_label_path,os.path.join(new_label_dir,label_file))# 处理测试集forimg_id,img_file,label_fileintest_data:old_img_pathos.path.join(image_root,img_file)old_label_pathos.path.join(label_root,label_file)new_img_diros.path.join(output_root,test,images)new_label_diros.path.join(output_root,test,labels)os.makedirs(new_img_dir,exist_okTrue)os.makedirs(new_label_dir,exist_okTrue)shutil.copy(old_img_path,os.path.join(new_img_dir,img_file))shutil.copy(old_label_path,os.path.join(new_label_dir,label_file))print(f数据集划分完成总样本数:{total}, 训练集:{len(train_data)}, 验证集:{len(val_data)}, 测试集:{len(test_data)})if__name____main__:# 修改为实际路径image_rootr./VOCData/JPEGImageslabel_rootr./VOCData/labelsoutput_rootr./VOCData/VOdevkitsplit_data(image_root,label_root,output_root)5. 配置数据集yaml文件划分完成后创建数据集配置yaml文件本项目为dataset.yaml内容如下# 数据集根路径path:./VOCData/VOdevkit# 替换为你的数据集实际根目录# 训练/验证/测试集相对路径train:train/images# 训练集图片路径val:val/images# 验证集图片路径test:test/images# 测试集图片路径可选# 类别数量nc:4# 类别名称names:0:Grape__BlackRot1:Grape__Esca2:Grape__Healthy3:Grape__LeafBlight模型训练数据集准备完成后执行训练脚本train.py核心代码如下fromultralyticsimportYOLOif__name____main__:# 加载YOLO26n预训练模型追求更高精度可更换为yolo26s.ptmodelYOLO(yolo26n.pt)# 开始训练resultsmodel.train(datar./VOCData/VOdevkit/dataset.yaml,epochs50,# 最大训练轮数配合早停自动终止patience10,# 连续10轮验证集指标无提升则触发早停batch24,# 批次大小12G显存建议设为248G显存建议改为16imgsz512,# 输入图片尺寸workers4,# 数据加载线程数Windows建议4Linux建议8device0,# GPU设备编号CPU训练可改为devicecpuoptimizerSGD,# 优化器选择SGD泛化性更优ampTrue,# 开启自动混合精度训练减少显存占用cachedisk,# 启用磁盘缓存数据避免内存溢出save_period11,# 每11轮保存一次权重文件scale0.3,# 多尺度训练增强提升模型鲁棒性rectFalse,# 关闭矩形训练配合多尺度训练使用mosaic1.0,# 开启Mosaic数据增强)关键训练参数说明参数说明推荐值epochs最大训练轮数50patience早停触发阈值连续N轮验证集指标无提升则终止训练10batch批次大小需根据显存容量调整16~24imgsz输入图片统一尺寸512device训练设备GPU编号或CPU0GPU/ ‘cpu’CPUamp是否开启自动混合精度训练可减少显存占用Truecache数据集缓存方式disk为磁盘缓存可避免内存不足‘disk’执行训练命令python train.py模型评估训练完成后使用val.py对最优权重进行评估核心代码如下fromultralyticsimportYOLOimportnumpyasnpfromdatetimeimportdatetime# 加载训练完成的最优权重modelYOLO(r./runs/detect/train/weights/best.pt)# 在验证集上执行评估metricsmodel.val(datar./VOCData/VOdevkit/dataset.yaml)# 计算平均精确率和召回率mean_pnp.mean(metrics.box.p)mean_rnp.mean(metrics.box.r)# 整理评估结果content[]content.append(*60)content.append(f验证时间{datetime.now().strftime(%Y-%m-%d %H:%M:%S)})content.append(*60)content.append(f整体 mAP50:{metrics.box.map50:.4f})content.append(f整体 mAP50-95:{metrics.box.map:.4f})content.append(f平均 Precision:{mean_p:.4f})content.append(f平均 Recall:{mean_r:.4f})content.append(-*60)content.append(f{类别:16}{Precision:12}{Recall:12}{AP50:12})content.append(-*60)class_names[Grape__BlackRot,Grape__Esca,Grape__Healthy,Grape__LeafBlight]fori,nameinenumerate(class_names):ap50metrics.box.ap50[i]pmetrics.box.p[i]rmetrics.box.r[i]content.append(f{name:16}{p:.4f}{:4}{r:.4f}{:4}{ap50:.4f})# 保存评估结果至文件withopen(val_result.txt,w,encodingutf-8)asf:f.write(\n.join(content))# 打印评估结果print(\n.join(content))训练结果默认保存在runs/detect/train/目录下核心输出文件说明文件/目录说明weights/best.pt验证集表现最优的权重文件weights/last.pt最后一轮训练的权重文件weights/epoch*.pt指定训练轮次的权重文件args.yaml训练参数配置记录results.csv每轮训练的指标数据记录results.png训练损失曲线、指标变化曲线图confusion_matrix.png混淆矩阵可视化图confusion_matrix_normalized.png归一化混淆矩阵可视化图BoxPR_curve.png精确率-召回率PR曲线图BoxF1_curve.pngF1值变化曲线图labels.jpg训练集标签分布可视化图train_batch*.jpg训练批次样本数据增强效果可视化图val_batch*_labels.jpg验证集标注数据可视化图val_batch*_pred.jpg验证集预测结果与标注对比可视化图执行评估命令python val.py模型预测本项目支持多种预测方式单张图片预测核心代码如下fromultralyticsimportYOLOimportos# 加载训练好的最优模型rootos.getcwd()modelYOLO(rf{root}/runs/detect/train/weights/best.pt)# 设置待检测图片路径sourcer./img_video/test_imgs/test_grape.jpg# 执行推理resultsmodel.predict(source,saveTrue,conf0.45,iou0.25)# 弹窗展示检测结果results[0].show()# 保存检测结果到指定路径results[0].save(filenamer./results/test_result.jpg)执行预测命令python predict.py除单张图片预测外系统还支持文件夹批量预测、视频预测、摄像头实时预测所有功能已集成至UI界面可直接通过界面操作使用。四、项目目录结构基于YOLO26葡萄叶病害检测系统/ ├── README.md # 项目说明文档 ├── requirements.txt # Python依赖列表 ├── yolo26n.pt # YOLO26n预训练权重 ├── train.py # 模型训练入口脚本 ├── predict.py # 模型推理预测脚本 ├── val.py # 模型验证评估脚本 ├── UI/ # 界面相关代码 │ ├── web.py # Flask Web后端主程序 │ ├── GUI.py # PyQt5 GUI界面逻辑 │ ├── config.yaml # UI全局配置文件 │ ├── user.txt # 用户登录信息存储文件 │ ├── templates/ │ │ ├── index.html # Web首页 │ │ └── login.html # Web登录页 │ └── models/ │ └── best.pt # UI使用的最优模型权重 ├── img_video/ # 测试素材目录 │ ├── test_imgs/ # 测试图片文件夹 │ └── test_MP4.mp4 # 测试视频文件 ├── results/ # 推理结果输出目录 ├── runs/ # 训练输出目录 │ └── detect/train/ │ ├── args.yaml # 训练参数配置记录 │ ├── results.csv # 训练指标数据记录 │ ├── results.png # 训练指标变化曲线图 │ ├── confusion_matrix.png # 混淆矩阵可视化图 │ ├── BoxPR_curve.png # PR曲线图 │ ├── labels.jpg # 训练集标签分布可视化图 │ └── weights/ │ ├── best.pt # 最优权重文件 │ └── last.pt # 最后一轮训练权重文件 ├── VOCData/ # 数据集处理工具目录 │ ├── SplitDataset.py # 数据集划分脚本 │ ├── ViewCategory.py # VOC标注类别统计脚本 │ ├── xml2txt.py # VOC XML转YOLO TXT格式脚本 │ ├── pic to mp4.py # 图片转视频脚本 │ └── VOdevkit/ │ ├── dataset.yaml # 数据集配置文件 │ └── 数据集单独下载.txt # 数据集下载说明文件 └── ultralytics/ # YOLO框架核心源码目录 ├── cfg/ # 模型和数据集配置文件 ├── data/ # 数据加载与增强模块 ├── engine/ # 训练/预测/验证引擎模块 └── models/ # 模型定义模块五、项目README摘要本项目是基于YOLO26目标检测模型开发的葡萄叶病害检测系统核心特性如下支持4类葡萄叶病害识别Black Rot、Esca、Healthy、Leaf Blight提供PyQt5 GUI桌面端和Flask Web网页端双界面实现支持5种检测模式单张图片检测、文件夹批量检测、视频检测、实时摄像头检测、结果保存导出提供完整的数据处理脚本、训练代码、评估代码支持用户基于自有数据集重新训练所有UI文字、参数均可通过config.yaml全局配置无需修改代码即可自定义系统项目启动方式启动GUI桌面端cd UI python GUI.py启动Web网页端cd UI python web.py文末互动区如果您觉得本项目有帮助欢迎点击【分享】【推荐】支持我们如需获取完整项目代码与数据集 回复**「基于YOLO26葡萄叶病害」**获取。

相关新闻

最新新闻

AI大模型开发实战:从部署到微调的完整指南

AI大模型开发实战:从部署到微调的完整指南

1. AI大模型开发全景指南:从入门到精通的完整路线图过去两年,大模型技术以惊人的速度重塑了整个AI行业。作为一名全程参与多个大模型项目的开发者,我见证了从早期GPT-3的惊艳亮相到现在Llama3、书生浦语等开源模型的百花齐放。这个领域最显著…

2026/7/23 2:38:54
Gemini 3.6 Flash / Gemini 3.5 Flash-Lite 模型能力解析 + OpenAI兼容调用实战

Gemini 3.6 Flash / Gemini 3.5 Flash-Lite 模型能力解析 + OpenAI兼容调用实战

前言 近期谷歌更新两款 Flash 系列轻量化多模态模型:gemini-3.6-flash、gemini-3.5-flash-lite。很多开发者做业务选型时很困惑:两款同系列模型怎么区分、分别适合什么业务?同时原生谷歌 API 网络环境调试麻烦,不少开发者会选择兼…

2026/7/23 2:38:54
Linux 实时任务内存锁定:mlock/mlockall 避免缺页异常实战教程

Linux 实时任务内存锁定:mlock/mlockall 避免缺页异常实战教程

一、简介1.1 技术背景Linux 采用虚拟内存管理机制,程序运行时不会一次性将所有代码、数据载入物理内存,而是采用按需分页策略:程序访问未载入物理内存的地址时,触发缺页异常(Page Fault)。 缺页异常处理流程…

2026/7/23 2:38:54
GitHub趋势分析工具:技术雷达与数据可视化实践

GitHub趋势分析工具:技术雷达与数据可视化实践

1. GitHub趋势分析工具概述2019年12月10日GitHub趋势报告按语言分类这个主题,实际上反映了一个持续存在的开发者需求:如何高效追踪技术生态中最活跃的项目。作为一个每天托管数百万个代码仓库的平台,GitHub上的项目热度变化往往预示着技术趋势…

2026/7/23 2:38:53
Tiva C系列微控制器EEPROM与Flash内存保护机制实战解析

Tiva C系列微控制器EEPROM与Flash内存保护机制实战解析

1. 项目概述与核心价值在嵌入式开发领域,尤其是涉及物联网节点、工业控制器或消费电子产品的固件开发时,我们常常面临一个核心矛盾:系统需要存储一些关键数据(如校准参数、设备序列号、用户配置、运行日志)&#xff0c…

2026/7/23 2:38:53
Orbis团队:用 AI Agent 连接数字世界与现实创造

Orbis团队:用 AI Agent 连接数字世界与现实创造

——第二届 DGX Spark 黑客松开发复盘一、项目背景:从 Agent Anything 到数字资产实体化随着生成式人工智能的持续发展,AI 的角色已经从单纯生成文本、图像和代码的工具,逐渐演变为能够理解任务、调用工具并组织复杂流程的智能系统。Agent An…

2026/7/23 2:33:53

月新闻