Implementierung von F1-Score, IOU und Dice ScorePython

Python-Programme
Guest
 Implementierung von F1-Score, IOU und Dice Score

Post by Guest »

In diesem Artikel wird ein hybrides CNN-Transformer-Modell zur Segmentierung medizinischer Bilder zur gleichzeitigen Segmentierung von Organen und Läsionen in medizinischen Bildern vorgeschlagen. Ihr Modell verfügt über zwei Ausgabezweige, einen zur Ausgabe der Organmaske und einen zur Ausgabe der Läsionsmaske. Nun beschreiben sie den Testprozess wie folgt:

Um die Leistung unseres Ansatzes mit den State-of-the-Art-Ansätzen zu vergleichen , wurden die folgenden Bewertungsmetriken verwendet: F1-Score (F1-S), Dice Score (D-S), Intersection Over Union (IoU) und
HD95, die wie folgt definiert sind:
Image



Image

wobei T P für True Positives steht, T N für True Negatives steht und F P für True Positives steht Falsch
Positive und F N sind falsch negative Werte, die alle mit den
Segmentierungsklassen der Testbilder verknüpft sind. Der Dice-Score ist eine Makrometrik, die für N Testbilder wie folgt berechnet wird:
[img]https:// i.sstatic.net/AJvkURd8.png[/img]
wobei TPi, FPi und FNi True Positives, True Negatives, False sind. Positiv und Falsch
Negativ für das i-te Bild.

Ich bin verwirrt, wie ich diese Metriken (mit Ausnahme von HD95) wie hier implementieren soll Ich verstehe, dass ich zur Berechnung von TP, FP und FN für f1-Score und IoU diese drei Größen (TP, FP und FN) über alle Stichproben im Testsatz für die beiden Ausgaben aggregieren muss (Läsion und Organ), und die Aggregation ist eine Summenoperation. Um beispielsweise den TP zu berechnen, muss ich ihn für jede Ausgabe jeder Stichprobe berechnen und diesen TP summieren. Wiederholen Sie dies dann zur Berechnung des TP für jede Stichprobe auf ähnliche Weise und addieren Sie dann alle diese TPs, um den Gesamt-TP zu erhalten. Dann mache ich dasselbe für FP und FN und setze sie dann in die Formeln ein.
Ich bin mir nicht sicher, ob mein Verständnis richtig ist oder nicht. Muss ich den Dice-Score für jede Ausgabe separat berechnen und sie dann mitteln? Da ich mir da nicht sicher bin, habe ich für diesen Artikel auf GitHub zugegriffen. Hier wird das Modell definiert, und hier wird die Codierung für das Testverfahren definiert. Das verwendete Framework ist PyTorch. Ich habe keine Kenntnisse über PyTorch, daher kann ich immer noch nicht verstehen, wie diese Metriken implementiert wurden, und kann daher nicht bestätigen, ob mein Verständnis richtig ist oder nicht. Kann also bitte jemand die Logik erklären, die zur Implementierung dieser Metriken verwendet wird?
Bearbeiten 1: Ich habe den Code zur Berechnung von TP, FP und FN in train_test_DTrAttUnet_BinarySegmentation.py durchgesehen:< /p>

Code: Select all

TP += np.sum(((preds == 1).astype(int) +
(yy == 1).astype(int)) == 2)
TN += np.sum(((preds == 0).astype(int) +
(yy == 0).astype(int)) == 2)
FP += np.sum(((preds == 1).astype(int) +
(yy == 0).astype(int)) == 2)
FN += np.sum(((preds == 0).astype(int) +
(yy == 1).astype(int)) == 2)
Es scheint, als hätten sie den Vorwärtsdurchlauf mit einer for-Schleife durchgeführt und dann diese Mengen akkumuliert und nach dieser Schleife die Metriken berechnet:

Code: Select all

    F1score = TP / (TP + ((1/2)*(FP+FN)) + 1e-8)
IoU = TP / (TP+FP+FN)
Das bedeutet also, dass sie TP, FP und FN über alle Bilder für beide Ausgaben akkumulieren und dann die Metriken berechnen. Ist das korrekt?
Für Dice Score it Scheint für mich schwierig zu sein, sie berechnen immer noch innerhalb der Schleife einige Mengen:

Code: Select all

for idice in range(preds.shape[0]):
dice_scores += (2 * (preds[idice] * yy[idice]).sum()) / (
(preds[idice] + yy[idice]).sum() + 1e-8
)

predss = np.logical_not(preds).astype(int)
yyy = np.logical_not(yy).astype(int)
for idice in range(preds.shape[0]):
dice_sc1 = (2 * (preds[idice] * yy[idice]).sum()) / (
(preds[idice] + yy[idice]).sum() + 1e-8
)
dice_sc2 = (2 * (predss[idice] * yyy[idice]).sum()) / (
(predss[idice] + yyy[idice]).sum() + 1e-8
)
dice_scores2 += (dice_sc1 + dice_sc2) / 2
Dann am Ende der Schleife:

Code: Select all

 epoch_dise = dice_scores/len(dataloader.dataset)
epoch_dise2 = dice_scores2/len(dataloader.dataset)
Trotzdem kann ich nicht verstehen, was mit Dice Score los ist.

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post