基于yolov5_7.0 pyside6 active_learning 开发的人工智能主动学习外周血细胞目标检测系统

基于YOLOv5的图像识别与主动学习应用程序

项目介绍

本项目是一个使用PySide6库开发的基于YOLOv5框架的图像识别应用程序。该应用程序不仅支持用户选择图像文件进行目标物体检测,还具备主动学习功能,允许用户手动标记错误的检测结果以优化模型。此外,应用程序支持切换不同的预训练模型,从而扩展了其应用范围。目前,主要使用的模型是biology.pt,这是一个通过YOLOv5框架和主动学习技术训练出来的外周血细胞检测模型,精度达到0.8,表现优秀。
在这里插入图片描述

运行环境

  • Python 3.12
  • OpenCV
  • Ultralytics YOLOv5
  • PySide6 (用于GUI开发)
  • 其他依赖项:请参考requirements.txt

安装依赖包:

pip install -r requirements.txt

运行方法

直接运行MainQt.py即可启动应用程序:

python MainQt.py

项目截图

(此处应插入项目界面截图)

功能区介绍

启动按钮 (Start Button)

  • 按钮名称: start_button
  • 功能: 用于启动某个过程或程序。

图片上传按钮 (Upload Image Button)

  • 按钮名称: upload_image_button
  • 功能: 允许用户上传图片文件,以便进行目标检测。

模型上传按钮 (Upload PT Button)

  • 按钮名称: upload_pt_button
  • 功能: 用于上传模型文件,通常是PyTorch模型文件(如.pt文件)。默认情况下,系统会加载data/models/biology.pt模型,但用户也可以上传其他YOLOv5模型文件,例如yolov5m.pt,以支持对其他目标的识别。
    在这里插入图片描述

运行标签按钮 (Label Run Button)

  • 按钮名称: labelrun_button
  • 功能: 用于启动一个标记或分类过程。在本项目中,这个按钮可以用来显示当前模型对图片的检测结果。

主动学习运行按钮 (Active Run Button)

  • 按钮名称: activeRun_button
  • 功能: 用于激活或开始一个实时运行的过程。在这个过程中,用户可以看到模型的实时检测结果,并有机会手动修正错误的检测结果。

主动学习训练按钮 (Active Train Button)

  • 按钮名称: activeTrain_button
  • 功能: 用于启动模型的活跃训练阶段。用户可以通过手动标记的数据来进一步训练模型,提高其准确性和泛化能力。

导出模型按钮 (Export Button)

  • 按钮名称: export_button
  • 功能: 用于导出经过训练后的模型到文件。用户可以保存新的模型权重,以便在未来使用。

停止进程按钮 (Stop Button)

  • 按钮名称: stop_button
  • 功能: 用于停止当前运行的过程,无论是检测、训练还是其他任务。

关闭窗口按钮 (Close Button)

  • 按钮名称: close_button
  • 功能: 用于关闭应用程序或当前窗口。

代码实现

ui.py

ui.py文件定义了应用程序的用户界面。它使用PySide6库创建了一个主窗口,并设置了各个功能按钮及其布局。以下是ui.py的基本结构:

import sys
from PySide6.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QFileDialog, QLabel
from PySide6.QtGui import QPixmap
from PySide6.QtCore import Qt

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        
        self.setWindowTitle("YOLOv5 Image Recognition with Active Learning")
        self.setGeometry(100, 100, 800, 600)
        
        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)
        
        self.layout = QVBoxLayout()
        self.central_widget.setLayout(self.layout)
        
        # 创建按钮
        self.start_button = QPushButton("Start", self)
        self.upload_image_button = QPushButton("Upload Image", self)
        self.upload_pt_button = QPushButton("Upload PT", self)
        self.labelrun_button = QPushButton("Label Run", self)
        self.activeRun_button = QPushButton("Active Run", self)
        self.activeTrain_button = QPushButton("Active Train", self)
        self.export_button = QPushButton("Export Model", self)
        self.stop_button = QPushButton("Stop", self)
        self.close_button = QPushButton("Close", self)
        
        # 添加按钮到布局
        self.layout.addWidget(self.start_button)
        self.layout.addWidget(self.upload_image_button)
        self.layout.addWidget(self.upload_pt_button)
        self.layout.addWidget(self.labelrun_button)
        self.layout.addWidget(self.activeRun_button)
        self.layout.addWidget(self.activeTrain_button)
        self.layout.addWidget(self.export_button)
        self.layout.addWidget(self.stop_button)
        self.layout.addWidget(self.close_button)
        
        # 连接按钮信号到槽函数
        self.upload_image_button.clicked.connect(self.upload_image)
        self.upload_pt_button.clicked.connect(self.upload_model)
        self.close_button.clicked.connect(self.close)
        
        # 图像显示区域
        self.image_label = QLabel(self)
        self.image_label.setAlignment(Qt.AlignCenter)
        self.layout.addWidget(self.image_label)
    
    def upload_image(self):
        file_dialog = QFileDialog.getOpenFileName(self, "Select Image", "", "Image Files (*.png *.jpg *.jpeg)")
        if file_dialog[0]:
            self.image_path = file_dialog[0]
            pixmap = QPixmap(self.image_path)
            self.image_label.setPixmap(pixmap.scaled(self.image_label.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation))
    
    def upload_model(self):
        file_dialog = QFileDialog.getOpenFileName(self, "Select Model", "", "Model Files (*.pt)")
        if file_dialog[0]:
            self.model_path = file_dialog[0]
            print(f"Model uploaded: {self.model_path}")

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

