0

我使用分割模型库进行多类(在我的情况下为 4 类)语义分割。该模型(具有“resnet34”主干的 UNet)使用 3000 个 RGB(224x224x3)图像进行训练。准确率约为 92.80%。

1) 为什么 model.predict() 函数需要 (1,224,224,3) 形状的数组作为输入?即使在Keras 文档中我也没有找到答案。实际上,下面的代码正在运行,我对此没有任何问题,但我想了解原因。

predictions = model.predict( test_image.reshape(-1,224,224,3) );

2)predictions是一个 (1,224,224,3) 形状的 numpy 数组。它的数据类型是float32并且包含一些浮点数。这个数组中的数字是什么意思?我如何可视化它们?我的意思是,我假设结果数组将包含每个像素的 4 个类标签(从 0 到 3)之一,然后我将为每个类应用颜色图。换句话说,结果应该是一个预测图,但我没有得到它。为了更好地理解我对预测图的意思,请访问Jeremy Jordan 关于语义分割的博客

result = predictions[0]
plt.imshow(result)  # import matplotlib.pyplot as plt

3)我最终想做的就像Github:mrgloom - Semantic Segmentation Categorical Crossentropy Examplevisualy_inspect_result函数中所做的。

4

1 回答 1

1

1)你的深度神经网络架构中的图像输入形状是(224,224,3),所以宽度=高度=224和3个颜色通道。如果您想一次为模型提供多个图像,您需要一个额外的维度。所以(1,224,224,3)或(某物,224,224,3)。

2)根据Segementation models repo的文档,您可以指定要作为输出的类数model = Unet('resnet34', classes=4, activation='softmax')。因此,如果您将标记的图像重塑为具有形状 (1,224,224,4)。最后一个维度是一个掩码通道,如果像素 i,j 属于 k 类,则用 0 或 1 指示。然后您可以预测和访问每个输出掩码

masked = model.predict(np.array([im])[0]
mask_class0 = masked[:,:,0]
mask_class1 = masked[:,:,1]

3)然后使用 matplotlib 你将能够绘制语义分割或使用scikit-imagecolor.label2rgb函数

于 2019-07-12T12:12:59.373 回答