Skip to content

Commit f08ad89

Browse files
Add SBD to CryoVesNet evaluation
1 parent d23d544 commit f08ad89

File tree

4 files changed

+63
-20
lines changed

4 files changed

+63
-20
lines changed

scripts/baselines/cryo_ves_net/evaluate_cooper.py

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import numpy as np
77
import pandas as pd
88
from elf.evaluation.matching import matching
9+
from elf.evaluation.dice import symmetric_best_dice_score
910
from tqdm import tqdm
1011

1112
INPUT_ROOT = "/mnt/lustre-emmy-hdd/projects/nim00007/data/synaptic-reconstruction/cooper/vesicles_processed_v2/testsets" # noqa
@@ -25,11 +26,11 @@
2526
]
2627

2728

28-
def evaluate_dataset(ds_name):
29+
def evaluate_dataset(ds_name, force):
2930
result_folder = "./results/cooper"
3031
os.makedirs(result_folder, exist_ok=True)
3132
result_path = os.path.join(result_folder, f"{ds_name}.csv")
32-
if os.path.exists(result_path):
33+
if os.path.exists(result_path) and not force:
3334
results = pd.read_csv(result_path)
3435
return results
3536

@@ -44,6 +45,9 @@ def evaluate_dataset(ds_name):
4445
mask_key = None
4546

4647
pred_files = sorted(glob(os.path.join(OUTPUT_ROOT, ds_name, "**/*.h5"), recursive=True))
48+
if ds_name == "04":
49+
pred_names = [os.path.basename(path) for path in pred_files]
50+
input_files = [path for path in input_files if os.path.basename(path) in pred_names]
4751
assert len(input_files) == len(pred_files), f"{len(input_files)}, {len(pred_files)}"
4852

4953
results = {
@@ -52,12 +56,13 @@ def evaluate_dataset(ds_name):
5256
"precision": [],
5357
"recall": [],
5458
"f1-score": [],
59+
"sbd-score": [],
5560
}
5661
for inf, predf in tqdm(zip(input_files, pred_files), total=len(input_files), desc=f"Evaluate {ds_name}"):
5762
fname = os.path.basename(inf)
5863
sub_res_path = os.path.join(result_folder, f"{ds_name}_{fname}.json")
5964

60-
if os.path.exists(sub_res_path):
65+
if os.path.exists(sub_res_path) and not force:
6166
print("Loading scores from", sub_res_path)
6267
with open(sub_res_path, "r") as f:
6368
scores = json.load(f)
@@ -89,6 +94,8 @@ def evaluate_dataset(ds_name):
8994
gt[mask == 0] = 0
9095

9196
scores = matching(seg, gt)
97+
sbd_score = symmetric_best_dice_score(seg, gt)
98+
scores["sbd"] = sbd_score
9299

93100
with open(sub_res_path, "w") as f:
94101
json.dump(scores, f)
@@ -98,16 +105,19 @@ def evaluate_dataset(ds_name):
98105
results["precision"].append(scores["precision"])
99106
results["recall"].append(scores["recall"])
100107
results["f1-score"].append(scores["f1"])
108+
results["sbd-score"].append(scores["sbd"])
101109

102110
results = pd.DataFrame(results)
103111
results.to_csv(result_path, index=False)
104112
return results
105113

106114

107115
def main():
116+
force = False
117+
108118
all_results = {}
109119
for ds in DATASETS:
110-
result = evaluate_dataset(ds)
120+
result = evaluate_dataset(ds, force=force)
111121
all_results[ds] = result
112122

113123
groups = {
@@ -123,16 +133,24 @@ def main():
123133
}
124134

125135
for name, datasets in groups.items():
126-
f1_scores = []
136+
f1_scores, sbd_scores = [], []
127137

128138
for ds in datasets:
129139
this_f1_scores = all_results[ds]["f1-score"].values.tolist()
140+
this_sbd_scores = all_results[ds]["sbd-score"].values.tolist()
130141
f1_scores.extend(this_f1_scores)
142+
sbd_scores.extend(this_sbd_scores)
131143

132144
mean_f1 = np.mean(f1_scores)
133145
std_f1 = np.std(f1_scores)
146+
print("F1-Score")
134147
print(name, ":", mean_f1, "+-", std_f1)
135148

