基于深度学习的稻田虫害检测系统(UI界面+YOLOv8/v7/v6/v5代码+训练数据集)
引言
在农业领域,稻田虫害检测是确保稻米产量和质量的重要环节。传统的人工检测方法效率低、成本高,而基于深度学习的自动化检测系统可以提高检测效率和准确性。本文将详细介绍如何构建一个基于深度学习的稻田虫害检测系统,包括环境搭建、数据收集与处理、模型训练、系统实现以及用户界面设计,并提供实际的代码示例。
系统概述
本系统的实现步骤包括:
- 环境搭建
- 数据收集与处理
- 模型训练
- 系统实现
- 用户界面设计
环境搭建
首先,需要搭建一个适合深度学习开发的环境。本文使用Python 3.8或以上版本,并依赖于多个深度学习和图像处理库。
安装必要的库
使用以下命令安装所需库:
pip install numpy pandas matplotlib opencv-python torch torchvision ultralytics pyqt5
数据收集与处理
数据收集
收集包含稻田虫害的图像和视频数据集。可以使用公开的数据集,如PestMonitor Dataset,或者通过实地拍摄获取。确保数据集包含各种不同虫害类型和不同生长阶段的图像。
数据处理
将图像数据整理到指定的文件夹结构,并标注虫害的位置。以下是示例的文件夹结构:
datasets/ ├── images/ │ ├── train/ │ │ ├── image1.jpg │ │ ├── image2.jpg │ ├── val/ │ │ ├── image1.jpg │ │ ├── image2.jpg ├── labels/ ├── train/ │ ├── image1.txt │ ├── image2.txt ├── val/ ├── image1.txt ├── image2.txt
每个标签文件的内容如下:
class x_center y_center width height
其中,class
表示类别编号(如稻飞虱、螟虫等),x_center
、y_center
为归一化后的中心坐标,width
和height
为归一化后的宽度和高度。
数据增强
为了提高模型的泛化能力,可以对数据进行增强处理。常见的数据增强方法包括旋转、缩放、平移、镜像等。
import albumentations as A from albumentations.pytorch import ToTensorV2 import cv2 import os # 定义数据增强变换 transform = A.Compose([ A.RandomRotate90(), A.Flip(), A.Transpose(), A.OneOf([ A.IAAAdditiveGaussianNoise(), A.GaussNoise(), ], p=0.2), A.OneOf([ A.MotionBlur(p=0.2), A.MedianBlur(blur_limit=3, p=0.1), A.Blur(blur_limit=3, p=0.1), ], p=0.2), A.ShiftScaleRotate(shift_limit=0.0625, scale_limit=0.2, rotate_limit=45, p=0.2), A.OneOf([ A.OpticalDistortion(p=0.3), A.GridDistortion(p=0.1), A.IAAPiecewiseAffine(p=0.3), ], p=0.2), A.OneOf([ A.CLAHE(clip_limit=2), A.IAASharpen(), A.IAAEmboss(), A.RandomBrightnessContrast(), ], p=0.3), A.HueSaturationValue(p=0.3), ToTensorV2() ]) # 处理图像 def augment_images(image_folder, output_folder): os.makedirs(output_folder, exist_ok=True) for filename in os.listdir(image_folder): image_path = os.path.join(image_folder, filename) image = cv2.imread(image_path) augmented = transform(image=image) augmented_image = augmented["image"].numpy().transpose(1, 2, 0) output_path = os.path.join(output_folder, filename) cv2.imwrite(output_path, augmented_image) # 应用数据增强 augment_images('datasets/images/train', 'datasets/images/train_augmented')
模型训练
使用YOLO模型进行训练。
配置文件
创建一个配置文件config.yaml
:
path: datasets train: images/train val: images/val test: images/test nc: 5 # 类别数,例如5种常见的稻田虫害 names: ['rice_leaf_folder', 'rice_hispa', 'brown_plant_hopper', 'white_backed_plant_hopper', 'rice_stem_borer'] # 类别名称
训练代码
使用以下代码训练模型:
from ultralytics import YOLO # 加载模型 model = YOLO('yolov8n.pt') # 训练模型 model.train(data='config.yaml', epochs=50, imgsz=640, batch=16, lr0=0.01)
训练过程会生成模型权重文件best.pt
,该文件包含了训练好的模型参数。
系统实现
训练好的模型可以用于实时稻田虫害检测。使用OpenCV读取视频流,并调用YOLO模型进行检测。
检测代码
import cv2 from ultralytics import YOLO # 加载训练好的模型 model = YOLO('best.pt') # 打开视频流 cap = cv2.VideoCapture('rice_field_video.mp4') while cap.isOpened(): ret, frame = cap.read() if not ret: break # 检测虫害 results = model(frame) for result in results: bbox = result['bbox'] label = result['label'] confidence = result['confidence'] # 画框和标签 cv2.rectangle(frame, (bbox[0], bbox[1]), (bbox[2], bbox[3]), (0, 255, 0), 2) cv2.putText(frame, f'{label} {confidence:.2f}', (bbox[0], bbox[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2) # 显示结果 cv2.imshow('Rice Field Pest Detection', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
用户界面设计
为了提高系统的易用性,我们设计了一个用户友好的界面。使用PyQt5实现用户界面,提供图像或视频播放和检测结果显示。
界面代码
以下是一个简单的PyQt5界面代码示例:
import sys from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QPushButton, QFileDialog from PyQt5.QtGui import QPixmap, QImage import cv2 from ultralytics import YOLO class PestDetectionUI(QWidget): def __init__(self): super().__init__() self.initUI() self.model = YOLO('best.pt') def initUI(self): self.setWindowTitle('Pest Detection System') self.layout = QVBoxLayout() self.label = QLabel(self) self.layout.addWidget(self.label) self.button = QPushButton('Open Image or Video', self) self.button.clicked.connect(self.open_file) self.layout.addWidget(self.button) self.setLayout(self.layout) def open_file(self): options = QFileDialog.Options() file_path, _ = QFileDialog.getOpenFileName(self, "Open File", "", "All Files (*);;MP4 Files (*.mp4);;JPEG Files (*.jpg);;PNG Files (*.png)", options=options) if file_path: if file_path.endswith('.mp4'): self.detect_pest_video(file_path) else: self.detect_pest_image(file_path) def detect_pest_image(self, file_path): frame = cv2.imread(file_path) results = self.model(frame) for result in results: bbox = result['bbox'] label = result['label'] confidence = result['confidence'] cv2.rectangle(frame, (bbox[0], bbox[1]), (bbox[2], bbox[3]), (0, 255, 0), 2) cv2.putText(frame, f'{label} {confidence:.2f}', (bbox[0], bbox[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2) height, width, channel = frame.shape bytesPerLine = 3 * width qImg = QImage(frame.data, width, height, bytesPerLine, QImage.Format_RGB888).rgbSwapped() self.label.setPixmap(QPixmap.fromImage(qImg)) def detect_pest_video(self, file_path): cap = cv2.VideoCapture(file_path) while cap.isOpened(): ret, frame = cap.read() if not ret: break results = self.model(frame) for result in results: bbox = result['bbox'] label = result['label'] confidence = result['confidence'] cv2.rectangle(frame, (bbox[0], bbox[1]), (bbox[2], bbox[3]), (0, 255, 0), 2) cv2.putText(frame, f'{label} {confidence:.2f}', (bbox[0], bbox[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2) height, width, channel = frame.shape bytesPerLine = 3 * width qImg = QImage(frame.data, width, height, bytesPerLine, QImage.Format_RGB888).rgbSwapped() self.label.setPixmap(QPixmap.fromImage(qImg)) QApplication.processEvents() cap.release() if __name__ == '__main__': app = QApplication(sys.argv) ex = PestDetectionUI() ex.show() sys.exit(app.exec_())
总结
本文详细介绍了如何构建一个基于深度学习的稻田虫害检测系统,从环境搭建、数据收集与处理、模型训练、系统实现到用户界面设计。这不仅有助于提高农业生产效率,还可以为农作物病虫害防治提供有力支持。
基于深度学习的稻田虫害检测系统(UI界面+YOLOv8/v7/v6/v5代码+训练数据集)
引言
在农业领域,稻田虫害检测是确保稻米产量和质量的重要环节。传统的人工检测方法效率低、成本高,而基于深度学习的自动化检测系统可以提高检测效率和准确性。本文将详细介绍如何构建一个基于深度学习的稻田虫害检测系统,包括环境搭建、数据收集与处理、模型训练、系统实现以及用户界面设计,并提供实际的代码示例。
系统概述
本系统的实现步骤包括:
- 环境搭建
- 数据收集与处理
- 模型训练
- 系统实现
- 用户界面设计
环境搭建
首先,需要搭建一个适合深度学习开发的环境。本文使用Python 3.8或以上版本,并依赖于多个深度学习和图像处理库。
安装必要的库
使用以下命令安装所需库:
pip install numpy pandas matplotlib opencv-python torch torchvision ultralytics pyqt5
数据收集与处理
数据收集
收集包含稻田虫害的图像和视频数据集。可以使用公开的数据集,如PestMonitor Dataset,或者通过实地拍摄获取。确保数据集包含各种不同虫害类型和不同生长阶段的图像。
数据处理
将图像数据整理到指定的文件夹结构,并标注虫害的位置。以下是示例的文件夹结构:
datasets/ ├── images/ │ ├── train/ │ │ ├── image1.jpg │ │ ├── image2.jpg │ ├── val/ │ │ ├── image1.jpg │ │ ├── image2.jpg ├── labels/ ├── train/ │ ├── image1.txt │ ├── image2.txt ├── val/ ├── image1.txt ├── image2.txt
每个标签文件的内容如下:
class x_center y_center width height
其中,class
表示类别编号(如稻飞虱、螟虫等),x_center
、y_center
为归一化后的中心坐标,width
和height
为归一化后的宽度和高度。
数据增强
为了提高模型的泛化能力,可以对数据进行增强处理。常见的数据增强方法包括旋转、缩放、平移、镜像等。
import albumentations as A from albumentations.pytorch import ToTensorV2 import cv2 import os # 定义数据增强变换 transform = A.Compose([ A.RandomRotate90(), A.Flip(), A.Transpose(), A.OneOf([ A.IAAAdditiveGaussianNoise(), A.GaussNoise(), ], p=0.2), A.OneOf([ A.MotionBlur(p=0.2), A.MedianBlur(blur_limit=3, p=0.1), A.Blur(blur_limit=3, p=0.1), ], p=0.2), A.ShiftScaleRotate(shift_limit=0.0625, scale_limit=0.2, rotate_limit=45, p=0.2), A.OneOf([ A.OpticalDistortion(p=0.3), A.GridDistortion(p=0.1), A.IAAPiecewiseAffine(p=0.3), ], p=0.2), A.OneOf([ A.CLAHE(clip_limit=2), A.IAASharpen(), A.IAAEmboss(), A.RandomBrightnessContrast(), ], p=0.3), A.HueSaturationValue(p=0.3), ToTensorV2() ]) # 处理图像 def augment_images(image_folder, output_folder): os.makedirs(output_folder, exist_ok=True) for filename in os.listdir(image_folder): image_path = os.path.join(image_folder, filename) image = cv2.imread(image_path) augmented = transform(image=image) augmented_image = augmented["image"].numpy().transpose(1, 2, 0) output_path = os.path.join(output_folder, filename) cv2.imwrite(output_path, augmented_image) # 应用数据增强 augment_images('datasets/images/train', 'datasets/images/train_augmented')
模型训练
使用YOLO模型进行训练。
配置文件
创建一个配置文件config.yaml
:
path: datasets train: images/train val: images/val test: images/test nc: 5 # 类别数,例如5种常见的稻田虫害 names: ['rice_leaf_folder', 'rice_hispa', 'brown_plant_hopper', 'white_backed_plant_hopper', 'rice_stem_borer'] # 类别名称
训练代码
使用以下代码训练模型:
from ultralytics import YOLO # 加载模型 model = YOLO('yolov8n.pt') # 训练模型 model.train(data='config.yaml', epochs=50, imgsz=640, batch=16, lr0=0.01)
训练过程会生成模型权重文件best.pt
,该文件包含了训练好的模型参数。
系统实现
训练好的模型可以用于实时稻田虫害检测。使用OpenCV读取视频流,并调用YOLO模型进行检测。
检测代码
import cv2 from ultralytics import YOLO # 加载训练好的模型 model = YOLO('best.pt') # 打开视频流 cap = cv2.VideoCapture('rice_field_video.mp4') while cap.isOpened(): ret, frame = cap.read() if not ret: break # 检测虫害 results = model(frame) for result in results: bbox = result['bbox'] label = result['label'] confidence = result['confidence'] # 画框和标签 cv2.rectangle(frame, (bbox[0], bbox[1]), (bbox[2], bbox[3]), (0, 255, 0), 2) cv2.putText(frame, f'{label} {confidence:.2f}', (bbox[0], bbox[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2) # 显示结果 cv2.imshow('Rice Field Pest Detection', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
用户界面设计
为了提高系统的易用性,我们设计了一个用户友好的界面。使用PyQt5实现用户界面,提供图像或视频播放和检测结果显示。
界面代码
以下是一个简单的PyQt5界面代码示例:
import sys from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QPushButton, QFileDialog from PyQt5.QtGui import QPixmap, QImage import cv2 from ultralytics import YOLO class PestDetectionUI(QWidget): def __init__(self): super().__init__() self.initUI() self.model = YOLO('best.pt') def initUI(self): self.setWindowTitle('Pest Detection System') self.layout = QVBoxLayout() self.label = QLabel(self) self.layout.addWidget(self.label) self.button = QPushButton('Open Image or Video', self) self.button.clicked.connect(self.open_file) self.layout.addWidget(self.button) self.setLayout(self.layout) def open_file(self): options = QFileDialog.Options() file_path, _ = QFileDialog.getOpenFileName(self, "Open File", "", "All Files (*);;MP4 Files (*.mp4);;JPEG Files (*.jpg);;PNG Files (*.png)", options=options) if file_path: if file_path.endswith('.mp4'): self.detect_pest_video(file_path) else: self.detect_pest_image(file_path) def detect_pest_image(self, file_path): frame = cv2.imread(file_path) results = self.model(frame) for result in results: bbox = result['bbox'] label = result['label'] confidence = result['confidence'] cv2.rectangle(frame, (bbox[0], bbox[1]), (bbox[2], bbox[3]), (0, 255, 0), 2) cv2.putText(frame, f'{label} {confidence:.2f}', (bbox[0], bbox[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2) height, width, channel = frame.shape bytesPerLine = 3 * width qImg = QImage(frame.data, width, height, bytesPerLine, QImage.Format_RGB888).rgbSwapped() self.label.setPixmap(QPixmap.fromImage(qImg)) def detect_pest_video(self, file_path): cap = cv2.VideoCapture(file_path) while cap.isOpened(): ret, frame = cap.read() if not ret: break results = self.model(frame) for result in results: bbox = result['bbox'] label = result['label'] confidence = result['confidence'] cv2.rectangle(frame, (bbox[0], bbox[1]), (bbox[2], bbox[3]), (0, 255, 0), 2) cv2.putText(frame, f'{label} {confidence:.2f}', (bbox[0], bbox[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2) height, width, channel = frame.shape bytesPerLine = 3 * width qImg = QImage(frame.data, width, height, bytesPerLine, QImage.Format_RGB888).rgbSwapped() self.label.setPixmap(QPixmap.fromImage(qImg)) QApplication.processEvents() cap.release() if __name__ == '__main__': app = QApplication(sys.argv) ex = PestDetectionUI() ex.show() sys.exit(app.exec_())
总结
本文详细介绍了如何构建一个基于深度学习的稻田虫害检测系统,从环境搭建、数据收集与处理、模型训练、系统实现到用户界面设计。通过提供详细的步骤和代码示例,读者可以轻松地实现自己的检测系统。这不仅有助于提高农业生产效率,还可以为农作物病虫害防治提供有力支持。