常用分割评价指标Dice、Hausdorff_95、IOU、PPV等 + Python实现

常用分割评价指标Dice、Hausdorff_95、IOU、PPV等 + Python实现_第1张图片

 

 

常用分割评价指标Dice、Hausdorff_95、IOU、PPV等 + Python实现_第2张图片

 

 

常用分割评价指标Dice、Hausdorff_95、IOU、PPV等 + Python实现_第3张图片

TP(紫色部分)

TN:True Negative,被判定为负样本,事实上也是负样本,即红色与蓝色以外区域

 

常用分割评价指标Dice、Hausdorff_95、IOU、PPV等 + Python实现_第4张图片

TN(紫色部分)

FP:False Positive,被判定为正样本,但事实上是负样本,即红色中除了蓝色部分

 

常用分割评价指标Dice、Hausdorff_95、IOU、PPV等 + Python实现_第5张图片

FP(紫色部分)

FN:False Negative,被判定为负样本,但事实上是正样本,即蓝色中除了红色部分

 

常用分割评价指标Dice、Hausdorff_95、IOU、PPV等 + Python实现_第6张图片

FN(紫色部分)

Dice

常用分割评价指标Dice、Hausdorff_95、IOU、PPV等 + Python实现_第7张图片

常用分割评价指标Dice、Hausdorff_95、IOU、PPV等 + Python实现_第8张图片

Pytorch 代码示例

        def dice_coef(output, target):#output为预测结果 target为真实结果
    smooth = 1e-5 #防止0除

    if torch.is_tensor(output):
        output = torch.sigmoid(output).data.cpu().numpy()
    if torch.is_tensor(target):
        target = target.data.cpu().numpy()

    intersection = (output * target).sum()

    return (2. * intersection + smooth) / \
        (output.sum() + target.sum() + smooth)
      

IOU

 

常用分割评价指标Dice、Hausdorff_95、IOU、PPV等 + Python实现_第9张图片

Pytorch 代码示例

        def iou_score(output, target):
    smooth = 1e-5

    if torch.is_tensor(output):
        output = torch.sigmoid(output).data.cpu().numpy()
    if torch.is_tensor(target):
        target = target.data.cpu().numpy()
    output_ = output > 0.5
    target_ = target > 0.5
    intersection = (output_ & target_).sum()
    union = (output_ | target_).sum()

    return (intersection + smooth) / (union + smooth)
      

Sensitivity

 

常用分割评价指标Dice、Hausdorff_95、IOU、PPV等 + Python实现_第10张图片

pytorch 代码示例

        def sensitivity(output, target):
    smooth = 1e-5

    if torch.is_tensor(output):
        output = torch.sigmoid(output).data.cpu().numpy()
    if torch.is_tensor(target):
        target = target.data.cpu().numpy()

    intersection = (output * target).sum()

    return (intersection + smooth) / \
        (target.sum() + smooth)
      

PPV

 

常用分割评价指标Dice、Hausdorff_95、IOU、PPV等 + Python实现_第11张图片

Pytorch 代码示例

        def ppv(output, target):
    smooth = 1e-5

    if torch.is_tensor(output):
        output = torch.sigmoid(output).data.cpu().numpy()
    if torch.is_tensor(target):
        target = target.data.cpu().numpy()

    intersection = (output * target).sum()

    return (intersection + smooth) / \
        (output.sum() + smooth)
      

Hausdorff_95 (95% HD)

Dice对mask的内部填充比较敏感,而hausdorff distance 对分割出的边界比较敏感。

 

v2-ae141681a17261b5eb73d4524277e8ab_b.png

 

常用分割评价指标Dice、Hausdorff_95、IOU、PPV等 + Python实现_第12张图片

 

下面8张图能够很清晰讲解它的原理:

 

常用分割评价指标Dice、Hausdorff_95、IOU、PPV等 + Python实现_第13张图片

 

常用分割评价指标Dice、Hausdorff_95、IOU、PPV等 + Python实现_第14张图片

 

常用分割评价指标Dice、Hausdorff_95、IOU、PPV等 + Python实现_第15张图片

 

常用分割评价指标Dice、Hausdorff_95、IOU、PPV等 + Python实现_第16张图片

 

常用分割评价指标Dice、Hausdorff_95、IOU、PPV等 + Python实现_第17张图片

 

常用分割评价指标Dice、Hausdorff_95、IOU、PPV等 + Python实现_第18张图片

 

常用分割评价指标Dice、Hausdorff_95、IOU、PPV等 + Python实现_第19张图片

 

常用分割评价指标Dice、Hausdorff_95、IOU、PPV等 + Python实现_第20张图片

95% HD is similar to maximum HD. However, it is based on the calculation of the 95th percentile of the distances between boundary points in X and Y. The purpose for using this metric is to eliminate the impact of a very small subset of the outliers.

Hausdorff_95就是是最后的值乘以95%,目的是为了消除离群值的一个非常小的子集的影响。

环境安装

        pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numba
pip install hausdorff
      

numpy 代码示例

        import numpy as np
from hausdorff import hausdorff_distance

# two random 2D arrays (second dimension must match)
np.random.seed(0)
X = np.random.random((1000,100))
Y = np.random.random((5000,100))

# Test computation of Hausdorff distance with different base distances
print("Hausdorff distance test: {0}".format( hausdorff_distance(X, Y, distance="manhattan") ))
print("Hausdorff distance test: {0}".format( hausdorff_distance(X, Y, distance="euclidean") ))
print("Hausdorff distance test: {0}".format( hausdorff_distance(X, Y, distance="chebyshev") ))
print("Hausdorff distance test: {0}".format( hausdorff_distance(X, Y, distance="cosine") ))

# For haversine, use 2D lat, lng coordinates
def rand_lat_lng(N):
    lats = np.random.uniform(-90, 90, N)
    lngs = np.random.uniform(-180, 180, N)
    return np.stack([lats, lngs], axis=-1)
        
X = rand_lat_lng(100)
Y = rand_lat_lng(250)
print("Hausdorff haversine test: {0}".format( hausdorff_distance(X, Y, distance="haversine") ))
      

 

v2-b97fafc668d7d17b219c051e84491989_b.jpg

 

你可能感兴趣的:(深度学习,深度学习,机器学习,python)