149+
mean_sbd = np.mean(sbd_scores)
150+
std_sbd = np.std(sbd_scores)
151+
print("SBD-Score")
152+
print(name, ":", mean_sbd, "+-", std_sbd)
153+
136154

137155
if __name__ == "__main__":
138156
main()

scripts/baselines/cryo_ves_net/evaluate_cryo.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,18 @@
44
import h5py
55
import pandas as pd
66
from elf.evaluation.matching import matching
7+
from elf.evaluation.dice import symmetric_best_dice_score
78

89

910
INPUT_FOLDER = "/mnt/lustre-emmy-hdd/projects/nim00007/data/synaptic-reconstruction/fernandez-busnadiego/vesicle_gt/v3" # noqa
1011
OUTPUT_FOLDER = "./predictions/cryo"
1112

1213

13-
def evaluate_dataset(ds_name="cryo"):
14+
def evaluate_dataset(ds_name="cryo", force=False):
1415
result_folder = "./results/cryo"
1516
os.makedirs(result_folder, exist_ok=True)
1617
result_path = os.path.join(result_folder, f"{ds_name}.csv")
17-
if os.path.exists(result_path):
18+
if os.path.exists(result_path) and not force:
1819
results = pd.read_csv(result_path)
1920
return results
2021

@@ -28,6 +29,7 @@ def evaluate_dataset(ds_name="cryo"):
2829
"precision": [],
2930
"recall": [],
3031
"f1-score": [],
32+
"sbd-score": [],
3133
}
3234
for inf, predf in zip(input_files, pred_files):
3335
fname = os.path.basename(inf)
@@ -39,22 +41,29 @@ def evaluate_dataset(ds_name="cryo"):
3941
assert gt.shape == seg.shape
4042

4143
scores = matching(seg, gt)
44+
sbd_score = symmetric_best_dice_score(seg, gt)
45+
scores["sbd"] = sbd_score
4246

4347
results["dataset"].append(ds_name)
4448
results["file"].append(fname)
4549
results["precision"].append(scores["precision"])
4650
results["recall"].append(scores["recall"])
4751
results["f1-score"].append(scores["f1"])
52+
results["sbd-score"].append(scores["sbd"])
4853

4954
results = pd.DataFrame(results)
5055
results.to_csv(result_path, index=False)
5156
return results
5257

5358

5459
def main():
55-
result = evaluate_dataset()
60+
force = False
61+
result = evaluate_dataset(force=force)
5662
print(result)
63+
print("F1-Score")
5764
print(result["f1-score"].mean())
65+
print("SBD-Score")
66+
print(result["sbd-score"].mean())
5867

5968

6069
if __name__ == "__main__":

scripts/baselines/cryo_ves_net/evaluate_endbulb.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,19 @@
44
import h5py
55
import pandas as pd
66
from elf.evaluation.matching import matching
7+
from elf.evaluation.dice import symmetric_best_dice_score
8+
from tqdm import tqdm
79

810

911
INPUT_FOLDER = "/mnt/lustre-emmy-hdd/projects/nim00007/data/synaptic-reconstruction/wichmann/extracted/endbulb_of_held/Automatische_Segmentierung_Dataset_Validierung" # noqa
1012
OUTPUT_FOLDER = "./predictions/endbulb"
1113

1214

13-
def evaluate_dataset(ds_name="endbulb"):
15+
def evaluate_dataset(ds_name="endbulb", force=False):
1416
result_folder = "./results/endbulb"
1517
os.makedirs(result_folder, exist_ok=True)
1618
result_path = os.path.join(result_folder, f"{ds_name}.csv")
17-
if os.path.exists(result_path):
19+
if os.path.exists(result_path) and not force:
1820
results = pd.read_csv(result_path)
1921
return results
2022

@@ -28,8 +30,9 @@ def evaluate_dataset(ds_name="endbulb"):
2830
"precision": [],
2931
"recall": [],
3032
"f1-score": [],
33+
"sbd-score": [],
3134
}
32-
for inf, predf in zip(input_files, pred_files):
35+
for inf, predf in tqdm(zip(input_files, pred_files), total=len(input_files), desc="Run evaluation"):
3336
fname = os.path.basename(inf)
3437

