44import h5py
55import pandas as pd
66
7- from elf .evaluation import matching
7+ from elf .evaluation import matching , symmetric_best_dice_score
88
99
1010
1111def evaluate (labels , vesicles ):
1212 assert labels .shape == vesicles .shape
1313 stats = matching (vesicles , labels )
14- return [stats ["f1" ], stats ["precision" ], stats ["recall" ]]
14+ sbd = symmetric_best_dice_score (vesicles , labels )
15+ return [stats ["f1" ], stats ["precision" ], stats ["recall" ], sbd ]
1516
1617
1718def summarize_eval (results ):
18- summary = results [["dataset" , "f1-score" , "precision" , "recall" ]].groupby ("dataset" ).mean ().reset_index ("dataset" )
19- total = results [["f1-score" , "precision" , "recall" ]].mean ().values .tolist ()
19+ summary = results [["dataset" , "f1-score" , "precision" , "recall" , "SBD score" ]].groupby ("dataset" ).mean ().reset_index ("dataset" )
20+ total = results [["f1-score" , "precision" , "recall" , "SBD score" ]].mean ().values .tolist ()
2021 summary .iloc [- 1 ] = ["all" ] + total
2122 table = summary .to_markdown (index = False )
2223 print (table )
2324
24- def evaluate_file (labels_path , vesicles_path , model_name , segment_key , anno_key ):
25+ def evaluate_file (labels_path , vesicles_path , model_name , segment_key , anno_key , mask_key = None ):
2526 print (f"Evaluate labels { labels_path } and vesicles { vesicles_path } " )
2627
2728 ds_name = os .path .basename (os .path .dirname (labels_path ))
@@ -33,16 +34,21 @@ def evaluate_file(labels_path, vesicles_path, model_name, segment_key, anno_key)
3334 #vesicles = labels["vesicles"]
3435 gt = labels [anno_key ][:]
3536
37+ if mask_key is not None :
38+ mask = labels [mask_key ][:]
39+
3640 with h5py .File (vesicles_path ) as seg_file :
3741 segmentation = seg_file ["vesicles" ]
3842 vesicles = segmentation [segment_key ][:]
3943
40-
41- #evaluate the match of ground truth and vesicles
44+ if mask_key is not None :
45+ gt [mask == 0 ] = 0
46+ vesicles [mask == 0 ] = 0
47+ #evaluate the match of ground truth and vesicles
4248 scores = evaluate (gt , vesicles )
4349
4450 #store results
45- result_folder = "/user/muth9/u12095/synaptic-reconstruction /scripts/cooper/evaluation_results"
51+ result_folder = "/user/muth9/u12095/synapse-net /scripts/cooper/evaluation_results"
4652 os .makedirs (result_folder , exist_ok = True )
4753 result_path = os .path .join (result_folder , f"evaluation_{ model_name } .csv" )
4854 print ("Evaluation results are saved to:" , result_path )
@@ -53,7 +59,7 @@ def evaluate_file(labels_path, vesicles_path, model_name, segment_key, anno_key)
5359 results = None
5460
5561 res = pd .DataFrame (
56- [[ds_name , tomo ] + scores ], columns = ["dataset" , "tomogram" , "f1-score" , "precision" , "recall" ]
62+ [[ds_name , tomo ] + scores ], columns = ["dataset" , "tomogram" , "f1-score" , "precision" , "recall" , "SBD score" ]
5763 )
5864 if results is None :
5965 results = res
@@ -65,7 +71,7 @@ def evaluate_file(labels_path, vesicles_path, model_name, segment_key, anno_key)
6571 summarize_eval (results )
6672
6773
68- def evaluate_folder (labels_path , vesicles_path , model_name , segment_key , anno_key ):
74+ def evaluate_folder (labels_path , vesicles_path , model_name , segment_key , anno_key , mask_key = None ):
6975 print (f"Evaluating folder { vesicles_path } " )
7076 print (f"Using labels stored in { labels_path } " )
7177
@@ -75,7 +81,7 @@ def evaluate_folder(labels_path, vesicles_path, model_name, segment_key, anno_ke
7581 for vesicle_file in vesicles_files :
7682 if vesicle_file in label_files :
7783
78- evaluate_file (os .path .join (labels_path , vesicle_file ), os .path .join (vesicles_path , vesicle_file ), model_name , segment_key , anno_key )
84+ evaluate_file (os .path .join (labels_path , vesicle_file ), os .path .join (vesicles_path , vesicle_file ), model_name , segment_key , anno_key , mask_key )
7985
8086
8187
@@ -87,13 +93,14 @@ def main():
8793 parser .add_argument ("-n" , "--model_name" , required = True )
8894 parser .add_argument ("-sk" , "--segment_key" , required = True )
8995 parser .add_argument ("-ak" , "--anno_key" , required = True )
96+ parser .add_argument ("-m" , "--mask_key" )
9097 args = parser .parse_args ()
9198
9299 vesicles_path = args .vesicles_path
93100 if os .path .isdir (vesicles_path ):
94- evaluate_folder (args .labels_path , vesicles_path , args .model_name , args .segment_key , args .anno_key )
101+ evaluate_folder (args .labels_path , vesicles_path , args .model_name , args .segment_key , args .anno_key , args . mask_key )
95102 else :
96- evaluate_file (args .labels_path , vesicles_path , args .model_name , args .segment_key , args .anno_key )
103+ evaluate_file (args .labels_path , vesicles_path , args .model_name , args .segment_key , args .anno_key , args . mask_key )
97104
98105
99106
0 commit comments