Как рассчитать средний балл IU при сегментации изображения?

Как рассчитать средний балл IU (среднее пересечение по объединению), как в этой статье?

Лонг, Джонатан, Эван Шелхамер и Тревор Даррелл. "Полностью сверточные сети для семантической сегментации".

3 ответа

Для каждого класса оценка пересечения по союзу (IU) равна:

истинно положительный / (истинно положительный + ложно положительный + ложно отрицательный)

Среднее IU - это просто среднее значение по всем классам.


Относительно обозначений в статье:

  • n_cl: количество классов
  • t_i: общее количество пикселей в классе i
  • n_ij: количество пикселей класса i, которые, по прогнозам, принадлежат классу j. Итак, для класса I:

    • n_ii: количество правильно классифицированных пикселей (истинные позитивы)
    • n_ij: количество ошибочно классифицированных пикселей (ложные срабатывания)
    • n_ji: количество пикселей ошибочно не классифицировано (ложные негативы)

Вы можете найти код Matlab для вычисления этого непосредственно в Pascak DevKit здесь

 from sklearn.metrics import confusion_matrix  
 import numpy as np

 def compute_iou(y_pred, y_true):
     # ytrue, ypred is a flatten vector
     y_pred = y_pred.flatten()
     y_true = y_true.flatten()
     current = confusion_matrix(y_true, y_pred, labels=[0, 1])
     # compute mean iou
     intersection = np.diag(current)
     ground_truth_set = current.sum(axis=1)
     predicted_set = current.sum(axis=0)
     union = ground_truth_set + predicted_set - intersection
     IoU = intersection / union.astype(np.float32)
     return np.mean(IoU)

Это должно помочь

def computeIoU(y_pred_batch, y_true_batch):
    return np.mean(np.asarray([pixelAccuracy(y_pred_batch[i], y_true_batch[i]) for i in range(len(y_true_batch))])) 

def pixelAccuracy(y_pred, y_true):
    y_pred = np.argmax(np.reshape(y_pred,[N_CLASSES_PASCAL,img_rows,img_cols]),axis=0)
    y_true = np.argmax(np.reshape(y_true,[N_CLASSES_PASCAL,img_rows,img_cols]),axis=0)
    y_pred = y_pred * (y_true>0)

    return 1.0 * np.sum((y_pred==y_true)*(y_true>0)) /  np.sum(y_true>0)

В jaccard_similarity_score( Как найти IoU из масок сегментации?) может использоваться для получения тех же результатов, что и код @Alex-zhai выше:

import numpy as np
from sklearn.metrics import jaccard_score

y_true = np.array([[0, 1, 1],
                   [1, 1, 0]])
y_pred = np.array([[1, 1, 1],
                   [1, 0, 0]])

labels = [0, 1]
jaccards = []
for label in labels:
    jaccard = jaccard_score(y_pred.flatten(),y_true.flatten(), pos_label=label)
    jaccards.append(jaccard)
print(f'avg={np.mean(jaccards)}')
Другие вопросы по тегам