基于YOLOv11的水稻害虫智能检测系统开发
📅 2026/7/4 14:33:39
👁️ 阅读次数
📝 编程学习
1. 水稻害虫检测项目概述
水稻作为全球最重要的粮食作物之一,其病虫害防治一直是农业生产中的关键环节。传统的人工巡查方式效率低下且容易遗漏,而基于深度学习的智能检测技术为解决这一问题提供了新的思路。本项目通过构建包含10类常见水稻害虫的数据集(3156张图像),结合YOLOv11目标检测模型和PyQt5图形界面,开发了一套完整的害虫检测系统。
这套系统在实际应用中能够实现以下核心功能:
- 实时检测田间拍摄的水稻害虫图像
- 准确识别并标注害虫种类和位置
- 统计检测结果并生成可视化报告
- 辅助农业工作者进行精准施药决策
提示:系统特别针对小目标害虫(如褐飞虱、稻叶蝉等)进行了优化,在保持较高检测速度的同时,平均精度(mAP@0.5)可达到85%以上。
2. 数据集构建与处理
2.1 数据集特性分析
本数据集包含3156张高质量水稻田间图像,涵盖10类主要害虫,采用YOLO和PASCAL VOC两种标注格式。各类别样本分布如下表所示:
| 害虫类别(中文) | 害虫类别(英文) | 标注数量 | 典型特征 |
|---|---|---|---|
| 亚洲稻螟 | Asiatic Rice Borer | 716 | 体长8-13mm,淡黄色带褐斑 |
| 褐飞虱 | Brown Plant Hopper | 577 | 体长3-4mm,褐色有翅 |
| 稻茎虫 | Paddy Stem Maggot | 104 | 白色幼虫,蛀食茎秆 |
| 稻瘿蚊 | Rice Gall Midge | 223 | 微小蚊虫,幼虫形成虫瘿 |
| 稻叶螟 | Rice Leaf Caterpillar | 187 | 绿色幼虫,啃食叶肉 |
| 稻叶蝉 | Rice Leaf Hopper | 294 | 体长3mm,浅绿色善跳 |
| 稻叶卷虫 | Rice Leaf Roller | 930 | 幼虫吐丝卷叶 |
| 稻水象甲 | Rice Water Weevil | 492 | 黑色甲虫,体长2-3mm |
| 小褐飞虱 | Small Brown Plant Hopper | 317 | 体长2mm,浅褐色 |
| 黄稻螟 | Yellow Rice Borer | 307 | 淡黄色,夜间活动 |
2.2 数据增强策略
针对样本分布不均衡的问题,我们采用以下增强策略:
- 对稀有类别(如稻茎虫)应用Mosaic增强,将4张图像拼接训练
- 使用MixUp增强,线性混合两张图像及其标签
- 调整HSV色彩空间参数(hsv_h=0.015,hsv_s=0.7,hsv_v=0.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( data='rice_pest.yaml', epochs=300, imgsz=1280, # 增大尺寸提升小目标检测 batch=16, patience=50, device=device, workers=8, optimizer='AdamW', lr0=0.001, weight_decay=0.0005, name='rice_pest_v11m' ) # 验证模型 metrics = model.val() print(f"mAP@0.5: {metrics.box.map:.3f}") return model if __name__ == '__main__': trained_model = train_model()注意:训练时建议使用至少16GB显存的GPU(如RTX 3090),当batch=16、imgsz=1280时,显存占用约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(i+1))) 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(format='onnx', half=True) # 导出FP16 ONNX模型 - TensorRT加速:提升NVIDIA GPU上的推理速度
model.export(format='engine', device=0) # 生成TensorRT引擎 - OpenVINO优化:针对Intel CPU优化
model.export(format='openvino') # 导出OpenVINO格式
5.2 性能测试结果
在不同硬件平台上的性能对比:
| 硬件平台 | 推理精度 | 推理时间(ms) | 内存占用(MB) |
|---|---|---|---|
| RTX 3090 (FP32) | mAP@0.5=0.87 | 15.2 | 1420 |
| RTX 3090 (FP16) | mAP@0.5=0.86 | 8.7 | 760 |
| Jetson Xavier NX | mAP@0.5=0.84 | 42.5 | 680 |
| Intel i7-12700K | mAP@0.5=0.82 | 78.3 | 920 |
5.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(maxsize=3) self.worker = Thread(target=self._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点进行检测,可获得最准确的结果。
编程学习
技术分享
实战经验