大图实例IOU快速计算

Instance IOU fast calculation on large image

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

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

我需要为每对预测和掩码计算 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],这是您的模型预测的 array/tensor。

您可以做的第一件事就是将标签和预测从 [1000,1000] 重塑为 [1000*1000, ]。这将复杂度从 N^2 降低到 N。这应该会显着提高速度。

你也可以试试 Scikit 的 IoU,它可能比你的版本快一点。

你可以在这里找到一个例子:

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