YOLOv5在windows部署

YOLOv5 pyside6可视化界面

坑
vscode ui转换py,使用了PyQT5 没有使用QT
解决 
使用命令手动转
pyside6-uic untitled.ui -o untitled.py

https://blog.csdn.net/qq_37529913/article/details/128090030

pyside6-uic untitled.ui -o untitled.py

import sys
from PySide6.QtWidgets import QMainWindow, QApplication
from main_window import Ui_MainWindow


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


if __name__=="__main__":
    app = QApplication(sys.argv)

    window= MainWindow()
    window.show()

    app.exec()

base_ui.py

import cv2  # 导入 OpenCV 库,用于图像处理
import sys  # 导入系统模块,用于命令行参数处理
import torch  # 导入 PyTorch 库,用于深度学习模型加载和推理
from PySide6.QtWidgets import QMainWindow, QApplication, QFileDialog  # 导入 PySide6 中的窗口和文件对话框组件
from PySide6.QtGui import QPixmap, QImage  # 导入 PySide6 中的图片和图像组件
from PySide6.QtCore import QTimer  # 导入 PySide6 中的定时器组件

from ui_main_windowjiu import Ui_MainWindow  # 导入 UI 设计文件生成的窗口类


def convert2QImage(img):
    """将 OpenCV 图像转换为 QImage 格式"""
    height, width, channel = img.shape
    return QImage(img, width, height, width * channel, QImage.Format_RGB888)


class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.setupUi(self)  # 初始化窗口界面
        self.model = torch.hub.load("./", "custom", path="runs/train/exp2/weights/best.pt", source="local")  # 加载预训练模型
        self.timer = QTimer()  # 创建定时器对象
        self.timer.setInterval(1)  # 设置定时器间隔为 1 毫秒
        self.video = None  # 初始化视频对象
        self.bind_slots()  # 绑定信号槽

    def image_pred(self, file_path):
        """对图像进行预测"""
        results = self.model(file_path)  # 使用模型进行预测
        image = results.render()[0]  # 获取预测结果中的图像
        return convert2QImage(image)  # 将预测结果转换为 QImage 格式

    def open_image(self):
        """打开图像文件"""
        print("点击了检测图片!")
        self.timer.stop()  # 停止定时器
        file_path = QFileDialog.getOpenFileName(self, dir="./datasets/images/train", filter="*.jpg;*.png;*.jpeg")  # 获取图像文件路径
        if file_path[0]:  # 如果选择了文件
            file_path = file_path[0]  # 获取文件路径
            qimage = self.image_pred(file_path)  # 对图像进行预测
            self.input.setPixmap(QPixmap(file_path))  # 在界面上显示原始图像
            self.output.setPixmap(QPixmap.fromImage(qimage))  # 在界面上显示检测结果

    def video_pred(self):
        """对视频进行预测"""
        ret, frame = self.video.read()  # 读取视频帧
        if not ret:  # 如果读取失败
            self.timer.stop()  # 停止定时器
        else:
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)  # 将图像格式从 BGR 转换为 RGB
            self.input.setPixmap(QPixmap.fromImage(convert2QImage(frame)))  # 在界面上显示原始视频帧
            results = self.model(frame)  # 使用模型进行预测
            image = results.render()[0]  # 获取预测结果中的图像
            self.output.setPixmap(QPixmap.fromImage(convert2QImage(image)))  # 在界面上显示检测结果

    def open_video(self):
        """打开视频文件"""
        print("点击了检测视频!")
        file_path = QFileDialog.getOpenFileName(self, dir="./datasets", filter="*.mp4")  # 获取视频文件路径
        if file_path[0]:  # 如果选择了文件
            file_path = file_path[0]  # 获取文件路径
            self.video = cv2.VideoCapture(file_path)  # 打开视频文件
            self.timer.start()  # 启动定时器
                
    def bind_slots(self):
        """绑定信号槽"""
        self.det_image.clicked.connect(self.open_image)  # 检测图像按钮点击事件与打开图像槽函数绑定
        self.det_video.clicked.connect(self.open_video)  # 检测视频按钮点击事件与打开视频槽函数绑定
        self.timer.timeout.connect(self.video_pred)  # 定时器超时信号与视频预测槽函数绑定


