Внедрение рейтинга F1, IOU и Dice ScorePython

Программы на Python
Ответить
Anonymous
 Внедрение рейтинга F1, IOU и Dice Score

Сообщение Anonymous »

В этой статье предлагается гибридная модель сегментации медицинских изображений CNN — трансформер для одновременной сегментации органов и поражений на медицинских изображениях. Их модель имеет две выходные ветви: одну для вывода маски органа, а другую для вывода маски поражения. Теперь они описывают процесс тестирования следующим образом:

Чтобы сравнить эффективность нашего подхода с современными
подходами использовались следующие метрики оценки: показатель 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)
Похоже, что они выполняли прямой проход с использованием цикла for, затем накапливали эти величины, а после этого цикла вычисляли метрики:

Код: Выделить всё

    F1score = TP / (TP + ((1/2)*(FP+FN)) + 1e-8)
IoU = TP / (TP+FP+FN)
Итак, это означает, что они накапливают 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)
Тем не менее, я не могу понять, что происходит с Dice Score.

Подробнее здесь: https://stackoverflow.com/questions/793 ... dice-score
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»