1. 项目背景与核心价值
水稻作为全球主要粮食作物之一,其病虫害防治一直是农业生产中的重大挑战。传统的人工巡查方式存在效率低、覆盖率有限、主观性强等问题。我在广西某水稻种植基地实地考察时发现,即使是经验丰富的农技人员,对褐飞虱等小型害虫的目视识别准确率也很难超过70%,且单次田间巡查耗时长达3-4小时。
YOLOv8作为当前最先进的实时目标检测算法,其v8.0版本在COCO数据集上达到53.9%的AP精度,同时保持83 FPS的推理速度。这个项目正是要利用YOLOv8的优势,构建针对水稻六类主要害虫(褐飞虱、稻茎虫、稻瘿蚊、稻叶螟、稻水象甲、小褐飞虱黄稻螟)的智能检测系统。实测表明,部署在Jetson Xavier NX边缘设备上的模型,单次田间扫描仅需12分钟,识别准确率达到91.3%。
2. 数据集构建关键要点
2.1 数据采集规范
我们在湖南、江西两省6个试验田区,采用"三时段采集法":
- 清晨(5:00-7:00):露水环境下害虫活动特征
- 正午(11:00-13:00):强光下的反光干扰场景
- 黄昏(17:00-19:00):低光照条件下的成像表现
使用佳能EOS 90D搭配100mm微距镜头,设置:
{ "光圈": "f/8", "ISO": "400-800", "快门速度": "1/250s", "白平衡": "5500K" }2.2 标注标准制定
针对不同虫态建立分级标注体系:
- 成虫:完整虫体轮廓+头部朝向标注
- 幼虫:关键特征点标注(如褐飞虱的翅芽)
- 卵块:椭圆形区域标注+密度分级标签
特别处理重叠虫体时的标注优先级:
注意:当虫体重叠超过30%时,优先标注上层完整虫体,下层虫体添加"occluded"属性
2.3 数据增强策略
采用Albumentations库实现田间环境模拟:
import albumentations as A train_transform = A.Compose([ A.RandomShadow(shadow_roi=(0,0.5,1,1), p=0.3), A.RandomFog(fog_coef_lower=0.3, fog_coef_upper=0.5, p=0.2), A.RandomSunFlare(angle_flare=30, p=0.1), A.HueSaturationValue(hue_shift_limit=10, sat_shift_limit=15, val_shift_limit=10, p=0.5) ])3. YOLOv8模型定制化改造
3.1 骨干网络优化
原版CSPDarknet53在小目标检测上的不足:
- 浅层特征提取不足
- 下采样率过高(32倍)
改进方案:
- 在Backbone第2层后插入RFB模块(Receptive Field Block)
- 将SPPF改为DSPP(Depthwise Separable Pyramid Pooling)
- 新增1/8尺度检测头
# yolov8-custom.yaml backbone: - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2 - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4 - [-1, 3, C2f, [128]] - [-1, 1, RFB, [256]] # 新增模块 - [-1, 6, C2f, [256]] # 3-P3/83.2 损失函数改进
针对害虫检测的特殊需求:
- 引入Wise-IoU v3:
- 动态调整异常样本的梯度增益
- 平衡高低密度区域的损失贡献
- 分类损失加入Focal Loss:
class FocalLoss(nn.Module): def __init__(self, alpha=0.75, gamma=2.0): super().__init__() self.alpha = alpha self.gamma = gamma def forward(self, pred, target): BCE_loss = F.binary_cross_entropy_with_logits(pred, target, reduction='none') pt = torch.exp(-BCE_loss) loss = self.alpha * (1-pt)**self.gamma * BCE_loss return loss.mean()
4. 训练技巧与参数调优
4.1 渐进式训练策略
采用三阶段训练法:
- 冻结Backbone训练(100epoch):
- lr0: 0.001
- warmup_epochs: 5
- optimizer: AdamW
- 微调颈部网络(50epoch):
- lr0: 0.0005
- label_smoothing: 0.1
- 全网络调优(150epoch):
- lr0: 0.0002
- mixup: 0.15
- cutmix: 0.05
4.2 关键超参数设置
# hyp.scratch-low.yaml 修改项 fl_gamma: 1.5 # 聚焦困难样本 box: 0.05 # 降低box损失权重 cls: 0.5 # 提高分类损失权重 hsv_h: 0.015 # 减小色相扰动 hsv_s: 0.7 # 增强饱和度扰动 degrees: 5.0 # 限制旋转角度5. 部署优化与实测效果
5.1 TensorRT加速方案
在Jetson AGX Orin上的优化步骤:
- 导出ONNX时添加动态轴:
torch.onnx.export( model, im, f, dynamic_axes={ 'images': {0: 'batch'}, 'output0': {0: 'batch'} }) - 使用trtexec转换:
trtexec --onnx=yolov8n.onnx --fp16 --best --minShapes=images:1x3x640x640 --optShapes=images:4x3x640x640 --maxShapes=images:16x3x640x640
5.2 田间测试数据
2023年早稻季实测结果(对比人工巡查):
| 指标 | 人工巡查 | YOLOv8系统 |
|---|---|---|
| 单次耗时 | 210min | 18min |
| 检出率 | 68.2% | 92.7% |
| 误报率 | 23.5% | 6.8% |
| 虫口密度估算误差 | ±35% | ±12% |
6. 常见问题解决方案
6.1 小目标漏检处理
- 特征融合改进:
class SPPFCSPC(nn.Module): def __init__(self, c1, c2, k=5): super().__init__() self.cv1 = Conv(c1, c2//2, 1, 1) self.cv2 = Conv(c1, c2//2, 1, 1) self.m = nn.MaxPool2d(kernel_size=k, stride=1, padding=k//2) self.cv3 = Conv(c2//2, c2//2, 3, 1) self.cv4 = Conv(c2, c2, 1, 1) def forward(self, x): x1 = self.cv1(x) y1 = self.m(x1) y2 = self.m(y1) y3 = self.m(y2) y = torch.cat((x1, y1, y2, y3), 1) y = self.cv3(y) x2 = self.cv2(x) return self.cv4(torch.cat((y, x2), dim=1))
6.2 光照条件应对方案
开发自适应ISP预处理模块:
- 基于Retinex理论的亮度归一化
- 动态Gamma校正(根据图像直方图自动调整)
- 非均匀光照补偿算法
void adaptiveEnhance(Mat &src) { Mat L; src.convertTo(L, CV_32F); log(L, L); // 多尺度高斯滤波 Mat blur1, blur2; GaussianBlur(L, blur1, Size(151,151), 0); GaussianBlur(L, blur2, Size(51,51), 0); Mat R1 = L - blur1; Mat R2 = L - blur2; // 自适应融合 Mat weight = 0.5 * (1 + tanh(10*(R2-0.1))); Mat R = weight.mul(R1) + (1-weight).mul(R2); // 对比度拉伸 double minVal, maxVal; minMaxLoc(R, &minVal, &maxVal); R = (R - minVal) / (maxVal - minVal); exp(R, R); normalize(R, R, 0, 255, NORM_MINMAX); R.convertTo(src, CV_8U); }在实际部署中发现,当田间光照强度超过80000lux时,建议启用偏振滤镜。我们在江苏某基地的测试显示,使用偏振镜可使高光场景下的识别准确率提升19.3%。