从用于 PIL 图像的 Caffe 分割整形输出数组

Shaping output array from Caffe segmentation for PIL Image

祝大家白天(或晚上)一切顺利。

我一直在研究遇到的 Caffe 模型,但在使用输出数组时遇到了一些问题。我之前没有使用过细分,所以对于更了解该主题的人来说,这可能是一个简单的修复。

模型基于这篇论文Deep Joint Task Learning for Generic Object Extraction。我已将模型转换为 CoreML 格式。

我遇到的问题是:

尝试从输出创建 PIL 图像时,我得到了随机噪声,我认为这只是 numpy 数组形状错误或像素顺序错误的简单问题。 输出数组的形状为 (2500, 1),它应该是一个 50x50 的黑白图像

代码如下所示:

image = Image.open('./1.jpg')
image = image.resize((55, 55), Image.ANTIALIAS)

predictions = model.predict({'data_55': image} , useCPUOnly = False)
predictions = predictions['fc8_seg']

reshape_array = numpy.reshape(predictions, (50,50))
output_image = Image.fromarray(reshape_array, '1')

我已经在 numpy reshape 上尝试了 F 和 C 命令,除了看起来像这样的噪声之外似乎什么也得不到 。我正在使用原始存储库中提供的测试图像之一,所以这应该不是问题。作为旁注,数组中的值如下所示:

[[  4.55798066e-08   5.40980977e-07   2.13476710e-06 ...,   6.66990445e-08
6.81615759e-08   3.21255470e-07]
[  2.69358861e-05   1.94866928e-07   4.71876803e-07 ...,   1.25911642e-10
3.14572794e-08   1.61371077e-08]

如有任何想法或答案,我们将不胜感激和乐于助人。提前致谢!

看来我能解决这个问题。这不是数组顺序的问题,而是值和数据类型的问题。这是我放在一起的代码,用于从输出中获取正确的图像。

predictions = model.predict({'data_55': image} , useCPUOnly = True) # Run the prediction

map_final = predictions['fc8_seg'][0,0,:,:] # fc8_seg is the output of the neural network
map_final = map_final.reshape((50,50)) # Reshape the output from shape (2500) to (50, 50)
map_final = numpy.flip(map_final, 1) # Flip axis 1 to unmirror the image

# Scale the values in the array to a range between 0 and 255
map_final -= map_final.min() 
map_final /= map_final.max()
map_final = numpy.ceil(map_final*255)

map_final_unint8 = map_final.astype(numpy.uint8) # Convert the data type to an uint8
pil_image = Image.fromarray(map_final_unint8, mode = 'L') # Create the PIL image

输出:

一切看起来都应该如此!