DDMR / EvaluationScripts /combine_metrics_files.py
jpdefrutos's picture
combine_metrics_files.py
ac29da8
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)