Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to calculate dice coefficient for measuring accuracy of image segmentation in python

I have an image of land cover and I segmented it using K-means clustering. Now I want to calculate the accuracy of my segmentation algorithm. I read somewhere that dice co-efficient is the substantive evaluation measure. But I am not sure how to calculate it. I use Python 2.7 Are there any other effective evaluation methods? Please give a summary or a link to a source. Thank You!

Edits: I used the following code for measuring the dice similarity for my original and the segmented image but it seems to take hours to calculate:

for i in xrange(0,7672320):
  for j in xrange(0,3):
    dice = np.sum([seg==gt])*2.0/(np.sum(seg)+np.sum(gt)) #seg is the segmented image and gt is the original image. Both are of same size
like image 499
RachJain Avatar asked Jul 07 '15 15:07

RachJain


People also ask

How do you calculate the coefficient of dice in image segmentation?

Simply put, the Dice Coefficient is 2 * the Area of Overlap divided by the total number of pixels in both images.

How do you find the accuracy of a segmented image?

Pixel Accuracy An alternative metric to evaluate a semantic segmentation is to simply report the percent of pixels in the image which were correctly classified. The pixel accuracy is commonly reported for each class separately as well as globally across all classes.

How are dice scores calculated?

The formula for calculating DICE score is DICE= D+2I+2C1+C2+E Numerical values are assigned to each one of these to express them statistically.


3 Answers

If you are working with opencv you could use the following function:

import cv2
import numpy as np

#load images
y_pred = cv2.imread('predictions/image_001.png')
y_true = cv2.imread('ground_truth/image_001.png') 

# Dice similarity function
def dice(pred, true, k = 1):
    intersection = np.sum(pred[true==k]) * 2.0
    dice = intersection / (np.sum(pred) + np.sum(true))
    return dice

dice_score = dice(y_pred, y_true, k = 255) #255 in my case, can be 1 
print ("Dice Similarity: {}".format(dice_score))

In case you want to evaluate with this metric within a deep learning model using tensorflow you can use the following:

def dice_coef(y_true, y_pred):
    y_true_f = tf.reshape(tf.dtypes.cast(y_true, tf.float32), [-1])
    y_pred_f = tf.reshape(tf.dtypes.cast(y_pred, tf.float32), [-1])
    intersection = tf.reduce_sum(y_true_f * y_pred_f)
    return (2. * intersection + 1.) / (tf.reduce_sum(y_true_f) + tf.reduce_sum(y_pred_f) + 1.)
like image 61
Denis Berroeta Avatar answered Oct 12 '22 13:10

Denis Berroeta


Please refer to Dice similarity coefficient at wiki

A sample code segment here for your reference. Please note that you need to replace k with your desired cluster since you are using k-means.

import numpy as np

k=1

# segmentation
seg = np.zeros((100,100), dtype='int')
seg[30:70, 30:70] = k

# ground truth
gt = np.zeros((100,100), dtype='int')
gt[30:70, 40:80] = k

dice = np.sum(seg[gt==k])*2.0 / (np.sum(seg) + np.sum(gt))

print 'Dice similarity score is {}'.format(dice)
like image 31
pyan Avatar answered Oct 12 '22 12:10

pyan


This is an important clarification if what you're using has more than 2 classes (aka, a mask with 1 and 0).

If you are using multiple classes, make sure to specify that the prediction and ground truth also equal the value which you want. Otherwise you can end up getting DSC values greater than 1.

This is the extra ==k at the end of each [] statement:

import numpy as np

k=1

# segmentation
seg = np.zeros((100,100), dtype='int')
seg[30:70, 30:70] = k

# ground truth
gt = np.zeros((100,100), dtype='int')
gt[30:70, 40:80] = k

dice = np.sum(seg[gt==k]==k)*2.0 / (np.sum(seg[seg==k]==k) + np.sum(gt[gt==k]==k))

print 'Dice similarity score is {}'.format(dice)
like image 39
Brian Mark Anderson Avatar answered Oct 12 '22 13:10

Brian Mark Anderson