| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- import os
- from glob import glob
- import numpy as np
- from config import Config
- config = Config()
- eval_txts = sorted(glob('e_results/*_eval.txt'))
- print('eval_txts:', [_.split(os.sep)[-1] for _ in eval_txts])
- score_panel = {}
- sep = '&'
- metrics = ['sm', 'wfm', 'hce'] # we used HCE for DIS and wFm for others.
- if 'DIS5K' not in config.task:
- metrics.remove('hce')
- for metric in metrics:
- print('Metric:', metric)
- current_line_nums = []
- for idx_et, eval_txt in enumerate(eval_txts):
- with open(eval_txt, 'r') as f:
- lines = [l for l in f.readlines()[3:] if '.' in l]
- current_line_nums.append(len(lines))
- for idx_et, eval_txt in enumerate(eval_txts):
- with open(eval_txt, 'r') as f:
- lines = [l for l in f.readlines()[3:] if '.' in l]
- for idx_line, line in enumerate(lines[:min(current_line_nums)]): # Consist line numbers by the minimal result file.
- properties = line.strip().strip(sep).split(sep)
- dataset = properties[0].strip()
- ckpt = properties[1].strip()
- if int(ckpt.split('--epoch_')[-1].strip()) < 0:
- continue
- targe_idx = {
- 'sm': [5, 2, 2, 5, 5, 2],
- 'wfm': [3, 3, 8, 3, 3, 8],
- 'hce': [7, -1, -1, 7, 7, -1]
- }[metric][['DIS5K', 'COD', 'HRSOD', 'General', 'General-2K', 'Matting'].index(config.task)]
- if metric != 'hce':
- score_sm = float(properties[targe_idx].strip())
- else:
- score_sm = int(properties[targe_idx].strip().strip('.'))
- if idx_et == 0:
- score_panel[ckpt] = []
- score_panel[ckpt].append(score_sm)
- metrics_min = ['hce', 'mae']
- max_or_min = min if metric in metrics_min else max
- score_max = max_or_min(score_panel.values(), key=lambda x: np.sum(x))
- good_models = []
- for k, v in score_panel.items():
- if (np.sum(v) <= np.sum(score_max)) if metric in metrics_min else (np.sum(v) >= np.sum(score_max)):
- print(k, v)
- good_models.append(k)
- # Write
- with open(eval_txt, 'r') as f:
- lines = f.readlines()
- info4good_models = lines[:3]
- metric_names = [m.strip() for m in lines[1].strip().strip('&').split('&')[2:]]
- testset_mean_values = {metric_name: [] for metric_name in metric_names}
- for good_model in good_models:
- for idx_et, eval_txt in enumerate(eval_txts):
- with open(eval_txt, 'r') as f:
- lines = f.readlines()
- for line in lines:
- if set([good_model]) & set([_.strip() for _ in line.split(sep)]):
- info4good_models.append(line)
- metric_scores = [float(m.strip()) for m in line.strip().strip('&').split('&')[2:]]
- for idx_score, metric_score in enumerate(metric_scores):
- testset_mean_values[metric_names[idx_score]].append(metric_score)
- if 'DIS5K' in config.task:
- testset_mean_values_lst = ['{:<4}'.format(int(np.mean(v_lst[:-1]).round())) if name == 'HCE' else '{:.3f}'.format(np.mean(v_lst[:-1])).lstrip('0') for name, v_lst in testset_mean_values.items()] # [:-1] to remove DIS-VD
- sample_line_for_placing_mean_values = info4good_models[-2]
- numbers_placed_well = sample_line_for_placing_mean_values.replace(sample_line_for_placing_mean_values.split('&')[1].strip(), 'DIS-TEs').strip().split('&')[3:]
- for idx_number, (number_placed_well, testset_mean_value) in enumerate(zip(numbers_placed_well, testset_mean_values_lst)):
- numbers_placed_well[idx_number] = number_placed_well.replace(number_placed_well.strip(), testset_mean_value)
- testset_mean_line = '&'.join(sample_line_for_placing_mean_values.replace(sample_line_for_placing_mean_values.split('&')[1].strip(), 'DIS-TEs').split('&')[:3] + numbers_placed_well) + '\n'
- info4good_models.append(testset_mean_line)
- info4good_models.append(lines[-1])
- info = ''.join(info4good_models)
- print(info)
- with open(os.path.join('e_results', 'eval-{}_best_on_{}.txt'.format(config.task, metric)), 'w') as f:
- f.write(info + '\n')
|