想对VGG16算法做一个可视化窗口处理,但是运行app.py(系统部分)时最终还是predict.py文件运行,系统窗口没有显示出来
个人感觉是系统代码中result部分出错
result = Classification.detect_image(img)
或者是predict那边有问题?
这是我想要运行app.py时出现的窗口
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)
不知道你这个问题是否已经解决, 如果还没有解决的话: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)
根据参考资料中的提示,predict.py文件中的代码是用来进行图像分割预测并输出结果的,而app.py文件作为一个可视化界面,在预测完成后需要将结果显示出来。那么问题可能出在app.py文件中,需要对其进行修改,使其能够正确显示结果。具体步骤如下:
确认app.py文件中显示predict.py内容的窗口是否是正确的,如果是错误的窗口,需要找到正确的窗口进行修改。
找到窗口显示内容的代码,一般以类似tk.Label(window, text="xxx")
的方式实现,需要将其中的text改为predict.py输出的结果。
修改显示结果的代码,需要将predict.py输出的结果载入到app.py中,并将其显示在窗口中。具体实现可以使用以下代码:
from predict import predict
...
result = predict(data)
label.config(text=result)
...
其中,data
为需要输入到predict函数中进行预测的数据,predict
函数是参考资料中给出的函数,在这里需要进行引用。label
是窗口中显示结果的标签,可以使用tk.Label
进行创建,并在窗口中摆放展示出来。修改之后再次运行程序即可看到正确的结果展示在相应窗口中。
如果在修改app.py文件后仍然无法正确显示结果,可以考虑查看是否有其他程序或配置出现了异常,或者是否需要进行更多的调试。