3. 农业识别模型选型与训练基础

在把模型导出为 ONNX 之前,真正决定部署效果的并不是导出工具,而是导出之前那个模型本身。农业识别任务通常面对的是田间复杂光照、叶片遮挡、病斑面积小、类别分布不均等问题,选错骨干网络或训练策略,后续再优化推理也补不回来。本节围绕四件事展开:骨干网络怎么选、迁移学习怎么用、超参怎么设、损失与评估指标怎么定。

一、常用 CNN 与轻量级网络的取舍

农业识别按任务形态大致分三类:作物/病害分类(整图一个标签)、目标检测(定位病斑、果实、虫害)、语义分割(叶片病斑像素级区域)。分类任务常用 ResNet 系列作为精度基线,ResNet18/34 在中等规模数据集上性价比高,ResNet50 适合类别多、细粒度强的场景。轻量级网络以 MobileNetV3、ShuffleNetV2、EfficientNet-Lite 为代表,参数量常在 1~5M 量级,适合边缘盒子、无人机机载或手机端推理。

选型时不要只看 ImageNet 精度。农业数据集往往只有几千到几万张,模型容量过大反而容易过拟合;同时田间图像分辨率高、目标小,过度下采样会丢失病斑细节。一个实用的判断顺序是:先确认部署端算力与内存上限,再确认输入分辨率下限,最后在满足前两者的候选里选精度最高的。例如部署在 4 核 ARM 边缘设备、要求单帧 100ms 内完成,MobileNetV3-Small 在 224×224 输入下通常比 ResNet50 更现实;若部署在带 GPU 的农机终端,ResNet34 或 EfficientNet-B0 更值得尝试。

农业识别:从任务到训练配置的选型路径 任务形态 分类 / 检测 / 分割 部署约束 算力 / 内存 / 时延 数据条件 样本量 / 类别均衡 骨干网络候选 ResNet18/34/50 精度基线,中大型数据 MobileNetV3 边缘端首选,1~5M 参数 ShuffleNetV2 低功耗设备,通道混洗 EfficientNet-Lite 复合缩放,精度均衡 迁移学习策略 冻结骨干 → 训练分类头 解冻后段 → 小学习率微调 判别式学习率:头 1e-3 / 骨干 1e-4 超参与损失 输入 224×224,批大小 32 AdamW,权重衰减 1e-4 余弦退火,早停 patience=8 交叉熵 + 类别权重 / Focal Loss 评估指标 宏平均 F1 / 每类召回率 混淆矩阵定位易混类别 注:图中参数为教学示例,实际取值需依据数据集与部署端实测调整

二、迁移学习:农业场景下最划算的起点

农业数据集普遍偏小,从零训练几乎不可行。推荐做法是加载 ImageNet 预训练权重,分两阶段微调。第一阶段冻结骨干网络,只训练新替换的分类头(或检测头),学习率取 1e-3 量级,训练 5~10 个 epoch,让随机初始化的头部先收敛,避免大梯度破坏预训练特征。第二阶段解冻骨干的后段(例如 ResNet 的 layer3、layer4),采用判别式学习率:头部保持 1e-3,骨干用 1e-4 甚至 1e-5,再训练 20~30 个 epoch。

需要注意农业图像与 ImageNet 的域差异:ImageNet 多为物体居中、背景干净的照片,而田间图像背景杂乱、目标占比小。因此数据增强要更贴近真实采集条件——随机裁剪缩放、色彩抖动(模拟不同时段光照)、轻度旋转与水平翻转。但要谨慎使用大角度旋转和垂直翻转,因为叶片病斑的形态与朝向有关,过度翻转可能引入不真实样本。若目标域与自然图像差异极大(如显微图像、多光谱图像),可考虑只迁移浅层特征,或改用该域自监督预训练权重。

三、超参数设置的实际做法

下面给出一份可直接参考的训练配置示例(PyTorch 风格,参数为教学示例值,需按实际数据调整):

model = mobilenet_v3_small(pretrained=True)
model.classifier[3] = nn.Linear(1024, num_classes)   # 替换分类头

# 阶段一:冻结骨干
for p in model.features.parameters():
    p.requires_grad = False
optimizer = AdamW(model.classifier.parameters(), lr=1e-3, weight_decay=1e-4)

# 阶段二:解冻后段,判别式学习率
for p in model.features[-3:].parameters():
    p.requires_grad = True
optimizer = AdamW([
    {"params": model.classifier.parameters(), "lr": 1e-3},
    {"params": model.features[-3:].parameters(), "lr": 1e-4},
], weight_decay=1e-4)
scheduler = CosineAnnealingLR(optimizer, T_max=30)
criterion = nn.CrossEntropyLoss(weight=class_weights)  # 类别不均衡时启用

批大小受显存限制,224×224 输入下 16~64 均可,批大小变化时学习率按线性比例粗略调整。训练轮数不必预设过大,配合早停(验证集宏 F1 连续 8 轮不提升即停止)更稳妥。输入分辨率是农业任务的关键超参:病斑小、目标密集时应提高到 384 或 512,但会显著增加推理耗时,需要在部署端实测后折中。

四、损失函数与评估指标的选择

分类任务默认交叉熵。农业数据常见类别不均衡——健康叶片样本远多于某种罕见病害,此时有两种处理:给交叉熵传入按类别频率反比计算的权重,或改用 Focal Loss(γ 取 1.5~2.0)压低易分样本的损失贡献。检测任务常用 CIoU Loss 做框回归、配合分类损失;分割任务在病斑像素占比极低时,建议 BCE 与 Dice Loss 组合,Dice 项能直接优化区域重叠度。

评估指标不能只看总体准确率。类别不均衡时总体准确率会被多数类主导,应重点看宏平均 F1 和每类召回率——漏检一种病害的代价往往高于误检。同时输出混淆矩阵,定位哪些类别互相混淆(例如两种叶斑病在早期形态接近),再针对性补充样本或调整增强策略。验证集划分要按地块或拍摄批次分组,避免同一植株的图像同时出现在训练集和验证集造成指标虚高。只有验证集指标稳定后,才进入 ONNX 导出环节。

选型与训练的核心判断链:部署约束定骨干容量 → 数据规模定迁移策略 → 类别分布定损失函数 → 业务代价定评估指标。四者一致,导出的 ONNX 模型才具备实际部署价值。