Python 大型图像的实例IOU快速计算

Python 大型图像的实例IOU快速计算,python,numpy,image-segmentation,Python,Numpy,Image Segmentation,我有一个实例布尔掩码,形状是(44810001000)对于448个实例,实例的平均像素大约是100 现在,如果我有一个形状为(1000,1000)的预测矩阵,并按整数预测实例,也就是说,如果矩阵预测500个实例,np.unique(pred)将是501(500类+1背景) 我需要计算每对预测和掩码的IOU(jaccard索引),以找到最大IOU。我已经写了下面的代码,但速度非常慢,效率非常低 c = 0 #intersection count u = 0 #union count pred_us

我有一个实例布尔掩码,形状是(44810001000)对于448个实例,实例的平均像素大约是100

现在,如果我有一个形状为(1000,1000)的预测矩阵,并按整数预测实例,也就是说,如果矩阵预测500个实例,np.unique(pred)将是501(500类+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)

因此,您有一个大小为[10001000]的输出图像,它是您的模型预测的数组/张量

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

你也可以试试Scikit的借条,它可能比你的vesion快一点

您可以在此处找到一个示例:


医生:

这不是真的。将阵列转换为1D阵列不会设置进程。您仍将处理N^2个元素+任何其他复合体以转换数组。