3. 农业数据集构建与标注
目标检测模型的性能上限,很大程度上在数据集阶段就已经被决定了。农业场景的数据集构建并不是“拍一堆照片、框一堆框”这么简单,它需要围绕检测任务本身,先明确要检测什么、如何界定边界、由谁来标、按什么规则标,最后才是选择工具和公开数据。本节围绕类别定义、标注工具、标注规范和公开数据集对比四个环节展开,并给出可直接参考的实践做法。
一、类别定义:先想清楚“检测什么”
类别体系是数据集的骨架。农业检测任务常见的类别定义方式有三种:按物种(如苹果、番茄、柑橘)、按器官(如花、幼果、成熟果、病叶)、按状态(如健康、早期病斑、严重病斑)。同一张图里,如果既想检测“番茄”又想检测“病斑”,就必须明确这是两个层级的目标,不能混在一个扁平类别表里,否则标注员会在“框整颗果实”还是“框病斑区域”之间反复摇摆。
实践中建议遵循三条原则。第一,互斥性:任意一个目标实例只能属于一个类别,例如“成熟番茄”和“未成熟番茄”按颜色区分后,就不再保留一个笼统的“番茄”类。第二,可辨识性:类别差异必须在图像分辨率下肉眼可辨,若两个病害阶段在 1080p 图像上几乎无法区分,就应合并或提升采集分辨率。第三,任务相关性:只保留对下游决策有用的类别,例如采摘机器人只需要“可采摘果实”,不必细分十个品种。
一个可参考的示例类别表如下(示例,非实测数据):
| 类别 ID | 类别名 | 定义要点 | 典型最小框尺寸 |
|---|---|---|---|
| 0 | 成熟番茄 | 果面红色占比≥60%,可见轮廓完整 | 约 24×24 像素 |
| 1 | 未成熟番茄 | 果面以青绿色为主,未转色 | 约 24×24 像素 |
| 2 | 病果 | 果面存在明显病斑或腐烂区域 | 约 32×32 像素 |
| 3 | 叶片病斑 | 叶片上独立可辨的病斑区域 | 约 16×16 像素 |
最小框尺寸的设定非常关键。它直接决定了标注时“多小的目标才标”,也影响后续模型输入分辨率的选择。若最小框为 16 像素,而训练时把图像缩放到 640×640,则原图中 16 像素的目标在缩放后可能只剩几个像素,模型难以学习,这时就需要提高采集分辨率或采用切图训练策略。
二、标注工具:按任务形态选工具
目标检测最常用的是矩形框标注,工具选择主要看三点:是否支持团队协作与任务分配、是否支持导出 COCO/YOLO/VOC 等主流格式、是否支持预标注与审核流程。常见选择包括 LabelImg(轻量、单机、适合小规模)、CVAT(支持视频、多人协作、审核流)、Label Studio(可配置多种标注类型)、Roboflow(在线协作与增强一体化)。
以 YOLO 格式为例,每张图对应一个同名 txt 文件,每行一个目标,格式为:
类别ID 中心x 中心y 宽 高
0 0.512 0.437 0.086 0.094
1 0.301 0.622 0.071 0.083
其中坐标均为归一化值,即除以图像宽高后的比例,取值范围 0~1。这一点必须在标注规范中写清楚,因为不同工具默认导出格式不同,COCO 使用绝对像素坐标的 [x_min, y_min, w, h],VOC 使用 [x_min, y_min, x_max, y_max],混用会导致训练时框全部错位。建议在项目开始时固定一种中间格式,转换脚本单独维护并做抽样校验。
三、标注规范:把“凭感觉”变成“可判定”
标注规范的本质是把模糊判断转成可执行的判定条件。一份可用的规范至少应覆盖:框的贴合程度(紧贴目标外轮廓,不留明显空白,也不切掉目标边缘)、遮挡处理(遮挡超过约 50% 不标,遮挡 20%~50% 按可见部分紧贴标注并在备注中记录)、截断处理(目标在图像边缘被截断且可见面积足够时标注,框到图像边界为止)、密集目标处理(相邻果实框允许少量重叠,但不得把两个目标框成一个)、以及难例标记(模糊、过曝、严重遮挡的目标标记为 difficult,训练时可选择忽略)。
规范落地还需要一致性校验。推荐做法是:先由一名标注员标 50 张作为“黄金集”,再由第二人独立复标,计算两者的框 IoU 与类别一致率。若平均 IoU 低于 0.75 或类别一致率低于 90%,说明规范存在歧义,应先修订规范再批量标注,而不是直接扩大标注量。批量标注过程中按 10% 比例抽检,发现系统性偏差(例如某标注员习惯把框画大一圈)时及时返工。
四、公开数据集对比:能用但要看清边界
农业公开数据集可以显著降低冷启动成本,但必须看清其采集条件与自身任务的匹配度。PlantVillage 是经典的叶片病害分类数据集,以受控背景下的单叶图像为主,适合做病害分类与预训练特征学习,但它不是目标检测数据集,图像中通常只有一片叶子居中,缺少真实田间场景的多目标、遮挡与复杂背景,直接用于田间检测会存在明显的域差异。AgriNet 一类农业图像数据集覆盖面更广,包含多种作物与场景,可用于预训练或类别扩展,但使用前仍需核对类别定义、标注格式与许可协议。
更实际的做法是“公开数据预训练 + 自有数据微调”:先用公开数据训练骨干网络或做初始化,再用符合本地作物、本地光照与本地相机条件的自有标注数据微调。下表给出对比维度(示例性归纳,具体以各数据集官方说明为准):
| 对比维度 | PlantVillage | AgriNet 类综合数据集 | 自建田间数据集 |
|---|---|---|---|
| 主要任务 | 叶片病害分类 | 分类/检测等多任务 | 按项目定制检测 |
| 场景真实性 | 受控背景为主 | 较多样 | 与部署场景一致 |
| 标注形式 | 图像级标签 | 视子集而定 | 矩形框/多边形 |
| 主要用途 | 预训练、分类基线 | 预训练、类别扩展 | 微调与最终评估 |
下面的图示把本节的关键关系串起来:从类别定义出发,经采集与标注规范约束,进入工具标注与一致性校验,最终形成可训练数据集,并标明公开数据在其中的位置——它主要作用于预训练环节,而最终评估必须依赖与部署场景一致的自建数据。
五、构建闭环中的几个易错点
第一,采集与类别脱节。先定类别再采集,能避免“拍完才发现某类样本极少”。建议按类别设定最低样本量,例如每类不少于 300 个实例,稀有类通过定向补采或合理的数据增强补足,但增强不能替代真实样本的多样性。
第二,训练集与测试集同源泄漏。同一植株、同一时间段连拍的多张图若被随机分到训练集和测试集,测试指标会虚高。应按“地块/植株/采集批次”为单位划分,而不是按单张图像随机划分。
第三,忽略负样本。田间图像中大量背景(土壤、支架、天空、杂草)不含目标,适当加入纯背景图作为负样本,可以降低误检率。负样本同样需要经过同一套采集与筛选流程。
第四,标注版本管理。规范修订后,旧标注需要按新规范回溯检查。建议为数据集打版本号(如 v1.0、v1.1),记录每次修订的类别变更、返工范围与样本量变化,使训练结果可追溯。
把以上环节串起来看,数据集构建的产出不只是一堆图片和标签文件,而是一套可复现的资产:明确的类别表、成文的标注规范、经过一致性校验的标注结果、固定格式的导出文件,以及划分清晰的训练/验证/测试集。这套资产的质量,直接决定了后续模型训练与评估结果是否可信。