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:


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)
Code: Select all
F1score = TP / (TP + ((1/2)*(FP+FN)) + 1e-8)
IoU = TP / (TP+FP+FN)
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
Code: Select all
epoch_dise = dice_scores/len(dataloader.dataset)
epoch_dise2 = dice_scores2/len(dataloader.dataset)