我有一个预先训练的keras模型pspnet50_ad20k,想从中得到分割的图像。输入是形状为(1,473,473,3)的numpy数组中的图像,由于该模型预测了150种不同的类,它返回了形状(1,473,473,150)的数组。 >
import os
os.environ['KERAS_BACKEND'] = "tensorflow"
from keras.models import model_from_json
json_file = open('/data/pspnet50_ade20k.json', 'r')
loaded_model_json = json_file.read()
json_file.close()
loaded_model = model_from_json(loaded_model_json)
# load weights into new model
loaded_model.load_weights("/data/pspnet50_ade20k.h5")
print("Loaded model from disk")
# img_array contains img in shape (1, 473, 473, 3)
result = loaded_model.predict(img_array)
# result contains img in shape (1, 473, 473, 150)
我的问题:如何从结果数组中获取分割的图像?我必须以某种方式为图像中预测的150个类着色,但我不知道如何。有人可以给我解释一下吗?
答案 0 :(得分:0)
json_file =打开('/data/pspnet50_ade20k.json','r') 您使用的模型经过编码,可以预测50个类别,重新编码以更改模型或 构建自己的模型以预测需要多少个类。
更好地使用keras来构建您自己的模型,该模型的权重为:loaded_model.load_weights(“ / data / pspnet50_ade20k.h5”)
答案 1 :(得分:0)
Ade20k数据集有150个类,这就是您的网络最终输出(1, 473, 473, 150)
的原因。 150代表每个像素位置150个类别的概率。因此,您需要更改最后一层,通常是conv2d(256,classes=150,kernel_size=1)
。请用150(要预测的类数)替换150,然后在自己的数据集中微调模型。
对于着色预测,您可以这样做
from PIL import Image
import numpy as np
prediction = np.argmax(prediction, axis=3) # get the max prob label
palette = np.loadtxt('path/to/ade20k_colors.txt').astype('uint8')
# The format of `ade20k_colors.txt`
# 120 120 120
# 180 120 120
# 6 230 230
# 80 50 50
# 4 200 3
# ...
color = Image.fromarray(prediction.astype(np.uint8)).convert('P')
color.putpalette(palette)
# color is colorized prediction.