【项目实战】基于YOLOv5+PySide6的遥感目标识别系统

1 项目概述

本项目旨在利用 YOLOv5 算法对遥感图像中的目标进行识别,并将识别过程集成到一个基于 PySide6 框架的GUI界面中。用户可以通过GUI界面选择图像、视频或摄像头输入,进行目标检测,并查看检测结果。项目支持多种模型切换、置信度和IOU阈值调整、目标类别筛选等功能。

2 项目结构

project/
├── GUI.py                # 主界面代码,基于PySide6的GUI实现
├── Model.py             # YOLOv5模型加载和推理的核心代码,主要包括v5模型的封装
├── utils/                # 工具函数和辅助模块
│   ├── plots.py          # 绘制检测框和标签的工具
│   ├── general.py        # 通用工具函数(如NMS、图像缩放等)
│   ├── torch_utils.py    # PyTorch相关工具函数
│   └── augmentations.py  # 数据增强工具
├── weights/               # 存放模型输出.pt文件的路径,对应代码里的 model_dir 路径
│   └── best.pt   # 实际模型文件
└── README.md             # 项目说明文档

3 实现的功能

  1. 图像检测:支持用户选择本地图像文件进行目标检测,检测结果实时显示在GUI界面中。
  2. 视频检测:支持用户选择本地视频文件进行目标检测,检测结果实时显示在GUI界面中。
  3. 摄像头检测:支持调用电脑摄像头进行实时目标检测,检测结果实时显示在GUI界面中。
  4. 模型切换:支持用户从本地模型目录中选择不同的YOLOv5模型进行检测。
  5. 置信度和IOU阈值调整:用户可以通过GUI界面调整置信度和IOU阈值,优化检测结果。
  6. 目标类别筛选:用户可以选择特定的目标类别进行筛选,只显示指定类别的检测结果。
  7. 检测结果保存:支持将检测后的图像、视频或摄像头检测结果保存到本地。
  8. 检测目标定位:支持用户鼠标点击选中出现再界面里的任何目标,将持续跟踪选中目标的相对位置并输出。

4 环境配置

4.1 依赖库安装

在运行本项目之前,请确保已安装以下依赖库:

pip install PySide6
pip install torch
pip install opencv-python
pip install numpy
pip install pillow

注:若要进行 yolov5 项目的构建,参考下面方法

git clone https://github.com/ultralytics/yolov5  # clone
cd yolov5
pip install -r requirements.txt  # install

4.2 模型权重文件

请将YOLOv5训练后输出的模型权重文件(.pt文件)放置在weights/目录下,并在GUI.py中指定模型路径。

若没有 weights 文件夹就自行创建,放在项目根目录下

5 使用说明

  1. 启动GUI界面
    进入项目文件夹,运行 GUI.py 文件,启动基于PySide6 的 GUI 界面。

    python GUI.py
    

在这里插入图片描述

  1. 选择输入源

    • 图像检测:点击“选择图片”按钮,选择本地图像文件进行检测。
    • 视频检测:点击“选择视频”按钮,选择本地视频文件进行检测。
    • 摄像头检测:点击“打开摄像头”按钮,调用电脑摄像头进行实时检测。
  2. 调整检测参数

    • 在“检测参数设置”区域,调整置信度 confIOU 阈值。
    • 在“目标选择”下拉菜单中,选择特定的目标类别进行筛选。
  3. 开始检测
    点击“开始检测”按钮,开始对输入源进行目标检测。检测结果将实时显示在界面中。
    目标检测实例
    在这里插入图片描述

  4. 保存检测结果
    点击“保存”按钮,将检测后的图像、视频或摄像头检测结果保存到本地。
    在这里插入图片描述

6 代码结构说明

6.1 GUI.py

  • MyWindow类:主窗口类,负责构建GUI界面和处理用户交互。
    • __init__:初始化GUI界面,设置布局和控件。
    • detect:统一处理图像、视频和摄像头的检测逻辑。
    • select_imageselect_videoselect_camera:分别处理图像、视频和摄像头的选择逻辑。
    • start_pred_imagestart_pred_videostart_pred_camera:分别处理图像、视频和摄像头的检测逻辑。
    • save_results:保存检测结果的统一函数。

代码初始化如下:

