1、安装pyqt及qt-designer
1.安装Pyqt5库
pip install PyQt5
pip install pyqt5-tools
2.在pycharm添加external tools
Designer添加:
Name:工具名字,譬如QTDesigner
Program:designer.exe程序的绝对路径,在site-packages下搜索
Working directory--designer.exe工作路径,设置为
$ProjectFileDir$
PyUIC添加
name:工具名字,譬如PyUIC
Program:python.exe的绝对路径路径
Arguments:$FileName$ -o $FileNameWithoutExtension$.py
Working dirctory:$ProjectFileDir$
3.用Designer制作界面
4.用PyUIC将UC文件转换成python文件
5、加工一下代码
(1)导入库:
from PyQt5.QtWidgets import QApplcatoin,QMainwindow
import sys
(2)主类继承QMainwindow父类,并初始化类:
class Ui_MainWindow(QMainwindow)
def __init__(self):
super().__init__()
self.setupUi(self)
self.retranslateUi(self)
(3)添加启动语句
if __name__ == __main__:
app = QApplication(sys.argv)
ui = Ui_MainWindow()
ui.show()
sys.exit(app.exec_())
2、界面程序和逻辑程序分离
这么做的好处是,在我们想使用QTdesigner更改界面时,不会让新生成的界面程序替换掉原来写好的一堆
界面程序demo–classification
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'classification.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow_cla(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(810, 653)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout")
self.groupBox_3 = QtWidgets.QGroupBox(self.centralwidget)
self.groupBox_3.setStyleSheet("font: 8pt \"微软雅黑\";")
self.groupBox_3.setObjectName("groupBox_3")
self.gridLayout_3 = QtWidgets.QGridLayout(self.groupBox_3)
self.gridLayout_3.setObjectName("gridLayout_3")
self.label_3 = QtWidgets.QLabel(self.groupBox_3)
self.label_3.setStyleSheet("font: 12pt \"微软雅黑\";")
self.label_3.setObjectName("label_3")
self.gridLayout_3.addWidget(self.label_3, 1, 1, 1, 2)
self.textEdit_3 = QtWidgets.QTextEdit(self.groupBox_3)
self.textEdit_3.setObjectName("textEdit_3")
self.gridLayout_3.addWidget(self.textEdit_3, 2, 3, 1, 1)
self.textEdit_2 = QtWidgets.QTextEdit(self.groupBox_3)
self.textEdit_2.setObjectName("textEdit_2")
self.gridLayout_3.addWidget(self.textEdit_2, 1, 3, 1, 1)
spacerItem = QtWidgets.QSpacerItem(20, 480, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.gridLayout_3.addItem(spacerItem, 0, 3, 1, 1)
self.label_4 = QtWidgets.QLabel(self.groupBox_3)
self.label_4.setStyleSheet("font: 12pt \"微软雅黑\";")
self.label_4.setObjectName("label_4")
self.gridLayout_3.addWidget(self.label_4, 2, 1, 1, 1)
spacerItem1 = QtWidgets.QSpacerItem(240, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.gridLayout_3.addItem(spacerItem1, 2, 0, 1, 1)
spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.gridLayout_3.addItem(spacerItem2, 1, 0, 1, 1)
self.gridLayout.addWidget(self.groupBox_3, 1, 1, 1, 1)
self.groupBox_2 = QtWidgets.QGroupBox(self.centralwidget)
self.groupBox_2.setStyleSheet("\n"
"font: 8pt \"微软雅黑\";")
self.groupBox_2.setObjectName("groupBox_2")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.groupBox_2)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.label = QtWidgets.QLabel(self.groupBox_2)
self.label.setObjectName("label")
self.verticalLayout_2.addWidget(self.label)
self.gridLayout.addWidget(self.groupBox_2, 1, 0, 1, 1)
self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
self.groupBox.setStyleSheet("font: 8pt \"微软雅黑\";")
self.groupBox.setObjectName("groupBox")
self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.groupBox)
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
self.verticalLayout_3 = QtWidgets.QVBoxLayout()
self.verticalLayout_3.setObjectName("verticalLayout_3")
self.label_5 = QtWidgets.QLabel(self.groupBox)
self.label_5.setObjectName("label_5")
self.verticalLayout_3.addWidget(self.label_5)
self.gridLayout_2 = QtWidgets.QGridLayout()
self.gridLayout_2.setObjectName("gridLayout_2")
self.comboBox = QtWidgets.QComboBox(self.groupBox)
self.comboBox.setObjectName("comboBox")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.gridLayout_2.addWidget(self.comboBox, 0, 0, 1, 1)
self.pushButton = QtWidgets.QPushButton(self.groupBox)
self.pushButton.setObjectName("pushButton")
self.gridLayout_2.addWidget(self.pushButton, 0, 1, 1, 1)
self.verticalLayout_3.addLayout(self.gridLayout_2)
self.horizontalLayout_3.addLayout(self.verticalLayout_3)
self.gridLayout.addWidget(self.groupBox, 0, 0, 1, 2)
self.gridLayout.setColumnStretch(0, 4)
self.gridLayout.setColumnStretch(1, 4)
self.gridLayout.setRowStretch(0, 1)
self.gridLayout.setRowStretch(1, 4)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 810, 22))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.groupBox_3.setTitle(_translate("MainWindow", "结果"))
self.label_3.setText(_translate("MainWindow", "<html><head/><body><p align=\"center\">准确率</p></body></html>"))
self.label_4.setText(_translate("MainWindow", "<html><head/><body><p align=\"center\">类别</p></body></html>"))
self.groupBox_2.setTitle(_translate("MainWindow", "图片"))
self.label.setText(_translate("MainWindow", "TextLabel"))
self.groupBox.setTitle(_translate("MainWindow", "介绍"))
self.label_5.setText(_translate("MainWindow", "<html><head/><body><p align=\"center\">可选模型的图像分类程序</p></body></html>"))
self.comboBox.setItemText(0, _translate("MainWindow", "Alexnet"))
self.comboBox.setItemText(1, _translate("MainWindow", "VGGnet"))
self.comboBox.setItemText(2, _translate("MainWindow", "resnet"))
self.comboBox.setItemText(3, _translate("MainWindow", "mobilenet"))
self.pushButton.setText(_translate("MainWindow", "图像分类"))
逻辑程序demo–run_classification
from PyQt5.QtWidgets import QApplication, QMainWindow
from classification import Ui_MainWindow_cla
from PyQt5 import QtCore, QtGui, QtWidgets
import cv2
import json
from alexnet.model import AlexNet
from resnet.model import resnet34
from vggnet.model import vgg
from mobilenet.model_v2 import MobileNetV2
import sys
import torch
from PIL import Image
import matplotlib.pyplot as plt
from torchvision import transforms
model_list = ["alexnet","vggnet","resnet","mobilenet"]
class MyMainwindow_cla(QMainWindow, Ui_MainWindow_cla):
def __init__(self,parent=None):
super(MyMainwindow_cla,self).__init__(parent)
self.setupUi(self)
self.comboBox.currentIndexChanged[int].connect(lambda val: self.upmodel(val))
self.pushButton.clicked.connect(self.button_image_open)
self.model_type = 'alexnet'
def upmodel(self,id):
print(id)
self.model_type = model_list[id]
print(self.model_type)
def button_image_open(self):
if self.model_type == "alexnet":
print("这次图片预测使用的时alexnet模型")
img_name, _ = QtWidgets.QFileDialog.getOpenFileName(self, "打开图片", "", "*.jpg;;*.png;;All Files(*)")
img = Image.open(img_name)
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
data_transform = transforms.Compose(
[transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
img = data_transform(img)
# expand batch dimension
img = torch.unsqueeze(img, dim=0)
# print(img)
json_path = r'./alexnet/class_indices.json'
json_file = open(json_path, "r")
class_indict = json.load(json_file)
# create model
model = AlexNet(num_classes=5).to(device)
weights_path = r"./alexnet/AlexNet.pth"
model.load_state_dict(torch.load(weights_path))
model.eval()
with torch.no_grad():
output = torch.squeeze(model(img.to(device))).cpu()
predict = torch.softmax(output, dim=0)
# print(predict)
predict_cla = torch.argmax(predict).numpy()
out_class = class_indict[str(predict_cla)]
out_pre=predict[predict_cla].numpy()
print(out_class)
print(out_pre)
self.textEdit_2.setText(str(out_pre))
self.textEdit_3.setText(str(out_class))#要字符串的形式,str
jpg = QtGui.QPixmap(img_name)
self.label.setScaledContents(True)#图片大小自适应label窗口大小
self.label.setPixmap(jpg)#在label上显示图片
if self.model_type == "resnet":
print("这次图片预测使用的是resnet34模型")
img_name, _ = QtWidgets.QFileDialog.getOpenFileName(self, "打开图片", "", "*.jpg;;*.png;;All Files(*)")
img = Image.open(img_name)
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
data_transform = transforms.Compose(
[transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])
img = data_transform(img)
# expand batch dimension
img = torch.unsqueeze(img, dim=0)
# print(img)
json_path = r'./resnet/class_indices.json'
json_file = open(json_path, "r")
class_indict = json.load(json_file)
# create model
model = resnet34(num_classes=5).to(device)
weights_path = r"./resnet/resNet34.pth"
model.load_state_dict(torch.load(weights_path))
model.eval()
with torch.no_grad():
output = torch.squeeze(model(img.to(device))).cpu()
predict = torch.softmax(output, dim=0)
# print(predict)
predict_cla = torch.argmax(predict).numpy()
out_class = class_indict[str(predict_cla)]
out_pre = predict[predict_cla].numpy()
print(out_class)
print(out_pre)
self.textEdit_2.setText(str(out_pre))
self.textEdit_3.setText(str(out_class)) # 要字符串的形式,str
jpg = QtGui.QPixmap(img_name)
self.label.setScaledContents(True) # 图片大小自适应label窗口大小
self.label.setPixmap(jpg) # 在label上显示图片
if self.model_type == "vggnet":
print("这次图片预测使用的是vggnet模型")
img_name, _ = QtWidgets.QFileDialog.getOpenFileName(self, "打开图片", "", "*.jpg;;*.png;;All Files(*)")
img = Image.open(img_name)
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
data_transform = transforms.Compose(
[transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])
img = data_transform(img)
# expand batch dimension
img = torch.unsqueeze(img, dim=0)
# print(img)
json_path = r'./vggnet/class_indices.json'
json_file = open(json_path, "r")
class_indict = json.load(json_file)
# create model
model = vgg(model_name="vgg16", num_classes=5).to(device)
weights_path = r"./vggnet/vgg16Net.pth"
model.load_state_dict(torch.load(weights_path))
model.eval()
with torch.no_grad():
output = torch.squeeze(model(img.to(device))).cpu()
predict = torch.softmax(output, dim=0)
# print(predict)
predict_cla = torch.argmax(predict).numpy()
out_class = class_indict[str(predict_cla)]
out_pre = predict[predict_cla].numpy()
print(out_class)
print(out_pre)
self.textEdit_2.setText(str(out_pre))
self.textEdit_3.setText(str(out_class)) # 要字符串的形式,str
jpg = QtGui.QPixmap(img_name)
self.label.setScaledContents(True) # 图片大小自适应label窗口大小
self.label.setPixmap(jpg) # 在label上显示图片
# if self.model_type == "mobilenet":
else:
print("这次图片预测使用的是mobilenet模型")
img_name, _ = QtWidgets.QFileDialog.getOpenFileName(self, "打开图片", "", "*.jpg;;*.png;;All Files(*)")
img = Image.open(img_name)
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
data_transform = transforms.Compose(
[transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])
img = data_transform(img)
# expand batch dimension
img = torch.unsqueeze(img, dim=0)
# print(img)
json_path = r'./mobilenet/class_indices.json'
json_file = open(json_path, "r")
class_indict = json.load(json_file)
# create model
model = MobileNetV2(num_classes=5).to(device)
weights_path = r"./mobilenet/MobileNetV2.pth"
model.load_state_dict(torch.load(weights_path,map_location=device))
model.eval()
with torch.no_grad():
output = torch.squeeze(model(img.to(device))).cpu()
predict = torch.softmax(output, dim=0)
# print(predict)
predict_cla = torch.argmax(predict).numpy()
out_class = class_indict[str(predict_cla)]
out_pre = predict[predict_cla].numpy()
print(out_class)
print(out_pre)
self.textEdit_2.setText(str(out_pre))
self.textEdit_3.setText(str(out_class)) # 要字符串的形式,str
jpg = QtGui.QPixmap(img_name)
self.label.setScaledContents(True) # 图片大小自适应label窗口大小
self.label.setPixmap(jpg) # 在label上显示图片
if __name__ == "__main__":
app = QApplication(sys.argv)
myWin = MyMainwindow_cla()
myWin.show()
sys.exit(app.exec_())
版权声明:本文为taylorman原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。