MainQt.py

MainQt.py文件是应用程序的主入口点,负责初始化UI并处理各种逻辑操作。以下是MainQt.py的基本结构:

import sys
from ui import MainWindow
from ultralytics import YOLO
import cv2
import numpy as np
from PySide6.QtGui import QImage, QPixmap

class MainApp(MainWindow):
    def __init__(self):
        super().__init__()
        
        # 默认模型路径
        self.model_path = 'data/models/biology.pt'
        self.model = YOLO(self.model_path)
        
        # 连接按钮信号到槽函数
        self.start_button.clicked.connect(self.start_process)
        self.labelrun_button.clicked.connect(self.run_label)
        self.activeRun_button.clicked.connect(self.run_active)
        self.activeTrain_button.clicked.connect(self.train_active)
        self.export_button.clicked.connect(self.export_model)
        self.stop_button.clicked.connect(self.stop_process)
    
    def start_process(self):
        # 启动某个过程或程序
        print("Process started")
    
    def run_label(self):
        # 显示当前模型对图片的检测结果
        if hasattr(self, 'image_path'):
            results = self.model.predict(source=self.image_path)
            for result in results:
                boxes = result.boxes.xyxy.cpu().numpy()
                scores = result.boxes.conf.cpu().numpy()
                classes = result.boxes.cls.cpu().numpy()
                
                img = cv2.imread(self.image_path)
                for box, score, cls in zip(boxes, scores, classes):
                    x1, y1, x2, y2 = map(int, box)
                    cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
                    label = f"{result.names[int(cls)]} {score:.2f}"
                    cv2.putText(img, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
                
                # 将OpenCV图像转换为QImage
                h, w, ch = img.shape
                bytes_per_line = ch * w
                q_img = QImage(img.data, w, h, bytes_per_line, QImage.Format_RGB888).rgbSwapped()
                pixmap = QPixmap.fromImage(q_img)
                self.image_label.setPixmap(pixmap.scaled(self.image_label.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation))
    
    def run_active(self):
        # 启动主动学习过程
        print("Active learning process started")
    
    def train_active(self):
        # 启动主动学习训练
        print("Active training started")
    
    def export_model(self):
        # 导出模型
        print("Model exported")
    
    def stop_process(self):
        # 停止当前运行的过程
        print("Process stopped")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    main_app = MainApp()
    main_app.show()
    sys.exit(app.exec())

项目运行介绍

项目启动

  1. 确保已经安装了所有依赖项。
  2. 打开终端,导航到项目目录。
  3. 运行以下命令启动应用程序:
    python MainQt.py
    

使用说明

  1. 上传图片:点击“Upload Image”按钮,选择一张图片文件进行上传。上传后,图片将显示在界面上。
  2. 上传模型:点击“Upload PT”按钮,可以选择上传一个新的YOLOv5模型文件。默认情况下,系统会加载data/models/biology.pt模型。
  3. 运行标签:点击“Label Run”按钮,系统将使用当前加载的模型对上传的图片进行检测,并在界面上显示检测结果。
  4. 主动学习:点击“Active Run”按钮,启动主动学习过程。用户可以手动标记错误的检测结果。
  5. 主动学习训练:点击“Active Train”按钮,启动主动学习训练过程。用户可以通过手动标记的数据来优化模型。
  6. 导出模型:点击“Export Model”按钮,可以将经过训练后的模型导出到文件。
  7. 停止进程:点击“Stop”按钮,可以停止当前运行的过程。
  8. 关闭窗口:点击“Close”按钮,关闭应用程序。

注意事项

  • 目前摄像头功能尚未开发好,只能识别图片。
  • 对于视频识别,可以使用原生YOLOv5代码进行检测,但在Qt中实现可能会较慢,暂未考虑实现视频识别模块。
  • biology.pt模型是用商业数据训练出来的,暂不对外开放。对于一般的课设作业,可以删除run, label, train, export停止进程按钮,仅保留基本的图片检测功能。

总结

本项目提供了一个基于YOLOv5的图像识别与主动学习应用程序,用户可以通过该应用程序轻松地进行目标检测,并通过主动学习优化模型。虽然目前只支持图片检测,但其灵活性和可扩展性使其成为一个强大的工具,适用于多种应用场景。希望这篇文档能帮助您更好地理解和使用该项目。

上一篇:Python基础之函数的定义与调用


下一篇:系统共享库(Shared Library)