class MyWindow(QWidget):
    def __init__(self):
        super().__init__()  # 初始化继承的QWidget属性
        # 初始化模型
        self.weight = r'C:\Users\27447\Desktop\model\best.pt'  # 初始化的权重路径
        self.model_dir = r'C:\Users\27447\Desktop\model'  # 初始化模型存放的地址
        self.model = YOLOModel(weights_path=self.weight)

        self.conf = 0.25
        self.iou = 0.45

        self.fps = 40  # 设置摄像头和检测的帧率上限

        self.model_paths = None  # 初始化当前选择的模型
        self.isConf = True  # 默认检测时显示类别和置信度都显示
        self.displayed_image = None  # 初始化qimage
        self.original_image = None  # 初始化上传的图像
        self.selected_image_path = None  # 初始化图像的本地路径
        self.original_image_width = 0  # 默认初始目标长宽为0
        self.original_image_height = 0

        # 初始化其他变量
        self.timer = QTimer()
        self.timer.setInterval(40)
        self.video = None  # 初始化视频
        self.camera = None  # 初始化摄像头
        self.condition_image = 0  # 默认没有上传照片
        self.condition_video = 0  # 默认没有上传视频
        self.condition_camera = 0  # 默认没有打开摄像头
        self.save_image = 0  # 默认没有权限保存检测图像
        self.save_video = 0  # 默认没有权限保存检测视频
        self.save_camera = 0  # 默认没有保存摄像头检测结果的权限
        self.save_camera = 0  # 默认没有保存摄像头拍摄的权限
        self.detect_image = None
        self.detected_frames = []  # 初始化变量,保存摄像头检测的帧

        self.class_mapping = {  # 定义类别映射
            '行人(pedestrian)': 'pedestrian',
            '人(people)': 'people',
            '自行车(bicycle)': 'bicycle',
            '小汽车(car)': 'car',
            '面包车(van)': 'van',
            '卡车(truck)': 'truck',
            '三轮车(tricycle)': 'tricycle',
            '遮阳棚三轮车(awning-tricycle)': 'awning-tricycle',
            '公交车(bus)': 'bus',
            '摩托车(motor)': 'motor'
        }

        # 设置窗口
        self.setGeometry(0, 0, 1008, 690)
        self.setWindowTitle('遥感目标检测平台')


        # 设置整体样式
        self.setStyleSheet("""
            QWidget {
                background-color: #121212;
                color: #FFFFFF;
            }
            QGroupBox {
                border: 2px solid #343434;
                border-radius: 5px;
                margin-top: 10px;
            }
            QGroupBox::title {
                subcontrol-origin: margin;
                left: 10px;
                padding: 0 3px 0 3px;
                background-color: #121212;
            }
            QLabel {
                color: #FFFFFF;
            }
            QPushButton {
                background-color: #1E1E1E;
                border: 2px solid #3A3A3A;
                border-radius: 5px;
                padding: 5px;
            }
            QPushButton:hover {
                background-color: #2C2C2C;
            }
            QPushButton:pressed {
                background-color: #3A3A3A;
            }
            QComboBox {
                background-color: #1E1E1E;
                border: 1px solid #3A3A3A;
                border-radius: 5px;
                padding: 3px;
                color: #FFFFFF;
            }
            QCheckBox {
                color: #FFFFFF;
            }
            QTextEdit {
                background-color: #1E1E1E;
                border: 1px solid #3A3A3A;
                color: #FFFFFF;
            }
            QLineEdit {
                background-color: #1E1E1E;
                border: 1px solid #3A3A3A;
                color: #FFFFFF;
            }
            QToolTip {
                background-color: #2C2C2C;
                color: #FFFFFF;
                border: 1px solid #FFFFFF;
            }
        """)

        # 标题标签
        self.lb = QLabel(self)
        self.lb.setText('遥感目标检测平台')
        self.lb.setAlignment(Qt.AlignVCenter | Qt.AlignHCenter)
        self.lb.setStyleSheet("color: white; font-weight: bold; background-color: transparent;")
        self.font = QFont("Arial", 20, QFont.Bold)

        self.font.setPointSize(14)
        self.lb.setFont(self.font)
        self.lb.setGeometry(200, 10, 581, 20)
        # 设置标题字体颜色和其它样式
        # self.lb.setStyleSheet("color: white; font-weight: bold;")

6.2 Model.py

  • YOLOModel:负责加载YOLOv5模型并进行推理与封装。
    • __init__:初始化模型,加载权重文件。
    • _load_model:加载YOLOv5模型。
    • preprocess_image:对输入图像进行预处理。
    • predict:使用YOLOv5模型进行推理。
    • postprocess:处理模型输出,绘制检测框并返回检测结果。
    • detect:对图像或视频帧进行检测,返回检测后的图像。

未来改进方向

  1. 多模型支持:支持更多类型的YOLO模型(如YOLOv7、YOLOv8等)。
  2. 性能优化:优化视频和摄像头检测的性能,减少延迟。
  3. 更多功能:添加目标跟踪、目标计数等功能。
  4. 跨平台支持:支持在Linux和macOS系统上运行。

若想获取源码,可私信本人,或关注微信公众号 咚叶的小铺,欢迎大家来交流!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值