深度学习(VGG16)的可视化界面

问题遇到的现象和发生背景
 想对VGG16算法做一个可视化窗口处理,但是运行app.py(系统部分)时最终还是predict.py文件运行,系统窗口没有显示出来
 个人感觉是系统代码中result部分出错
result = Classification.detect_image(img)

或者是predict那边有问题?
这是我想要运行app.py时出现的窗口

img


这是我实际运行app.py时出现了predict.py的窗口

img


想请问一下大家该怎么解决?
以下是代码部分
这是预测部分的代码

from PIL import Image

from classification import Classification

classfication = Classification()

while True:
    img = input('Input image filename:')
    try:
        image = Image.open(img)
    except:
        print('Open Error! Try again!')
        continue
    else:
        class_name = classfication.detect_image(image)
        print(class_name)

这是系统界面结果显示功能按键的代码

def recognition(self):
        global imgName


        model_ = torch.load('D:/study/classification-pytorch-main/logs/best_epoch_weights.pth')
        img = cv2.imread(imgName)
        img = img.reshape((1, 252, 324, 3))
        img = img.astype('float32')
        img = img / 255.0
        result = Classification.detect_image(img)  
        max_index = np.argmax(result) 
        label = ["F。","L。"]
        self.label.setText(label[max_index])
        self.label.setAlignment(Qt.AlignCenter)

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇博客: 语义分割-地表建筑物识别的一种解决方案中的 2,predict.py预测部分 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    from nets.segnet import mobilenet_segnet
    import copy
    import os
    import random
    
    import numpy as np
    from PIL import Image
    
    if __name__ == "__main__":
        #---------------------------------------------------#
        #   定义了输入图片的颜色,当我们想要去区分两类的时候
        #   我们定义了两个颜色,分别用于背景和斑马线
        #   [0,0,0], [0,255,0]代表了颜色的RGB色彩
        #---------------------------------------------------#
        class_colors = [[0,0,0],[0,255,0]]
        #---------------------------------------------#
        #   定义输入图片的高和宽,以及种类数量
        #---------------------------------------------#
        HEIGHT = 416
        WIDTH = 416
        #---------------------------------------------#
        #   背景 + 斑马线 = 2
        #---------------------------------------------#
        NCLASSES = 2
        directory1 = r'C:\Users\Administrator\Desktop\MY-SegNet_Mobile'
        os.chdir(directory1)     #设定当前工作路径
        #---------------------------------------------#
        #   载入模型
        #---------------------------------------------#
        model = mobilenet_segnet(n_classes=NCLASSES,input_height=HEIGHT, input_width=WIDTH)
        #--------------------------------------------------#
        #   载入权重,训练好的权重会保存在logs文件夹里面
        #   我们需要将对应的权重载入
        #   修改model_path,将其对应我们训练好的权重即可
        #   下面只是一个示例
        #--------------------------------------------------#
        model.load_weights("logs/ep002-loss0.290-val_loss0.457.h5")        #及时更新损失小的权重
    
        #--------------------------------------------------#
        #   对imgs文件夹进行一个遍历
        #--------------------------------------------------#
        imgs = os.listdir("./img/")                                        #读取文件的目录
        for jpg in imgs:
            #--------------------------------------------------#
            #   打开imgs文件夹里面的每一个图片
            #--------------------------------------------------#
            img = Image.open("./img/"+jpg)
            
            old_img = copy.deepcopy(img)
            orininal_h = np.array(img).shape[0]                            #获取图片的高和宽
            orininal_w = np.array(img).shape[1]
    
            #--------------------------------------------------#
            #   对输入进来的每一个图片进行Resize
            #   resize成[HEIGHT, WIDTH, 3]
            #--------------------------------------------------#
            img = img.resize((WIDTH,HEIGHT), Image.BICUBIC)
            img = np.array(img) / 255
            img = img.reshape(-1, HEIGHT, WIDTH, 3)
    
            #--------------------------------------------------#
            #   将图像输入到网络当中进行预测
            #--------------------------------------------------#
            pr = model.predict(img)[0]
            pr = pr.reshape((int(HEIGHT/2), int(WIDTH/2), NCLASSES)).argmax(axis=-1)
    
            #------------------------------------------------#
            #   创建一副新图,并根据每个像素点的种类赋予颜色
            #------------------------------------------------#
            seg_img = np.zeros((int(HEIGHT/2), int(WIDTH/2),3))
            for c in range(NCLASSES):
                seg_img[:, :, 0] += ((pr[:,: ] == c) * class_colors[c][0]).astype('uint8')
                seg_img[:, :, 1] += ((pr[:,: ] == c) * class_colors[c][1]).astype('uint8')
                seg_img[:, :, 2] += ((pr[:,: ] == c) * class_colors[c][2]).astype('uint8')
    
            seg_img = Image.fromarray(np.uint8(seg_img)).resize((orininal_w,orininal_h))
            #------------------------------------------------#
            #   将新图片和原图片混合
            #------------------------------------------------#
            image = Image.blend(old_img,seg_img,0.3)
            
            image.save("./img_out/"+jpg)
    
    
    
    
  • 以下回答来自chatgpt:

    根据参考资料中的提示,predict.py文件中的代码是用来进行图像分割预测并输出结果的,而app.py文件作为一个可视化界面,在预测完成后需要将结果显示出来。那么问题可能出在app.py文件中,需要对其进行修改,使其能够正确显示结果。具体步骤如下:

    1. 确认app.py文件中显示predict.py内容的窗口是否是正确的,如果是错误的窗口,需要找到正确的窗口进行修改。

    2. 找到窗口显示内容的代码,一般以类似tk.Label(window, text="xxx")的方式实现,需要将其中的text改为predict.py输出的结果。

    3. 修改显示结果的代码,需要将predict.py输出的结果载入到app.py中,并将其显示在窗口中。具体实现可以使用以下代码:

    from predict import predict
    ...
    result = predict(data)
    label.config(text=result)
    ...
    

    其中,data为需要输入到predict函数中进行预测的数据,predict函数是参考资料中给出的函数,在这里需要进行引用。label是窗口中显示结果的标签,可以使用tk.Label进行创建,并在窗口中摆放展示出来。修改之后再次运行程序即可看到正确的结果展示在相应窗口中。

    如果在修改app.py文件后仍然无法正确显示结果,可以考虑查看是否有其他程序或配置出现了异常,或者是否需要进行更多的调试。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^