--- a +++ b/Segmentation/metrics.py @@ -0,0 +1,44 @@ +import numpy as np +from keras import backend as K + + +def dice_score(mask_gt, mask_pred): + """Computes soerensen-dice coefficient. + + compute the soerensen-dice coefficient between the ground truth mask `mask_gt` + and the predicted mask `mask_pred`. + + Args: + mask_gt: 3-dim Numpy array of type bool. The ground truth mask. + mask_pred: 3-dim Numpy array of type bool. The predicted mask. + + Returns: + the dice coeffcient as float. If both masks are empty, the result is NaN. + """ + volume_sum = mask_gt.sum() + mask_pred.sum() + if volume_sum == 0: + return np.NaN + volume_intersect = (mask_gt & mask_pred).sum() + return 2*volume_intersect / volume_sum + +def dice_coef(y_true, y_pred, smooth=1): + """ + Dice = (2*|X & Y|)/ (|X|+ |Y|) + = 2*sum(|A*B|)/(sum(A^2)+sum(B^2)) + ref: https://arxiv.org/pdf/1606.04797v1.pdf + """ + intersection = K.sum(K.abs(y_true * y_pred), axis=-1) + return (2. * intersection + smooth) / (K.sum(K.square(y_true),-1) + K.sum(K.square(y_pred),-1) + smooth) + +def dice_coef_loss(y_true, y_pred): + return 1-dice_coef(y_true, y_pred) + +def jacard_coef(y_true, y_pred): + y_true_f = K.flatten(y_true) + y_pred_f = K.flatten(y_pred) + intersection = K.sum(y_true_f * y_pred_f) + return (intersection + 1.0) / (K.sum(y_true_f) + K.sum(y_pred_f) - intersection + 1.0) + + +def jacard_coef_loss(y_true, y_pred): + return 1-jacard_coef(y_true, y_pred) \ No newline at end of file