3538
with h5py.File(inf, "r") as f:
@@ -39,24 +42,29 @@ def evaluate_dataset(ds_name="endbulb"):
3942
assert gt.shape == seg.shape
4043

4144
scores = matching(seg, gt)
45+
sbd_score = symmetric_best_dice_score(seg, gt)
4246

4347
results["dataset"].append(ds_name)
4448
results["file"].append(fname)
4549
results["precision"].append(scores["precision"])
4650
results["recall"].append(scores["recall"])
4751
results["f1-score"].append(scores["f1"])
52+
results["sbd-score"].append(sbd_score)
4853

4954
results = pd.DataFrame(results)
5055
results.to_csv(result_path, index=False)
5156
return results
5257

5358

5459
def main():
55-
result = evaluate_dataset()
60+
force = False
61+
result = evaluate_dataset(force=force)
5662
print(result)
5763
print()
58-
print(result["f1-score"].mean())
59-
print(result["f1-score"].std())
64+
print("F1-Score")
65+
print(result["f1-score"].mean(), "+-", result["f1-score"].std())
66+
print("SBD-Score")
67+
print(result["sbd-score"].mean(), "+-", result["sbd-score"].std())
6068

6169

6270
if __name__ == "__main__":

scripts/baselines/cryo_ves_net/evaluate_inner_ear.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,19 @@
44
import h5py
55
import pandas as pd
66
from elf.evaluation.matching import matching
7+
from elf.evaluation.dice import symmetric_best_dice_score
8+
from tqdm import tqdm
79

810

911
INPUT_FOLDER = "/mnt/lustre-emmy-hdd/projects/nim00007/data/synaptic-reconstruction/moser/vesicle_gt" # noqa
1012
OUTPUT_FOLDER = "./predictions/inner_ear"
1113

1214

13-
def evaluate_dataset(ds_name="inner_ear"):
15+
def evaluate_dataset(ds_name="inner_ear", force=False):
1416
result_folder = "./results/inner_ear"
1517
os.makedirs(result_folder, exist_ok=True)
1618
result_path = os.path.join(result_folder, f"{ds_name}.csv")
17-
if os.path.exists(result_path):
19+
if os.path.exists(result_path) and not force:
1820
results = pd.read_csv(result_path)
1921
return results
2022

@@ -28,8 +30,9 @@ def evaluate_dataset(ds_name="inner_ear"):
2830
"precision": [],
2931
"recall": [],
3032
"f1-score": [],
33+
"sbd-score": [],
3134
}
32-
for inf, predf in zip(input_files, pred_files):
35+
for inf, predf in tqdm(zip(input_files, pred_files), total=len(input_files), desc="Run evaluation"):
3336
fname = os.path.basename(inf)
3437

3538
with h5py.File(inf, "r") as f:
@@ -39,24 +42,29 @@ def evaluate_dataset(ds_name="inner_ear"):
3942
assert gt.shape == seg.shape
4043

4144
scores = matching(seg, gt)
45+
sbd_score = symmetric_best_dice_score(seg, gt)
4246

4347
results["dataset"].append(ds_name)
4448
results["file"].append(fname)
4549
results["precision"].append(scores["precision"])
4650
results["recall"].append(scores["recall"])
4751
results["f1-score"].append(scores["f1"])
52+
results["sbd-score"].append(sbd_score)
4853

4954
results = pd.DataFrame(results)
5055
results.to_csv(result_path, index=False)
5156
return results
5257

5358

5459
def main():
55-
result = evaluate_dataset()
60+
force = False
61+
result = evaluate_dataset(force=force)
5662
print(result)
5763
print()
58-
print(result["f1-score"].mean())
59-
print(result["f1-score"].std())
64+
print("F1-Score")
65+
print(result["f1-score"].mean(), "+-", result["f1-score"].std())
66+
print("SBD-Score")
67+
print(result["sbd-score"].mean(), "+-", result["sbd-score"].std())
6068

6169

6270
if __name__ == "__main__":

0 commit comments

Comments
 (0)