N1955688260 2023-04-13 13:32 采纳率: 18.8%
浏览 27
已结题

我的print出的结果和tkinter上显示的结果不一致,怎么改啊?

我的print出的结果,和tkinter上显示的结果不一样,怎么改啊?
这是我tkinter上的显示:

img


这是print出的结果:

img


这是我将结果显示在tkinter上的代码:

    for k, v in name_dict.items():  # 将类别由数字转换为名称
        if result == v:  # 如果预测结果等于v, 打印出名称
            print("预测结果:", k)  # 打印出名称

    pred = "预测结果:" + k
    e1 = tk.Label(root, text=pred, font=('Arial', 16))#显示预测结果
    e1.place(x=600, y=370)

下面是我的整体代码:

import tkinter as tk
import tensorflow as tf
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import numpy as np
from tkinter import *
import tkinter.filedialog  # 注意次数要将文件对话框导入
from PIL import Image
from tensorflow.python.keras import models, layers

def CNN_yuce():
    global e1, pred, root,predict_class, k
    name_dict = {"Uninfected":0, "Parasitized":1}

    fig = plt.figure(figsize=(2,2),dpi=100)
    # 从本地选择一个文件,并返回文件的目录
    # filenames = tkinter.filedialog.askopenfile()#形成一共io流 的文件名称
    filename = tk.filedialog.askopenfilename(title=u'加载图片',initialdir=(()))#只保留文件名和后缀
    print(filename)

    # model_save_path = 'D:/ningyupeng/pythonProject/Graduation Project V1.0/my_model/variables/variables.ckpt'

    model = tf.keras.models.Sequential([
        tf.keras.layers.Flatten(),#Flatten-变成一维数组
        tf.keras.layers.Dense(128, activation='relu'),#relu函数可以解决 梯度消失问题 是线性的
        tf.keras.layers.Dense(2, activation='softmax')])# 2个类所以2个神经元 softmax只用在最后一层 可以让最后输出的概率在0-1之间

    # model.load_weights('checkpoint-05e-val_acc_0.58.hdf5')#读取文件
    models.load_model("my_model")

    # 加载测试图片
    img = Image.open(filename)
    # 将图片resize到224x224大小
    img = img.resize((128, 128), Image.ANTIALIAS)
    # 将灰度图转化为RGB模式
    img = img.convert("RGB")

    plt.axis('off')  # 去掉坐标轴
    plt.imshow(img)
    # 归一化
    img1 = np.array(img) / 255.
    # 将图片增加一个维度,目的是匹配网络模型
    img1 = (np.expand_dims(img1, 0))
    # 将预测结果转化为概率值
    result = np.squeeze(model.predict(img1))
    predict_class = np.argmax(result)
    # pred = tf.argmax(result, axis=1)#求最大值得出最后识别出来的数
    # print(inverse_dict[int(predict_class)],result[predict_class])
    # 将预测的结果打印在图片上面
    # plt.title([inverse_dict[int(predict_class)],result[predict_class]])
    print(result)

    result = np.argmax(result[0])  # 取出预测结果中概率最大的元素索引值
    for k, v in name_dict.items():  # 将类别由数字转换为名称
        if result == v:  # 如果预测结果等于v, 打印出名称
            print("预测结果:", k)  # 打印出名称

    pred = "预测结果:" + k
    e1 = tk.Label(root, text=pred, font=('Arial', 16))#显示预测结果
    e1.place(x=600, y=370)

    canvas = FigureCanvasTkAgg(fig, master=root)#渲染器 在画布上放置图片
    canvas.draw()
    canvas.get_tk_widget().place(x=600,y=150)
def picture():
    global root
    root = Tk()
    root.wm_title("细胞图像疟疾检测")
    root.geometry('1000x650')

    ask = tk.Button(root, text="CNN", width=10, command=CNN_yuce)
    ask.place(x=600, y=90)

    root.mainloop()

if __name__ == '__main__':
    picture()

  • 写回答

2条回答 默认 最新

  • Leodong. 2023-04-13 14:14
    关注

    该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:

    从您提供的代码中可以看出,您在将预测结果打印在控制台中时使用了以下代码:

    for k, v in name_dict.items():
        if result == v:
            print("预测结果:", k)
    

    但是,当您在将预测结果显示在 tkinter 窗口中时,使用了以下代码:

    result = np.argmax(result[0])
    for k, v in name_dict.items():
        if result == v:
            print("预测结果:", k)
    pred = "预测结果:" + k
    e1 = tk.Label(root, text=pred, font=('Arial', 16))
    e1.place(x=600, y=370)
    

    这两段代码中的变量 k 的值是不同的。在第一段代码中,k 的值是在循环中最后一次赋值的名称,而在第二段代码中,k 的值是在循环结束后最后一次赋值的名称。因此,这两个变量的值不同,导致在控制台中打印的结果和 tkinter 窗口中显示的结果不一致。

    要解决这个问题,您可以将第二段代码中的 k 的赋值移到循环内部,以确保每次循环结束时 k 的值都是正确的名称。以下是修改后的代码:

    result = np.argmax(result[0])
    for k, v in name_dict.items():
        if result == v:
            print("预测结果:", k)
            pred = "预测结果:" + k
            e1 = tk.Label(root, text=pred, font=('Arial', 16))
            e1.place(x=600, y=370)
    

    这样修改后,您的预测结果应该在控制台和 tkinter 窗口中都能正确地显示。


    如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月18日
  • 已采纳回答 4月14日
  • 创建了问题 4月13日

悬赏问题

  • ¥15 AT89C51控制8位八段数码管显示时钟。
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口