2015-07-27 27 views
11

Jak obliczyć wynik (IU (średnia przecięcie na poziomie Unii) jak w dokumencie?Jak obliczyć średnią wartość IU w segmentacji obrazu?

Długo, Jonathan, Evan Shelhamer i Trevor Darrell. "W pełni konwergentne sieci do segmentacji semantycznej".

+0

zobacz także: [jak obliczyć Iou z Python] (http://stackoverflow.com/a/42874377/562769) –

Odpowiedz

18

dla każdej klasy przecięcia nad Unii (jm) wynik:

prawda dodatnie/(true dodatnie + fałszywie dodatnie + fałszywie ujemnych)

oznaczać jm jest po prostu średnią dla wszystkich klas.


chodzi o zapis na papierze:

  • n_cl: liczba klas
  • t_I: całkowita liczba pikseli w klasie i
  • n_ij: liczba piksele klasy i przewidziano, że należą do klasy j. Więc dla klasy i:

    • n_ii: liczba prawidłowo sklasyfikowanych pikseli (prawdziwie dodatnich)
    • n_ij: liczba pikseli błędnie sklasyfikowane (fałszywie dodatnie)
    • n_ji: liczba pikseli niesłusznie nie classifed (fałszywe negatywy)

można znaleźć kod mATLAB do obliczania tego bezpośrednio w DevKit Pascak here

+0

Czy istnieje wersja Pythona z tego samego kodu ? –

+0

@stochastic_zeitgeist check [to] (http://www.pyimagesearch.com/2016/11/07/intersection-over-union-iou-for-object-detection/) – Miki

+2

Myślę, że jest to tylko dla prostokątnych ramek ograniczających. W przypadku nieregularnych kształtów, myślę, że [to] (https://gist.github.com/meetshah1995/6a5ad112559ef1536d0191f8b9fe8d1e) powinno działać. –

1

To powinno pomóc

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) 
+0

jaki jest sens używania argmax w kodzie? – Eliethesaiyan

+1

Dane wyjściowe 'y_pred' mają kształt' n_classes * h * w', które chcemy przekonwertować na jeden obraz, gdzie wartości pikseli są równe klasie tego piksela i dlatego przyjmujemy wartość arg max na osi klasy. –

+0

dzięki .... rozumiem teraz – Eliethesaiyan