ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

花生植株与果簇检测数据集:YOLOv5农业小目标实战指南

花生植株与果簇检测数据集:YOLOv5农业小目标实战指南 简介作物目标检测是农业AI落地的核心基础能力其本质是将田间视觉信息转化为可执行农事决策的结构化输出。在真实场景中小目标如花生果簇、低对比度、遮挡重叠及生育期动态变化构成主要技术挑战。YOLOv5凭借轻量架构与工业级部署成熟度成为农机视觉模块首选模型但高度依赖规范的数据集结构与精准标注。本数据集聚焦‘单株花生植株’和‘花生果实簇’两类语义明确、业务强相关的视觉实体提供207张多生育期实拍图像及严格校验的YOLO格式标签覆盖苗期、花期、结荚期典型干扰并预置适配无人机航拍尺度的anchor优化方案。适用于农业AI初创POC验证、高校小目标检测基线研究及农机边缘端部署。1. 这个花生检测数据集到底解决了什么实际问题在农业智能化落地的现场我见过太多次这样的场景植保无人机飞过一片花生田机载摄像头实时回传画面但后台算法要么把刚出土的嫩叶识别成杂草要么把密集生长的花生藤蔓当成单株目标漏检——最后人工还得下地复查智能设备成了“智能摆设”。直到去年帮一家山东花生合作社部署病虫害早期预警系统时我才真正意识到不是模型不够强而是手头根本找不到一个能反映真实田间复杂性的、带明确语义边界的花生目标检测数据集。市面上公开的作物数据集要么是实验室环境下拍摄的干净样本比如Peanut-Leaf-Disease要么是整片田块的遥感影像如CropSeg但没有一个数据集专门标注“单株花生植株”和“花生果实簇”这两个对农事决策最关键的视觉实体。这个YOLOv5格式的花生检测数据集就是为解决这个卡点而生的它不追求海量图片而是用207张实拍田间图像精准标注出“植株”和“果簇”两类目标每张图都经过光照变化、遮挡、重叠、不同生育期等真实干扰条件的筛选。它不是学术玩具而是能直接喂进YOLOv5训练管道、跑通端到端推理的生产级最小可行数据集。如果你正在做农机视觉模块开发、农业AI初创公司的POC验证或者高校课题组需要可复现的农业小目标检测基线这个数据集的价值在于——它省掉了你从零采集、标注、清洗、格式转换的3周时间让你能把精力聚焦在模型调优和业务逻辑上。2. 数据集结构深度拆解为什么必须严格遵循YOLOv5目录规范YOLOv5对数据集目录结构有近乎苛刻的要求这不是开发者故意设置障碍而是由其训练脚本的硬编码逻辑决定的。这个花生数据集采用标准的datasets/peanut/根目录结构但每一层设计都有明确的工程意图我来逐层拆解2.1 根目录与划分逻辑datasets/peanut/下的生存法则datasets/ └── peanut/ ├── images/ # 所有原始图像存放处 │ ├── train/ # 训练集图像155张 │ └── val/ # 验证集图像52张 ├── labels/ # 对应的YOLO格式标注文件 │ ├── train/ # 训练集标签.txt与images/train同名 │ └── val/ # 验证集标签.txt与images/val同名 └── data.yaml # 数据集配置元信息这个结构的关键在于路径绑定YOLOv5的train.py脚本会硬性读取data.yaml中定义的train:和val:路径这两个路径必须是相对于datasets/peanut/的相对路径且必须与images/和labels/子目录下的实际文件名完全一致包括大小写和扩展名。我曾因把val/误写成valid/导致训练脚本报错FileNotFoundError: No such file or directory排查了2小时才发现是yaml里一个字母的差异。更隐蔽的坑是YOLOv5默认要求images/和labels/下对应子目录的文件数量必须严格相等哪怕某张图没有目标即对应label文件为空也必须存在一个空的.txt文件。这个花生数据集已预处理完成所有52张验证图都有对应的空或非空label文件避免了训练中途因文件缺失中断。2.2data.yaml配置文件被低估的元数据中枢datasets/peanut/data.yaml的内容看似简单却是整个训练流程的“宪法”train: ../peanut/images/train # 注意这里是相对于yolov5主目录的路径 val: ../peanut/images/val nc: 2 # number of classes names: [plant, pod_cluster] # class names, must match label indices这里有两个极易踩的深坑第一train和val路径的写法。YOLOv5官方代码默认在yolov5/目录下运行所以../peanut/images/train意味着从yolov5/向上一级进入datasets/再进入peanut/。如果你把数据集放在其他位置比如/home/user/agri-data/peanut/就必须修改这里的路径否则脚本会去yolov5/../peanut/找必然失败。第二names列表的顺序直接决定了模型输出的类别索引plant永远是索引0pod_cluster永远是索引1。这意味着你在后处理时如果用pred[0]代表植株pred[1]代表果簇这个映射关系是硬编码在训练过程中的绝不能颠倒。我在调试一个喷药机器人控制逻辑时就因在data.yaml里把names写成[pod_cluster, plant]导致模型输出的类别ID和下游控制指令完全错位喷头对着空地狂喷。2.3 YOLO格式标签文件坐标系与数值精度的实战约束每个.txt标签文件如images/train/IMG_20230415_102345.jpg对应labels/train/IMG_20230415_102345.txt的格式是0 0.423 0.618 0.215 0.389 1 0.782 0.291 0.142 0.227这行数字的含义是class_id center_x center_y width height全部归一化到[0,1]区间。关键细节在于坐标系原点左上角0,0x向右y向下这是OpenCV和PyTorch的通用约定归一化基准center_x (bbox_x_min bbox_width/2) / image_width必须用原始图像的宽高计算而非缩放后的尺寸数值精度YOLOv5官方推荐保留6位小数但实测中4位如0.4230已足够稳定。我测试过用round(x, 4)和round(x, 6)训练同一模型mAP0.5差异小于0.1%但4位小数能显著减小label文件体积加快I/O速度。这个花生数据集的标签文件全部通过labelImg工具人工校验并用Python脚本批量检查了所有坐标是否在[0,1]范围内、宽高是否为正数。曾发现3张图的果簇标注因操作失误导致width0.000这种无效标注会让YOLOv5在计算loss时产生NaN值训练几轮后梯度爆炸。数据集已修复这些边缘错误确保开箱即用。3. 图像与标注质量分析207张图如何撑起一个可靠基线数据集规模207张远小于COCO20万张但农业场景的特殊性决定了“少而精”才是王道。我用一套自研的质检流程对这批图像做了深度分析结论颠覆了很多人的直觉3.1 图像来源与场景覆盖田间真实性的硬指标所有207张图像均来自山东临沂、河南驻马店、河北邢台三地的规模化花生种植基地拍摄时间覆盖**苗期3-5叶、花期始花至盛花、结荚期初荚至饱果**三个关键生育阶段。相机为大疆Mavic 3 Enterprise4800万像素飞行高度15-30米地面采样距离GSD在1.2-2.5cm/pixel之间。这意味着苗期图像能清晰分辨单株幼苗的子叶和真叶形态但植株间距小、易重叠花期图像黄色小花在绿叶背景中形成高对比度目标但花量大、分布密易造成密集小目标漏检结荚期图像地下果簇在土壤表面形成浅褐色凸起与枯叶、土块颜色接近是典型的低对比度目标。这种按生育期分层采样的策略比随机抓拍更能暴露模型在不同生长阶段的泛化短板。我在用YOLOv5s训练时发现模型在结荚期图像上的Recall召回率比苗期低12.3%这直接指向了模型对低对比度目标的特征提取能力不足成为后续改进的明确方向。3.2 标注粒度与一致性两类目标的定义边界“植株”和“果簇”的定义在农业实践中存在模糊地带数据集制定了严格的标注规范植株plant以第一对真叶的基部为中心框选包含主茎、所有分枝及叶片的整体轮廓。不标注子叶因易脱落不框选根系不可见。果簇pod_cluster仅标注露出土壤表面的、肉眼可见的花生荚果集合体单个荚果不单独标注若多个荚果紧密粘连成团则视为一个果簇若被落叶完全覆盖则不标注。这个定义规避了“是否包含根系”“单个荚果是否算目标”等学术争议直接服务于喷药、收获等农事决策——喷药需覆盖整株收获需定位果簇群。我抽样检查了50张图的标注一致性发现人工标注员对“果簇”的判定Kappa系数达0.890.8表示极好一致性远高于对“病斑”等细粒度目标的标注水平。这得益于前期对标注员进行了3小时田间实物对照培训而非仅看PPT规则。3.3 目标尺度分布小目标检测的残酷现实用统计脚本分析所有标注框的宽高像素值基于原始图像尺寸结果令人警醒类别平均宽度像素平均高度像素最小宽度像素最小高度像素plant1862424258pod_cluster63411812这意味着在30米航拍下一个果簇目标在图像中可能只有18×12像素远低于YOLOv5默认输入尺寸640×640的1%64×64。传统上认为“小目标”指32×32像素而这里近35%的果簇标注框小于这个阈值。这解释了为什么直接用YOLOv5s训练时果簇的AP0.5只有0.41而植株达到0.78。数据集的价值之一就是逼你直面这个现实不做针对性优化小目标检测在农业场景中注定失败。后续我通过在YOLOv5中启用--multi-scale多尺度训练和调整anchor尺寸将最小anchor从32×32改为16×16使果簇AP提升至0.63。4. 实战训练全流程从数据加载到mAP评估的避坑指南拿到数据集后真正的挑战才开始。我用YOLOv5 v6.2版本PyTorch 1.12完整跑通了训练-验证-推理闭环以下是血泪总结的实操步骤与陷阱4.1 环境准备版本锁死与依赖兼容性YOLOv5对PyTorch和CUDA版本极其敏感。这个数据集在以下环境验证通过Python 3.8.10PyTorch 1.12.1cu113CUDA 11.3torchvision 0.13.1cu113numpy 1.21.6, opencv-python 4.5.5.64致命陷阱不要用pip install torch安装最新版PyTorch。YOLOv5 v6.2的models/common.py中使用了torch.nn.functional.interpolate的旧参数签名新版PyTorch已弃用align_cornersFalse的默认行为会导致训练时出现RuntimeError: Input and output sizes do not match。我因此浪费了1天时间最终解决方案是严格按官方requirements.txt安装pip install torch1.12.1cu113 torchvision0.13.1cu113 -f https://download.pytorch.org/whl/torch_stable.html4.2 数据加载调试验证管道是否通畅在运行train.py前务必先执行数据加载检查避免训练到一半才发现路径错误python detect.py --weights yolov5s.pt --source datasets/peanut/images/val/ --conf 0.25 --save-txt这个命令会用预训练模型在验证集上跑一次推理并保存结果。重点观察控制台是否输出Found 52 images验证集图像数runs/detect/exp/目录下是否生成52个.txt文件任意一张图的预测框是否合理如IMG_20230415_102345.jpg上是否有明显误检。我第一次运行时发现detect.py报错KeyError: names根源是data.yaml中names字段写成了classes而YOLOv5 v6.2只认names。这个检查步骤能帮你提前48小时发现90%的配置错误。4.3 训练超参调优针对花生场景的定制化选择YOLOv5默认超参data/hyp.scratch.yaml是为通用场景设计的对花生数据集需针对性调整lr0: 0.01→lr0: 0.005农业图像背景复杂学习率过高易震荡mosaic: 1.0→mosaic: 0.5马赛克增强对重叠植株有益但过度使用会破坏果簇的局部纹理scale: 0.5→scale: 0.3缩放增强幅度减小避免果簇目标被缩得太小而丢失新增fliplr: 0.5左右翻转增强模拟无人机不同航向拍摄视角。最关键的是anchor调整。原YOLOv5s的anchor尺寸基于COCO统计为[[10,13, 16,30, 33,23], [30,61, 62,45, 59,119], [116,90, 156,198, 373,326]]而花生数据集中果簇目标平均尺寸为63×41像素远小于最小anchor10×13。我用utils/autoanchor.py脚本重新聚类得到新anchor[[8,10, 12,22, 25,18], [22,48, 45,36, 48,95], [92,72, 124,158, 292,258]]将models/yolov5s.yaml中anchors字段替换后果簇检测AP提升8.2个百分点。4.4 评估指标解读mAP不是唯一真理YOLOv5训练日志中的mAP0.5IoU阈值0.5时的平均精度常被当作金标准但在农业场景中需结合业务逻辑看mAP0.5 0.68整体合格但拆解看plant0.79pod_cluster-0.63Recall 0.71意味着约29%的果簇被漏检对收获机器人可能是致命缺陷Precision 0.82误检率18%对喷药系统意味着18%的药量浪费。我因此增加了--task val --data datasets/peanut/data.yaml --weights runs/train/exp/weights/best.pt --name eval_pods专项评估强制只计算果簇类别的指标。结果显示单纯提升mAP会掩盖小目标性能短板必须用--iou 0.3降低IoU阈值和--conf 0.1降低置信度阈值来评估模型对微弱信号的敏感度。5. 模型部署与业务集成让检测结果真正驱动农事动作训练出高mAP模型只是起点如何让结果在田间地头产生价值我以喷药机器人控制为例说明从检测输出到物理动作的全链路5.1 输出解析从tensor到可执行指令YOLOv5的detect.py默认输出.txt文件格式为class_id center_x center_y width height conf。但机器人控制系统需要的是地理坐标而非图像坐标。这就需要建立图像像素到GPS坐标的映射步骤1获取无人机POS数据经纬度、高度、姿态角步骤2用相机内参焦距、主点和外参旋转矩阵、平移向量构建投影方程步骤3对每个检测框中心点(center_x, center_y)反解其在地面的经纬度。这个花生数据集配套提供了10张图像的POS元数据CSV格式包含timestamp,lat,lon,alt,yaw,pitch,roll,focal_length。我用OpenCV的cv2.projectPoints函数实现了逆向投影误差在±0.15米内满足喷药作业要求。没有POS数据那就得用RTK-GNSSIMU组合导航成本增加3倍。5.2 决策逻辑检测结果如何转化为农事策略检测结果本身不等于决策。例如当模型输出plant: 0.85 confidence, pod_cluster: 0.62 confidence时机器人该做什么喷药场景置信度0.8才触发喷雾避免对健康植株误喷若pod_cluster置信度0.5则标记该区域为“疑似结荚不良”生成巡检任务收获场景只响应pod_cluster且要求连续3帧检测到同一位置滤除运动伪影再结合土壤湿度传感器数据判断是否达到最佳收获期。这个花生数据集的价值正在于它提供了两类目标的联合检测能力让决策系统能基于植株健康状态通过植株检测密度推断和果实成熟度通过果簇检测密度与大小分布做复合判断而非单一目标的简单计数。5.3 边缘部署实测在Jetson Orin上跑通实时推理最终模型需部署到农机边缘设备。我在Jetson Orin16GB RAM上测试了YOLOv5s量化版FP16精度28 FPS功耗12WINT8精度41 FPS功耗9WmAP0.5下降1.3个百分点关键优化关闭--agnostic-nms类别无关NMS启用--max-det 100限制输出框数减少后处理开销。实测发现Orin的GPU对YOLOv5的Focus层切片操作支持不佳导致FP16推理延迟波动大。解决方案是将models/common.py中的Focus类替换为Convnn.PixelUnshuffle虽增加少量参数但FPS提升15%。这个修改已集成到数据集配套的yolov5_orin_patch.py中。6. 数据集局限性与升级路线它不是终点而是起点必须坦诚地说这个花生检测数据集有明确的边界理解它的局限性比盲目使用更重要6.1 当前版本的三大硬约束光照条件单一所有图像摄于上午9-11点、下午2-4点未覆盖晨雾、傍晚低照度、阴雨天场景。实测表明模型在阴天图像上的果簇Recall下降22%品种覆盖有限仅包含鲁花9号、豫花15号两个主流品种对珍珠豆型如汕油71的泛化能力未知无遮挡鲁棒性未刻意采集被杂草、秸秆严重遮挡的样本模型在遮挡率40%时性能断崖式下跌。这些不是缺陷而是产品化过程中的优先级选择——先解决“有没有”再解决“好不好”。就像手机第一代只能打电话但它是移动互联网的基石。6.2 社区共建路线图你的贡献如何让它更强大这个数据集采用CC BY-NC-SA 4.0协议署名-非商业性使用-相同方式共享鼓励社区协作升级短期3个月内开放datasets/peanut/extra/目录接收用户提交的阴天、雨后、不同品种图像经审核后合并入主数据集中期6个月启动“花生病害子集”计划用同一套图像新增leaf_spot、root_rot等病害类别标注长期1年构建跨模态数据集同步采集RGB图像、热红外图像用于水分胁迫检测、多光谱图像用于氮素含量反演。我已在GitHub仓库中创建了CONTRIBUTING.md文档详细说明图像拍摄规范ISO≤400、快门≥1/500s、白平衡手动锁定、标注工具LabelImg配置文件、提交PR流程。每一次有效提交都会在CHANGELOG.md中记录贡献者ID——因为农业AI的进步从来不是一个人的战斗。6.3 从花生到作物方法论的迁移价值这个数据集最珍贵的不是207张图而是背后沉淀的农业视觉数据集构建方法论场景驱动标注不追求学术上的“完美分割”而是定义对农事动作有直接指导意义的目标如“果簇”而非“单个荚果”生育期分层采样把作物生长周期作为核心维度而非随机抓拍硬件协同设计标注规范与无人机参数GSD、镜头畸变深度耦合确保数据可直接用于产线。这套方法论已成功迁移到我们正在构建的“玉米螟虫检测数据集”中同样按玉米的拔节期、抽雄期、灌浆期分层采样标注目标定义为“虫孔群”而非单个虫孔因为防治决策依据是虫口密度而非个体数量。当你下次面对一个新作物、新病虫害时这套方法论比任何具体数据集都更有生命力。本文还有配套的精品资源点击获取
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表