Comment calculer le score moyen IU (Intersection moyenne sur Union) comme dans le papier this ?
Long, Jonathan, Evan Shelhamer et Trevor Darrell. "Réseaux entièrement convolutifs pour la segmentation sémantique."
Pour chaque classe Intersection over Union (IU) le score est:
vrai positif/(vrai positif + faux positif + faux négatif)
Le IU moyen est simplement la moyenne de toutes les classes.
Concernant la notation dans le papier:
n_ij: nombre de pixels de la classe i prévu pour appartenir à la classe j . Donc pour la classe i :
Vous pouvez trouver le code matlab pour le calculer directement dans le Pascak DevKit ici
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)
Cela devrait aider
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)