公司的网站建设做什么费用,网页制作用什么软件比较好,做词云图的网站,wordpress固定链接设置访问出错个人打卡#xff0c;慎看。
指路大佬#xff1a;【手把手带你实战YOLOv5-入门篇】YOLOv5 Pyside6可视化界面_哔哩哔哩_bilibili 零、虚拟环境迁移路径后pip报错解决
yolov5-master文件夹我换位置后#xff0c;无法pip install了。解决如下#xff1a;
activate.bat中修改…个人打卡慎看。
指路大佬【手把手带你实战YOLOv5-入门篇】YOLOv5 Pyside6可视化界面_哔哩哔哩_bilibili 零、虚拟环境迁移路径后pip报错解决
yolov5-master文件夹我换位置后无法pip install了。解决如下
activate.bat中修改set VIRTUAL_ENVD:\yolov5-master\venvactivate中修改VIRTUAL_ENVD:\yolov5-master\venv更新pippython -m pip install --upgrade pip
参考Python 虚拟环境迁移路径后pip报错解决记录_pybot移动路径后-CSDN博客 【建议挂v速度会快】
一、环境安装
下载Pyside6 pip install pyside6
我的pyside6不在Python.exe的上级文件夹的子目录下packages和python.exe的位置也不同发现解释器的位置设置错了之前一直提示我Invalid我也没有注意。
一般python.exe和site-packages的位置关系是python.exe和它的上级在同一文件夹下。
比如anaconda下python.exe, lib
lib下site-packages 也可以输入以下命令查找site-packages的位置。
import site
print(site.getsitepackages())
以后安装了包但是无法import也可以查找site-packages的位置很有可能这里面没有那个包。是python.exe选取的错误修改为对应的python.exe即可。 找到pyside6/designer.exe将快捷方式发送到桌面。up主用vscode安装了qt for python插件但是我使用的是Pycharmvscode不熟练在pycharm中设置setting-tools-external tools点击 添加在Program中输入designer.exe的位置。name和group随便设置点击ok。 二、设计UI
新建mainwindow把两个textlabel拖到mainwindow中【存放图片】用vertical line隔离他们。拖两个pushbutton【按钮】。勾选scaledcontents可以实现label中存放内容缩放。将alignment设置水平中心对齐。修改对象的名字便于记忆。比如label1改成input保存到yolov5-master文件夹下修改名字为main_window 三、将ui转换成py
添加external tool
我的血泪教训改这个错改了40min
program不要选site-packages\Pyside6\uic.exe 这样转换出来的结果可能是C代码。选\Scripts\pyside6-uic.exe这个文件 Program: D:\anaconda\Scripts\pyside6-uic.exe 【输入自己的pyside6-uic.exe文件路径】Arguments: $FileName$ -o $FileNameWithoutExtension$.pyworking directory: $FileDir$ 四、调用mainwindow
import sysfrom PySide6.QtWidgets import QMainWindow, QApplicationfrom main_window import Ui_MainWindow
#这里的main_window是你的ui转换成的py名字
#Ui_MainWindow是main_window里的class名字class MainWindow(QMainWindow,Ui_MainWindow):def __init__(self):super(MainWindow,self).__init__() #self后不要加()我加了()报错无法调用mainwindowself.setupUi(self)if __name____main__:appQApplication(sys.argv)window1 MainWindow()window1.show()app.exec()
运行上面的指令即可弹出UI设计界面。 五、关联按钮和代码
bing_slots()函数负责绑定。det_image和pushButton_2【忘改了】是那两个按钮的名字。
import sysfrom PySide6.QtWidgets import QMainWindow, QApplication,QFileDialog
#QFileDialog可以访问文件资源管理器from main_window import Ui_MainWindowclass MainWindow(QMainWindow,Ui_MainWindow):def __init__(self):super(MainWindow,self).__init__()self.setupUi(self)self.bind_slots() #不要忘记调用不写这句话无法显示。def open_image(self):print(点击显示图片)def open_video(self):print(点击显示视频)def bind_slots(self):#绑定self.det_image.clicked.connect(self.open_image)self.pushButton_2.clicked.connect(self.open_video)if __name____main__:appQApplication(sys.argv)window1 MainWindow()window1.show()app.exec() 六、获取图片
一开始无法显示我设置QPixmap(./datasets/images/train/30.jpg)发现可以显示于是判断是filepath格式的问题QPixmap的参数是string类型的。打印file_path[0]发现打印出来的仍然是list格式。于是转换list为string类型。filePath,.join(file_path[0])
#与上个代码省略了相同的部分方便理解。from PySide6.QtGui import QPixmap
#显示图片def open_image(self):file_pathQFileDialog.getOpenFileNames(self,dir./datasets/images/train,filter*.jpg;*.png)#设置从dir里找图片, filter分号隔离不同格式#file_path返回的是有两个元素的数组我们运行后发现第一个元素是路径第二个元素是格式。我们只输出路径。if file_path[0]:filePath,.join(file_path[0])print(file_path[0])print(filePath)self.input.setPixmap(QPixmap(filePath)) #图片显示七、训练图片 首先遇到了问题我运行页面卡住了一直在下载某个包经查找发现是下面这行代码的问题。我运行提示卡在了“Downloading torch-2.2.2-cp310-cp310-win_amd64.whl (198.6 MB)”model torch.hub.load(./,custom,pathruns/train/exp2/weights/best.pt,trust_repoTrue, sourcelocal) 运行这行代码时卡住了其他代码不会卡。已解决下载几个包即可pip install torch torchvision torchaudio参考通过pip安装pytorch超时问题解决 - 知乎 (zhihu.com) 运行代码
import sys
import torch
from PySide6.QtWidgets import QMainWindow, QApplication,QFileDialog
#QFileDialog可以访问文件资源管理器from PySide6.QtGui import QPixmap,QImage
#显示图片from main_window import Ui_MainWindowdef convert2QImage(img):height,width,channelimg.shapereturn 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.modeltorch.hub.load(./,custom,pathruns/train/exp2/weights/best.pt,sourcelocal)self.bind_slots() #不要忘记调用不写这句话无法显示def image_pred(self,filePath):resultsself.model(filePath)imageresults.render()[0]return convert2QImage(image)#检测后的图片def open_image(self):file_pathQFileDialog.getOpenFileNames(self,dir./datasets/images/train,filter*.jpg;*.png)#设置从dir里找图片, filter分号隔离不同格式#file_path返回的是有两个元素的数组我们运行后发现第一个元素是路径第二个元素是格式。我们只输出路径。if file_path[0]:filePath,.join(file_path[0])qimageself.image_pred(filePath)self.input.setPixmap(QPixmap(filePath))self.output.setPixmap(QPixmap.fromImage(qimage))def open_video(self):print(点击显示视频)def bind_slots(self):#绑定self.det_image.clicked.connect(self.open_image)self.pushButton_2.clicked.connect(self.open_video)if __name____main__:appQApplication(sys.argv)window1 MainWindow()window1.show()app.exec() 八、训练视频
仍然遇到了报错Traceback (most recent call last): File D:\yolov5-master\yolov5-master\base_ui.py, line 57, in open_video self.input.setPixmap(QPixmap(convert2QImage(filePath))) File D:\yolov5-master\yolov5-master\base_ui.py, line 13, in convert2QImage height,width,channelimag.shape AttributeError: str object has no attribute shape 但是我训练图片时 height,width,channelimag.shape这行代码就没有出现问题于是查找包含改行代码的函数调用的参数果然写错了self.input.setPixmap(QPixmap(convert2QImage(frame)))是frame不是filePath。 一定要细心
import sys
import cv2
import torch
from PySide6.QtWidgets import QMainWindow, QApplication,QFileDialog
#QFileDialog可以访问文件资源管理器from PySide6.QtGui import QPixmap,QImage
#显示图片from main_window import Ui_MainWindowdef convert2QImage(imag):height,width,channelimag.shapereturn QImage(imag,width,height,width*channel,QImage.Format_RGB888)class MainWindow(QMainWindow,Ui_MainWindow):def __init__(self):super(MainWindow,self).__init__()self.setupUi(self)self.modeltorch.hub.load(./,custom,pathruns/train/exp2/weights/best.pt,sourcelocal)self.bind_slots() #不要忘记调用不写这句话无法显示def image_pred(self,filePath):resultsself.model(filePath)imageresults.render()[0]return convert2QImage(image)#检测后的图片def video_pred(self,img):resultsself.model(img)imageresults.render()[0]return convert2QImage(image)def open_image(self):file_pathQFileDialog.getOpenFileNames(self,dir./datasets/images/train,filter*.jpg;*.png)#设置从dir里找图片, filter分号隔离不同格式#file_path返回的是有两个元素的数组我们运行后发现第一个元素是路径第二个元素是格式。我们只输出路径。if file_path[0]:filePath,.join(file_path[0])qimageself.image_pred(filePath)self.input.setPixmap(QPixmap(filePath))self.output.setPixmap(QPixmap.fromImage(qimage))def open_video(self):#视频检测是一帧一帧地检测利用opencv抽帧。file_path QFileDialog.getOpenFileNames(self, dir./datasets, filter*.mp4)if file_path[0]:filePath,.join(file_path[0])print(filePath)video cv2.VideoCapture(filePath)while True:ret,framevideo.read()if not ret:breakframe cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)qimageself.video_pred(frame)self.input.setPixmap(QPixmap(convert2QImage(frame)))self.output.setPixmap(QPixmap.fromImage(qimage))print(点击显示视频)def bind_slots(self):#绑定self.det_image.clicked.connect(self.open_image)self.pushButton_2.clicked.connect(self.open_video)if __name____main__:appQApplication(sys.argv)window1 MainWindow()window1.show()app.exec() 不过我运行后很慢并且只显示了视频最后一帧的检测结果和原图片。
问题界面刷新不及时。
解决加入计时器from PySide6.QtCore import QTimer
import sys
import cv2
import torch
from PySide6.QtWidgets import QMainWindow, QApplication,QFileDialog
#QFileDialog可以访问文件资源管理器from PySide6.QtGui import QPixmap,QImage
#显示图片
from PySide6.QtCore import QTimer
#计时器from main_window import Ui_MainWindowdef convert2QImage(imag):height,width,channelimag.shapereturn QImage(imag,width,height,width*channel,QImage.Format_RGB888)class MainWindow(QMainWindow,Ui_MainWindow):def __init__(self):super(MainWindow,self).__init__()self.setupUi(self)self.modeltorch.hub.load(./,custom,pathruns/train/exp2/weights/best.pt,sourcelocal)self.timerQTimer()self.timer.setInterval(100) #时间间隔。默认单位毫秒ms 可以设置的小一点儿视频更加丝滑。self.bind_slots() #不要忘记调用不写这句话无法显示def image_pred(self,filePath):resultsself.model(filePath)imageresults.render()[0]return convert2QImage(image)#检测后的图片def video_pred(self):ret, frame self.video.read()if not ret:self.timer.stop()else:frame cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)self.input.setPixmap(QPixmap.fromImage(convert2QImage(frame)))#放在这儿而不是self.output上面因为可能受检测的图像影响。在检测之前先显示出来。resultsself.model(frame)imageresults.render()[0]self.output.setPixmap(QPixmap.fromImage(convert2QImage(image)))def open_image(self):file_pathQFileDialog.getOpenFileNames(self,dir./datasets/images/train,filter*.jpg;*.png)#设置从dir里找图片, filter分号隔离不同格式#file_path返回的是有两个元素的数组我们运行后发现第一个元素是路径第二个元素是格式。我们只输出路径。if file_path[0]:filePath,.join(file_path[0])qimageself.image_pred(filePath)self.input.setPixmap(QPixmap(filePath))self.output.setPixmap(QPixmap.fromImage(qimage))def open_video(self):#视频检测是一帧一帧地检测利用opencv抽帧。file_path QFileDialog.getOpenFileNames(self, dir./datasets, filter*.mp4)if file_path[0]:filePath,.join(file_path[0])print(filePath)self.video cv2.VideoCapture(filePath)self.timer.start()# while True:# ret,framevideo.read()## if not ret:# break# frame cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)# qimageself.video_pred(frame)# self.input.setPixmap(QPixmap(convert2QImage(frame)))# self.output.setPixmap(QPixmap.fromImage(qimage))print(点击显示视频)def bind_slots(self):#绑定self.det_image.clicked.connect(self.open_image)self.pushButton_2.clicked.connect(self.open_video)self.timer.timeout.connect(self.video_pred)if __name____main__:appQApplication(sys.argv)window1 MainWindow()window1.show()app.exec()
仍然存在问题如果再点击“图片检测”按钮不会停下这是因为计时器没有停。
解决方案在打开图片时关闭计时器def open_image(self): self.timer.stop()
全部代码
import sys
import cv2
import torch
from PySide6.QtWidgets import QMainWindow, QApplication,QFileDialog
#QFileDialog可以访问文件资源管理器from PySide6.QtGui import QPixmap,QImage
#显示图片
from PySide6.QtCore import QTimer
#计时器from main_window import Ui_MainWindowdef convert2QImage(imag):height,width,channelimag.shapereturn QImage(imag,width,height,width*channel,QImage.Format_RGB888)class MainWindow(QMainWindow,Ui_MainWindow):def __init__(self):super(MainWindow,self).__init__()self.setupUi(self)self.modeltorch.hub.load(./,custom,pathruns/train/exp2/weights/best.pt,sourcelocal)self.timerQTimer()self.timer.setInterval(1) #默认单位毫秒msself.bind_slots() #不要忘记调用不写这句话无法显示def image_pred(self,filePath):resultsself.model(filePath)imageresults.render()[0]return convert2QImage(image)#检测后的图片def video_pred(self):ret, frame self.video.read()if not ret:self.timer.stop()else:frame cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)self.input.setPixmap(QPixmap.fromImage(convert2QImage(frame)))# 放在这儿而不是self.output上面因为可能受检测的图像影响。在检测之前先显示出来。resultsself.model(frame)imageresults.render()[0]self.output.setPixmap(QPixmap.fromImage(convert2QImage(image)))def open_image(self):self.timer.stop()file_pathQFileDialog.getOpenFileNames(self,dir./datasets/images/train,filter*.jpg;*.png)#设置从dir里找图片, filter分号隔离不同格式#file_path返回的是有两个元素的数组我们运行后发现第一个元素是路径第二个元素是格式。我们只输出路径。if file_path[0]:filePath,.join(file_path[0])qimageself.video_pred(filePath)self.input.setPixmap(QPixmap(filePath))self.output.setPixmap(QPixmap.fromImage(qimage))def open_video(self):#视频检测是一帧一帧地检测利用opencv抽帧。file_path QFileDialog.getOpenFileNames(self, dir./datasets, filter*.mp4)if file_path[0]:filePath,.join(file_path[0])print(filePath)self.video cv2.VideoCapture(filePath)self.timer.start()# while True:# ret,framevideo.read()## if not ret:# break# frame cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)# qimageself.video_pred(frame)# self.input.setPixmap(QPixmap(convert2QImage(frame)))# self.output.setPixmap(QPixmap.fromImage(qimage))print(点击显示视频)def bind_slots(self):#绑定self.det_image.clicked.connect(self.open_image)self.pushButton_2.clicked.connect(self.open_video)self.timer.timeout.connect(self.video_pred)if __name____main__:appQApplication(sys.argv)window1 MainWindow()window1.show()app.exec() 九、复盘
首先利用Pyside6的designer设计了UI界面。两个button两个label一条线。导出生成ui文件。将ui文件编译生成成py文件注意external tool选的是pyside6-uic.exe,不是uic.exe构建程序设计函数初始化绑定按键与函数事件打开图片打开视频图片预测视频预测【预测部分利用了torch.hub实际上是对每一帧的图片进行预测利用了计时器】 效果如下【我之前标注的label很草率所以效果很差不过迈出了从0到1的步子我很开心了。】 pyside6可视化页面预测 今天最大的收获就是可以平静地对待报错了之前从大一开始每次改报错都特别烦躁今天竟然可以平静地坐着改几个小时的bug。我之前特别怵头以后做机器学习、python相关的研究现在不怕了。
要相信你遇到的问题别人也遇到过并且他们解决了。
如果别人没有遇到过那正好你会是第一个发现问题并解决的人之后的人都会借鉴你的解决方案。