资讯动态

YOLOv11实战:多作物叶片计数与生长状态评估全流程解析

发布时间:2026/9/17 20:32:12 来源:尧图企业网站定制
简介面向农业科研人员、计算机视觉工程师与智慧农业学习者这份PDF系统讲解YOLOv11在多作物叶片计数与生长状态评估中的应用。文档共48页支持目录章节跳转和大纲快速定位内容围绕YOLOv11网络结构、损失函数与训练策略数据集收集、标注与预处理叶片计数实现流程复杂场景下重叠、光照和混合作物处理以及作物生长状态评估指标与方法等专题展开其中对LabelImg、CVAT等标注工具、图像增强、模型量化与评估指标也作了具体说明兼顾算法原理与实操细节。资源共1个PDF文件压缩包大小2.26MB图文及目录显示正常可直接作为目标检测在农业表型分析场景落地的参考手册。已有73人学习查看适合需要快速掌握多作物叶片计数思路、训练优化要点与生长状态评估方法的读者。1. 农业表型分析的第一道坎YOLOv11要做的不只是“数叶片”田间表型数据的瓶颈不在相机而在把图像变成数字的算法。玉米、小麦、大豆的试验小区里叶片数量是最基础也最耗人力的指标苗期数真叶分蘖期数分蘖后期还要估叶面积与覆盖率。人工数法误差在 5% 以内都算好结果但连续观测几百个小区时间和人力成本会直接压垮实验方案。YOLOv11 承担的是“把叶片从背景里挑出来”叶片计数和生长状态评估则是更上层的表型统计。从检测到表型统计中间隔着标注规范、小目标优化、重复框处理和面积估算。油菜裂刻深、小麦细长、大豆复叶互相遮挡同一套权重在不同作物上的表现差异很大。这里把 YOLOv11 网络结构、训练闭环和推理后处理三个层面串起来做成一套可复现的多作物叶片计数与生长状态评估方案适合农学背景的算法工程师参考。2. YOLOv11 网络结构与多作物叶片计数的最小训练闭环训练 YOLOv11 不需要先把源码走一遍但至少要理解骨干、颈部和检测头里最影响叶片检测的那几个设计否则后面调参都是在碰运气。2.1 从结构看 YOLOv11 为什么适合叶片这类密集目标YOLOv11 的骨干延续了 CSP 风格用 C3k2 模块替代早期 YOLO 里的 C3 模块。C3k2 把瓶颈层拆成两条更窄的分支再合并计算量更小同时保留了足够的通道交互能力。叶片这种目标纹理重复、边缘多C3k2 在浅层能保留局部细节在深层也不会把特征过度压缩。骨干末端还放了一个 C2PSA 模块本质上是把自注意力机制引入高层特征提取。田间图像里叶片、叶柄和茎秆经常交叉在一起普通卷积只能看到局部感受野而自注意力可以把相距较远的叶片边缘关联起来降低相互遮挡造成的漏检。检测头采用 Anchor-Free 解耦结构分类分支和回归分支分开输出。多作物叶片场景经常只有“叶片”一个类别但叶片大小从几十像素到几百像素不等解耦后框回归不会因为类别不平衡被带偏。下面是一个 yolo11.yaml 关键结构的示意训练时直接加载预训练权重即可不用手工改这个文件。# yolo11.yaml 关键结构示意不是完整的可运行文件 backbone: - [-1, 1, C3k2, [128, False, 0.25]] # 跨阶段局部连接 - [-1, 1, C2PSA, [1024]] # 自注意力特征增强 head: - [-1, 1, C2PSA, [1024]] # 检测头前的注意力特征融合这段 YAML 只是想说明 C3k2 和 C2PSA 在模型中的位置。实际训练时用yolo11n.pt作为起点权重里的预训练参数会覆盖这些配置不需要自己去拼骨干。2.2 环境配置与数据集准备先把 YOLOv11 跑通我一般会用 conda 建一个独立环境避免 ultralytics 的依赖把项目里的 PyTorch 版本顶掉。conda create -n agri_yolo python3.10 -y conda activate agri_yolo pip install ultralytics opencv-python装好后先用yolo predict modelyolo11n.pt sourcehttps://ultralytics.com/images/bus.jpg验证环境。跑通后再准备数据。叶片标注工具用 LabelImg 或 X-AnyLabeling 都可以输出 YOLO 格式的 txt 文件。类别方面我一般只保留一个leaf类别茎秆、花和果实不要混进同一类否则生长状态评估时会引入大量噪声。数据集目录和 yaml 配置如下# crop_leaf.yaml path: D:/agri_pheno train: images/train val: images/val nc: 1 names: [leaf]这里path指向数据集根目录train 和 val 是相对路径如果某个小区的图像特别暗先把白平衡统一再训练不要指望模型自己学会校色。2.3 训练 YOLOv11 的必调参数宁小勿大第一轮训练不要一上来就开 1280 分辨率和 YOLOv11x。田间叶片数据集通常只有几千张大模型加高分辨率很容易过拟合。我一般用yolo11n起步yolo detect train \ datacrop_leaf.yaml \ modelyolo11n.pt \ epochs150 \ imgsz640 \ batch16 \ patience30 \ projectagri_runs \ nameleaf_count训练结束后权重在agri_runs/leaf_count/weights/best.pt。关键参数可以按下面这张表去调整参数建议值说明imgsz640先看基线漏检小目标再拉 960 或 1280batch尽量大占用显存不超过 80% 即可patience30叶片的类间差异小早停太激进会欠拟合close_mosaic10最后 10 个 epoch 关闭马赛克增强让框回归稳定hsv_h0.015田间光照变化大色调抖动微调即可训练命令里没有写weights默认用预训练权重迁移。叶片和 COCO 里的目标形态差异比较大但低层边缘、纹理特征仍然通用迁移学习能明显减少训练时间。命令行日志里关注P、R、mAP50不要只看 loss 曲线。3. 多作物叶片计数实战检测统计与生长状态怎么联动训练完 YOLOv11 只是第一步。真正到小区里数叶片时还需要确定计数策略和生长状态分级方式。3.1 叶片计数选“检测后统计”还是“密度回归”叶片计数有两种常见思路检测后数框以及密度图回归。检测后数框最直观每个检测框代表一片叶计数就是框数量密度回归则是让网络预测每个像素附近的叶片密度再对密度图积分得到总数。两种方案的取舍如下方案标注成本重叠叶片表现与 YOLOv11 的配合检测计数高需要画完整框中等严重遮挡时漏检直接使用检测头输出密度回归高需要点标注或像素级标注更好适合拥挤场景需要额外加密度头训练复杂我一般默认先走检测计数。YOLOv11 对叶片密集场景已经做了大量优化只要标注质量稳定检测计数在苗期和分蘖期足够可靠。大豆复叶、小麦拔节后期遮挡严重时再考虑密度分支不要一开始就把流程复杂化。3.2 用 YOLOv11 的回归框估算叶面积与覆盖度叶片面积不能直接从检测框坐标得到但可以把检测框面积占整张图像的比例作为“覆盖度”指标再建立覆盖度和真实叶面积的换算关系。from ultralytics import YOLO model YOLO(agri_runs/leaf_count/weights/best.pt) res model.predict(sample.jpg, conf0.25, iou0.5)[0] boxes res.boxes leaf_count len(boxes) img_h, img_w res.orig_shape img_area img_h * img_w box_area 0.0 for box in boxes.xyxy: x1, y1, x2, y2 box.tolist() box_area (x2 - x1) * (y2 - y1) cover_ratio box_area / img_area print(叶片数:, leaf_count) print(覆盖度:, round(cover_ratio, 4))这段代码先读取检测结果再把所有检测框面积累加后除以原图面积。注意cover_ratio是外接矩形的覆盖度不是真实叶片面积但同一高度拍摄时它和叶面积指数 LAI 高度线性相关。想要真实叶面积可以取几片叶做像素级分割标出真实面积再拟合一个比例系数。3.3 把生长状态评估做成可解释的分级函数生长状态评估可以用叶片数和覆盖度两个指标联合判断。常见做法是定义一个分级函数def growth_stage(count, cover_ratio): if count 2: return 苗期 if cover_ratio 0.03: return 分蘖/分枝期 if cover_ratio 0.12: return 旺长期 return 封行/成熟期阈值必须根据作物和拍摄高度重新标定。小麦分蘖期叶片细长覆盖度阈值可以调低大豆复叶展开后覆盖度上升很快阈值应调高。保存推理结果时可以通过saveTrue直接输出带框图片model.predict( sample.jpg, conf0.25, iou0.5, saveTrue, projectruns/detect, nameleaf_stage )保存结果会用不同颜色标出框方便和人工计数做对比也能快速看出哪些叶片被 YOLOv11 漏掉。4. 把 YOLOv11 小目标检测能力调到能数田间重叠叶片的水平叶片越小、越密YOLOv11 的漏检率越高。这一章按“先诊断、再切片、再改网络、最后调后处理”的顺序处理。4.1 先用验证集确认漏检来自数据还是模型不要凭着感觉去加注意力模块。先用验证集跑一次低阈值验证看漏检目标主要集中在哪个尺寸范围。yolo detect val \ modelagri_runs/leaf_count/weights/best.pt \ datacrop_leaf.yaml \ conf0.001 \ iou0.5把conf设成 0.001 后网络会输出几乎所有候选框。打开验证结果里的混淆矩阵如果大量小叶片出现在“ground truth 有、预测没有”的区域说明是模型分辨率不够如果预测框偏移明显说明标注框本身不准确。这一步能避免后续做无效优化。4.2 用切片推理处理高清田间图田间相机或无人机拍出的图像往往是 4000×3000 以上。直接缩到 640 会把小叶片缩成 5×5 像素YOLOv11 很难识别。常见做法是切片推理把大图切成多个 640×640 的块逐块检测再合并结果。from sahi import AutoDetectionModel from sahi.predict import get_sliced_prediction model AutoDetectionModel.from_pretrained( model_typeultralytics, model_pathagri_runs/leaf_count/weights/best.pt, confidence_threshold0.25, image_size640, ) result get_sliced_prediction( DJI_0001.jpg, model, slice_height640, slice_width640, overlap_height_ratio0.2, overlap_width_ratio0.2, ) print(len(result.object_prediction_list))切片后叶片在原图上的尺寸变大漏检明显减少。重叠比例 0.2 是为了避免叶片恰好被切到两半重叠太大会导致同一叶片被重复计数。切片推理计算量约为整图推理的 8 到 10 倍离线批量处理可以接受。4.3 网络侧的小目标改进P2 检测头、CARAFE 与自注意力如果切片后仍漏检再对 YOLOv11 做网络侧改进。优先做的是缩小检测头的下采样倍数。YOLOv11 默认从 P3 / P4 / P5 层输出检测结果小叶片对应的是 80×80 特征图改用 P2 配置后网络会多出一个 160×160 的特征图小叶片的信息不会被 stride 吃掉。Ultralytics 的仓库里有对应的 P2 配置训练时把modelyolo11n.pt换成modelyolo11n-p2.yaml即可不需要自己搭建复杂结构。CARAFE 是另一种常见改进。它把最近邻上采样换成基于内容重建的上采样方式对特征图中的边缘和纹理信息更友好。改动示意如下# 示意在 YOLOv11 neck 中把最近邻上采样替换为 CARAFE head: - [-1, 1, CARAFE, [None, 2, 64]]CARAFE 不是 Ultralytics 内置模块需要自己把CARAFE类注册到ultralytics.nn.tasks里搜索“YOLOv11 CARAFE”能找到现成的实现。注意 CARAFE 的通道数要与下一步卷积对齐否则会报维度错误。自注意力方面YOLOv11 本身已经有 C2PSA 模块不必再额外叠加 Transformer 结构否则小数据集上更容易过拟合。4.4 后处理参数conf、iou 与 max_det网络训练完成后推理参数对叶片计数影响很大。参数常用值调整逻辑conf0.25调到 0.1 会多出大量错检调到 0.5 会漏掉小叶片iou0.5叶片重叠越多iou 阈值越低越容易保留相邻框max_det300-500单片图像叶片数较多时默认 300 上限不够如果发现同一个叶片被两个框同时框住把 iou 提到 0.6 或 0.7 合并重复结果如果发现相邻叶片被合并成一个框说明 iou 阈值太高要降回 0.4 附近。提示YOLOv11 的计数结果不要直接等同于最终表型值记录重叠度、视角和作物品种再统一做校正。5. 用 YOLOv11 推理结果生成生长状态报表一个可直接落地的工具脚本最后一步是把模型封装成批量处理工具让试验人员不需要懂 Python 也能拿到 CSV 报表。这个脚本会自动遍历小区图像保存标记后的图片同时输出叶片数、覆盖度和生长状态。import csv import glob import os from ultralytics import YOLO model YOLO(agri_runs/leaf_count/weights/best.pt) def growth_stage(count, cover_ratio): if count 2: return 苗期 if cover_ratio 0.03: return 分蘖/分枝期 if cover_ratio 0.12: return 旺长期 return 封行/成熟期 rows [] for img_path in sorted(glob.glob(field/**/*.jpg, recursiveTrue)): res model.predict( img_path, conf0.25, iou0.5, imgsz1280, saveTrue, projectruns/predict, namefield_out )[0] count len(res.boxes) img_area res.orig_shape[0] * res.orig_shape[1] cover 0.0 for box in res.boxes.xyxy.tolist(): cover (box[2] - box[0]) * (box[3] - box[1]) cover_ratio round(cover / img_area, 4) rows.append([ os.path.basename(img_path), count, cover_ratio, growth_stage(count, cover_ratio) ]) with open(phenotype_report.csv, w, newline, encodingutf-8) as f: writer csv.writer(f) writer.writerow([image, leaf_count, cover_ratio, growth_stage]) writer.writerows(rows)脚本里imgsz1280是针对高分辨率田间图的常用配置如果还是漏检就把 SAHI 切片逻辑接进来。生成的 CSV 可以直接导入统计分析软件标记图片则用于人工抽检。验证精度时把人工数的 30 张图与算法结果做相关性分析计算皮尔逊相关系数相关系数低于 0.9 时优先检查标注框是否漏标、拍摄图像是否存在严重反光再决定是否回炉训练。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价