Как найти IoU из масок сегментации?
Я выполняю задачу сегментации изображений и использую набор данных, который имеет только истинные факты, но не имеет ограничивающих рамок или многоугольников.
У меня есть 2 класса (игнорируя 0 для фона) и выходные данные и метки заземления в массиве, как
Прогнозируемый -/--- Этикетки
0|0|0|1|2 0|0|0|1|2
0|2|1|0|0 0|2|1|0|0
0|0|1|1|1 0|0|1|1|1
0|0|0|0|1 0|0|0|0|1
Как мне рассчитать IoU из них?
PS: я использую Python3 с API Pytorch
2 ответа
Поэтому я только что узнал, что jaccard_simility_score считается IoU.
Так что решение очень простое,
from sklearn.metrics import jaccard_similarity_score
jac = jaccard_similarity_score(predictions, label, Normalize = True/False)
Ссылка на источник: http://scikit-learn.org/stable/modules/generated/sklearn.metrics.jaccard_similarity_score.html
Вы можете создавать бинарные карты для данного класса.
def calculate_iou(self, gt_mask, pred_mask, class=1):
if threshold:
pred_mask = (pred_mask == class) * 1
gt_mask = (gt_mask == class) * 1
overlap = pred_mask * gt_mask # Logical AND
union = (pred_mask + gt_mask)>0 # Logical OR
iou = overlap.sum() / float(union.sum())
return iou
Обратите внимание, что такое представление создается путем создания двоичных вероятностей для каждого класса. Итак, модели создают 4 карты вероятностей для 4 классов. Затем наибольшая вероятность для каждого пикселя считается наибольшим классом вероятности.