去年夏天,我在某大型果园实地考察时发现一个令人震惊的现象:尽管果农每天花费数小时巡查果树,仍有超过30%的虫害被漏检,直到造成明显损害才被发现。这个痛点直接催生了本课题——一套基于YOLOv11的实时害虫识别系统。不同于传统学术论文的呈现方式,我想通过工程师视角,分享这个毕业设计从构思到落地的完整过程。
系统核心是一个能在树莓派4B上以25FPS运行的轻量化模型,识别准确率达到91.7%(mAP@0.5),支持三种检测模式:
技术栈选择上,我们采用PyQt5构建交互界面而非Web方案,主要考虑果园现场往往网络覆盖不佳。模型训练使用Ultralytics官方实现的YOLOv11-nano版本,在自建数据集上通过迁移学习微调,最终模型体积仅8.3MB,非常适合边缘设备部署。
关键决策点:放弃使用更复杂的YOLOv8/v9,因为v11在保持精度的前提下,内存占用减少19%,这对资源受限的嵌入式设备至关重要。
市面上公开的农业数据集普遍存在两个问题:类间样本不均衡(如蚜虫样本量是果蝇的10倍),以及背景过于单一(白底实验室照片)。我们通过三种方式解决:
实地采集方案:
数据增强策略:
python复制transform = A.Compose([
A.RandomSunFlare(num_flare_circles_lower=1), # 模拟强光干扰
A.RandomShadow(shadow_roi=(0,0,1,0.5)), # 树叶投影效果
A.MotionBlur(blur_limit=7), # 模拟微风中的叶片
A.RandomFog(fog_coef_lower=0.1) # 清晨雾气效果
])
最终构建的数据集包含14类常见果树害虫,共计23,587张标注图像,类别分布方差控制在1:3以内。
原版YOLOv11在果园场景下暴露出两个问题:小目标漏检(特别是<20px的蚧壳虫),以及相似物种误检(如梨小食心虫与桃小食心虫)。我们的改进方案:
特征融合增强:
检测头改进:
python复制class InsectHead(nn.Module):
def __init__(self, ch=256):
super().__init__()
self.micro = nn.Sequential( # 小目标专用检测头
GSConv(ch, ch//2, 1),
nn.Upsample(scale_factor=2),
GSConv(ch//2, ch//4, 3)
)
self.cls = nn.Conv2d(ch//4, num_classes, 1)
实测表明,改进后的模型在测试集上:
为避免GUI卡顿,我们设计了三层处理架构:
前端交互层:
逻辑控制层:
python复制class DetectorController:
def __init__(self):
self.task_queue = Queue(maxsize=10) # 缓冲待处理帧
self.result_cache = LRUCache(100) # 最近结果缓存
def start_pipeline(self):
self.det_thread = DetectionThread(self.task_queue)
self.disp_thread = DisplayThread(self.result_cache)
在树莓派4B上的性能测试显示:
问题1:阴雨天误检率高
问题2:老款安卓手机兼容性问题
python复制cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*'MJPG'))
OpenCV版本陷阱:
pip install opencv-python>=4.5.4树莓派优化技巧:
code复制gpu_mem=256
dtoverlay=vc4-kms-v3d
sudo raspi-config关闭桌面环境模型量化注意事项:
目前系统已在实际果园完成第一阶段测试,准确率稳定在89%以上。但有几个值得改进的方向:
多模态融合:
增量学习方案:
边缘计算优化:
这个项目给我的最大启示是:农业AI落地必须考虑"三现主义"——现场、现物、现实。实验室指标再漂亮,不能解决果农的实际问题就是空中楼阁。比如我们最初没考虑逆光拍摄场景,导致首批测试时系统几乎瘫痪,后来通过添加眩光模拟数据才解决。