大图片上的实例IOU快速计算

时间:2018-06-28 02:21:15

标签: python numpy image-segmentation

我有一个实例布尔蒙版,它的形状为448个实例,形状为(448,1000,1000),实例的平均像素约为100。

现在,如果我有一个形状为(1000,1000)的预测矩阵并按整数预测实例,即如果该矩阵预测500个实例,则np.unique(pred)将为501(500类+ 1个背景)。 / p>

我需要为每对预测和掩码计算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)

1 个答案:

答案 0 :(得分:1)

因此,您有一个尺寸为[1000,1000]的输出图像,它是模型预测的数组/张量。

您可以做的第一件事就是将标签和预测的形状从[1000,1000]调整为[1000 * 1000,]。这样可以将复杂度从N ^ 2降低到N。这应该大大提高速度。

您还可以尝试使用Scikit的IoU,它可能比您的版本要快一些。

您可以在此处找到示例:How to find IoU from segmentation masks?

文档:http://scikit-learn.org/stable/modules/generated/sklearn.metrics.jaccard_similarity_score.html