我使用Segmentation Models库进行多类(在我的情况下为4类)语义分割。使用3000 RGB(224x224x3)图像训练模型(带有“ resnet34”主干的UNet)。准确度约为92.80%。
1)为什么model.predict()函数要求将(1,224,224,3)形状的数组作为输入?即使在Keras documentation中也找不到答案。实际上,下面的代码可以正常工作,我没问题,但是我想了解原因。
predictions = model.predict( test_image.reshape(-1,224,224,3) );
2)predictions
是一个(1,224,224,3)形状的numpy数组。其数据类型为float32
,并包含一些浮点数。此数组中数字的含义是什么?如何可视化它们?我的意思是,我假设结果数组将为每个像素包含4个类标签之一(从0到3),然后我将为每个类应用颜色映射。换句话说,结果应该是一个预测图,但我没有得到。为了更好地理解我对预测图的含义,请访问Jeremy Jordan's blog about semantic segmentation。
result = predictions[0]
plt.imshow(result) # import matplotlib.pyplot as plt
3)我最终想要做的就像Github: mrgloom - Semantic Segmentation Categorical Crossentropy Example在visualy_inspect_result
函数中所做的一样。
答案 0 :(得分:1)
1)您的深度神经网络体系结构中的图像输入形状为(224,224,3),因此width = height = 224和3个颜色通道。并且,如果您想一次为模型提供多个图像,则还需要一个附加尺寸。所以(1,224,224,3)或(something,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-image:color.label2rgb
函数