|
|
@ -0,0 +1,200 @@
|
|
|
|
|
|
|
|
from warnings import simplefilter
|
|
|
|
|
|
|
|
simplefilter(action='ignore', category=FutureWarning)
|
|
|
|
|
|
|
|
from tkinter import ttk
|
|
|
|
|
|
|
|
import tkinter
|
|
|
|
|
|
|
|
import cv2
|
|
|
|
|
|
|
|
import numpy as np
|
|
|
|
|
|
|
|
from tkinter import *
|
|
|
|
|
|
|
|
from PIL import Image,ImageTk
|
|
|
|
|
|
|
|
from model_improved_alexnet import ImprovedAlexNet#调用模型
|
|
|
|
|
|
|
|
from tkinter.filedialog import askopenfilename
|
|
|
|
|
|
|
|
import tkinter.messagebox
|
|
|
|
|
|
|
|
import torch
|
|
|
|
|
|
|
|
from predict_improved_alexnet import improved_alexnet_predict#调用预测函数
|
|
|
|
|
|
|
|
import warnings
|
|
|
|
|
|
|
|
import os
|
|
|
|
|
|
|
|
warnings.filterwarnings("ignore")
|
|
|
|
|
|
|
|
from tkinter import *
|
|
|
|
|
|
|
|
import tkinter.simpledialog
|
|
|
|
|
|
|
|
import tkinter as tk
|
|
|
|
|
|
|
|
import tkinter.simpledialog as sd
|
|
|
|
|
|
|
|
from PIL import Image,ImageTk
|
|
|
|
|
|
|
|
import matplotlib.pyplot as plt#画图库
|
|
|
|
|
|
|
|
plt.rcParams['font.sans-serif']=['PingFang']
|
|
|
|
|
|
|
|
#plt.rcParams['axes.unicode_minus'] = False
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class CustomDialog(sd.Dialog):
|
|
|
|
|
|
|
|
def __init__(self, parent, title=None, background_image='bg.png', user_icon_path='user.gif', password_icon_path='hmenu-lock.gif'):
|
|
|
|
|
|
|
|
self.background_image = background_image
|
|
|
|
|
|
|
|
self.user_icon_path = user_icon_path
|
|
|
|
|
|
|
|
self.password_icon_path = password_icon_path
|
|
|
|
|
|
|
|
super().__init__(parent, title)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def body(self, master):
|
|
|
|
|
|
|
|
# 加载背景图
|
|
|
|
|
|
|
|
bg_image = Image.open(self.background_image)
|
|
|
|
|
|
|
|
bg_photo = ImageTk.PhotoImage(bg_image)
|
|
|
|
|
|
|
|
new_width = 400
|
|
|
|
|
|
|
|
new_height = 150
|
|
|
|
|
|
|
|
style = ttk.Style()
|
|
|
|
|
|
|
|
style.configure('ExtraLarge.TButton', font=('Arial', 16), padding=15)
|
|
|
|
|
|
|
|
self.bg_label = tk.Label(master, image=bg_photo)
|
|
|
|
|
|
|
|
self.bg_label.image = bg_photo # 保持对图片的引用
|
|
|
|
|
|
|
|
self.bg_label.place(x=0, y=0, relwidth=10, relheight=10) # 背景标签覆盖整个对话框区域
|
|
|
|
|
|
|
|
# 调整对话框尺寸
|
|
|
|
|
|
|
|
self.geometry(f"{new_width}x{new_height}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 加载用户名图标
|
|
|
|
|
|
|
|
user_icon_image = Image.open(self.user_icon_path)
|
|
|
|
|
|
|
|
user_icon_photo = ImageTk.PhotoImage(user_icon_image)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 加载密码图标
|
|
|
|
|
|
|
|
password_icon_image = Image.open(self.password_icon_path)
|
|
|
|
|
|
|
|
password_icon_photo = ImageTk.PhotoImage(password_icon_image)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 创建带用户名图标的标签
|
|
|
|
|
|
|
|
label_with_user_icon = tk.Label(master, text="用户名:", image=user_icon_photo, compound='left', font=('Arial', 16))
|
|
|
|
|
|
|
|
label_with_user_icon.grid(row=0)
|
|
|
|
|
|
|
|
label_with_user_icon.image = user_icon_photo # 保持对用户名图标图片的引用
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 创建带密码图标的标签
|
|
|
|
|
|
|
|
label_with_password_icon = tk.Label(master, text="密码:", image=password_icon_photo, compound='left', font=('Arial', 16))
|
|
|
|
|
|
|
|
label_with_password_icon.grid(row=1)
|
|
|
|
|
|
|
|
label_with_password_icon.image = password_icon_photo # 保持对密码图标图片的引用
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#创建用于输入用户名和密码的文本框,字体为arial,大小为16
|
|
|
|
|
|
|
|
self.entry1 = tk.Entry(master, font=('Arial', 16))
|
|
|
|
|
|
|
|
self.entry2 = tk.Entry(master, font=('Arial', 16), show='*')#密码显示为*
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#确定文本框位置
|
|
|
|
|
|
|
|
self.entry1.grid(row=0, column=1)
|
|
|
|
|
|
|
|
self.entry2.grid(row=1, column=1)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return self.entry1 # 设置初始焦点
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#获取用户输入的两个值并将它们作为一个元组存储在self.result变量中
|
|
|
|
|
|
|
|
def apply(self):
|
|
|
|
|
|
|
|
first_value = self.entry1.get()
|
|
|
|
|
|
|
|
second_value = self.entry2.get()
|
|
|
|
|
|
|
|
self.result = (first_value, second_value)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 设置窗体
|
|
|
|
|
|
|
|
root = Tk()#创建主窗口
|
|
|
|
|
|
|
|
root.withdraw()#隐藏主窗口
|
|
|
|
|
|
|
|
dialog = CustomDialog(root, "登录")#显示登陆窗口
|
|
|
|
|
|
|
|
result = dialog.result
|
|
|
|
|
|
|
|
#print("输入框1的值:", result[0])
|
|
|
|
|
|
|
|
#print("输入框2的值:", result[1])
|
|
|
|
|
|
|
|
if result is not None and str(result[0])=='12345' and str(result[1]) == '12345':
|
|
|
|
|
|
|
|
tkinter.messagebox.showinfo('提示:', '欢迎进入 中药识别')
|
|
|
|
|
|
|
|
root = Toplevel()
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
tkinter.messagebox.showinfo('提示:', '登录失败')
|
|
|
|
|
|
|
|
exit(-1)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 设置窗体
|
|
|
|
|
|
|
|
#root = Tk()
|
|
|
|
|
|
|
|
root.title("")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 图片对话框信息
|
|
|
|
|
|
|
|
path = StringVar()
|
|
|
|
|
|
|
|
file_entry = Entry(root, state='readonly', text=path)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 初始化
|
|
|
|
|
|
|
|
global now_img, alexnet_model
|
|
|
|
|
|
|
|
alexnet_model = None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#训练结果展示
|
|
|
|
|
|
|
|
def btn_pc():
|
|
|
|
|
|
|
|
image = plt.imread('./logs/0005.png')
|
|
|
|
|
|
|
|
plt.figure()#创建图形窗口
|
|
|
|
|
|
|
|
plt.imshow(image)#将读取的图片显示在图形窗口上
|
|
|
|
|
|
|
|
plt.axis('off')#关闭了图形的坐标轴显示
|
|
|
|
|
|
|
|
plt.title('模型训练曲线01-70')#标题
|
|
|
|
|
|
|
|
image = plt.imread('./logs/0006.png')
|
|
|
|
|
|
|
|
plt.figure()
|
|
|
|
|
|
|
|
plt.imshow(image)
|
|
|
|
|
|
|
|
plt.axis('off')
|
|
|
|
|
|
|
|
plt.title('模型混淆矩阵01-70')
|
|
|
|
|
|
|
|
image = plt.imread('./logs/0007.png')
|
|
|
|
|
|
|
|
plt.figure()
|
|
|
|
|
|
|
|
plt.imshow(image)
|
|
|
|
|
|
|
|
plt.axis('off')
|
|
|
|
|
|
|
|
plt.title('模型混淆矩阵71-100')
|
|
|
|
|
|
|
|
image = plt.imread('./logs/0008.png')
|
|
|
|
|
|
|
|
plt.figure()
|
|
|
|
|
|
|
|
plt.imshow(image)
|
|
|
|
|
|
|
|
plt.axis('off')
|
|
|
|
|
|
|
|
plt.title('模型混淆矩阵71-100')
|
|
|
|
|
|
|
|
plt.show()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 选择图片
|
|
|
|
|
|
|
|
def choosepic():
|
|
|
|
|
|
|
|
default_dir = r"./test/"
|
|
|
|
|
|
|
|
path_ = askopenfilename(title=u'选择文件', initialdir=(os.path.expanduser(default_dir)))
|
|
|
|
|
|
|
|
if len(path_) < 1:#若所选文件路径长度小于1,即代表没有这个文件
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
path.set(path_)#路径赋值给path
|
|
|
|
|
|
|
|
global now_img
|
|
|
|
|
|
|
|
# 设置图片路径
|
|
|
|
|
|
|
|
now_img = file_entry.get()
|
|
|
|
|
|
|
|
#print(now_img)
|
|
|
|
|
|
|
|
img_open = Image.open(file_entry.get())#打开图片
|
|
|
|
|
|
|
|
img_open = img_open.resize((1100, 700))#调整大小
|
|
|
|
|
|
|
|
# 显示图片到窗体
|
|
|
|
|
|
|
|
img = ImageTk.PhotoImage(img_open)#将打开的图片转换为Tkinter可用的
|
|
|
|
|
|
|
|
image_label.config(image=img)#将图片显示在窗口中
|
|
|
|
|
|
|
|
image_label.image = img#将转换后的图片对象保存在image_label中,显示在窗口中
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 退出软件
|
|
|
|
|
|
|
|
def btn_exit():
|
|
|
|
|
|
|
|
exit(0)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 调用模型
|
|
|
|
|
|
|
|
def btn_ai():
|
|
|
|
|
|
|
|
global now_img
|
|
|
|
|
|
|
|
global alexnet_model
|
|
|
|
|
|
|
|
if alexnet_model is None:
|
|
|
|
|
|
|
|
# create model
|
|
|
|
|
|
|
|
alexnet_model = ImprovedAlexNet(num_classes=11)
|
|
|
|
|
|
|
|
# load model weights
|
|
|
|
|
|
|
|
model_weight_path = "./models/se-inc-alexnet.pth"#调用模型
|
|
|
|
|
|
|
|
alexnet_model.load_state_dict(torch.load(model_weight_path,map_location='cpu'))
|
|
|
|
|
|
|
|
alexnet_model.eval()
|
|
|
|
|
|
|
|
res=improved_alexnet_predict(now_img,alexnet_model)#调用预测函数进行并预测
|
|
|
|
|
|
|
|
s=str(res)#转化为字符形式
|
|
|
|
|
|
|
|
tkinter.messagebox.showinfo('提示:',s)#显示一个提示框,包含预测结果
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 显示识别率
|
|
|
|
|
|
|
|
def btn_acc():
|
|
|
|
|
|
|
|
res = ''
|
|
|
|
|
|
|
|
with open('./logs/model.txt', 'r', encoding='utf-8') as fb:
|
|
|
|
|
|
|
|
s = fb.read()
|
|
|
|
|
|
|
|
res = res + '识别率是:%.2f%%'%(float(s)*100)
|
|
|
|
|
|
|
|
tkinter.messagebox.showinfo('提示:', res)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 设置窗体 可调整 主窗口
|
|
|
|
|
|
|
|
mainframe = ttk.Frame(root, padding="5 4 12 12")
|
|
|
|
|
|
|
|
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
|
|
|
|
|
|
|
|
mainframe.columnconfigure(0, weight=1)
|
|
|
|
|
|
|
|
mainframe.rowconfigure(0, weight=1)#使得当窗口调整大小时,该列/行也会相应地调整大小
|
|
|
|
|
|
|
|
# 配置按钮,联系上述对应功能
|
|
|
|
|
|
|
|
style = ttk.Style()
|
|
|
|
|
|
|
|
style.configure('ExtraLarge.TButton', font=('Arial', 16), padding=15)
|
|
|
|
|
|
|
|
#创建按钮
|
|
|
|
|
|
|
|
ttk.Button(mainframe, text="模型训练", command=btn_pc, style='ExtraLarge.TButton').grid(column=1, row=4, sticky=W)#左对齐
|
|
|
|
|
|
|
|
ttk.Button(mainframe, text="选择图片", command=choosepic, style='ExtraLarge.TButton').grid(column=2, row=4, sticky=W)
|
|
|
|
|
|
|
|
ttk.Button(mainframe, text="图像识别", command=btn_ai, style='ExtraLarge.TButton').grid(column=4, row=4, sticky=W)
|
|
|
|
|
|
|
|
ttk.Button(mainframe, text="模型准确率", command=btn_acc, style='ExtraLarge.TButton').grid(column=6, row=4, sticky=W)
|
|
|
|
|
|
|
|
ttk.Button(mainframe, text="关闭软件", command=btn_exit, style='ExtraLarge.TButton').grid(column=7, row=4, sticky=W)
|
|
|
|
|
|
|
|
# 显示初始化
|
|
|
|
|
|
|
|
image_label = ttk.Label(root,compound=CENTER)
|
|
|
|
|
|
|
|
image_label.grid(column=0,row=5, sticky=W)
|
|
|
|
|
|
|
|
bg = "./bg2.PNG"#封面
|
|
|
|
|
|
|
|
pil_image = Image.open(bg)#打开图片
|
|
|
|
|
|
|
|
pil_image = pil_image.resize((1100, 700))
|
|
|
|
|
|
|
|
img = ImageTk.PhotoImage(pil_image)
|
|
|
|
|
|
|
|
image_label.configure(image=img)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
root.mainloop()#进入Tkinter主事件循环,显示应用程序的界面并等待用户操作
|