import os
import shutil
import sys
import cv2
import numpy as np
import tensorflow as tf
from PIL import Image
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from datetime import datetime
# 记得修改一下路径
os.environ["QT_QPA_PLATFORM_PLUGIN_PATH"] = \
r"D:\DeepLearning\python\PyQt_Learning\深度学习分类识别系统\venv\Lib\site-packages\PyQt5\Qt\plugins\platforms"
class MainWindow(QTabWidget):
# 初始化
def __init__(self):
super().__init__()
# 左上角logo图像
self.setWindowIcon(QIcon('images/logo.png'))
self.setWindowTitle('深度学习分类识别系统2024')
# 模型初始化
self.model = tf.keras.models.load_model("models/mobilenet_flowers.h5")
# self.model = tf.keras.models.load_model("models/models_ym_kongguan.hdf5")
# 初始显示图片
self.to_predict_name = "images/background.png"
# 分类列表
# self.class_names = ['迪丽热巴', '赵丽颖']
self.class_names = ['向日葵', '玫瑰', '蒲公英', '郁金香', '雏菊']
# self.class_names = ['NG', 'OK']
self.resize(750, 500)
self.initUI()
# 界面初始化,设置界面布局
def initUI(self):
main_widget = QWidget()
main_layout = QHBoxLayout()
font = QFont('楷体', 15)
# 主页面,设置组件并在组件放在布局上
left_widget = QWidget()
left_layout = QVBoxLayout()
img_title = QLabel("待识别图片")
img_title.setFont(font)
img_title.setAlignment(Qt.AlignLeft)
self.img_label = QLabel()
img_init = cv2.imread(self.to_predict_name)
h, w, c = img_init.shape
scale = 400 / h
img_show = cv2.resize(img_init, (0, 0), fx=scale, fy=scale)
cv2.imwrite("images/show.png", img_show)
img_init = cv2.resize(img_init, (224, 224))
cv2.imwrite('images/target.png', img_init)
self.img_label.setPixmap(QPixmap("images/show.png"))
left_layout.addWidget(img_title)
left_layout.addWidget(self.img_label, 1, Qt.AlignCenter)
left_widget.setLayout(left_layout)
right_widget = QWidget()
right_layout = QVBoxLayout()
btn_change = QPushButton("上传图片")
btn_change.clicked.connect(self.change_img)
btn_change.setFont(font)
btn_predict = QPushButton("开始识别")
btn_predict.setFont(font)
btn_predict.clicked.connect(self.predict_img)
label_result = QLabel(' 识别结果 ')
self.result = QLabel("等待识别")
label_result.setFont(QFont('楷体', 16))
self.result.setFont(QFont('楷体', 24))
right_layout.addStretch()
right_layout.addWidget(label_result, 0, Qt.AlignCenter)
right_layout.addStretch()
right_layout.addWidget(self.result, 0, Qt.AlignCenter)
right_layout.addStretch()
right_layout.addStretch()
right_layout.addWidget(btn_change)
right_layout.addWidget(btn_predict)
right_layout.addStretch()
right_widget.setLayout(right_layout)
main_layout.addWidget(left_widget)
main_layout.addWidget(right_widget)
main_widget.setLayout(main_layout)
# 关于页面,设置组件并把组件放在布局上
about_widget = QWidget()
about_layout = QVBoxLayout()
about_title = QLabel('\n深度学习分类识别系统\n\n\n'
'收集数据集-处理训练集\n训练分类模型-测试模型-使用模型预测分类')
about_title.setFont(QFont('楷体', 25))
about_title.setAlignment(Qt.AlignCenter)
now = datetime.now()
# now = print(now)
# label_super = QLabel("B站:兵慌码乱\n2024-04-24")
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
label_super = QLabel("PYQT_Learning\n"+current_time)
label_super.setFont(QFont('楷体', 16))
label_super.setAlignment(Qt.AlignCenter)
about_layout.addWidget(about_title)
about_layout.addWidget(label_super)
about_widget.setLayout(about_layout)
# 添加注释
self.addTab(main_widget, '主页')
self.addTab(about_widget, '关于')
self.setTabIcon(0, QIcon('images/主页面.png'))
self.setTabIcon(1, QIcon('images/关于.png'))
# 上传并显示图片
def change_img(self):
openfile_name = QFileDialog.getOpenFileName(self, 'chose files', '',
'Image files(*.jpg *.png *jpeg)') # 打开文件选择框选择文件
img_name = openfile_name[0] # 获取图片名称
if img_name == '':
pass
else:
target_image_name = "images/tmp_up." + img_name.split(".")[-1] # 将图片移动到当前目录
shutil.copy(img_name, target_image_name)
self.to_predict_name = target_image_name
img_init = cv2.imread(self.to_predict_name) # 打开图片
h, w, c = img_init.shape
scale = 400 / h
img_show = cv2.resize(img_init, (0, 0), fx=scale, fy=scale) # 将图片的大小统一调整到400的高,方便界面显示
cv2.imwrite("images/show.png", img_show)
img_init = cv2.resize(img_init, (224, 224)) # 将图片大小调整到224*224用于模型推理
cv2.imwrite('images/target.png', img_init)
self.img_label.setPixmap(QPixmap("images/show.png"))
self.result.setText("等待识别")
# 预测图片
def predict_img(self):
img = Image.open('images/target.png') # 读取图片
img = np.asarray(img) # 将图片转化为numpy的数组
# outputs = self.model.predict(img.reshape(1, 224, 224, 3)) # 将图片输入模型得到结果
outputs = self.model.predict(img.reshape(1, 224, 224, 3)) # 将图片输入模型得到结果
print(outputs)
if max(max(outputs)) <= 0.7:
self.result.setText("暂无") # 在界面上做显示
return
result_index = int(np.argmax(outputs))
result = self.class_names[result_index] # 获得对应的分类名称
self.result.setText(result) # 在界面上做显示
# 界面关闭事件,询问用户是否关闭
def closeEvent(self, event):
reply = QMessageBox.question(self, '系统提示', "是否要退出程序?",
QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
self.close()
event.accept()
else:
event.ignore()
if __name__ == "__main__":
app = QApplication(sys.argv)
x = MainWindow()
x.show()
sys.exit(app.exec_())
PYQT实现分类检测识别系统----20240927
于 2024-09-27 13:39:52 首次发布