| 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"] |
| 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)] |
| ): |
| 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) |
|
|
| |
| 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() |
| ] |
| 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") |
|
|