| import os, sys |
| |
|
|
| import torch |
| import numpy as np |
| from umap.umap_ import find_ab_params |
| import pickle |
| import gc |
| import base64 |
| from .backend_adapter import TimeVisBackend, ActiveLearningTimeVisBackend, AnormalyTimeVisBackend |
|
|
| timevis_path = "../../DLVisDebugger" |
| sys.path.append(timevis_path) |
| from singleVis.SingleVisualizationModel import VisModel |
| from singleVis.losses import SingleVisLoss, UmapLoss, ReconstructionLoss, SmoothnessLoss, HybridLoss |
| from singleVis.trainer import SingleVisTrainer, HybridVisTrainer |
| from singleVis.data import NormalDataProvider, ActiveLearningDataProvider, DenseActiveLearningDataProvider |
| from singleVis.eval.evaluator import Evaluator |
| from singleVis.visualizer import visualizer, DenseALvisualizer |
| from singleVis.projector import Projector, ALProjector, DenseALProjector |
| from singleVis.segmenter import Segmenter |
|
|
|
|
|
|
| def initialize_backend(CONTENT_PATH, dense_al=False): |
|
|
| import config |
|
|
| |
| CLASSES = config["CLASSES"] |
| DATASET = config["DATASET"] |
| GPU_ID = config["GPU"] |
| DEVICE = torch.device("cuda:{}".format(GPU_ID) if torch.cuda.is_available() else "cpu") |
| |
| PREPROCESS = config["VISUALIZATION"]["PREPROCESS"] |
| B_N_EPOCHS = config["VISUALIZATION"]["BOUNDARY"]["B_N_EPOCHS"] |
| L_BOUND = config["VISUALIZATION"]["BOUNDARY"]["L_BOUND"] |
| LAMBDA = config["VISUALIZATION"]["LAMBDA"] |
| |
| ENCODER_DIMS = config["VISUALIZATION"]["ENCODER_DIMS"] |
| DECODER_DIMS = config["VISUALIZATION"]["DECODER_DIMS"] |
| N_NEIGHBORS = config["VISUALIZATION"]["N_NEIGHBORS"] |
| MAX_EPOCH = config["VISUALIZATION"]["MAX_EPOCH"] |
| S_N_EPOCHS = config["VISUALIZATION"]["S_N_EPOCHS"] |
| PATIENT = config["VISUALIZATION"]["PATIENT"] |
| VIS_MODEL_NAME = config["VISUALIZATION"]["VIS_MODEL_NAME"] |
| RESOLUTION = config["VISUALIZATION"]["RESOLUTION"] |
| EVALUATION_NAME = config["VISUALIZATION"]["EVALUATION_NAME"] |
| NET = config["TRAINING"]["NET"] |
| |
|
|
| SETTING = config["SETTING"] |
| if SETTING == "normal" or SETTING == "abnormal": |
| EPOCH_START = config["EPOCH_START"] |
| EPOCH_END = config["EPOCH_END"] |
| EPOCH_PERIOD = config["EPOCH_PERIOD"] |
|
|
| INIT_NUM = config["VISUALIZATION"]["INIT_NUM"] |
| ALPHA = config["VISUALIZATION"]["ALPHA"] |
| BETA = config["VISUALIZATION"]["BETA"] |
| MAX_HAUSDORFF = config["VISUALIZATION"]["MAX_HAUSDORFF"] |
| T_N_EPOCHS = config["VISUALIZATION"]["T_N_EPOCHS"] |
| elif SETTING == "active learning": |
| BASE_ITERATION = config["BASE_ITERATION"] |
| TOTAL_EPOCH = config["TRAINING"]["total_epoch"] |
| else: |
| raise NotImplementedError |
|
|
| import Model.model as subject_model |
| net = eval("subject_model.{}()".format(NET)) |
|
|
|
|
| |
| |
| |
|
|
| |
| model = VisModel(ENCODER_DIMS, DECODER_DIMS) |
|
|
| if SETTING == "normal" or SETTING == "abnormal": |
| data_provider = NormalDataProvider(CONTENT_PATH, net, EPOCH_START, EPOCH_END, EPOCH_PERIOD, device=DEVICE, classes=CLASSES,epoch_name="Epoch", verbose=1) |
| segmenter = Segmenter(data_provider=data_provider, threshold=78.5, range_s=EPOCH_START, range_e=EPOCH_END, range_p=EPOCH_PERIOD) |
| SEGMENTS = segmenter.segment() |
| |
| projector = Projector(vis_model=model, content_path=CONTENT_PATH, segments=SEGMENTS, device=DEVICE) |
| elif SETTING == "active learning": |
| DENSE_VIS_MODEL_NAME = config["VISUALIZATION"]["DENSE_VIS_MODEL_NAME"] |
| if dense_al: |
| data_provider = DenseActiveLearningDataProvider(CONTENT_PATH, net, BASE_ITERATION, epoch_num=TOTAL_EPOCH, split=-1, device=DEVICE, classes=CLASSES,verbose=1) |
| projector = DenseALProjector(vis_model=model, content_path=CONTENT_PATH, vis_model_name=DENSE_VIS_MODEL_NAME, device=DEVICE) |
| else: |
| data_provider = ActiveLearningDataProvider(CONTENT_PATH, net, BASE_ITERATION, split=-1, device=DEVICE, classes=CLASSES, verbose=1) |
| projector = ALProjector(vis_model=model, content_path=CONTENT_PATH, vis_model_name=VIS_MODEL_NAME, device=DEVICE) |
| |
| |
| |
| |
| |
| if SETTING == "active learning": |
| negative_sample_rate = 5 |
| min_dist = .1 |
| _a, _b = find_ab_params(1.0, min_dist) |
| umap_loss_fn = UmapLoss(negative_sample_rate, DEVICE, _a, _b, repulsion_strength=1.0) |
| recon_loss_fn = ReconstructionLoss(beta=1.0) |
| if dense_al: |
| smooth_loss_fn = SmoothnessLoss(margin=1.) |
| S_LAMBDA = config["VISUALIZATION"]["S_LAMBDA"] |
| criterion = HybridLoss(umap_loss_fn, recon_loss_fn, smooth_loss_fn, lambd1=LAMBDA, lambd2=S_LAMBDA) |
| optimizer = torch.optim.Adam(model.parameters(), lr=.01, weight_decay=1e-5) |
| lr_scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=4, gamma=.1) |
| trainer = HybridVisTrainer(model, criterion, optimizer, lr_scheduler,edge_loader=None, DEVICE=DEVICE) |
| else: |
| criterion = SingleVisLoss(umap_loss_fn, recon_loss_fn, lambd=LAMBDA) |
| optimizer = torch.optim.Adam(model.parameters(), lr=.01, weight_decay=1e-5) |
| lr_scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=4, gamma=.1) |
| trainer = SingleVisTrainer(model, criterion, optimizer, lr_scheduler,edge_loader=None, DEVICE=DEVICE) |
| |
| |
| |
| |
|
|
| if dense_al: |
| vis = DenseALvisualizer(data_provider, projector, RESOLUTION) |
| else: |
| vis = visualizer(data_provider, projector, RESOLUTION) |
| evaluator = Evaluator(data_provider, projector) |
|
|
| if SETTING == "normal": |
| timevis = TimeVisBackend(data_provider, projector, vis, evaluator, **config) |
| elif SETTING == "abnormal": |
| timevis = AnormalyTimeVisBackend(data_provider, projector, vis, evaluator, period=100, **config) |
| elif SETTING == "active learning": |
| timevis = ActiveLearningTimeVisBackend(data_provider, projector, trainer, vis, evaluator, dense_al, **config) |
| |
| del config |
| gc.collect() |
| return timevis |
|
|
|
|
| def update_epoch_projection(timevis, EPOCH, predicates): |
| train_data = timevis.data_provider.train_representation(EPOCH) |
| test_data = timevis.data_provider.test_representation(EPOCH) |
| all_data = np.concatenate((train_data, test_data), axis=0) |
| |
| fname = "Epoch" if timevis.data_provider.mode == "normal" or timevis.data_provider.mode == "abnormal" else "Iteration" |
| embedding_path = os.path.join(timevis.data_provider.model_path, "{}_{}".format(fname, EPOCH), "embedding.npy") |
| if os.path.exists(embedding_path): |
| embedding_2d = np.load(embedding_path) |
| else: |
| embedding_2d = timevis.projector.batch_project(EPOCH, all_data) |
| np.save(embedding_path, embedding_2d) |
|
|
| train_labels = timevis.data_provider.train_labels(EPOCH) |
| test_labels = timevis.data_provider.test_labels(EPOCH) |
| labels = np.concatenate((train_labels, test_labels), axis=0).tolist() |
|
|
| training_data_number = timevis.hyperparameters["TRAINING"]["train_num"] |
| testing_data_number = timevis.hyperparameters["TRAINING"]["test_num"] |
| training_data_index = list(range(training_data_number)) |
| testing_data_index = list(range(training_data_number, training_data_number + testing_data_number)) |
|
|
| |
| |
| fname = "Epoch" if timevis.data_provider.mode == "normal" or timevis.data_provider.mode == "abnormal" else "Iteration" |
| bgimg_path = os.path.join(timevis.data_provider.model_path, "{}_{}".format(fname, EPOCH), "bgimg.png") |
| grid_path = os.path.join(timevis.data_provider.model_path, "{}_{}".format(fname, EPOCH), "grid.pkl") |
| if os.path.exists(bgimg_path) and os.path.exists(grid_path): |
| with open(os.path.join(grid_path), "rb") as f: |
| grid = pickle.load(f) |
| with open(bgimg_path, 'rb') as img_f: |
| img_stream = img_f.read() |
| b_fig = base64.b64encode(img_stream).decode() |
| else: |
| x_min, y_min, x_max, y_max, b_fig = timevis.vis.get_background(EPOCH, timevis.hyperparameters["VISUALIZATION"]["RESOLUTION"]) |
| grid = [x_min, y_min, x_max, y_max] |
| |
| grid = [float(i) for i in grid] |
| b_fig = str(b_fig, encoding='utf-8') |
|
|
| |
| save_path = timevis.data_provider.model_path |
| iteration_name = "Epoch" if timevis.data_provider.mode == "normal" or timevis.data_provider.mode == "abnormal" else "Iteration" |
| save_path = os.path.join(save_path, "{}_{}".format(iteration_name, EPOCH)) |
| with open(os.path.join(save_path, "grid.pkl"), "wb") as f: |
| pickle.dump(grid, f) |
| np.save(os.path.join(save_path, "embedding.npy"), embedding_2d) |
| |
| color = timevis.vis.get_standard_classes_color() * 255 |
| color = color.astype(int).tolist() |
|
|
| |
| file_name = timevis.hyperparameters["VISUALIZATION"]["EVALUATION_NAME"] |
| evaluation = timevis.evaluator.get_eval(file_name=file_name) |
| eval_new = dict() |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| eval_new["train_acc"] = evaluation["train_acc"][str(EPOCH)] |
| eval_new["test_acc"] = evaluation["test_acc"][str(EPOCH)] |
|
|
| label_color_list = [] |
| label_list = [] |
| label_name_dict = dict() |
| for i, label in enumerate(timevis.hyperparameters["CLASSES"]): |
| label_name_dict[i] = label |
| |
| for label in labels: |
| label_color_list.append(color[int(label)]) |
| label_list.append(timevis.hyperparameters["CLASSES"][int(label)]) |
|
|
| prediction_list = [] |
| prediction = timevis.data_provider.get_pred(EPOCH, all_data).argmax(1) |
|
|
| for i in range(len(prediction)): |
| prediction_list.append(timevis.hyperparameters["CLASSES"][prediction[i]]) |
| |
| if timevis.hyperparameters["SETTING"] == "normal" or timevis.hyperparameters["SETTING"] == "abnormal": |
| max_iter = (timevis.hyperparameters["EPOCH_END"] - timevis.hyperparameters["EPOCH_START"]) // timevis.hyperparameters["EPOCH_PERIOD"] + 1 |
| elif timevis.hyperparameters["SETTING"] == "active learning": |
| |
| max_iter = timevis.get_max_iter() |
| |
|
|
| |
| |
| selected_points = np.arange(training_data_number + testing_data_number) |
| for key in predicates.keys(): |
| if key == "label": |
| tmp = np.array(timevis.filter_label(predicates[key])) |
| elif key == "type": |
| tmp = np.array(timevis.filter_type(predicates[key], int(EPOCH))) |
| else: |
| tmp = np.arange(training_data_number + testing_data_number) |
| selected_points = np.intersect1d(selected_points, tmp) |
| |
| properties = np.concatenate((np.zeros(training_data_number, dtype=np.int16), 2*np.ones(testing_data_number, dtype=np.int16)), axis=0) |
| lb = timevis.get_epoch_index(EPOCH) |
| ulb = np.setdiff1d(training_data_index, lb) |
| properties[ulb] = 1 |
| |
| return embedding_2d.tolist(), grid, b_fig, label_name_dict, label_color_list, label_list, max_iter, training_data_index, testing_data_index, eval_new, prediction_list, selected_points, properties |
|
|