# ----------------------------------------------------------------------------------------------------------------------
# 导入
# ----------------------------------------------------------------------------------------------------------------------
from PyQt5.QtWidgets import (QFileDialog, QApplication, QPushButton, QHBoxLayout, QVBoxLayout, QLabel, QWidget)
from PyQt5.QtGui import QPixmap, QFont
from PyQt5.QtCore import Qt
from train import build_net
from PIL import Image
import numpy as np
import sys
# ----------------------------------------------------------------------------------------------------------------------
# UI界面
# ----------------------------------------------------------------------------------------------------------------------
class MyWindow(QWidget):
def __init__(self):
super().__init__()
self.initUI()
# 用于初始化用户界面,并设置一些初始状态和属性。
def initUI(self):
self.myFileStr = './test/cat.9.jpg' # 用于存储文件路径字符串
self.result = ''
self.model = build_net() # 创建一个model变量存储机器学习模型
self.model.load_weights('./model/model.h5') # 用于加载已经训练好的模型参数,以便在后续使用中进行预测或推断。
# ----------------------------------------------------------------------------------------------------------------------
# 按键设置
# ----------------------------------------------------------------------------------------------------------------------
self.okButton = QPushButton("OK") # 创建了一个名为okButton的按钮小部件,并将显示文本设置为"OK"
# 按钮的clicked信号连接到self.get_result()方法。意味着当按钮被点击时,将执行self.get_result()方法。
self.okButton.clicked.connect(self.get_result)
self.okButton.setFixedSize(100, 40) # 设置按钮的固定尺寸为100x40像素
# 设置按钮的样式表,使用了一系列的CSS样式规则来定义按钮的外观。这些规则包括设置文本颜色为白色、
# 鼠标悬停时的背景颜色、背景颜色、边框宽度、边框圆角、内边距和外边距等。
self.okButton.setStyleSheet("QPushButton{color:white}"
"QPushButton:hover{background-color: rgb(2,110,180);}"
"QPushButton{background-color:rgb(48,124,208)}"
"QPushButton{border:2px}"
"QPushButton{border-radius:5px}"
"QPushButton{padding:5px 5px}"
"QPushButton{margin:5px 5px}")
self.openButton = QPushButton("OPEN") # 创建了一个名为openButton的按钮小部件,并将显示文本设置为"OPEN"。
# 将按钮的clicked信号连接到self.showDialog()方法。意味着当按钮被点击时,将执行self.showDialog()方法。
self.openButton.clicked.connect(self.showDialog)
self.openButton.setFixedSize(100, 40) # 设置按钮的固定尺寸为100x40像素
# 这行代码设置按钮的样式表,使用了一系列的CSS样式规则来定义按钮的外观。
# 这些规则包括设置文本颜色为白色、鼠标悬停时的背景颜色、背景颜色、边框宽度、边框圆角、内边距和外边距等。
self.openButton.setStyleSheet("QPushButton{color:white}"
"QPushButton:hover{background-color: rgb(2,110,180);}"
"QPushButton{background-color:rgb(48,124,208)}"
"QPushButton{border:2px}"
"QPushButton{border-radius:5px}"
"QPushButton{padding:5px 5px}"
"QPushButton{margin:5px 5px}")
# ----------------------------------------------------------------------------------------------------------------------
# 图片显示区域和结果显示区域设置
# ----------------------------------------------------------------------------------------------------------------------
# 使用指定路径self.myFileStr创建了一个QPixmap对象,并将其赋值给变量pixmap。
# 根据代码中的变量名和参数,推测这个QPixmap对象可能是用于加载图像文件,即显示图片。
pixmap = QPixmap(self.myFileStr, 'wr')
self.graphLabel = QLabel() # 这行代码创建了一个名为graphLabel的标签小部件。
self.graphLabel.setPixmap(pixmap) # 设置为graphLabel的像素图,并显示图像
self.graphLabel.setScaledContents(True) # 启用了graphLabel的自适应内容缩放,意味着可以根据graphLabel的大小自动调整图片的大小。
self.graphLabel.setFixedSize(400, 400)
self.graphLabel.setAlignment(Qt.AlignCenter) # 这行代码将graphLabel的对齐方式设置为居中对齐,保证图片在标签中居中显示。
self.graphText = QLabel() # 这行代码将graphLabel的对齐方式设置为居中对齐,保证图片在标签中居中显示。
# 这行代码设置graphText的文本内容为"cat or dog: \n---------- \n "加上self.result的字符串表示。
# 格式化的文本在标签中显示。
self.graphText.setText(' cat or dog: \n---------- \n ' + str(self.result))
# 行代码设置graphText中文本的字体,使用了"LingWai SC"字体,字体大小为30,设置为加粗
self.graphText.setFont(QFont("LingWai SC", 30, QFont.Bold))
# ----------------------------------------------------------------------------------------------------------------------
# 布局设置
# ----------------------------------------------------------------------------------------------------------------------
vbox = QVBoxLayout() # 这行代码创建了一个垂直布局对象
vbox.addWidget(self.openButton) # 这行代码将self.openButton按钮添加到vbox垂直布局中。
vbox.addWidget(self.okButton) # 这行代码将self.okButton按钮添加到vbox垂直布局中。
vbox.addWidget(self.graphText) # 这行代码将self.graphText标签小部件添加到vbox垂直布局中。
hbox = QHBoxLayout() # 这行代码创建了一个水平布局对象hbox。
hbox.addWidget(self.graphLabel) # 这行代码将self.graphLabel标签小部件添加到hbox水平布局中。
hbox.addLayout(vbox) # 将vbox垂直布局添加到hbox水平布局中,形成了一个嵌套布局。
# ----------------------------------------------------------------------------------------------------------------------
# 总的窗口配置
# ----------------------------------------------------------------------------------------------------------------------
self.setLayout(hbox) # 将前面创建的hbox水平布局设置为窗口的布局。通过调用setLayout方法,指定了窗口的整体布局。
self.setWindowTitle("猫狗识别") # 将窗口的标题设置为"猫狗识别"。
self.show() # 将窗口显示在屏幕上。
# ----------------------------------------------------------------------------------------------------------------------
# 打开文件夹功能
# ----------------------------------------------------------------------------------------------------------------------
# 定义了一个名为showDialog的方法,用于打开文件对话框,并更新图像标签小部件graphLabel的图像内容。
def showDialog(self):
# 调用QFileDialog类的getOpenFileName方法,打开一个文件对话框并返回所选文件的路径。
# self表示对话框的父窗口,‘Open file’是对话框的标题,’./test/'是对话框显示的默认目录。
fname = QFileDialog.getOpenFileName(self, 'Open file', './test/')
self.myFileStr = fname[0] # 将对话框返回的文件路径存储在self.myFileStr变量中。
pixmap = QPixmap(self.myFileStr) # 使用self.myFileStr路径创建一个QPixmap对象,并将其赋值给变量pixmap
self.graphLabel.setPixmap(pixmap) # 将先前创建的pixmap设置为graphLabel的像素图,并更新图像内容。
# ----------------------------------------------------------------------------------------------------------------------
# 识别以及显示结果
# ----------------------------------------------------------------------------------------------------------------------
# 定义了一个名为get_result的方法,用于获取图像的预测结果,并更新显示在graphText标签小部件中的文本内容。
def get_result(self):
# 使用PIL库的Image对象打开self.myFileStr路径对应的图像文件,并将其赋值给变量img。
img = Image.open(self.myFileStr)
# 调整图像大小为固定尺寸(224, 224)。
img = img.resize((224, 224))
# 将图像转换为NumPy数组,并将其形状调整为(-1, 224, 224, 3)。这是为了与模型的输入形状相匹配。
img = np.array(img).reshape(-1, 224, 224, 3)
# 使用训练好的模型self.model对图像进行预测,得到预测结果。这可能是一个概率数组或一个预测类别编号
prediction = self.model.predict(img)
# 将预测结果中的每个概率数组转换为对应的预测类别编号,然后获取第一个预测类别编号。
prediction = [result.argmax() for result in prediction][0]
# 根据预测类别编号,将self.result设置为对应的类别名称,即’cat’或’dog’。
self.result = ['cat', 'dog'][int(prediction)]
# 更新graphText标签小部件的文本内容,显示预测类别的结果
self.graphText.setText(' cat or dog: \n---------- \n ' + str(self.result))
# ----------------------------------------------------------------------------------------------------------------------
# 主函数,程序的入口
# ----------------------------------------------------------------------------------------------------------------------
# 用于启动应用程序并显示主窗口。
if __name__ == '__main__':
# 创建一个QApplication对象app,它是PyQt应用程序的核心对象,用于管理GUI事件循环和应用程序的整体行为。
app = QApplication(sys.argv)
# 创建了一个自定义的主窗口对象mainWindow,即MyWindow类的实例化对象。
# 根据上述代码,MyWindow类应该包含了界面的相关定义和功能实现。
mainWindow = MyWindow()
# 显示主窗口。通过调用show方法,使主窗口可见。
mainWindow.show()
# 启动应用程序的事件循环。app.exec_()方法开始事件循环,监听并处理GUI事件,
# 直到应用程序退出。sys.exit()用于确保在应用程序退出后,Python解释器也会正常退出。
sys.exit(app.exec_())
# ----------------------------------------------------------------------------------------------------------------------
猫狗识别的
最新推荐文章于 2024-08-07 17:42:24 发布