我有一个实例布尔掩码,448个实例的形状为(448,1000,1000),实例的平均像素大约为100。
现在,如果我有一个形状为(1000,1000)的预测矩阵并按整数预测实例,即如果矩阵预测500实例,则np.unique(pred)将为501(500 class + 1 background)。
我需要为每对预测和掩码计算IOU(jaccard索引)以找到最大IOU。我在下面写过代码,但它超级慢,效率低。
c = 0 #intersection count
u = 0 #union count
pred_used = [] #record prediction used
# loop for every ground truth mask
for idx_m in range(len(mask[:,0,0])):
m = mask[idx_m,:,:] #take one mask
intersect_list = []
union_list = []
# loop every prediction
for idx_pred in range(1, int(np.max(pred))+1):
p = (pred==idx_pred) # take one prediction mask
intersect = np.sum(m.ravel() * p.ravel()) #calculate intersect
union = np.sum(m.ravel() + p.ravel() - m.ravel()*p.ravel())
intersect_list.append(intersect)
union_list.append(union_list)
if np.sum(intersect_list) > 0:
idx_max_iou = np.argmax(np.array(intersect_list))
c += intersect_list[idx_max_iou]
u += union_list[idx_max_iou]
pred_used.append(idx_max_iou)
因此,您的输出图像大小为[1000,1000],这是您的模型预测的数组/张量。
您可以做的第一件事就是将标签和预测从[1000,1000]重新整形为[1000 * 1000,]。这降低了从N ^ 2到N的复杂性。这应该显着提高速度。
你也可以试试Scikit的IoU,它可能比你的版本快一点。
你可以在这里找到一个例子:How to find IoU from segmentation masks?
Doc:http://scikit-learn.org/stable/modules/generated/sklearn.metrics.jaccard_similarity_score.html