基于YOLOv11的水稻害虫智能检测系统开发

基于YOLOv11的水稻害虫智能检测系统开发 1. 水稻害虫检测项目概述水稻作为全球最重要的粮食作物之一其病虫害防治一直是农业生产中的关键环节。传统的人工巡查方式效率低下且容易遗漏而基于深度学习的智能检测技术为解决这一问题提供了新的思路。本项目通过构建包含10类常见水稻害虫的数据集3156张图像结合YOLOv11目标检测模型和PyQt5图形界面开发了一套完整的害虫检测系统。这套系统在实际应用中能够实现以下核心功能实时检测田间拍摄的水稻害虫图像准确识别并标注害虫种类和位置统计检测结果并生成可视化报告辅助农业工作者进行精准施药决策提示系统特别针对小目标害虫如褐飞虱、稻叶蝉等进行了优化在保持较高检测速度的同时平均精度(mAP0.5)可达到85%以上。2. 数据集构建与处理2.1 数据集特性分析本数据集包含3156张高质量水稻田间图像涵盖10类主要害虫采用YOLO和PASCAL VOC两种标注格式。各类别样本分布如下表所示害虫类别(中文)害虫类别(英文)标注数量典型特征亚洲稻螟Asiatic Rice Borer716体长8-13mm淡黄色带褐斑褐飞虱Brown Plant Hopper577体长3-4mm褐色有翅稻茎虫Paddy Stem Maggot104白色幼虫蛀食茎秆稻瘿蚊Rice Gall Midge223微小蚊虫幼虫形成虫瘿稻叶螟Rice Leaf Caterpillar187绿色幼虫啃食叶肉稻叶蝉Rice Leaf Hopper294体长3mm浅绿色善跳稻叶卷虫Rice Leaf Roller930幼虫吐丝卷叶稻水象甲Rice Water Weevil492黑色甲虫体长2-3mm小褐飞虱Small Brown Plant Hopper317体长2mm浅褐色黄稻螟Yellow Rice Borer307淡黄色夜间活动2.2 数据增强策略针对样本分布不均衡的问题我们采用以下增强策略对稀有类别如稻茎虫应用Mosaic增强将4张图像拼接训练使用MixUp增强线性混合两张图像及其标签调整HSV色彩空间参数hsv_h0.015hsv_s0.7hsv_v0.4随机旋转-10°~10°和尺度变换0.8~1.2倍# 数据增强配置示例YOLOv8/yolov11 augment: True mosaic: 0.5 # 50%概率使用mosaic mixup: 0.2 # 20%概率使用mixup hsv_h: 0.015 hsv_s: 0.7 hsv_v: 0.4 degrees: 10.0 scale: 0.23. YOLOv11模型训练3.1 模型架构选择YOLOv11在YOLOv8基础上主要改进了以下方面引入更高效的CSPNet结构使用SiLU激活函数替代LeakyReLU优化Anchor-Free检测头增强小目标检测能力针对本项目的需求我们选择yolov11m作为基础模型在速度和精度间取得平衡。3.2 训练参数配置# rice_pest.yaml 配置文件 path: ../rice_pest_dataset train: images/train val: images/val test: images/test nc: 10 names: 0: asiatic_rice_borer 1: brown_plant_hopper 2: paddy_stem_maggot 3: rice_gall_midge 4: rice_leaf_caterpillar 5: rice_leaf_hopper 6: rice_leaf_roller 7: rice_water_weevil 8: small_brown_plant_hopper 9: yellow_rice_borer3.3 训练过程实现from ultralytics import YOLO import torch def train_model(): # 检查GPU可用性 device 0 if torch.cuda.is_available() else cpu # 加载预训练模型 model YOLO(yolov11m.pt).to(device) # 训练参数 results model.train( datarice_pest.yaml, epochs300, imgsz1280, # 增大尺寸提升小目标检测 batch16, patience50, devicedevice, workers8, optimizerAdamW, lr00.001, weight_decay0.0005, namerice_pest_v11m ) # 验证模型 metrics model.val() print(fmAP0.5: {metrics.box.map:.3f}) return model if __name__ __main__: trained_model train_model()注意训练时建议使用至少16GB显存的GPU如RTX 3090当batch16、imgsz1280时显存占用约14GB。4. PyQt5 GUI开发4.1 界面设计架构GUI采用MVC模式设计主要包含以下组件主视图(MainView)继承QMainWindow控制面板(ControlPanel)QWidget包含各类按钮图像显示区(ImageCanvas)QLabel显示图像和检测结果结果表格(ResultTable)QTableWidget展示检测数据PestDetectionGUI/ ├── main_view.py # 主窗口 ├── controllers.py # 业务逻辑 ├── models.py # 数据模型 └── utils/ ├── image_utils.py # 图像处理 └── draw_utils.py # 绘制检测框4.2 核心功能实现# main_view.py from PyQt5.QtWidgets import (QMainWindow, QLabel, QPushButton, QVBoxLayout, QHBoxLayout, QWidget, QFileDialog, QTableWidget, QTableWidgetItem) from PyQt5.QtGui import QPixmap, QImage from PyQt5.QtCore import Qt import cv2 class MainWindow(QMainWindow): def __init__(self, model): super().__init__() self.model model self.init_ui() self.current_image None def init_ui(self): # 主窗口设置 self.setWindowTitle(水稻害虫检测系统 v1.0) self.setGeometry(100, 100, 1600, 900) # 中央部件 central_widget QWidget() self.setCentralWidget(central_widget) # 主布局 main_layout QHBoxLayout() central_widget.setLayout(main_layout) # 左侧 - 图像显示 self.image_label QLabel() self.image_label.setAlignment(Qt.AlignCenter) self.image_label.setMinimumSize(800, 600) main_layout.addWidget(self.image_label, 70) # 70%宽度 # 右侧 - 控制面板 right_panel QVBoxLayout() main_layout.addLayout(right_panel, 30) # 30%宽度 # 控制按钮 btn_open QPushButton(打开图像) btn_open.clicked.connect(self.open_image) right_panel.addWidget(btn_open) btn_detect QPushButton(开始检测) btn_detect.clicked.connect(self.detect_pests) right_panel.addWidget(btn_detect) btn_export QPushButton(导出结果) btn_export.clicked.connect(self.export_results) right_panel.addWidget(btn_export) # 结果表格 self.result_table QTableWidget() self.result_table.setColumnCount(5) self.result_table.setHorizontalHeaderLabels( [ID, 类别, 置信度, 位置, 大小]) right_panel.addWidget(self.result_table) def open_image(self): 打开图像文件 file_path, _ QFileDialog.getOpenFileName( self, 选择图像, , 图像文件 (*.jpg *.jpeg *.png *.bmp)) if file_path: self.current_image cv2.imread(file_path) self.display_image(self.current_image) def display_image(self, image): 显示OpenCV图像到QLabel rgb_image cv2.cvtColor(image, cv2.COLOR_BGR2RGB) h, w, ch rgb_image.shape bytes_per_line ch * w qt_image QImage( rgb_image.data, w, h, bytes_per_line, QImage.Format_RGB888) self.image_label.setPixmap( QPixmap.fromImage(qt_image).scaled( self.image_label.width(), self.image_label.height(), Qt.KeepAspectRatio)) def detect_pests(self): 执行害虫检测 if self.current_image is None: return # 执行推理 results self.model(self.current_image) # 清空表格 self.result_table.setRowCount(0) # 处理检测结果 for result in results: # 绘制检测框 annotated_image result.plot() # 更新表格 for i, box in enumerate(result.boxes): cls_id int(box.cls[0]) conf float(box.conf[0]) x1, y1, x2, y2 map(int, box.xyxy[0].tolist()) row self.result_table.rowCount() self.result_table.insertRow(row) self.result_table.setItem(row, 0, QTableWidgetItem(str(i1))) self.result_table.setItem(row, 1, QTableWidgetItem(result.names[cls_id])) self.result_table.setItem(row, 2, QTableWidgetItem(f{conf:.2f})) self.result_table.setItem(row, 3, QTableWidgetItem(f({x1},{y1})-({x2},{y2}))) self.result_table.setItem(row, 4, QTableWidgetItem(f{(x2-x1)*(y2-y1)}px)) # 显示标注后的图像 self.display_image(annotated_image) def export_results(self): 导出检测结果到CSV # 实现代码省略...4.3 界面优化技巧异步加载使用QThread避免检测过程中界面卡顿图像缩放实现鼠标滚轮缩放和拖拽查看细节主题定制通过QSS设置暗色主题保护用户视力多语言支持使用Qt Linguist实现中英文切换# 异步检测示例 from PyQt5.QtCore import QThread, pyqtSignal class DetectionThread(QThread): finished pyqtSignal(object) # 检测完成信号 def __init__(self, model, image): super().__init__() self.model model self.image image def run(self): results self.model(self.image) self.finished.emit(results) # 在主窗口中使用 def start_async_detection(self): if self.current_image is None: return # 显示加载状态 self.statusBar().showMessage(检测中...) # 创建并启动线程 self.thread DetectionThread(self.model, self.current_image) self.thread.finished.connect(self.on_detection_finished) self.thread.start() def on_detection_finished(self, results): # 更新界面 self.statusBar().showMessage(检测完成, 3000) # 处理结果...5. 系统部署与优化5.1 模型量化与加速为实现在边缘设备上的部署我们采用以下优化方案FP16量化减少模型体积和推理时间model.export(formatonnx, halfTrue) # 导出FP16 ONNX模型TensorRT加速提升NVIDIA GPU上的推理速度model.export(formatengine, device0) # 生成TensorRT引擎OpenVINO优化针对Intel CPU优化model.export(formatopenvino) # 导出OpenVINO格式5.2 性能测试结果在不同硬件平台上的性能对比硬件平台推理精度推理时间(ms)内存占用(MB)RTX 3090 (FP32)mAP0.50.8715.21420RTX 3090 (FP16)mAP0.50.868.7760Jetson Xavier NXmAP0.50.8442.5680Intel i7-12700KmAP0.50.8278.39205.3 实际应用建议田间部署方案使用Jetson AGX Orin作为边缘计算节点搭配500万像素以上的防抖摄像头采用太阳能供电系统检测时机选择最佳检测时间为清晨或傍晚避免强光直射和雨天拍摄维护与更新每月收集新样本进行增量训练每季度更新一次模型权重6. 常见问题与解决方案6.1 检测精度问题排查问题现象可能原因解决方案漏检小目标害虫图像分辨率不足增大imgsz(1280以上)误检背景噪点训练样本多样性不足增加背景变换增强类别混淆相似害虫样本不足针对性采集更多样本检测框偏移标注不准确检查并修正标注文件6.2 性能优化技巧模型层面使用更小的模型变体(yolov11n)减少输入尺寸(640x640)启用TensorRT加速代码层面使用多线程预处理实现检测结果缓存优化图像传输管道# 优化后的检测流水线 class OptimizedPipeline: def __init__(self, model_path): self.model YOLO(model_path) self.queue Queue(maxsize3) self.worker Thread(targetself._inference_worker) self.worker.daemon True self.worker.start() def _inference_worker(self): while True: img self.queue.get() results self.model(img) self.callback(results) def detect_async(self, image, callback): 异步检测接口 self.callback callback self.queue.put(image)6.3 实际应用中的挑战复杂背景干扰解决方案在训练数据中加入更多复杂背景样本技术手段使用注意力机制增强目标区域光照条件变化解决方案训练时应用更激进的颜色增强硬件方案使用带补光灯的摄像设备实时性要求优化方案实现区域检测而非全图检测架构设计采用检测跟踪混合策略我在实际部署中发现稻飞虱类害虫在清晨露水环境下检测效果最佳此时害虫活动较少且轮廓清晰。建议用户在早晨6-8点进行检测可获得最准确的结果。