if __name__ == "__main__":
    app = QApplication(sys.argv)  # 创建应用程序对象

    window = MainWindow()  # 创建主窗口对象
    window.show()  # 显示主窗口
    
    app.exec()  # 运行应用程序

YOLOv5 Gradio搭建Web GUI

import torch  # 导入 PyTorch 库,用于深度学习模型加载
import gradio as gr  # 导入 Gradio 库,用于构建交互式界面

# 加载预训练模型
model = torch.hub.load("./", "custom", path="runs/train/exp2/weights/best.pt", source="local")

# 定义标题和描述信息
title = "基于Gradio的YOLOv5演示项目"
desc = "这是一个基于Gradio的YOLOv5演示项目,非常简洁,非常方便!"

# 设置默认的置信度阈值和IoU阈值
base_conf, base_iou = 0.25, 0.45

# 定义图像检测函数
def det_image(img, conf_thres, iou_thres):
    model.conf = conf_thres  # 设置模型的置信度阈值
    model.iou = iou_thres  # 设置模型的IoU阈值
    return model(img).render()[0]  # 返回图像检测结果中的图像

# 创建 Gradio 接口
gr.Interface(inputs=["image", gr.Slider(minimum=0, maximum=1, value=base_conf), gr.Slider(minimum=0, maximum=1, value=base_iou)], 
             outputs=["image"], 
             fn=det_image,  # 指定处理函数
             title=title,  # 设置标题
             description=desc,  # 设置描述
             live=True,  # 启用实时预览
             examples=[["./datasets/images/train/30.jpg", base_conf, base_iou], ["./datasets/images/train/60.jpg", 0.3, base_iou]]  # 设置示例输入
            ).launch(share=True)  # 启动 Gradio 接口并共享

TensorRT环境安装与配置

https://www.bilibili.com/video/BV1KL411S7hw/?p=16&spm_id_from=pageDriver

https://developer.nvidia.com/cuda-11-6-0-download-archive?

ZLIB DLL Home Page (winimage.com)

cuda安装一路next

cudnn 安装下载zip 粘贴到cuda的bin

nvcc -V

TensorRT,找到python,pip install

lib文件 , 粘贴到cuda 的bin

zlib的zlibwapi.dll , 粘贴到cuda 的bin

pip install onnx

python export.py --weights yolov5s.pyt --include engine --device 0

TensorRT推理加速

pt 原模型 detect图片是384 640

engine 图片是640 640

重新导出模型

python export.py --weights yolov5s.pyt --include engine --device 0 --img 684 640

python detect.py --weights yolov5s-fp32.engine --imgsz 384 640

速度提升了

主要是图片大小对推理速度的影响

Torchhub模型预测使用进阶

基于flash的YOLOv5项目部署

yolov5的utilis/flask_rest_api/

restapi.py

# YOLOv5 🚀 by Ultralytics, AGPL-3.0 license
"""
Run a Flask REST API exposing one or more YOLOv5s models
"""

import argparse  # 导入解析命令行参数的库
import io  # 导入用于I/O操作的库

import torch  # 导入PyTorch库,用于深度学习模型加载
from flask import Flask, request  # 导入Flask库,用于构建Web应用;导入request模块,用于处理HTTP请求
from PIL import Image  # 导入PIL库,用于图像处理

app = Flask(__name__)  # 创建Flask应用对象
models = {}  # 定义模型字典,用于存储加载的YOLOv5模型

DETECTION_URL = '/v1/object-detection/<model>'  # 定义检测URL路径

