拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

黄瓜害虫检测数据集与YOLOv8实战:从标注校验到TTA切片推理

黄瓜害虫检测数据集与YOLOv8实战:从标注校验到TTA切片推理 简介这份黄瓜害虫目标检测数据集面向智能农业开发者、农技科研人员及目标检测学习者聚焦黄瓜栽培场景下的虫害自动识别需求。数据覆盖蚜虫、果蝇、南瓜甲虫、潜叶虫、粉虱五大高危害类害虫样本均来自真实农田拍摄包含不同生长阶段、光照条件与虫害密度测试集规模达三千余张图像。全部标注采用标准化YOLO格式边界框定位精确兼容YOLOv5、YOLOv8等主流框架可直接用于训练与迁移。资源包共1429个文件以907张jpg图像与519个txt标注文件为主另附yaml数据配置、docx说明文档及压缩包整体约158.58MB目录结构清晰便于按类别检索。已有193人学习下载。借助该数据集读者可快速搭建虫害识别模型并扩展至害虫计数、密度分析与温室预警等精准农业任务为减少农药使用的可持续治理方案提供数据基础。1. 黄瓜害虫检测数据集三千张真实农田图能撑起什么样的检测模型棚里刚发现叶背有粉虱等植保站的人来确认三天过去虫口密度已经翻了一倍。这类场景在黄瓜种植里太常见了——蚜虫、果蝇、南瓜甲虫、潜叶虫、粉虱五种害虫体型差异大、伪装性强靠人眼巡棚既费工又容易漏判。这份黄瓜害虫目标检测数据集就是冲着这个痛点来的三千多张农业场景真实拍摄的黄瓜植株害虫图像YOLO格式标注五个类别直接能喂给YOLOv5/v8跑训练。适合谁做智能农业监测系统的开发、搞农作物保护研究的团队、需要虫害识别教学素材的农技培训方以及想把虫害预警集成进农业物联网平台的工程人员。它不是那种实验室摆拍图是真实农田环境下的多样化样本光照、密度、生长阶段都有覆盖这一点对模型落地的影响比多几千张合成图大得多。2. 拆开数据集五类害虫的标注逻辑与YOLO格式落地2.1 类别定义与农业场景对应关系数据集把黄瓜主要害虫归成五类这个分类不是随便拍的每一类在田间的危害方式和识别难度都不一样。蚜虫Aphids体型最小常聚集在嫩叶背面和生长点标注时边界框容易重叠果蝇Fruitfly体型中等成虫和幼虫阶段形态差异大数据集里应该都有覆盖南瓜甲虫Pumpkin-Beetle个体大、颜色显眼检测难度最低但容易和瓢虫混淆潜叶虫Serpentine-leafminer的危害特征在叶片上表现为蜿蜒的白色隧道虫体本身小且藏在叶肉里标注时框的是虫体还是危害痕迹需要统一粉虱Whitefly成虫白色小点群集在叶背密度高时框会非常密集。这五类的选择覆盖了黄瓜种植中从刺吸式口器到咀嚼式口器的不同危害类型做虫害预警时不同类别的防治阈值和施药方案完全不同。比如蚜虫和粉虱用内吸性杀虫剂效果更好南瓜甲虫需要触杀型药剂潜叶虫得用渗透性强的药。模型能区分这五类精准施药才有依据。2.2 YOLO标注格式的字段含义与校验方法数据集用的是YOLO格式每张图对应一个txt标注文件每行一个目标格式是class_id x_center y_center width height四个坐标都是归一化到0-1之间的浮点数相对于图像宽高。class_id从0开始按类别列表顺序映射。常见做法是建一个data.yaml把类别名和id对应起来# data.yaml path: ./cucumber_pest_dataset train: images/train val: images/val test: images/test nc: 5 names: 0: Aphids 1: Fruitfly 2: Pumpkin-Beetle 3: Serpentine-leafminer 4: Whitefly拿到数据集后第一件事不是直接开训而是校验标注。我一般会跑一段脚本检查有没有越界框、零面积框和类别id超范围import os import glob def validate_yolo_labels(label_dir, nc5): issues [] for txt_path in glob.glob(os.path.join(label_dir, *.txt)): with open(txt_path, r) as f: for line_no, line in enumerate(f, 1): parts line.strip().split() if len(parts) ! 5: issues.append(f{txt_path}:{line_no} 字段数不对: {len(parts)}) continue cls_id int(parts[0]) coords [float(x) for x in parts[1:]] if cls_id 0 or cls_id nc: issues.append(f{txt_path}:{line_no} 类别id越界: {cls_id}) if any(c 0 or c 1 for c in coords): issues.append(f{txt_path}:{line_no} 坐标越界: {coords}) if coords[2] 0 or coords[3] 0: issues.append(f{txt_path}:{line_no} 宽高非正: {coords[2:]}) return issues issues validate_yolo_labels(./cucumber_pest_dataset/labels/train) print(f发现 {len(issues)} 个问题) for i in issues[:20]: print(i)这段脚本的逻辑很直接逐行读标注文件检查字段数、类别id范围、坐标归一化范围、宽高是否为正。参数nc要跟data.yaml里的类别数一致label_dir指向标注文件夹。跑完如果输出问题数为0说明标注基本干净如果有越界框大概率是标注工具导出时坐标系没对齐需要回原工具重新导出。2.3 训练集/验证集/测试集划分策略数据集简介里提到测试集有三千多张但没明确训练集和验证集的数量。常见做法是按7:2:1或8:1:1划分。对于农业检测任务我倾向于按拍摄批次或地块划分而不是随机划分——同一株植物在不同光照下拍的图如果被分到训练集和验证集验证指标会虚高实际部署时遇到新地块就翻车。如果数据集本身没提供划分文件可以用脚本按文件名前缀或拍摄时间分组后再划分import os import random import shutil def split_dataset(img_dir, label_dir, output_dir, ratios(0.7, 0.2, 0.1)): random.seed(42) imgs [f for f in os.listdir(img_dir) if f.endswith((.jpg, .jpeg, .png))] random.shuffle(imgs) n len(imgs) n_train int(n * ratios[0]) n_val int(n * ratios[1]) splits { train: imgs[:n_train], val: imgs[n_train:n_train n_val], test: imgs[n_train n_val:] } for split, files in splits.items(): img_out os.path.join(output_dir, images, split) lbl_out os.path.join(output_dir, labels, split) os.makedirs(img_out, exist_okTrue) os.makedirs(lbl_out, exist_okTrue) for f in files: shutil.copy(os.path.join(img_dir, f), os.path.join(img_out, f)) lbl_name os.path.splitext(f)[0] .txt lbl_src os.path.join(label_dir, lbl_name) if os.path.exists(lbl_src): shutil.copy(lbl_src, os.path.join(lbl_out, lbl_name)) print(f训练集: {len(splits[train])}, 验证集: {len(splits[val])}, 测试集: {len(splits[test])}) split_dataset(./raw/images, ./raw/labels, ./cucumber_pest_dataset)random.seed(42)保证每次划分结果一致方便复现。ratios参数控制划分比例如果数据量少可以调成8:1:1。注意这个脚本是按文件名随机划分的如果数据集有明确的拍摄批次信息建议改成按批次分组后再划分。3. 从零跑通YOLOv8训练环境、配置与首轮结果解读3.1 环境搭建与依赖版本锁定YOLOv8用ultralytics包安装本身不复杂但版本兼容性有坑。我一般锁这几个版本pip install ultralytics8.1.0 pip install torch2.1.0 torchvision0.16.0 --index-url https://download.pytorch.org/whl/cu118 pip install opencv-python4.9.0.80 pip install pyyaml6.0.1torch版本要根据显卡驱动来cu118对应CUDA 11.8。如果驱动版本低换成cu117或cpu版本。ultralytics 8.1.0对YOLOv8的支持比较稳定再新的版本有些API会变。opencv-python锁4.9是因为有些旧版本读某些jpg会报错这个数据集的图片文件名里有rf.后缀是Roboflow导出时加的不影响读取但值得留意。验证环境是否装好from ultralytics import YOLO import torch print(torch.__version__) print(torch.cuda.is_available()) model YOLO(yolov8n.pt) print(model.names)如果torch.cuda.is_available()返回False检查显卡驱动和CUDA版本是否匹配。yolov8n.pt是预训练权重第一次运行会自动下载。3.2 data.yaml配置与训练命令参数拆解data.yaml前面已经给过路径要根据实际存放位置改。训练命令yolo detect train \ data./cucumber_pest_dataset/data.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16 \ lr00.01 \ lrf0.01 \ patience20 \ device0 \ workers4 \ project./runs/cucumber_pest \ nameexp1逐个参数说epochs100是上限patience20表示验证指标20轮不提升就早停实际可能60-80轮就停了。imgsz640是YOLOv8的默认输入尺寸如果害虫目标特别小可以提到1280但显存占用会翻倍。batch16看显存8G显存跑640尺寸大概能到16不够就降到8。lr00.01是初始学习率lrf0.01是最终学习率因子实际最终学习率是lr0*lrf0.0001。device0指定第一块GPU多卡用0,1。workers4是数据加载线程数Windows下如果报错改成0。训练过程中重点看几个指标box_loss和cls_loss是否稳定下降mAP50和mAP50-95是否在涨。如果box_loss震荡厉害可能是学习率偏大或batch太小如果cls_loss不降检查类别是否不平衡。3.3 首轮训练结果分析与常见指标异常训练完在runs/cucumber_pest/exp1/下会有结果文件。重点看results.csv和confusion_matrix.png。常见异常mAP50高但mAP50-95低说明框的位置不够准可能是标注框偏大或偏小或者害虫目标太小导致定位精度上不去。这时候可以试试提高输入尺寸到1280或者用YOLOv8m/l更大的模型。某一类AP特别低比如Serpentine-leafminer大概率是样本量少或标注不一致。潜叶虫的危害痕迹和虫体本身如果混标模型学不明白。需要回标注文件检查这一类是不是有的框虫体有的框隧道。验证集loss比训练集loss低很多这通常是验证集太简单或划分有问题。按批次划分后这种情况会缓解。混淆矩阵里如果Aphids和Whitefly互相误判多说明这两类在图像上区分度不够可能需要增加这两类的困难样本或者在训练时用类别权重。4. 避坑与排查标注、训练、推理里最容易翻车的五个点4.1 标注框贴边导致训练时目标被裁切现象训练时提示某些标注框被裁切或者mAP始终上不去。原因YOLO训练时会对图像做随机裁剪增强如果标注框紧贴图像边缘裁剪后目标只剩一部分模型学到的特征不完整。解决校验标注时检查x_center±width/2和y_center±height/2是否超出[0,1]超出的框要么回标注工具调整要么在训练配置里关掉裁剪增强mosaic0。我一般会在校验脚本里加一条如果框的任一边界超出0.02的余量就标记为贴边框人工确认。4.2 类别id映射错位导致模型学偏现象训练完发现某一类的检测效果特别好另一类完全检测不到。原因data.yaml里的names顺序和标注文件里的class_id没对上。比如标注时Aphids是0但data.yaml里写成了1。解决写一段脚本统计标注文件里每个class_id的出现次数和data.yaml里的names逐一核对。这个坑血泪经验我见过有人训了三天才发现id错了一位模型把果蝇全检成了南瓜甲虫。4.3 图片文件名带特殊后缀导致读取失败现象训练时报错“cannot identify image file”或某些图片被跳过。原因这个数据集的图片文件名里有rf.后缀Roboflow导出特征某些旧版本的PIL或opencv对这类文件名处理有问题。解决升级opencv-python到4.9以上或者写脚本批量重命名去掉rf.后缀。重命名时注意同步改标注文件名保持一一对应。4.4 显存不足导致训练中断现象训练到一半报CUDA out of memory。原因batch设太大或者imgsz提到1280后显存不够。解决先降batch到8或4再不行降imgsz到512。另外YOLOv8的mosaic增强会同时加载4张图显存占用比单图高可以在训练后期关掉mosaicclose_mosaic10表示最后10轮关闭。如果还不行用梯度累积模拟大batchbatch4, accumulate4等效于batch16。4.5 推理时置信度阈值设太高漏检小目标现象模型训练指标不错但实际推理时粉虱和蚜虫漏检严重。原因这两类目标小模型输出的置信度普遍偏低默认conf0.25会过滤掉很多正确检测。解决推理时把conf降到0.1-0.15同时用NMS的iou阈值控制重叠框。对于密集小目标还可以开agnostic_nms让不同类别的框一起做NMS避免同类框互相抑制。实际部署时建议在验证集上画PR曲线找到漏检和误检的平衡点再定阈值。5. 进阶技巧用TTA和切片推理把粉虱检出率再提一截粉虱和蚜虫这类小目标常规推理方式下检出率很难超过0.7。我一般会加两个手段TTA测试时增强和切片推理。TTA是在推理时对同一张图做翻转、缩放等变换把多次预测结果融合。YOLOv8命令行直接支持yolo detect predict \ model./runs/cucumber_pest/exp1/weights/best.pt \ source./test_images \ conf0.15 \ iou0.5 \ augmentTrue \ saveTrueaugmentTrue开启TTA推理时间大概增加2-3倍但mAP通常能涨1-3个点。对于粉虱这种小目标TTA的收益更明显。切片推理适合图像分辨率高但目标极小的场景。把原图切成512x512的块每块单独推理再合并结果。ultralytics没有内置切片推理但可以用SAHI库from sahi import AutoDetectionModel from sahi.predict import get_sliced_prediction detection_model AutoDetectionModel.from_pretrained( model_typeyolov8, model_path./runs/cucumber_pest/exp1/weights/best.pt, confidence_threshold0.15, devicecuda:0 ) result get_sliced_prediction( ./test_images/sample.jpg, detection_model, slice_height512, slice_width512, overlap_height_ratio0.2, overlap_width_ratio0.2 ) result.export_visuals(export_dir./sahi_output/)slice_height和slice_width控制切片大小overlap_ratio控制切片之间的重叠比例0.2表示20%重叠避免目标被切在边界上。切片推理对小目标的检出率提升很明显但推理时间会随切片数量线性增长。实际部署时可以根据图像分辨率和目标尺寸决定是否开启。验证TTA和切片推理效果的方法在测试集上分别跑常规推理、TTA推理、切片推理对比mAP50和mAP50-95。如果切片推理的mAP提升超过5个点说明目标确实小到常规推理吃不消部署时值得上切片。如果提升不明显说明瓶颈在别处比如标注质量或模型容量。从那以后我每次拿到新的农业检测数据集都强制走一遍“校验标注→按批次划分→小模型试跑→看混淆矩阵→调推理参数”的流程不再一上来就怼大模型跑几百轮。希望帮到你。本文还有配套的精品资源点击获取
返回列表