显示Numpy数组中的类概率

时间:2020-06-02 11:57:35

标签: numpy amazon-sagemaker

我已经浏览了一下,我不认为堆栈可以解决这个问题,尽管对此有所帮助,但我还是一个新手。

我正在使用AWS Sagemaker终端节点返回png蒙版,并且试图显示每个类的整体概率。

所以首先要这么做:

np.set_printoptions(threshold=np.inf)
pred_map = np.argmax(mask, axis=0)

non_zero_mask = pred_map[pred_map != 0]) # get everything but background

# print(np.bincount(pred_map[pred_map != 0]).argmax()) # Ignore this line as it just shows the most probable

num_classes = 6
plt.imshow(pred_map, vmin=0, vmax=num_classes-1, cmap='jet')
plt.show()

如您所见,我正在删除背景像素,现在我需要显示1,2,3,4,5类具有X概率,这取决于它们所占据的像素数-我不确定是否会只需从原始蒙版中获取元素总数,然后循环并计算每个像素/类编号等,即可重新发明轮子-请问有内置方法吗?

更新:

因此,在输入此内容后,请稍加思考并重新输入一些搜索字词,然后发现该问题。

    unique_elements, counts_elements = np.unique(pred_map[pred_map != 0], return_counts=True)
    print(np.asarray((unique_elements, counts_elements)))
#[[    2     3]
#[87430  2131]]

因此,我只是根据此计算百分比,还是有更好的方法?例如,我会

87430 / 89561(total number of pixels in the mask) * 100

在这种情况下,给2的概率为97%。

更新以下乔的评论:

rec = Record()
recordio = mx.recordio.MXRecordIO(results_file, 'r')
protobuf = rec.ParseFromString(recordio.read())
values = list(rec.features["target"].float32_tensor.values)
shape = list(rec.features["shape"].int32_tensor.values)
shape = np.squeeze(shape)
mask = np.reshape(np.array(values), shape)
mask = np.squeeze(mask, axis=0)

2 个答案:

答案 0 :(得分:0)

我的第一个想法是使用np.digitize并编写一个不错的解决方案。

但是后来我意识到了如何在10行中破解它:

import numpy as np
import matplotlib.pyplot as plt

size = (10, 10)

x = np.random.randint(0, 7, size) # your classes, seven excluded.

# empty array, filled with mask and number of occurrences.
x_filled = np.zeros_like(x)

for i in range(1, 7):

    mask = x == i
    count_mask = np.count_nonzero(mask)

    x_filled[mask] = count_mask

print(x_filled)    

plt.imshow(x_filled)
plt.colorbar()
plt.show()

我不确定imshow的轴约定 此刻,您可能必须翻转y轴才能向上。

enter image description here

答案 1 :(得分:0)

SageMaker不为此提供内置方法。