Как рассчитать коэффициент кости для задачи сегментации мультикласса, используя Python? - PullRequest
1 голос
/ 28 апреля 2020

Мне интересно, как я могу рассчитать коэффициент кости для мультиклассовой сегментации.

Вот скрипт, который рассчитывает коэффициент кости для задачи двоичной сегментации. Как я могу l oop по каждому классу и рассчитать кости для каждого класса?

Заранее спасибо

import numpy 



def dice_coeff(im1, im2, empty_score=1.0):

    im1 = numpy.asarray(im1).astype(numpy.bool)
    im2 = numpy.asarray(im2).astype(numpy.bool)

    if im1.shape != im2.shape:
        raise ValueError("Shape mismatch: im1 and im2 must have the same shape.")

    im_sum = im1.sum() + im2.sum()
    if im_sum == 0:
        return empty_score

    # Compute Dice coefficient
    intersection = numpy.logical_and(im1, im2)

    return (2. * intersection.sum() / im_sum)

1 Ответ

0 голосов
/ 29 апреля 2020

Вы можете использовать dice_score для бинарных классов, а затем повторно использовать бинарные карты для всех классов, чтобы получить оценку для нескольких классов.

Я предполагаю, что ваши изображения / карты сегментации имеют формат (batch/index of image, height, width, class_map).

import numpy as np
import matplotlib.pyplot as plt

def dice_coef(y_true, y_pred):
    y_true_f = y_true.flatten()
    y_pred_f = y_pred.flatten()
    intersection = np.sum(y_true_f * y_pred_f)
    smooth = 0.0001
    return (2. * intersection + smooth) / (np.sum(y_true_f) + np.sum(y_pred_f) + smooth)

def dice_coef_multilabel(y_true, y_pred, numLabels):
    dice=0
    for index in range(numLabels):
        dice += dice_coef(y_true[:,:,:,index], y_pred[:,:,:,index])
    return dice/numLabels # taking average

num_class = 5

imgA = np.random.randint(low=0, high= 2, size=(5, 64, 64, num_class) ) # 5 images in batch, 64 by 64, num_classes map
imgB = np.random.randint(low=0, high= 2, size=(5, 64, 64, num_class) )


plt.imshow(imgA[0,:,:,0]) # for 0th image, class 0 map
plt.show()

plt.imshow(imgB[0,:,:,0]) # for 0th image, class 0 map
plt.show()

dice_score = dice_coef_multilabel(imgA, imgB, num_class)
print(f'For A and B {dice_score}')

dice_score = dice_coef_multilabel(imgA, imgA, num_class)
print(f'For A and A {dice_score}')

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...