使用YOLOv8训练农业害虫数据集,并创建一个可视化的界面来展示模型的性能和结果,经过以下几个步骤。从准备数据集、训练模型到集成可视化界面的全过程。
灯诱杀虫灯害虫数据集,常见农业害虫数据集。
数据集25378张jpeg图像,训练集12701、验证集5077 、测试集7600,手动标注,可用于害虫识别检测任务。
24类常见农业害虫:{ “0”: “棉铃虫”, “1”: “草地螟”, “2”: “东亚蟋蟀”, “3”: “三轮褐拟步甲”, “4”: “线虫沟”, “5”: “苔螟蛾”, “6”: “小壁虎”, “7”: “三叶草夜蛾”, “8”: “棉蚜虫”, “9”: “甘蓝夜蛾”, “10”: “大黑瓢虫”, “11”: “甜菜夜蛾”, “12”: “小菜蛾”, “13”: “平行隐翅虫”, “14”: “稻计划蝉”, “15”: “地虎”, “16”: “黄虎”, “17”: “八字虎”, “18”: “黑隐翅虫”, “19”: “稻纵卷叶螟”, “20”: “条纹稻螟”, “21”: “斜纹夜蛾”, “22”: “稻叶卷蛾”, “23”: “梅蛾” }
voc、yolo、coco格式,
使用YOLOv8训练农业害虫数据集,并创建一个可视化的界面来展示模型的性能和结果,经过以下几个步骤。从准备数据集、训练模型到集成可视化界面的全过程。
1. 数据集准备
假设您的数据集已经按照YOLO格式标注好,结构如下:
pest_detection/
├── images/
│ ├── train/
│ │ ├── img1.jpg
│ │ └── ...
│ ├── val/
│ │ ├── img1.jpg
│ │ └── ...
│ └── test/
│ ├── img1.jpg
│ └── ...
└── labels/
├── train/
│ ├── img1.txt
│ └── ...
├── val/
│ ├── img1.txt
│ └── ...
└── test/
├── img1.txt
└── ...
data_pest.yaml
data_pest.yaml
文件内容示例:
train: ./pest_detection/images/train/
val: ./pest_detection/images/val/
nc: 24 # 类别数量:棉铃虫, 草地螟, 东亚蟋蟀, ..., 梅蛾
names: ['棉铃虫', '草地螟', '东亚蟋蟀', '三轮褐拟步甲', '线虫沟', '苔螟蛾', '小壁虎', '三叶草夜蛾', '棉蚜虫', '甘蓝夜蛾', '大黑瓢虫', '甜菜夜蛾', '小菜蛾', '平行隐翅虫', '稻计划蝉', '地虎', '黄虎', '八字虎', '黑隐翅虫', '稻纵卷叶螟', '条纹稻螟', '斜纹夜蛾', '稻叶卷蛾', '梅蛾']
2. 安装依赖库
确保安装了必要的库:
pip install ultralytics opencv-python-headless PyQt5 tensorboard
3. 训练模型
使用YOLOv8进行训练。
训练脚本
from ultralytics import YOLO
def main_train():
# 加载预训练的YOLOv8n模型或从头开始定义模型
model = YOLO('yolov8n.yaml') # 或者直接加载预训练权重,如 'yolov8n.pt'
results = model.train(
data='./data_pest.yaml',
epochs=100, # 根据需要调整
imgsz=640,
batch=16,
project='./runs/detect',
name='pest_detection',
optimizer='SGD',
device='0', # 使用GPU编号
save=True,
cache=True,
verbose=True,
patience=10, # 提前停止的耐心值
lr0=0.01, # 初始学习率
lrf=0.1, # 最终学习率(相对于lr0的比例)
)
if __name__ == '__main__':
main_train()
4. 模型优化
在训练过程中,可以通过以下几种方式进行模型优化:
- 学习率调整:通过设置
lr0
和lrf
参数调整初始和最终的学习率。 - 提前停止:设置
patience
参数,当验证损失不再降低时提前停止训练。 - 数据增强:利用
augment
参数增加训练数据的多样性。 - 超参数调优:调整批次大小、优化器类型等超参数以提高模型性能。
5. 可视化界面
使用PyQt5设计用户界面,以便于测试和展示模型效果。
GUI设计
import sys
import cv2
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton, QVBoxLayout, QWidget, QFileDialog, QTextEdit
from PyQt5.QtGui import QPixmap
from ultralytics import YOLO
class PestDetectionApp(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("害虫检测系统")
self.setGeometry(100, 100, 800, 600)
self.initUI()
def initUI(self):
self.image_label = QLabel(self)
self.image_label.setGeometry(50, 50, 600, 400)
self.result_text = QTextEdit(self)
self.result_text.setGeometry(700, 50, 300, 400)
self.result_text.setReadOnly(True)
self.open_button = QPushButton('打开图片', self)
self.open_button.setGeometry(700, 500, 100, 30)
self.open_button.clicked.connect(self.open_image)
self.detect_button = QPushButton('检测', self)
self.detect_button.setGeometry(810, 500, 100, 30)
self.detect_button.clicked.connect(self.detect_objects)
self.save_button = QPushButton('保存', self)
self.save_button.setGeometry(920, 500, 100, 30)
self.save_button.clicked.connect(self.save_results)
def open_image(self):
options = QFileDialog.Options()
file_name, _ = QFileDialog.getOpenFileName(self, "选择图片", "", "Image Files (*.png *.jpg *.jpeg)", options=options)
if file_name:
self.image_path = file_name
self.load_image(file_name)
def load_image(self, file_name):
img = cv2.imread(file_name)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
h, w, ch = img.shape
bytes_per_line = ch * w
q_img = QImage(img.data, w, h, bytes_per_line, QImage.Format_RGB888)
pixmap = QPixmap.fromImage(q_img)
self.image_label.setPixmap(pixmap)
def detect_objects(self):
model = YOLO('./runs/detect/pest_detection/weights/best.pt')
results = model.predict(source=self.image_path)
img = cv2.imread(self.image_path)
for result in results:
boxes = result.boxes.numpy()
for box in boxes:
r = box.xyxy
x1, y1, x2, y2 = int(r[0]), int(r[1]), int(r[2]), int(r[3])
label_id = int(box.cls)
label = result.names[label_id]
confidence = box.conf
if confidence > 0.5: # 设置置信度阈值
cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) # 绘制矩形框
cv2.putText(img, f'{label} {confidence:.2f}', (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
self.result_text.append(f"{label}: {confidence:.2f}, ({x1}, {y1}), ({x2}, {y2})")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
h, w, ch = img.shape
bytes_per_line = ch * w
q_img = QImage(img.data, w, h, bytes_per_line, QImage.Format_RGB888)
pixmap = QPixmap.fromImage(q_img)
self.image_label.setPixmap(pixmap)
def save_results(self):
options = QFileDialog.Options()
file_name, _ = QFileDialog.getSaveFileName(self, "保存结果", "", "Text Files (*.txt)", options=options)
if file_name:
with open(file_name, 'w') as f:
f.write(self.result_text.toPlainText())
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = PestDetectionApp()
ex.show()
sys.exit(app.exec_())
6. 训练流程总结
- 数据集准备:确认数据集已按要求组织好,并创建
data_pest.yaml
。 - 安装依赖:通过提供的命令安装所需的Python库。
- 训练模型:运行训练脚本开始训练过程,并根据实际情况进行模型优化。
- GUI设计:使用上述代码设计用户界面,用于展示模型的预测结果。
- 集成模型:将训练好的模型集成到GUI中,实现图像上传、目标检测和结果保存功能。
构建一个完整的基于YOLOv8的害虫检测系统,包括模型训练、优化以及可视化界面的开发