|
import pandas as pd |
|
import os |
|
from argparse import ArgumentParser |
|
import re |
|
|
|
|
|
DICT_MODEL_NAMES = {'BASELINE': 'BL', |
|
'SEGGUIDED': 'SG', |
|
'UW': 'UW'} |
|
|
|
DICT_METRICS_NAMES = {'NCC': 'N', |
|
'SSIM': 'S', |
|
'DICE': 'D', |
|
'DICE MACRO': 'D', |
|
'HD': 'H', } |
|
|
|
|
|
DF_COLS = ['SSIM', 'NCC', 'MSE', 'DICE_MACRO', 'HD', 'HD95', 'Time', 'TRE', 'Experiment', 'Model'] |
|
|
|
|
|
def get_model_name(in_path: str) -> str: |
|
model = re.search('((UW|SEGGUIDED|BASELINE).*)_\d', in_path) |
|
if model: |
|
model = model.group(1).rstrip('_') |
|
model = model.replace('_Lsim', '') |
|
model = model.replace('_Lseg', '') |
|
model = model.replace('_L', '') |
|
model = model.replace('_', ' ') |
|
model = model.upper() |
|
elements = model.split() |
|
model = elements[0] |
|
metrics = list() |
|
model = DICT_MODEL_NAMES[model] |
|
for m in elements[1:]: |
|
if m != 'MACRO': |
|
metrics.append(DICT_METRICS_NAMES[m]) |
|
|
|
return '{}-{}'.format(model, ''.join(metrics)) |
|
else: |
|
try: |
|
model = re.search('(SyNCC|SyN)', in_path).group(1) |
|
except AttributeError: |
|
raise ValueError('Unknown folder name/model: '+ in_path) |
|
return model |
|
|
|
|
|
def find_metric_files(root_path: str, folder_filter: str) -> dict: |
|
metric_files = dict() |
|
starting_level = root_path.count(os.sep) |
|
for r, d, f in os.walk(root_path): |
|
level = r.count(os.sep) - starting_level |
|
if level < 3: |
|
for name in f: |
|
if 'metrics.csv' == name and folder_filter in r.split(os.sep): |
|
model = get_model_name(os.path.join(r, name)) |
|
metric_files[model] = os.path.join(r, name) |
|
return metric_files |
|
|
|
|
|
def read_metrics_files(metrics: dict, experiment: str) -> pd.DataFrame: |
|
df = pd.DataFrame(columns=DF_COLS) |
|
for k in metrics.keys(): |
|
csv = pd.read_csv(metrics[k], sep=';') |
|
csv['Experiment'] = experiment |
|
csv['Model'] = k |
|
df = df.append(csv[DF_COLS], ignore_index=True) |
|
return df |
|
|
|
|
|
if __name__ == '__main__': |
|
parser = ArgumentParser() |
|
parser.add_argument('--output-dir', help='Output directory', default='./') |
|
parser.add_argument('--ixi-runs', help='Directory were the evaluation outputs are stored') |
|
parser.add_argument('--comet-runs', help='Directory were the evaluation outputs are stored') |
|
parser.add_argument('--comet-tl-freezenone-runs', help='Directory were the evaluation outputs are stored') |
|
parser.add_argument('--comet-tl-encoder-runs', help='Directory were the evaluation outputs are stored') |
|
parser.add_argument('--ants-runs', help='Directory were the evaluation outputs are stored') |
|
parser.add_argument('--folder-filter', default='Evaluate') |
|
|
|
args = parser.parse_args() |
|
|
|
assert os.path.exists(args.ixi_runs), 'IXI directory not found' |
|
assert os.path.exists(args.comet_runs), 'COMET directory not found' |
|
assert os.path.exists(args.comet_tl_freezenone_runs), 'COMET TL Fine Tuned Froze None directory not found' |
|
assert os.path.exists(args.comet_tl_encoder_runs), 'COMET TL Fine Tuned in 2 Steps directory not found' |
|
assert os.path.exists(args.ants_runs), 'COMET TL Fine Tuned in 2 Steps directory not found' |
|
|
|
IXI_metrics = find_metric_files(args.ixi_runs, args.folder_filter) |
|
COMET_metrics = find_metric_files(args.comet_runs, args.folder_filter) |
|
COMET_TL_FTFN_metrics = find_metric_files(args.comet_tl_freezenone_runs, args.folder_filter) |
|
COMET_TL_FT2S_metrics = find_metric_files(args.comet_tl_encoder_runs, args.folder_filter) |
|
ANTS_metrics = find_metric_files(args.ants_runs, args.folder_filter) |
|
|
|
IXI_df = read_metrics_files(IXI_metrics, 'IXI') |
|
COMET_df = read_metrics_files(COMET_metrics, 'COMET') |
|
COMET_TL_FtFn_df = read_metrics_files(COMET_TL_FTFN_metrics, 'COMET_TL_FtFn') |
|
COMET_TL_Ft2S_df = read_metrics_files(COMET_TL_FT2S_metrics, 'COMET_TL_Ft2Stp') |
|
ANTS_df = read_metrics_files(ANTS_metrics, 'ANTs') |
|
|
|
df = pd.concat([IXI_df, COMET_df, COMET_TL_FtFn_df, COMET_TL_Ft2S_df, ANTS_df], ignore_index=True) |
|
out_file_path = os.path.join(args.output_dir, 'Combined_metrics.csv') |
|
if os.path.exists(out_file_path): |
|
os.remove(out_file_path) |
|
df.to_csv(out_file_path, sep=';', index=False) |
|
print('Output file: ' + out_file_path) |
|
|