图像分割评估指标——表⾯距离计算库
⽂章⽬录
⼀、简介
当我们评价图像分割的质量和模型表现时,经常会⽤到各类表⾯距离的计算。这⾥推荐⼀个deepmind的表⾯距离度量计算库。
这个库主要包含了以下⼏个表⾯距离计算:
Average surface distance 平均表⾯距离
Hausdorff distance 豪斯多夫距离
Surface overlap 表⾯重叠度
Surface dice 表⾯dice值
Volumetric dice 三维dice值
⼆、安装qq头像女生霸气超拽酷
git /deepmind/surface-distance.git
cd surface-distance
修改surface_distance⽂件夹下的__init__.py⽂件中的第16⾏
from metrics import *
改为
from .metrics import *
win10怎么关闭防火墙然后
pip install .
为了测试是否安装成功, 运⾏
python surface_distance_test.py
如果出现下⾯的输出说明安装成功
[ RUN ] stEmptyGroundTruthMask
[ OK ] stEmptyGroundTruthMask
[ RUN ] stEmptyPredictionMask
[ OK ] stEmptyPredictionMask
[ RUN ] stSinglePixels2mmAway
[ OK ] stSinglePixels2mmAway
[ RUN ] stTwoCubes
党员材料[ OK ] stTwoCubes
三、计算各类度量
该计算库的调⽤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)。
3D Volume的表⾯定义:对于⼀个体素,如果在其18邻域范围(请看上图,在3x3的⽅阵中,橘黄⾊⽅块表⽰当前体素,除了红⾊⽅块外,其他的都属于邻域范围)内⾄少有⼀个像素不是物体,则认为该体素属于表⾯,依次遍历所有的体素便得到volume的表⾯。
表⾯距离:设P为prediction的表⾯点集,G为ground truth的Volume表⾯点集,P中任意⼀点的表⾯距离为该体素到G中所有体素的欧式距离的最⼩值,依次遍历P中所有的点即可得到表⾯距离。
Average surface distance 平均表⾯距离
顾名思义,这个指标就是P中所有点的表⾯距离的平均。这个指标⼜可称为Average Symmetric Surface Distance (ASSD),它也是医疗图像分割竞赛CHAOS中的⼀个评估指标。平均表⾯距离的计算代码如下:
import surface_distance as surfdist
surface_distances = pute_surface_distances(
mask_gt, mask_pred, spacing_mm=(1.0, 1.0, 1.0))嬴悝
avg_surf_dist = pute_average_surface_distance(surface_distances)
第一位女词人
Hausdorff distance 豪斯多夫距离
关于这个距离的计算,很多⼈都讲的不是⾮常清晰,甚⾄有很多⼈介绍的是错的。这⾥我介绍⼀个⽐较简单清晰的计算流程,请对照下图阅读。
1. 给定两个点集合A{ a0, a1, … }和B{ b0, b1, b2, …}
2. 取A集合中的⼀点a0,计算a0到B集合中所有点的距离,保留最短的距离d0
3. 遍历A集合中所有点,图中⼀共两点a0和a1,计算出d0和d1
4. ⽐较所有的距离{ d0, d1 },选出最长的距离d1
5. 这个最长的距离就是h,它是A→B的单向豪斯多夫距离,记为h( A, B )
6. 对于A集合中任意⼀点a,我们可以确定,以点a为圆⼼,h为半径的圆内部必有B集合中的点
7. 交换A集合和B集合的⾓⾊,计算B→A的单向豪斯多夫距离h( B, A ),选出h( A, B )和h( B, A )中最长的距离,就是A,B集合的双向豪
斯多夫距离
豪斯多夫距离95%的计算代码如下:
import surface_distance as surfdist
surface_distances = pute_surface_distances(
mask_gt, mask_pred, spacing_mm=(1.0, 1.0, 1.0))
hd_dist_95 = pute_robust_hausdorff(surface_distances, 95)
七月半鬼门开compute_robust_hausdorff这个函数的第⼆个参数表⽰最⼤距离分位数,取值范围为0-100,它表⽰的是计算步骤4中,选取的距离能覆盖距离的百分⽐,例如我这⾥选取了95%,那么在计算步骤4中选取的不是最⼤距离,⽽是将距离从⼤到⼩排列后,取排名为5%的距离。这么做的⽬的是为了排除⼀些离群点所造成的不合理的距离,保持整体数值的稳定性。
Surface overlap 表⾯重叠度
给定⼀个容许的误差距离,在此容差范围内的表⾯视作重叠部分,计算mask_gt和mask_pred的表⾯重叠⽐例。表⾯重叠度的计算代码如下:
import surface_distance as surfdist
surface_distances = pute_surface_distances(
mask_gt, mask_pred, spacing_mm=(1.0, 1.0, 1.0))
surface_overlap = pute_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 surfdist
surface_distances = pute_surface_distances(
mask_gt, mask_pred, spacing_mm=(1.0, 1.0, 1.0))
surface_dice = pute_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 surfdist
volume_dice = pute_dice_coefficient(mask_gt, mask_pred)
该函数的返回值为0~1之间的float值,如果gt和pred均为空,那么会返回NAN值。
四、公开竞赛中的度量
这边统计⼀些公开竞赛中所选取的metric,不在surfdist库⾥的metric将加以括号。
: Volumetric dice, Average surface distance, ( Relative absolute volume difference ), ( Maximum symmetric surface distance )
: Volumetric dice, Hausdorff distance 95%
: Volumetric dice, Average surface distance, Hausdorff distance 95%
平菇怎么保存
: Volumetric dice
: Volumetric dice, Hausdorff distance 95%
etric dice
: Volumetric dice, Hausdorff distance 95%
这边可以看出,Volumetric dice和Hausdorff distance 95%是最常⽤的两种metric,推荐⼤家在评估⾃⼰的模型的时候优先使⽤这两种。