图像分割评估指标——表面距离计算库

一、简介

当我们评价图像分割的质量和模型表现时,经常会用到各类表面距离的计算。这里推荐一个deepmind的表面距离度量计算库surface-distance

这个库主要包含了以下几个表面距离计算:

  • Average surface distance 平均表面距离
  • Hausdorff distance 豪斯多夫距离
  • Surface overlap 表面重叠度
  • Surface dice 表面dice值
  • Volumetric dice 三维dice值

二、安装

git clone https://github.com/deepmind/surface-distance.git
cd 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)。

img

  • 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 = 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 豪斯多夫距离

关于这个距离的计算,很多人都讲的不是非常清晰,甚至有很多人介绍的是错的。这里我介绍一个比较简单清晰的计算流程,请对照下图阅读。

  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集合的双向豪斯多夫距离

img

豪斯多夫距离95%的计算代码如下:

import surface_distance as surfdist

surface_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 surfdist

surface_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 surfdist

surface_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 surfdist

volume_dice = surfdist.compute_dice_coefficient(mask_gt, mask_pred)

该函数的返回值为0~1之间的float值,如果gt和pred均为空,那么会返回NAN值。

四、公开竞赛中的度量

这边统计一些公开竞赛中所选取的metric,不在surfdist库里的metric将加以括号。

  • CHAOS: Volumetric dice, Average surface distance, ( Relative absolute volume difference ), ( Maximum symmetric surface distance )
  • StructSeg: Volumetric dice, Hausdorff distance 95%
  • RT-MAC: Volumetric dice, Average surface distance, Hausdorff distance 95%
  • KiTS19: Volumetric dice
  • SegTHOR: Volumetric dice, Hausdorff distance 95%

etric dice

  • SegTHOR: Volumetric dice, Hausdorff distance 95%

这边可以看出,Volumetric dice和Hausdorff distance 95%是最常用的两种metric,推荐大家在评估自己的模型的时候优先使用这两种。

  • 11
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值