本文共 4363 字,大约阅读时间需要 14 分钟。
当我们评价图像分割的质量和模型表现时,经常会用到各类表面距离的计算。这里推荐一个deepmind的表面距离度量计算库。
这个库主要包含了以下几个表面距离计算:
git clone https://github.com/deepmind/surface-distance.gitcd surface-distance
修改surface_distance文件夹下的__init__.py文件中的第16行
from metrics import *改为from .metrics import *
然后
pip install .
为了测试是否安装成功, 运行
python surface_distance_test.py
如果出现下面的输出说明安装成功
[ RUN ] SurfaceDistanceTest.testEmptyGroundTruthMask[ OK ] SurfaceDistanceTest.testEmptyGroundTruthMask[ RUN ] SurfaceDistanceTest.testEmptyPredictionMask[ OK ] SurfaceDistanceTest.testEmptyPredictionMask[ RUN ] SurfaceDistanceTest.testSinglePixels2mmAway[ OK ] SurfaceDistanceTest.testSinglePixels2mmAway[ RUN ] SurfaceDistanceTest.testTwoCubes[ OK ] SurfaceDistanceTest.testTwoCubes
该计算库的调用API都是类似的,首先调用compute_surface_distances这个函数计算出中间结果,再用这个中间结果去计算各类距离。compute_surface_distances的参数有三个,mask_gt和mask_pred分别为ground truth和prediction的volume,spacing_mm是每个轴的体素间距。体素间距是医疗影像上常见的一个参数,它的含义是,图像中相邻的两个体素(即两个点)间的直线距离转换为现实中的距离是多少毫米。例如,一个shape为(256, 256, 64)的array,spacing_mm为(1.1, 1.1, 3),实际表示的是 (281.6mm, 281.6mm, 192mm) 大小的块。体素间距不同,计算得到的surface distance也不同。如果不确定自己的数据体素间距是多少,就设为(1.0, 1.0, 1.0)。
Average surface distance 平均表面距离
顾名思义,这个指标就是P中所有点的表面距离的平均。这个指标又可称为Average Symmetric Surface Distance (ASSD),它也是医疗图像分割竞赛CHAOS中的一个评估指标。平均表面距离的计算代码如下:
import surface_distance as surfdistsurface_distances = surfdist.compute_surface_distances( mask_gt, mask_pred, spacing_mm=(1.0, 1.0, 1.0))avg_surf_dist = surfdist.compute_average_surface_distance(surface_distances)
Hausdorff distance 豪斯多夫距离
关于这个距离的计算,很多人都讲的不是非常清晰,甚至有很多人介绍的是错的。这里我介绍一个比较简单清晰的计算流程,请对照下图阅读。
豪斯多夫距离95%的计算代码如下:
import surface_distance as surfdistsurface_distances = surfdist.compute_surface_distances( mask_gt, mask_pred, spacing_mm=(1.0, 1.0, 1.0))hd_dist_95 = surfdist.compute_robust_hausdorff(surface_distances, 95)
compute_robust_hausdorff这个函数的第二个参数表示最大距离分位数,取值范围为0-100,它表示的是计算步骤4中,选取的距离能覆盖距离的百分比,例如我这里选取了95%,那么在计算步骤4中选取的不是最大距离,而是将距离从大到小排列后,取排名为5%的距离。这么做的目的是为了排除一些离群点所造成的不合理的距离,保持整体数值的稳定性。
Surface overlap 表面重叠度
给定一个容许的误差距离,在此容差范围内的表面视作重叠部分,计算mask_gt和mask_pred的表面重叠比例。表面重叠度的计算代码如下:
import surface_distance as surfdistsurface_distances = surfdist.compute_surface_distances( mask_gt, mask_pred, spacing_mm=(1.0, 1.0, 1.0))surface_overlap = surfdist.compute_surface_overlap_at_tolerance(surface_distances, 1)
compute_surface_overlap_at_tolerance函数的第二个参数表示容许误差,以mm为单位,例如我这里选择了1,那么容许误差也就是空间欧氏距离小于1mm的点都会被当做是重叠部分。注意,这里返回的surface_overlap有两个值,分别代表pred->gt和gt->pred的重叠比例。大多数情况下这两个比例是相等的,但是在某些情况下是不同的。
Surface dice 表面dice值
给定一个容许的误差距离,在此容差范围内的表面视作重叠部分,计算mask_gt和mask_pred的表面重叠dice值。表面dice值的计算代码如下:
import surface_distance as surfdistsurface_distances = surfdist.compute_surface_distances( mask_gt, mask_pred, spacing_mm=(1.0, 1.0, 1.0))surface_dice = surfdist.compute_surface_dice_at_tolerance(surface_distances, 1)
compute_surface_dice_at_tolerance这个函数的第二个参数跟表面重叠度函数的第二个参数是一样的用法。该函数的返回值只有一个,因为pred->gt和gt->pred的表面dice是相同的。
Volumetric dice 三维dice值
计算pred与gt之间的三维dice值。注意,这与上面计算的表面dice不同,三维dice值会考虑空间中的每一个点而不仅仅是表面。三维dice的计算代码如下:
import surface_distance as surfdistvolume_dice = surfdist.compute_dice_coefficient(mask_gt, mask_pred)
该函数的返回值为0~1之间的float值,如果gt和pred均为空,那么会返回NAN值。
这边统计一些公开竞赛中所选取的metric,不在surfdist库里的metric将加以括号。
etric dice
这边可以看出,Volumetric dice和Hausdorff distance 95%是最常用的两种metric,推荐大家在评估自己的模型的时候优先使用这两种。
转载地址:http://ajqqd.baihongyu.com/