猫狗识别的

# ----------------------------------------------------------------------------------------------------------------------
# 导入
# ----------------------------------------------------------------------------------------------------------------------

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_())

# ----------------------------------------------------------------------------------------------------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿明同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值