Ищем эффективные способы вычисления среднего значения IoU для большого набора - PullRequest
0 голосов
/ 17 июня 2020

Итак, у меня есть набор растровых изображений полигонов. Каждое изображение содержит массив битовых масок, описывающий выпуклый многоугольник. Все формы центрированы и имеют одинаковую величину.

Я хочу измерить сходство в каждом наборе, а также сравнить сходство в разных наборах.

Для этого я вычисляю среднее значение IoU. каждого набора со следующим кодом:

def calc_IoU(sample1, sample2):
    intersection = np.logical_and(sample1, sample2)
    union = np.logical_or(sample1, sample2)
    iou_score = np.sum(intersection) / np.sum(union)
    return iou_score

def IoU_of_Set(geometry_set):
    idx = range(len(geometry_set))
    pairs = list(IT.combinations(idx, 2))
    print("{} combinations from set".format(len(pairs)))
    IoU = 0
    for i,j in pairs:
        if i == j:
            continue
        IoU += calc_IoU(geometry_set[i],geometry_set[j])
    set_IoU = IoU/len(pairs)
    return set_IoU

Когда у меня есть IoU для всех наборов, я могу вычислить отношение средних IoU, чтобы дать сравнительную меру. Это следует из рекомендаций, приведенных здесь .

Эта процедура хорошо подходит для небольших наборов, однако некоторые из наборов, которые у меня есть, содержат более 12 000 форм. Эти наборы должны быть l oop через функцию calc_IoU более 81 миллиона раз, что приводит к некоторым проблемам с памятью.

Приведенный выше код работает более часа без вывода, поэтому я здесь, чтобы спросить, знает ли кто-нибудь более эффективный с вычислительной точки зрения метод получения баллов IoU, которые мне нужны?

Мы будем очень благодарны за вашу помощь!

...