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

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

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

Ответ 1

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

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

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


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

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

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

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

Ответ 2

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

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)