@app.route(DETECTION_URL, methods=['POST'])  # 定义路由,处理POST请求
def predict(model):
    if request.method != 'POST':  # 如果请求方法不是POST,则返回
        return

    if request.files.get('image'):  # 如果请求中包含图像文件
        # Method 1
        # with request.files["image"] as f:
        #     im = Image.open(io.BytesIO(f.read()))

        # Method 2
        im_file = request.files['image']  # 获取图像文件对象
        im_bytes = im_file.read()  # 读取图像文件的字节流
        im = Image.open(io.BytesIO(im_bytes))  # 使用PIL库打开图像

        if model in models:  # 如果指定模型已加载
            results = models[model](im, size=640)  # 对图像进行检测
            return results.pandas().xyxy[0].to_json(orient='records')  # 返回检测结果的JSON格式数据

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Flask API exposing YOLOv5 model')  # 创建参数解析器
    parser.add_argument('--port', default=5000, type=int, help='port number')  # 添加端口参数
    parser.add_argument('--model', nargs='+', default=['yolov5s'], help='model(s) to run, i.e. --model yolov5n yolov5s')  # 添加模型参数
    opt = parser.parse_args()  # 解析命令行参数

    for m in opt.model:  # 遍历每个模型
        models[m] = torch.hub.load('ultralytics/yolov5', m, force_reload=True, skip_validation=True)  # 加载YOLOv5模型

    app.run(host='0.0.0.0', port=opt.port)  # 启动Flask应用,并指定主机和端口

example_request.py

​```python
# YOLOv5 🚀 by Ultralytics, AGPL-3.0 license

# 执行测试请求

import pprint

import requests

DETECTION_URL = 'http://localhost:5000/v1/object-detection/yolov5s'
IMAGE = 'zidane.jpg'

# 读取图像
with open(IMAGE, 'rb') as f:
    image_data = f.read()

# 发送POST请求并获取响应
response = requests.post(DETECTION_URL, files={'image': image_data}).json()

# 打印响应
pprint.pprint(response)
​```

redeme

# Flask REST API

# REST API通常用于将机器学习(ML)模型暴露给其他服务。
# 该文件夹包含使用Flask创建的示例REST API,以公开来自PyTorch Hub的YOLOv5s模型。

## 要求

# 需要Flask。使用以下命令安装:

# $ pip install Flask

## 运行

# 安装Flask后,运行以下命令:

# $ python3 restapi.py --port 5000

# 然后使用curl执行请求:

# $ curl -X POST -F image=@zidane.jpg 'http://localhost:5000/v1/object-detection/yolov5s'

# 模型推断结果将作为JSON响应返回:

# [
#   {
#     "class": 0,
#     "confidence": 0.8900438547,
#     "height": 0.9318675399,
#     "name": "person",
#     "width": 0.3264600933,
#     "xcenter": 0.7438579798,
#     "ycenter": 0.5207948685
#   },
#   {
#     "class": 0,
#     "confidence": 0.8440024257,
#     "height": 0.7155083418,
#     "name": "person",
#     "width": 0.6546785235,
#     "xcenter": 0.427829951,
#     "ycenter": 0.6334488392
#   },
#   {
#     "class": 27,
#     "confidence": 0.3771208823,
#     "height": 0.3902671337,
#     "name": "tie",
#     "width": 0.0696444362,
#     "xcenter": 0.3675483763,
#     "ycenter": 0.7991207838
#   },
#   {
#     "class": 27,
#     "confidence": 0.3527112305,
#     "height": 0.1540903747,
#     "name": "tie",
#     "width": 0.0336618312,
#     "xcenter": 0.7814827561,
#     "ycenter": 0.5065554976
#   }
# ]

# 提供了一个使用requests执行推断的示例Python脚本,该脚本位于example_request.py中

“xcenter”: 0.3675483763,
“ycenter”: 0.7991207838
},
{
“class”: 27,
“confidence”: 0.3527112305,
“height”: 0.1540903747,
“name”: “tie”,
“width”: 0.0336618312,
“xcenter”: 0.7814827561,
“ycenter”: 0.5065554976
}
]

提供了一个使用requests执行推断的示例Python脚本,该脚本位于example_request.py中

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 13
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值