Índice de Jaccard versus Precisión#

Dependiendo del caso de uso, algunas métricas son subóptimas para determinar la calidad de la segmentación. Demostramos esto comparando los resultados de segmentación en imágenes recortadas de manera diferente.

Ver también:

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

Usamos el conjunto de datos de ejemplo human_mitosis de scikit-image.

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

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

Supongamos que esta es una anotación de referencia realizada por un experto.

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

Además, esto crea un resultado de segmentación del que nos gustaría determinar la calidad.

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

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

Medición de calidad#

Hay muchas métricas de calidad para medir qué tan bien se ajustan entre sí las dos imágenes de etiquetas. A continuación, usamos la precisión y el índice de Jaccard implementados en The Segmentation Game, un complemento de napari para medir métricas de calidad de los resultados de segmentación.

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

Ahora aplicaremos las mismas métricas a la imagen de etiquetas nuevamente, pero recortaremos la imagen de etiquetas eliminando algunos de los píxeles de valor cero en la parte superior e izquierda de la imagen de etiquetas.

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

Como puede ver, la métrica de precisión cambia, mientras que el Índice de Jaccard no. Obviamente, la métrica de precisión depende de la cantidad de píxeles de valor cero en la imagen de etiquetas. Simplemente visualizamos las imágenes recortadas:

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

Explicación#

Al comparar las ecuaciones de precisión \(A\) e índice de Jaccard \(J\), es obvio que ambas hacen algo similar, pero solo la precisión incluye el número de píxeles de valor cero en ambas imágenes de etiquetas. Estos píxeles son los verdaderos negativos \(TN\).

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