1. 简介
本节内容主要是介绍图像分割中常用指标的定义、公式和代码。常用的指标有Dice、Jaccard、Hausdorff Distance、IOU以及科研作图-Accuracy,F1,Precision,Sensitive中已经介绍的像素准确率等指标。在每个指标介绍时,会使用编写相关代码,以及使用MedPy这个Python库进行代码的调用。
2.常用指标介绍
2.1 Dice
Dice系数是一种集合相似度度量函数,通常用来计算两个样本的相似度,它的直观图形表示如下图所示。
根据图像,可得出Dice的计算公式为:
其中A与B分表代表着预测标签和真实标签的集合,Dice的范围也在0到1。而对于分割训练中的Dice Loss常用1-Dice来表示。
常用Dice与Dice Loss代码:
def dice_coeff(pred, target):
smooth = 1e-7
num = pred.size(0)
A= pred.view(num, -1) # Flatten
B= target.view(num, -1) # Flatten
intersection = (A * B).sum()
return (2. * intersection + smooth) / (A.sum() + B.sum() + smooth) # smooth防止除数为0
直接调用MedPy包
from medpy.metric.binary import dc
import numpy as np
# 定义预测结果和真实标记数组
predict=np.random.randint(0,4,size=(2,3))
ground_truth=np.random.randint(0,4,size=(2,3))
# 计算Dice相似系数
dice1=dc(predict,ground_truth)
print("Dice相似系数为{}".format(dice1))
2.2 Jaccard(Iou)
Jaccard index,又称为交并比(Intersection over Union),是用于比较样本集的相似性与多样性的统计量。Jaccard index能够量度有限样本集合的相似度,其定义为两个集合交集大小与并集大小之间的比例,图形表示为:
Jaccard的计算公式如下所示:
这里的计算代码为:
def Iou_coeff(pred, target):
smooth = 1e-7
num = pred.size(0)
A= pred.view(num, -1) # Flatten
B= target.view(num, -1) # Flatten
intersection = (A * B).sum()
return (intersection + smooth) / (A.sum() + B.sum() - intersection + smooth) # smooth防止除数为0
直接调用MedPy代码为:
from medpy.metric.binary import jc
import numpy as np
# 定义预测结果和真实标记数组
predict=np.random.randint(0,4,size=(2,3))
ground_truth=np.random.randint(0,4,size=(2,3))
# 直接计算Jaccard相似系数
jaccard=jc(predict,ground_truth)
print("Jaccard相似系数为{}".format(jaccard))
2.3 Hausdorff Distance
表示预测分割区域边界与真实区域边界之间的最大距离,其值越小代表预测边界分割误差越小、质量越好。设 X 和 Y 是度量空间( M, d )的两个非空子集,则定义他们的Hausdorff distance为:
计算绿色曲线 X 和蓝色曲线 Y 之间的豪斯多夫距离的分量过程如下图所示,图像来自于维基百科。首先,对点集X中的每一个点x计算其到点集Y中的每一个点y的距离,保留最短距离,然后找出保留的最短距离中的最大距离记为Dxy。然后,对点集Y中的每一个点y计算其到点集X中的每一个点x的距离,保留最短距离,然后找出保留最短距离中的最大距离记为Dyx。最后,取Dxy和Dyx最大值作为点集X和Y之间的豪斯多夫距离。
95% 豪斯多夫距离(95% Hausdorff distance,HD95)
为了排除一些离群点造成的不合理距离,保持整体数值稳定性,一般选择从小到大排名前 95%的距离作为实际豪斯多夫距离,称之为 95% 豪斯多夫距离。
这里直接调用MedPy库函数进行计算HD
from medpy.metric.binary import hd,hd95
# 定义预测结果和真实标记数组
predict=np.random.randint(0,4,size=(30,30))
ground_truth=np.random.randint(0,4,size=(30,30))
# 计算豪斯多夫距离
hausdorff_distance=hd(predict,ground_truth)
print("豪斯多夫距离为{}".format(hausdorff_distance))
# 计算95%豪斯多夫距离
hausdorff_distance95=hd95(predict,ground_truth)
print("95%豪斯多夫距离为{}".format(hausdorff_distance95))
3. 总结
本文总结了图像分割常用的指标Dice, Iou, Hausdorff以及指标实现的代码。
4. 参考链接
- https://blog.csdn.net/m0_46223009/article/details/128204724
- http://loli.github.io/medpy/
- https://en.wikipedia.org/wiki/Hausdorff_distance