【问题标题】:Shaping output array from Caffe segmentation for PIL Image从 Caffe 分割为 PIL 图像整形输出数组
【发布时间】:2018-08-25 06:12:03
【问题描述】:

希望每个人的白天(或夜晚)都过得很好。

我一直在使用我遇到的 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]

任何想法或答案将不胜感激和有帮助。提前谢谢!

【问题讨论】:

  • 也许这是一个错字,但 reshape_array 实际上并没有在您发布的代码中的任何地方赋予值。另外,您是否验证了该图像的原始模型的输出是什么?如果是这样,您是否还必须在那里重塑预测,或者那里是否发生了其他类型的后处理?我问的原因是输出看起来根本不是随机的,而是以某种方式以错误的顺序排列。
  • 是的,复制粘贴时错过了reshape_array。接得好。对我来说,噪音绝对是一个糟糕的选择。我同意它确实看起来确实存在数据,这只是将输出数据格式化为图像的问题。我无法运行原始项目中的代码,因为我没有安装 caffe 的 python 包装器。我试图对后处理代码进行逆向工程,但这是一种非常奇怪的方法,老实说它没有多大意义。 Link 如果你好奇的话可以去 repo
  • 他们将 caffe 模型的结果保存到文本文件中,然后将文本文件加载到后处理中。我缺乏 c++ 语法知识,所以我很难理解它。我相信后处理发生在 Caffe_Segmentation/examples/seg/dumpRes.cpp
  • 我建议您构建和安装他们的 Caffe 分支,并使用它来确定网络的实际作用。比猜测要快得多。 ;-)
  • 不幸的是,我花了很多时间尝试构建它,但没有运气:(感谢您的帮助!非常感谢。我将深入研究他们正在使用的脚本看看我是否能理解他们将数据写入 txt 文件然后将其转换为图像的方法。也许这会迫使我更多地了解 C++

标签: python machine-learning caffe coreml


【解决方案1】:

看起来我能够弄清楚这一点。这不是数组顺序的问题,而是值和数据类型的问题。这是我为从输出中获取正确图像而编写的代码。

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

然后输出:

一切看起来都应该如此!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 2021-06-12
    • 1970-01-01
    相关资源
    最近更新 更多