Package: segmentationmetrics
Segmentation MetricsVolumetric binary mask segmentation accuracy metricsA small package for assessing the accuracy of binary segmentations. There are lots of metrics that can be used to compare how close two segmentations are, here voxel overlap, surface and volume based metrics are all calculated at once and returned either as individual metrics, a dictionary or a Pandas DataFrame.The surface based metrics in this package are calculated using code fromdeepmind's surface-distancerepository, however as this is not available as a PyPI package, the code has been included as a submodule here.Calculated MetricsVoxel overlap based metricsDice Score/F1 ScoreJaccard ScoreSensitivitySpecificityPrecisionAccuracySurface based metricsMean Surface Distance(in mm) - The symmetric mean surface distance is returned by default i.e. the mean of the distance from surface A to surface B and surface B to surface A.Hausdorff Distance(in mm) - Computes the robust distance based on the percentile of distances rather than the maximum distance.Volume based metricsVolume Difference (in millilitres)Example Usageimportnibabelasnib# Package for reading MRI dataimportsegmentationmetricsassmimg_manual=nib.load('mask_manually_segmented.nii.gz')# Load manually generated ground truth maskimg_automatic=nib.load('mask_automatically_segmented.nii.gz')# Load automatically generated mask# Get voxel data from image objectmask_manual=img_manual.get_fdata()mask_automatic=img_automatic.get_fdata()# Get zoom from headerzoom=img_manual.header.get_zooms()# Generate metricsmetrics=sm.SegmentationMetrics(mask_automatic,mask_manual,zoom)# Print the dice scoreprint(f'The Dice score is{metrics.dice:.2f}')The Dice score is 0.85# Get and print a DataFrame containing all the scores for this mask pairdf=metrics.get_df()print(df)Metric       Score
dice                                    Dice    0.844512
jaccard                              Jaccard    0.730870
sensitivity                      Sensitivity    0.732352
specificity                      Specificity    0.999926
precision                          Precision    0.997239
accuracy                            Accuracy    0.990492
mean_surface_distance  Mean Surface Distance    1.459697
hausdorff_distance        Hausdorff Distance    7.027224
volume_difference          Volume Difference -107.212906
true_volume                      True Volume  403.632624
predicted_volume            Predicted Volume  296.419718# As above but with asymmetric mean surface distance and Hausdorff distance defined by the 99th percentil rather than the 95th percentile.metrics=sm.SegmentationMetrics(mask_automatic,mask_manual,zoom,symmetric=False,percentile=99)df=metrics.get_df()print(df)Metric                                    Score
dice                                    Dice                                 0.844512
jaccard                              Jaccard                                  0.73087
sensitivity                      Sensitivity                                 0.732352
specificity                      Specificity                                 0.999926
precision                          Precision                                 0.997239
accuracy                            Accuracy                                 0.990492
mean_surface_distance  Mean Surface Distance  (1.6603182056644057, 1.259075931110695)
hausdorff_distance        Hausdorff Distance                                 9.335755
volume_difference          Volume Difference                              -107.212906
true_volume                      True Volume                               403.632624
predicted_volume            Predicted Volume                               296.419718