深度学习目标检测中_构建一个完整的基于YOLOv8的棉花病虫害检测系统,包括数据集准备、环境部署、模型使用、界面设计以及功能实现

基于YOLOV8的棉花病虫害检测系统 基于深度学习的棉花病虫害检测系统

在这里插入图片描述

运行效果见图像
项目介绍:
软件:Pycharm+Anaconda
环境:python=3.9 opencv-python PyQt5 torch1.9
文件:
1.完整程序文件(.py等
2.UI界面源文件、图标(.ui、.qrc、.py等)
3.测试图片、视频文件(.jpeg、.mp4、.avi等)在这里插入图片描述

病虫害种类一共分为6类[“叶斑病”, ‘卷叶病’, ‘红斑病’, “细菌性枯萎病”, ‘叶部病害’, ‘除草剂’]在这里插入图片描述

功能: 系统可用于棉花病虫害检测; 支持图片、视频及摄像头进行检测,同时支持图片的批量检测: 界面可实时显示目标位置、目标总数、置信度、用时等信息: 支持图片或者视频的检测结果保存;
①选择图片进行对于棉花病虫害检测。
①选择文件夹批量进行对于棉花病虫害检测。
②选择视频进行对于棉花病虫害检测。
③摄像头进行检测对于棉花病虫害检测。在这里插入图片描述申明:文章所有代码仅供参考!


建一个基于YOLOv8的棉花病虫害检测系统。以下是详细的步骤和代码示例,包括项目结构、环境部署、模型使用、界面设计以及功能实

***现。

项目介绍

环境配置
  • 软件: PyCharm + Anaconda
  • 环境: Python=3.9, OpenCV-Python, PyQt5, Torch=1.9
文件结构
cotton_disease_detection/
├── src/
│   ├── main.py
│   ├── ui_mainwindow.py
│   ├── resources.qrc
│   ├── resources_rc.py
│   └── utils.py
├── data/
│   ├── test_images/
│   │   ├── image1.jpeg
│   │   ├── image2.jpeg
│   │   └── ...
│   ├── test_videos/
│       ├── video1.mp4
│       ├── video2.avi
│       └── ...
├── models/
│   └── best.pt
└── README.md

环境部署说明

首先,确保你已经安装了必要的库。以下是详细的环境部署步骤:

安装依赖
# 创建虚拟环境(可选)
conda create -n cotton_env python=3.9
conda activate cotton_env

# 安装PyTorch
pip install torch==1.9 torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu111

# 安装其他依赖
pip install opencv-python pyqt5 ultralytics

UI界面设计

我们将使用Qt Designer设计一个简单的GUI界面来进行模型预测。假设你已经有一个 .ui 文件,并且已经将其转换为 .py 文件。

ui_mainwindow.uiresources.qrc

你可以使用 Qt Designer 创建 ui_mainwindow.ui 文件,并将资源文件打包成 resources.qrc。然后使用 pyrcc5 将其转换为 resources_rc.py

pyrcc5 resources.qrc -o resources_rc.py
ui_mainwindow.py

假设你已经使用 pyuic5ui_mainwindow.ui 转换为 ui_mainwindow.py

pyuic5 ui_mainwindow.ui -o ui_mainwindow.py

主程序文件 main.py

这是主程序文件,负责加载UI、处理用户输入并调用模型进行预测。

[<title="Main Program for Cotton Disease Detection">]
import sys
import cv2
import numpy as np
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton, QVBoxLayout, QWidget, QFileDialog, QMessageBox, QProgressBar, QTextEdit
from PyQt5.QtGui import QImage, QPixmap
from PyQt5.QtCore import QTimer
from ultralytics import YOLO
from ui_mainwindow import Ui_MainWindow

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.setWindowTitle("Cotton Disease Detection")
        self.setGeometry(100, 100, 800, 600)

        self.model = YOLO('models/best.pt')
        self.cap = None
        self.timer = QTimer()

        self.ui.pushButton_image.clicked.connect(self.open_image)
        self.ui.pushButton_folder.clicked.connect(self.open_folder)
        self.ui.pushButton_video.clicked.connect(self.open_video)
        self.ui.pushButton_camera.clicked.connect(self.start_camera)
        self.ui.pushButton_stop.clicked.connect(self.stop_camera)

    def open_image(self):
        options = QFileDialog.Options()
        file_name, _ = QFileDialog.getOpenFileName(self, "QFileDialog.getOpenFileName()", "", "Images (*.jpeg *.jpg);;All Files (*)", options=options)
        if file_name:
            self.process_image(file_name)

    def process_image(self, file_name):
        img = cv2.imread(file_name)  # BGR
        assert img is not None, f'Image Not Found {file_name}'

        results = self.model(img, stream=True)

        for result in results:
            boxes = result.boxes.cpu().numpy()
            for box in boxes:
                r = box.xyxy[0].astype(int)
                cls = int(box.cls[0])
                conf = box.conf[0]
                label = f'{self.model.names[cls]} {conf:.2f}'
                color = (0, 255, 0)  # Green
                cv2.rectangle(img, r[:2], r[2:], color, 2)
                cv2.putText(img, label, (r[0], r[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, color, 2)

        rgb_image = cv2.cvtColor(img, 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)
        pixmap = QPixmap.fromImage(qt_image)
        self.ui.label_display.setPixmap(pixmap.scaled(800, 600))

    def open_folder(self):
        folder_name = QFileDialog.getExistingDirectory(self, "Select Folder")
        if folder_name:
            for filename in os.listdir(folder_name):
                if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
                    file_path = os.path.join(folder_name, filename)
                    self.process_image(file_path)

    def open_video(self):
        options = QFileDialog.Options()
        file_name, _ = QFileDialog.getOpenFileName(self, "QFileDialog.getOpenFileName()", "", "Videos (*.mp4 *.avi);;All Files (*)", options=options)
        if file_name:
            self.cap = cv2.VideoCapture(file_name)
            self.timer.timeout.connect(self.process_frame)
            self.timer.start(30)  # Process frame every 30 ms

    def start_camera(self):
        self.cap = cv2.VideoCapture(0)
        self.timer.timeout.connect(self.process_frame)
        self.timer.start(30)  # Process frame every 30 ms

    def stop_camera(self):
        if self.cap is not None:
            self.cap.release()
            self.cap = None
            self.timer.stop()

    def process_frame(self):
        if self.cap is not None:
            ret, frame = self.cap.read()
            if ret:
                results = self.model(frame, stream=True)

                for result in results:
                    boxes = result.boxes.cpu().numpy()
                    for box in boxes:
                        r = box.xyxy[0].astype(int)
                        cls = int(box.cls[0])
                        conf = box.conf[0]
                        label = f'{self.model.names[cls]} {conf:.2f}'
                        color = (0, 255, 0)  # Green
                        cv2.rectangle(frame, r[:2], r[2:], color, 2)
                        cv2.putText(frame, label, (r[0], r[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, color, 2)

                rgb_image = cv2.cvtColor(frame, 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)
                pixmap = QPixmap.fromImage(qt_image)
                self.ui.label_display.setPixmap(pixmap.scaled(800, 600))
            else:
                self.cap.release()
                self.cap = None
                self.timer.stop()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

辅助工具文件 utils.py

这个文件可以用来存放一些辅助函数,比如保存结果等。

[<title="Utility Functions for Cotton Disease Detection">]
import cv2
import os

def save_results(image, detections, output_dir, filename):
    for det in detections:
        r = det['bbox']
        cls = det['class']
        conf = det['confidence']
        label = f'{cls} {conf:.2f}'
        color = (0, 255, 0)  # Green
        cv2.rectangle(image, (int(r[0]), int(r[1])), (int(r[2]), int(r[3])), color, 2)
        cv2.putText(image, label, (int(r[0]), int(r[1]) - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, color, 2)
    
    output_path = os.path.join(output_dir, filename)
    cv2.imwrite(output_path, image)

界面设计文件 ui_mainwindow.py

假设你已经使用 pyuic5ui_mainwindow.ui 转换为 ui_mainwindow.py。这里提供一个简化的示例。

[<title="Generated UI Code from ui_mainwindow.ui">]
from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.label_display = QtWidgets.QLabel(self.centralwidget)
        self.label_display.setText("")
        self.label_display.setObjectName("label_display")
        self.verticalLayout.addWidget(self.label_display)
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.pushButton_image = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_image.setObjectName("pushButton_image")
        self.horizontalLayout.addWidget(self.pushButton_image)
        self.pushButton_folder = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_folder.setObjectName("pushButton_folder")
        self.horizontalLayout.addWidget(self.pushButton_folder)
        self.pushButton_video = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_video.setObjectName("pushButton_video")
        self.horizontalLayout.addWidget(self.pushButton_video)
        self.pushButton_camera = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_camera.setObjectName("pushButton_camera")
        self.horizontalLayout.addWidget(self.pushButton_camera)
        self.pushButton_stop = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_stop.setObjectName("pushButton_stop")
        self.horizontalLayout.addWidget(self.pushButton_stop)
        self.verticalLayout.addLayout(self.horizontalLayout)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton_image.setText(_translate("MainWindow", "Open Image"))
        self.pushButton_folder.setText(_translate("MainWindow", "Open Folder"))
        self.pushButton_video.setText(_translate("MainWindow", "Open Video"))
        self.pushButton_camera.setText(_translate("MainWindow", "Start Camera"))
        self.pushButton_stop.setText(_translate("MainWindow", "Stop Camera"))

资源文件 resources.qrcresources_rc.py

假设你已经创建了一个 resources.qrc 文件,并使用 pyrcc5 转换为 resources_rc.py

<RCC>
    <qresource prefix="/">
        <file>icons/icon.png</file>
    </qresource>
</RCC>

运行效果展示

假设你已经有了运行效果的图像,可以在 README.md 中添加这些图像以供参考。

# Cotton Disease Detection System

## Overview
This project provides a deep learning-based system for detecting various diseases in cotton plants using YOLOv8.

## Environment Setup
- Software: PyCharm + Anaconda
- Environment: Python=3.9, OpenCV-Python, PyQt5, Torch=1.9

## Features
- Detects 6 types of cotton diseases: ["叶斑病", '卷叶病', '红斑病', "细菌性枯萎病", '叶部病害', '除草剂']
- Supports detection on images, videos, and live camera feed.
- Batch processing of images.
- Real-time display of detected objects with confidence scores and bounding boxes.
- Saving detection results.

## Usage
1. Run the program.
2. Choose an option to detect diseases in images, folders, videos, or via the camera.

## Screenshots
![Example Screenshot](data/screenshots/example_screenshot.png)

总结

构建一个完整的基于YOLOv8的棉花病虫害检测系统,包括数据集准备、环境部署、模型使用、界面设计以及功能实现。以下是所有相关的代码文件:

  1. 主程序文件 (main.py)
  2. UI界面源文件 (ui_mainwindow.py)
  3. 资源文件 (resources.qrc, resources_rc.py)
  4. 测试图片、视频文件 (data/test_images/*.jpeg, data/test_videos/*.mp4)
  5. 模型文件 (models/best.pt)
  6. 辅助工具文件 (utils.py)
  7. 文档 (README.md)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值