Чтобы сравнить эффективность нашего подхода с современными
подходами использовались следующие метрики оценки: показатель F1 (F1-S), показатель Dice (DS), показатель пересечения через объединение (IoU) и
HD95, которые определяются следующим образом:


где TP — истинно положительные значения, T N — истинно отрицательные значения, F P — это ложные
положительные результаты, а FN — это ложные отрицательные результаты, все они связаны с классами
сегментации тестовых изображений. Оценка Dice — это макро
метрика, которая рассчитывается для N тестовых изображений следующим образом:
[img]https:// i.sstatic.net/AJvkURd8.png[/img]
где TPi, FPi и FNi — истинные положительные значения, истинные отрицательные значения и ложные значения. Положительные и ложные
Отрицательные значения для i-го изображения соответственно.
Я не понимаю, как реализовать эти метрики (исключая HD95), как показано здесь. Как я понимаю, чтобы вычислить TP, FP и FN для f1-показателя и IoU, мне нужно агрегировать эти три величины (TP, FP и FN) по всем выборкам в тестовом наборе для два выхода (поражение и орган), а агрегирование представляет собой операцию суммы. Например, чтобы вычислить TP, мне нужно вычислить его для каждого результата каждого образца и просуммировать этот TP. Затем повторите это для расчета TP для каждого образца аналогичным образом, а затем сложите все эти TP, чтобы получить общий TP. Затем я делаю то же самое для FP и FN, а затем подставляю их в формулы.
Я не уверен, правильно ли я понимаю или нет. Для оценки Dice мне нужно рассчитать ее для каждого результата отдельно, а затем усреднить их? Я не уверен в этом, поэтому я обратился к GitHub для этой статьи. Здесь определяется модель, а также кодирование процедуры тестирования. Используемый фреймворк — PyTorch. У меня нет никаких знаний о PyTorch, поэтому я до сих пор не могу понять, как были реализованы эти метрики, и, следовательно, я не могу подтвердить, правильно ли я понимаю или нет. Поэтому, пожалуйста, кто-нибудь может объяснить логику, используемую для реализации этих показателей.
Изменить 1: я просмотрел код для расчета TP, FP и FN в train_test_DTrAttUnet_BinarySegmentation.py:< /p>
Код: Выделить всё
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)
Код: Выделить всё
F1score = TP / (TP + ((1/2)*(FP+FN)) + 1e-8)
IoU = TP / (TP+FP+FN)
Для Dice Score это Мне это кажется сложным, они все равно внутри цикла вычисляют некоторые величины:
Код: Выделить всё
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
Код: Выделить всё
epoch_dise = dice_scores/len(dataloader.dataset)
epoch_dise2 = dice_scores2/len(dataloader.dataset)
Подробнее здесь: https://stackoverflow.com/questions/793 ... dice-score
Мобильная версия