File size: 5,168 Bytes
99ec8a2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
107
108
109
110
111
112
113
114
115
116
117
118
import os
import torch
import argparse
import numpy as np
import pandas as pd

from pathlib import Path
from datetime import datetime

# mine
from ius.ius import IUS
from ius.ius_eval_parser import IUSEvalParser
from data.loading import IUSEvalDataset
from data.dataloader import to_dataloader
from utils.eval_utils import EPUCNNEval
from utils.train_utils import create_output_folders, save_to_json
from utils.omega_parser import IUSConfig


BASE_PATH = Path(__file__).resolve().parent


def parse_options():
    parser = argparse.ArgumentParser()
    parser.add_argument("--experiment_folder_name", type=str, required=True,
                        help="Folder name containing epu configuration & saved ckpt")
    parser.add_argument("--cb_vector_tag", type=str, default=None, required=True,
                        help="cb vector data. If not specified estimates all cb_vectors")
    parser.add_argument("--synthetic_images", type=str, default='png',
                        help="It can be either a single synthetic image file or a folder path containing multiple "
                             "synthetic images")
    parser.add_argument("--synthetic_img_extension", type=str, default='png',
                        help="Extension of synthetic images")
    args = parser.parse_args()
    return args


def main():
    args = parse_options()
    cb_vec_tag = args.cb_vector_tag
    synthetic_img_path = args.synthetic_images
    synthetic_img_extension = args.synthetic_img_extension
    experiment_folder_name = args.experiment_folder_name

    # Load saved config
    print('Loading configuration...')
    saved_epu_folder = (BASE_PATH / "../results/checkpoints").resolve()
    saved_epu_folder = os.path.join(saved_epu_folder, experiment_folder_name)
    cfg_path = os.path.join(saved_epu_folder, "epu_config.yaml")
    cfg = IUSConfig.from_yaml(cfg_path)

    # Load EPU for obtaining Contribution Feature Profiles of synthetic images
    print('Loading trained model...')
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    trained_ckpt = os.path.join(saved_epu_folder, f"ckpt_{experiment_folder_name}.pt")
    epu = EPUCNNEval(epu_cfg=cfg.model)
    trained_epu = epu.load_ckpt(device=device, ckpt_path=trained_ckpt)

    # Load Baseline Contribution Feature Profile (cb_vector)
    print('IUS class...')
    saved_cb_vec_folder = (BASE_PATH / "../results/cb_vectors").resolve()
    saved_cb_vec_folder = os.path.join(saved_cb_vec_folder, experiment_folder_name)
    cb_vec_path = os.path.join(saved_cb_vec_folder, f"cb_vector_{cb_vec_tag}.npy")
    ius = IUS(cb_path=cb_vec_path, cb_tag=cb_vec_tag, device=device)

    # Load Synthetic Images & Estimate their Contribution Feature Profiles (c^_vectors)
    synthetic_img_path = str((BASE_PATH / ".." / synthetic_img_path).resolve())
    parser = IUSEvalParser(path=synthetic_img_path, image_ext=synthetic_img_extension,)
    synthetic_dset = IUSEvalDataset(dataconfig=cfg.data_params).get_dataset(parser=parser)

    cfg.data_params.data_loading.shuffle = False         # update cfg.data_params.data_loading
    cfg.data_params.data_loading.batch_size = 1
    synthetic_dataloader = to_dataloader(dataset=synthetic_dset, loading_cfg=cfg.data_params.data_loading)

    synthetic_c_vecs = trained_epu.calculate_feature_contribution_profiles(
        data_loader=synthetic_dataloader,
        device=device,
    )

    ius_score_list = ius.ius_measure(c_vectors=synthetic_c_vecs)
    synthetic_filenames = parser.image_filenames

    # Setup Saving Dir
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    output_folder = str((BASE_PATH / "../results/ius_eval").resolve())
    output_folder = os.path.join(output_folder, experiment_folder_name)
    create_output_folders(output_folder)        # skipped if exists

    ius_score_pd = pd.DataFrame(
        {
            "filename": synthetic_filenames,
            "ius_measure_score":  ius_score_list
        }
    )
    file_saved_ius_scores = os.path.join(output_folder, f"ius_scores_{timestamp}.csv")
    ius_score_pd.to_csv(file_saved_ius_scores, index=False)

    save_info_dict = {
        "epu_ckpt": trained_ckpt,
        "config": cfg_path,
        "experiment_id": cfg.experiment_saved_folder_name,
        "cb_vector_path": cb_vec_path,
        "synthetic_images_path": synthetic_img_path,
        "synthetic_img_extension": synthetic_img_extension,
        "synthetic_samples_num": len(synthetic_filenames),
        "timestamp": timestamp,
        "ius_scores": file_saved_ius_scores,
    }
    json_file_path = os.path.join(output_folder, f"ius_scores_info_{timestamp}.json")
    save_to_json(save_info_dict, json_file_path)


if __name__ == "__main__":
    # python - m scripts.eval_ius - -experiment_folder_name ius_dataset_name_base_one_0000_timestamp - -cb_vector_tag normal - -synthetic_images datasets_synthetic/dataset_name/normal - -synthetic_img_extension png
    # python - m scripts.eval_ius - -experiment_folder_name ius_dataset_name_base_one_0000_timestamp - -cb_vector_tag normal - -synthetic_images datasets_synthetic/dataset_name/normal/image_0001.png - -synthetic_img_extension png

    main()