我已经浏览了一下,我不认为堆栈可以解决这个问题,尽管对此有所帮助,但我还是一个新手。
我正在使用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)
答案 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轴才能向上。
答案 1 :(得分:0)
SageMaker不为此提供内置方法。