图像分割——Dice系数
在预测脑肿瘤或者皮肤病变的mask模型中,我们一般将mask图像中的像素分类成1或0,即如果像素中有mask,我们声明为1,如果像素中没有mask,我们声明为0,这种对图像进行逐像素二进制分类称为“语义分割”。
如果我们试图去识别图像中的许多对象,则称为“实例分割”,实例分割是一种多分类分割。例如,在自动驾驶汽车视野中,物体被分类为汽车、道路、树木、房屋、天空、行人等。
在语义(二进制)分割和实例(多类)分割中,我们需要一个损失函数来计算梯度。
Dice定义
Dice系数是一种集合相似度度量函数,通常用于计算两个样本的相似度,取值为[0,1]。
在上图中,ground truth为金标准,即理论分割结果的图像,一般是通过专家手工勾画出来得到的理论值; predicted为预测的分割结果图像。
Dice系数的python实现
下列给出求一套数据的dice和批量求dice的python代码
import shutil
import SimpleITK as sitk
from medpy.metric import dc
import numpy as np
from scipy.ndimage import label
def calculate_dice(seg_path,pred_path):
seg = sitk.ReadImage(seg_path)
seg_arr = sitk.GetArrayFromImage(seg)
pred = sitk.ReadImage(pred_path)
pred_arr = sitk.GetArrayFromImage(pred)
label = [1] #这里求得是label=1的dice,需要根据实际情况修改
dice = []
for i in range(len(label)):
intersection = np.sum((seg_arr == label[i])*(pred_arr == label[i]))
union = np.sum(pred_arr == label[i])+np.sum(seg_arr == label[i])
dice.append(2*intersection/union)
return np.mean(dice)
#求一套数据的dice
seg_path = 'E:/segmentation.nii.gz' #ground truth的路径
pred_path = 'C:/case30.nii.gz' #预测图像的路径
print(calculate_dice(seg_path,pred_path))
#批量求dice,先把路径保存为txt格式,再一个一个读取
seg_path = 'E:/label_list.txt' #保存ground truth的文本路径
pred_path = 'E:/pred_list_c++.txt' #保存预测图像的文本路径
dice = []
seg_opens = open(seg_path)
pred_opens = open(pred_path)
seg_files = seg_opens.readlines()
pred_files = pred_opens.readlines()
for i in range(len(seg_files)):
seg_files[i] = seg_files[i].strip('\n')
pred_files[i] = pred_files[i].strip('\n')
dice.append(calculate_dice(seg_files[i],pred_files[i]))
print(calculate_dice(seg_files[i], pred_files[i]))
print(np.mean(dice))