这里写目录标题
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中