农业无人机搭载多光谱相机巡田时,单纯依赖可见光图像很难在病害显性化之前发现问题。作物在感染真菌或遭受虫咬后,叶绿素含量与细胞结构会发生变化,导致红边波段和近红外波段的反射率曲线偏离健康植株。AI病虫害识别正是利用这种光谱特征差异,结合边缘计算在机载端完成推理,从而降低对网络带宽和云端算力的依赖。整套系统涉及光学传感、图像配准、轻量模型设计与嵌入式部署多个环节。

多光谱影像的波段选择与预处理原理
常见的农业多光谱传感器会输出蓝、绿、红、红边以及近红外五个波段,少数设备还会加入短波红外。红边波段位于大约720纳米到750纳米之间,对叶绿素荧光和叶片内部结构变化极为敏感,是区分健康与染病作物的核心依据。近红外波段则主要反映叶片密度和含水量,在虫害导致局部枯萎时会出现明显跌落。如果只拿可见光三通道训练模型,往往会把阴影和泥渍误判为病斑,因此必须把这些非视觉波段作为独立输入通道。
原始影像在传入模型前需要完成辐射定标与反射率转换。无人机飞行高度和光照角度变化会让同一地块的像素值波动,通常通过机载光强传感器做相对校正,或者采用经验线性法利用布设的反射率板求解斜率。接着要做波段配准,因为不同滤光片对应的成像位置存在亚像素偏移,可用基于特征点的仿射变换把红边与近红外对齐到可见光坐标系。下面是一段用Python做多光谱通道堆叠与简单校正的示例:
import numpy as np
from skimage.registration import phase_cross_correlation
from skimage.transform import warp, AffineTransform
# 假设四个波段已读取为单通道数组
blue = np.load('blue.npy').astype(np.float32)
red_edge = np.load('red_edge.npy').astype(np.float32)
nir = np.load('nir.npy').astype(np.float32)
# 以蓝波段为基准,计算红边偏移并配准
shift, _, _ = phase_cross_correlation(blue, red_edge)
at = AffineTransform(translation=(shift[1], shift[0]))
red_edge_aligned = warp(red_edge, at.inverse)
# 堆叠为四通道输入,顺序为蓝、红边、近红外、NDVI衍生
ndvi = (nir - blue) / (nir + blue + 1e-6)
stack = np.stack([blue, red_edge_aligned, nir, ndvi], axis=-1)
print('预处理后形状:', stack.shape)
除了配准,还要针对田间光照不均做归一化。比如用每个波段分块统计均值并做减去局部均值除以标准差的处理,能削弱云影带来的误检。经验上看,加入NDVI或红边指数作为衍生通道,比直接丢原始反射率更能提升轻量模型的泛化能力,因为这类指数已经压缩了部分光照干扰。
面向边缘设备的模型压缩与训练策略
无人机机载计算单元多为瑞芯微、树莓派或带有NPU的国产模组,内存通常在1到4GB,难以承载普通ResNet50这类模型。因此要把识别网络设计为MobileNetV3或GhostNet一类结构,并利用通道剪枝把冗余卷积去掉。训练时可以采用教师学生框架,先用高精度的多光谱大模型在服务器上产出软标签,再让小模型去拟合,这样既保留光谱判别边界,又压低了参数量。
另一个关键是类别不均衡。实际巡田时健康叶片占绝大多数,病害样本稀少,如果直接交叉熵训练,模型会偏向全部预测为健康。可以采用 focal loss 或者过采样染病区块,并在数据增强时模拟不同高度的成像模糊与曝光漂移。下面示例展示了一个轻量模型在PyTorch中的定义与剪枝后导出思路:
import torch
import torch.nn as nn
class LightMSNet(nn.Module):
def __init__(self, num_classes=4):
super().__init__()
# 四通道输入,深度可分离卷积降低计算
self.stem = nn.Conv2d(4, 16, 3, padding=1, groups=4)
self.bn = nn.BatchNorm2d(16)
self.act = nn.ReLU()
self.pool = nn.AdaptiveAvgPool2d(1)
self.fc = nn.Linear(16, num_classes)
def forward(self, x):
x = self.act(self.bn(self.stem(x)))
x = self.pool(x).flatten(1)
return self.fc(x)
model = LightMSNet()
dummy = torch.randn(1, 4, 64, 64)
torch.onnx.export(model, dummy, 'light_msnet.onnx', input_names=['inp'], output_names=['out'])
print('已导出ONNX供边缘端转换')
在边缘端推理前,往往还要把ONNX转成各硬件支持的格式,例如瑞芯微用RKNN、华为昇腾用OM。转换时会做量化,把浮点32位压成int8,这一步要提供校准集以免反射率数值范围错位。实测表明,int8量化后病害识别准确率掉一到两个百分点,但推理耗时降到原来的三分之一,对早期预警场景完全可接受。
边缘计算部署流程与实测对比
把模型放到无人机机载模组后,整个流水线通常是:相机回调帧数据、机载程序做波段提取、预处理、推理、把置信度高于阈值的区块映射到GPS坐标并写入日志。相比把原始多光谱视频传回地面站,边缘计算只回传矢量病害点,流量从每分钟几十兆降到几KB。下面是一段C++风格的伪代码描述端侧主循环:
// 假设capture返回四通道Mat
while (drone.flying()) {
Mat frame = camera.capture();
Mat aligned = register_bands(frame);
Tensor input = normalize_to_tensor(aligned);
auto result = model.infer(input);
for (auto &box : result.boxes) {
if (box.score > 0.6) {
GpsPoint p = geo.tag(box.center);
log.add(p, box.cls);
}
}
send_log_only();
}我们对比过三种方案:纯云端、机载树莓派4B、机载带NPU的模组。纯云端在信号覆盖差的农田会丢帧,且端到端时延超过两秒;树莓派4B跑量化后模型能达到每秒八帧,功耗五瓦,可连续飞行作业;NPU模组帧率提到二十以上,功耗仅两瓦,但前期转换工具链更繁琐。对于中小农场,树莓派级方案已经够用,大规模作业才建议上NPU。需要留意的是,边缘端不能省略反射率校正,否则中午和傍晚的同一病斑会被给出不同置信度,造成漏报。
实际落地时还要处理飞行姿态引入的运动模糊。若无人机风速较大,单帧多光谱配准误差上升,可在机载端用惯性测量单元数据做预判,丢弃陀螺仪抖动超阈值的帧。这样虽然少看几帧,但保证了输入质量,比盲目全帧推理更稳妥。综合来看,多光谱加边缘计算的模式让病虫害识别从“回去再看”变成“空中即判”,是精准农业里性价比很高的技术路线。
multispectral_imagingedge_computingAI_pest_detection修改时间:2026-08-13 22:39:37