Farshid Rayhan
Farshid Rayhan

Reputation: 1214

How to find IoU from segmentation masks?

I am doing an image segmentation task and I am using a dataset that only has ground truths but no bounding boxes or polygons.

I have 2 classes( ignoring 0 for background) and the outputs and ground truth labels are in an array like

Predicted--/---Labels

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

How do I calculate IoU from these ?

PS: I am using python3 with pytorch api

Upvotes: 11

Views: 16346

Answers (2)

Mehmet Burak Sayıcı
Mehmet Burak Sayıcı

Reputation: 467

You can create binary maps for given class.

    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

Note that this kind of representation, is created by creating binary probabilities for each class. So, models are creating 4 probability maps for 4 classes. Then, largest probability for each pixel is considered as the largest probability class.

Upvotes: 1

Farshid Rayhan
Farshid Rayhan

Reputation: 1214

So I just found out that jaccard_similarity_score is regarded as IoU.

So the solution is very simple,

from sklearn.metrics import jaccard_similarity_score jac = jaccard_similarity_score(predictions, label, Normalize = True/False)

Source link: https://scikit-learn.org/stable/modules/generated/sklearn.metrics.jaccard_score.html#sklearn.metrics.jaccard_score

Upvotes: 9

Related Questions