Итак, у меня есть набор растровых изображений полигонов. Каждое изображение содержит массив битовых масок, описывающий выпуклый многоугольник. Все формы центрированы и имеют одинаковую величину.
Я хочу измерить сходство в каждом наборе, а также сравнить сходство в разных наборах.
Для этого я вычисляю среднее значение 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, которые мне нужны?
Мы будем очень благодарны за вашу помощь!