File size: 4,448 Bytes
ac29da8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
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)