Jaccard指数与准确率的比较#

根据具体用例,某些指标在确定分割质量时可能并不理想。我们通过比较不同裁剪图像的分割结果来演示这一点。

另请参阅:

from skimage.data import human_mitosis
from the_segmentation_game import metrics
import napari_segment_blobs_and_things_with_membranes as nsbatwm
import stackview

我们使用scikit-image中的human_mitosis示例数据集。

image = human_mitosis()[95:165, 384:454]

stackview.insight(image)
shape(70, 70)
dtypeuint8
size4.8 kB
min8
max79

让我们假设这是由专家执行的参考标注。

reference_labels = nsbatwm.voronoi_otsu_labeling(image)
reference_labels
nsbatwm made image
shape(70, 70)
dtypeint32
size19.1 kB
min0
max3

此外,这创建了一个我们想要确定质量的分割结果。

test_labels = nsbatwm.gauss_otsu_labeling(image, outline_sigma=3)

test_labels
nsbatwm made image
shape(70, 70)
dtypeint32
size19.1 kB
min0
max3

质量测量#

有许多质量指标可用于衡量两个标签图像之间的匹配程度。在接下来的内容中,我们使用The Segmentation Game中实现的准确率和Jaccard指数,这是一个用于测量分割结果质量指标的napari插件。

metrics.roc_accuracy_binary(reference_labels, test_labels)
0.9744898
metrics.jaccard_index_sparse(reference_labels, test_labels)
0.7274754206261056

现在,我们将再次对标签图像应用相同的指标,但通过移除标签图像顶部和左侧的一些零值像素来裁剪图像。

metrics.roc_accuracy_binary(reference_labels[20:,20:], test_labels[20:,20:])
0.95
metrics.jaccard_index_sparse(reference_labels[20:,20:], test_labels[20:,20:])
0.7274754206261056

如你所见,准确率指标发生了变化,而Jaccard指数保持不变。显然,准确率指标取决于标签图像中零值像素的数量。我们只是可视化裁剪后的图像:

reference_labels[20:,20:]
nsbatwm made made image
shape(50, 50)
dtypeint32
size9.8 kB
min0
max3
test_labels[20:,20:]
nsbatwm made made image
shape(50, 50)
dtypeint32
size9.8 kB
min0
max3

解释#

比较准确率\(A\)和Jaccard指数\(J\)的方程时,很明显两者做的是类似的事情,但只有准确率包括了两个标签图像中的零值像素数量。这些像素是真负例\(TN\)

\[ A =\frac{TP + TN}{FN + FP + TP + TN} \]
\[ J =\frac{TP}{FN + FP + TP} \]