Indice de Jaccard versus Précision#

Selon le cas d’utilisation, certaines métriques sont sous-optimales pour déterminer la qualité de la segmentation. Nous démontrons cela en comparant les résultats de segmentation sur des images recadrées différemment.

Voir aussi :

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

Nous utilisons le jeu de données d’exemple human_mitosis de scikit-image.

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

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

Supposons que ceci soit une annotation de référence réalisée par un expert.

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

De plus, cela crée un résultat de segmentation dont nous aimerions déterminer la qualité.

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

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

Mesure de la qualité#

Il existe de nombreuses métriques de qualité pour mesurer à quel point les deux images d’étiquettes correspondent entre elles. Dans ce qui suit, nous utilisons la précision et l’indice de Jaccard tels qu’implémentés dans The Segmentation Game, un plugin napari pour mesurer les métriques de qualité des résultats de segmentation.

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

Nous allons maintenant appliquer les mêmes métriques à l’image d’étiquettes à nouveau, mais en recadrant l’image d’étiquettes en supprimant certains pixels de valeur zéro en haut et à gauche de l’image d’étiquettes.

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

Comme vous pouvez le voir, la métrique de précision change, tandis que l’indice de Jaccard ne change pas. Évidemment, la métrique de précision dépend de la quantité de pixels de valeur zéro dans l’image d’étiquettes. Nous visualisons simplement les images recadrées :

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

Explication#

En comparant les équations de la précision \(A\) et de l’indice de Jaccard \(J\), il est évident que les deux font la même chose en quelque sorte, mais seule la précision inclut le nombre de pixels de valeur zéro dans les deux images d’étiquettes. Ces pixels sont les vrais négatifs \(TN\).

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