我正在使用神经网络进行语义分割(人类解析),类似于将人的照片作为输入,神经网络告诉我们每个像素最有可能是头部、腿部、背景或人体的其他部分。算法运行流畅,并给出一个numpy.ndarray
作为输出。数组的形状是(1,23,600,400)
,其中600x400是输入图像的分辨率,23是类别的数量。3d矩阵看起来像23层堆叠的2d矩阵,其中每一层都使用浮点矩阵来告知每个像素属于该类别的可能性。
为了使矩阵可视化,如下图所示,我使用numpy.argmax
将3d矩阵压缩成一个2d矩阵,该矩阵包含最可能的类别的索引。但我不知道如何继续获得我想要的可视化效果。
编辑
实际上,我可以用一种微不足道的方式来做这件事。也就是说,使用for循环遍历每个像素并为其分配颜色以获得图像。但是,这不是向量化编码,因为numpy内置了加速矩阵操作的方法。我需要为实时分割节省CPU周期。
发布于 2018-07-25 13:31:45
这相当简单。您所需要的只是一个将23个标签映射成独特颜色的lookup table。最简单的方法是使用23 x 3的numpy数组,每行存储相应标签的RGB值:
import numpy as np
import matplotlib.pyplot as plt
lut = np.random.rand(23, 3) # using random mapping - but you can do better
lb = np.argmax(prediction, axis=1) # converting probabilities to discrete labels
rgb = lut[lb[0, ...], :] # this is all it takes to do the mapping.
plt.imshow(rgb)
plt.show()
或者,如果您只对用于显示的色彩映射表感兴趣,则可以使用plt.imshow
的cmap
参数,但这将要求您将lut
转换为“色彩映射表”:
from matplotlib.colors import LinearSegmentedColormap
cmap = LinearSegmentedColormap.from_list('new_map', lut, N=23)
plt.imshow(lb[0, ...], cmap=cmap)
plt.show()
https://stackoverflow.com/questions/51495927
复制相似问题