def predict_compare_regular(self): img_y_all = self.k_fold_train_data.get_train_data_all().get_y_train() lst_get = [ get_borders1, get_borders2, get_borders3, get_borders4, get_borders5, get_borders6 ] img_clean = self.img_x[..., :3] for i_fold in range(6): y_lst = [] # Average prediction print(f'i_fold = {i_fold}') for k in [17, 18, 19]: print(f'k = {k}') for epoch in [36, 37, 38, 39, 40]: print(f'epoch = {epoch}') y = self.predict_regular(i_fold=i_fold, k=k, epoch=epoch) y_lst.append(y) y_avg = np.mean(y_lst, axis=0) y_avg_bin = self.get_bin(y_avg) # Performance img_y_te = self.k_fold_train_data.k_split_i(i_fold).get_y_test() thresh = optimal_test_thresh_equal_distribution(img_y_all, y_avg) perf = foo_performance(img_y_te, y_avg, thresh) # CROP w0, w1, h0, h1 = lst_get[i_fold]() y_avg_bin_crop = y_avg_bin[h0:h1, w0:w1] clean_crop = img_clean[h0:h1, w0:w1, :] y_avg_bin_transparent_crop = semi_transparant( clean_crop, y_avg_bin_crop) if 0: concurrent( [clean_crop, y_avg_bin_crop, y_avg_bin_transparent_crop]) folder_save = '/scratch/lameeus/data/ghent_altar/output/hierarchy/10_lamb/ifolds_regular_tiunet' filename = f'_tiunet_ifold{i_fold}_jacc{perf["jaccard"]:.3f}.png' # Save y_bin imsave(os.path.join(folder_save, 'binpred' + filename), y_avg_bin_crop, b_check_duplicate=False) # Save overlay imsave(os.path.join(folder_save, 'overlay' + filename), y_avg_bin_transparent_crop, b_check_duplicate=False)
def get_bin(y_pred): assert len(y_pred.shape) == 2 y_pred01 = np.stack([1-y_pred, y_pred], axis=-1) thresh = optimal_test_thresh_equal_distribution(y_true, y_pred01) print(foo_performance(y_true, y_pred01, thresh)) y_pred_bin = y_pred >= thresh return y_pred_bin
def foo(n_segm, b=0): y_pred = n_segm.predict(self.img_x) thresh_single = optimal_test_thresh_equal_distribution( self.img_y_te, y_pred) # data_single_i = {'k': self.k, # 'i_fold': i_fold, # 'epoch': epoch} print(foo_performance(self.img_y_te, y_pred, thresh_single)) img_clean = self.img_x[..., :3] concurrent([ img_clean, y_pred[..., 1], y_pred[..., 1] >= thresh_single, semi_transparant(img_clean, y_pred[..., 1] >= thresh_single) ]) if b: from data.datatools import imsave folder = '/home/lameeus/data/ghent_altar/output/hierarchy/' info_epoch = f'_epoch{n_segm.epoch}' if n_segm.epoch > 0 else '' filename = folder + f'13_small/pred_transfer_kfoldenc{self.fixed_enc}_ifold{self.i_fold}_avg{info_epoch}.png' imsave(filename, y_pred[..., 1])
def predict_compare(self): img_y_all = self.k_fold_train_data.get_train_data_all().get_y_train() lst_get = [ get_borders1, get_borders2, get_borders3, get_borders4, get_borders5, get_borders6 ] img_clean = self.img_x[..., :3] for i_fold in range(6): for i_fixed_enc in range(3): self.fixed_enc = i_fixed_enc y_lst = [] # Average prediction for k in [17, 18, 19]: for epoch in [96, 97, 98, 99, 100]: y = self.predict(i_fold=i_fold, k=k, epoch=epoch) y_lst.append(y) y_avg = np.mean(y_lst, axis=0) y_avg_bin = self.get_bin(y_avg) # Performance img_y_te = self.k_fold_train_data.k_split_i( i_fold).get_y_test() thresh = optimal_test_thresh_equal_distribution( img_y_all, y_avg) perf = foo_performance(img_y_te, y_avg, thresh) # CROP w0, w1, h0, h1 = lst_get[i_fold]() y_avg_bin_crop = y_avg_bin[h0:h1, w0:w1] clean_crop = img_clean[h0:h1, w0:w1, :] y_avg_bin_transparent_crop = semi_transparant( clean_crop, y_avg_bin_crop) if 0: concurrent([ clean_crop, y_avg_bin_crop, y_avg_bin_transparent_crop ]) # Save if self.fixed_enc == 0: info_enc = 'Train' elif self.fixed_enc == 1: info_enc = 'Fixed' elif self.fixed_enc == 2: info_enc = 'FixedTrain' folder_save = '/scratch/lameeus/data/ghent_altar/output/hierarchy/10_lamb/ifolds' filename = f'_enc{info_enc}_ifold{i_fold}_jacc{perf["jaccard"]:.3f}.png' # Save y_bin imsave(os.path.join(folder_save, 'binpred' + filename), y_avg_bin_crop, b_check_duplicate=False) # Save overlay imsave(os.path.join(folder_save, 'overlay' + filename), y_avg_bin_transparent_crop, b_check_duplicate=False)
def main(): b_encoder_fixed = False info_enc_fixed = '_enc_fixed' folder_weights = '/scratch/lameeus/data/ghent_altar/net_weight/10lamb_kfold_pretrained' folder_save = '/home/lameeus/data/ghent_altar/dataframes' filename_single = f'pretrained_unet_10lamb_kfold_single' filename_avg_pred = f'pretrained_unet_10lamb_kfold_avgpred' folder_weights += info_enc_fixed if b_encoder_fixed else '' filename_single += info_enc_fixed if b_encoder_fixed else '' filename_avg_pred += info_enc_fixed if b_encoder_fixed else '' fold_range = range(6) # fold_range = [0, 1] k = 10 epoch_range = range(1, 40 + 1) w_ext_in = 28 k_fold_train_data = get_10lamb_6patches(5) # 5 is the number of modalities train_data_all = k_fold_train_data.get_train_data_all() img_x = train_data_all.get_x_train() img_x = rescale0to1(img_x) img_clean = img_x[..., :3] img_y_all = train_data_all.get_y_train() b_plot = False for i_fold in fold_range: print(i_fold) img_y_te = k_fold_train_data.k_split_i(i_fold).get_y_test() # Init for range epochs lst_data_single = [] lst_data_avg_pred = [] list_y_pred = [] model = None for epoch in np.sort(epoch_range)[::-1]: filepath_model = os.path.join( folder_weights, f'unet_enc_k{k}_ifold{i_fold}/w_{epoch}.h5') model = load_model_quick(filepath_model, model=model) n = NeuralNet(model, w_ext=w_ext_in) y_pred = n.predict(img_x) """ Average out predictions """ list_y_pred.append(y_pred) y_avg_pred = np.mean(list_y_pred, axis=0) thresh_single = optimal_test_thresh_equal_distribution( img_y_all, y_pred) thresh_avg_pred = optimal_test_thresh_equal_distribution( img_y_all, y_avg_pred) y_pred_bin = np.greater_equal(y_pred[..., 1], thresh_single) dict_perf = foo_performance(img_y_te, y_pred, thresh_single) print(dict_perf) if b_plot: concurrent([ y_pred_bin, img_clean, semi_transparant(img_clean, y_pred_bin), semi_transparant(img_clean, img_y_te[..., 1].astype(bool)) ]) data_single_i = {'k': k, 'i_fold': i_fold, 'epoch': epoch} data_avg_pred_i = { 'k': k, 'i_fold': i_fold, 'epoch_start': epoch, 'epoch_end': max(epoch_range) } data_single_i.update(dict_perf) data_avg_pred_i.update( foo_performance(img_y_te, y_avg_pred, thresh_avg_pred)) lst_data_single.append(data_single_i) lst_data_avg_pred.append(data_avg_pred_i) df_single = pd.DataFrame(lst_data_single) df_avg_pred = pd.DataFrame(lst_data_avg_pred) path_single = os.path.join(folder_save, filename_single + '.csv') path_avg_pred = os.path.join(folder_save, filename_avg_pred + '.csv') pandas_save(path_single, df_single, append=True) pandas_save(path_avg_pred, df_avg_pred, append=True) return
def main(): """ :return: """ ### Settings mod = 5 w_patch = 16 * 2 """ Data (all important modalities) """ # folder_windows = r'C:\Users\Laurens_laptop_w\OneDrive - UGent\data\10lamb' train_data = get_10lamb_old(mod) img_x, img_y_tr, _, _ = get_training_data(train_data) # Normalise the input! img_x = rescale0to1(img_x) """ Train segmentation 1) reuse everything 2) fix encoder """ if 1: if 1: b_encoder_fixed = False info_enc_fixed = '_enc_fixed' if b_encoder_fixed else '' get_info = lambda: f'10lamb_kfold_pretrained{info_enc_fixed}/unet_enc_k{k}_ifold{i_fold}' n_epochs = 40 k = 10 if k == 10: epoch_w = 100 else: raise NotImplementedError() ### Settings you don't have to change: w_patch = 50 w_ext_in = 28 b_double = False padding = 'valid' # TODO flag for converting encoder to dilated conv def get_unet_pretrained_encoder(): model_encoder = get_model_encoder() encoder_inputs = model_encoder.input decoder_outputs = decoder(model_encoder, f_out=2) model_pretrained_unet = Model(encoder_inputs, decoder_outputs) from methods.examples import compile_segm compile_segm(model_pretrained_unet, lr=1e-4) model_pretrained_unet.summary() return model_pretrained_unet """ Train """ k_fold_train_data = get_10lamb_6patches(5) for i_fold in range(6): """ Get a new network (not trained yet for segmentation) """ model_pretrained_unet = get_unet_pretrained_encoder() n_pretrained_unet = NeuralNet(model_pretrained_unet) """ The data """ train_data_i = k_fold_train_data.k_split_i(i_fold) info = get_info() img_y_tr = train_data_i.get_y_train() img_y_te = train_data_i.get_y_test() flow_tr = get_flow( img_x, img_y_tr, w_patch=w_patch, # Comes from 10 w_ext_in=w_ext_in) flow_te = get_flow( img_x, img_y_te, w_patch=w_patch, # Comes from 10 w_ext_in=w_ext_in) n_pretrained_unet.train(flow_tr, flow_te, epochs=n_epochs, verbose=1, info=info) """ Prediction """ n_pretrained_unet.w_ext = w_ext_in y_pred = n_pretrained_unet.predict(img_x) concurrent([y_pred[..., 1]]) """ Classification """ if 1: im_clean = img_x[..., :3] k = 8 i_fold = 3 epoch_last = 40 from methods.examples import kappa_loss, weighted_categorical_crossentropy from performance.metrics import accuracy_with0, jaccard_with0 loss = weighted_categorical_crossentropy((1, 1)) list_y_pred = [] ### K fold validation k_fold_train_data = get_10lamb_6patches(5) train_data_i = k_fold_train_data.k_split_i(i_fold) img_y_tr = train_data_i.get_y_train() img_y_te = train_data_i.get_y_test() for epoch in np.arange(31, epoch_last + 1): filepath_model = f'/scratch/lameeus/data/ghent_altar/net_weight/10lamb_kfold/ti_unet_k{k}_kfold{i_fold}/w_{epoch}.h5' model = load_model(filepath_model, custom_objects={ 'loss': loss, 'accuracy_with0': accuracy_with0, 'jaccard_with0': jaccard_with0, 'kappa_loss': kappa_loss }) n = NeuralNet(model, w_ext=10) y_pred = n.predict(img_x) list_y_pred.append(y_pred) y_pred_mean = np.mean(list_y_pred, axis=0) q1 = y_pred_mean[..., 1] concurrent([q1, q1.round(), im_clean]) """ Optimal threshold (making conf matrix symmetric, not based on maximising kappa) """ y_gt = np.any([img_y_tr, img_y_te], axis=0) from performance.testing import _get_scores, filter_non_zero def foo_performance(y_true, y_pred, thresh): # is basically argmax y_pred_thresh_arg = np.greater_equal(y_pred[..., 1], thresh) y_true_flat, y_pred_thresh_arg_flat = filter_non_zero( y_true, y_pred_thresh_arg) y_te_argmax = np.argmax(y_true_flat, axis=-1) # Kappa return _get_scores(y_te_argmax, y_pred_thresh_arg_flat)[-1] """ 1. BEST? PERFORMANCE based on test set """ print('1. Test distribution optimization') thresh = optimal_test_thresh_equal_distribution(img_y_te, y_pred_mean) q1_thresh = np.greater_equal(q1, thresh) concurrent([q1, q1_thresh, im_clean]) print(f'thresh: {thresh}') # Test, train, both print('Kappa performance:') print('\ttrain:', foo_performance(img_y_tr, y_pred_mean, thresh)) print('\ttestset:', foo_performance(img_y_te, y_pred_mean, thresh)) print('\tboth:', foo_performance(y_gt, y_pred_mean, thresh)) print('\nIncremental optimization on test set') test_thresh2 = test_thresh_incremental(y_pred_mean, img_y_tr, img_y_te, n=5, verbose=0) print('Kappa performance:') print('\ttrain:', foo_performance(img_y_tr, y_pred_mean, test_thresh2)) print('\ttestset:', foo_performance(img_y_te, y_pred_mean, test_thresh2)) print('\tboth:', foo_performance(y_gt, y_pred_mean, test_thresh2)) """ 2. based on train """ print('\n2. Training distribution optimization') thresh = optimal_test_thresh_equal_distribution(img_y_tr, y_pred_mean) q1_thresh = np.greater_equal(q1, thresh) concurrent([q1, q1_thresh, im_clean]) print(f'thresh: {thresh}') # Test, train, both print('Kappa performance:') print('\ttrain:', foo_performance(img_y_tr, y_pred_mean, thresh)) print('\ttestset:', foo_performance(img_y_te, y_pred_mean, thresh)) print('\tboth:', foo_performance(y_gt, y_pred_mean, thresh)) """ 3. CONSISTENT: based on train+set """ print('\n3. all GT distribution optimization') thresh = optimal_test_thresh_equal_distribution(y_gt, y_pred_mean) q1_thresh = np.greater_equal(q1, thresh) concurrent([q1, q1_thresh, im_clean]) print(f'thresh: {thresh}') # Test, train, both print('Kappa performance:') print('\ttrain:', foo_performance(img_y_tr, y_pred_mean, thresh)) print('\ttestset:', foo_performance(img_y_te, y_pred_mean, thresh)) print('\tboth:', foo_performance(y_gt, y_pred_mean, thresh)) if 0: """ 4. DUMB/Not needed: Based on prediction of whole panel """ thresh = optimal_test_thresh_equal_distribution(y_gt, y_pred_mean, mask_true=False) q1_thresh = np.greater_equal(q1, thresh) concurrent([q1, q1_thresh, im_clean]) print('Done')
def train_segm(self): folder_save = '/home/lameeus/data/ghent_altar/dataframes' info_batchnorm = '_batchnorm' if self.batch_norm else '' info_fixed = '_encfixed' if self.fixed_enc == 1 else '_prefixed' if self.fixed_enc == 2 else '' info_model = 'tiunet' if self.ti else 'unet' filename_single = f'pretrained/{info_model}_10lamb_kfold{info_fixed}{info_batchnorm}/d{self.depth}_single' path_single = os.path.join(folder_save, filename_single + '.csv') get_info = lambda: f'10lamb_kfold_pretrained{info_fixed}{info_batchnorm}/{info_model}_d{self.depth}_k{self.k}_ifold{i_fold}' img_y_all = self.k_fold_train_data.get_train_data_all().get_y_train() def get_model(): if self.ti: model = self.get_tiunet_preenc(k=self.k, lr=self.lr_opt) else: model = self.get_unet_preenc(k=self.k, lr=self.lr_opt) if self.fixed_enc == 2: n_temp = NeuralNet(model) folder_weights = '/scratch/lameeus/data/ghent_altar/net_weight' folder1 = f'10lamb_kfold_pretrained{"_encfixed"}{info_batchnorm}' folder2 = f'{info_model}_d{self.depth}_k{self.k}_ifold{i_fold}' n_temp.load(os.path.join(folder_weights, folder1, folder2), 100) del (n_temp) return model w_ext = self.w_ext_in_ti if self.ti else self.w_ext_in_ae if not self.lr_opt: model_segm = get_model() find_learning_rate(model_segm, self.flow_segm, lr1=1e0) for i_fold in range(6): print(f'i_fold = {i_fold}') model_segm = get_model() n_segm = NeuralNet(model_segm, w_ext=w_ext) train_data_i = self.k_fold_train_data.k_split_i(i_fold) img_y_tr = train_data_i.get_y_train() img_y_te = train_data_i.get_y_test() flow_tr = get_flow(self.img_x, img_y_tr, w_patch=self.w_patch, w_ext_in=w_ext) flow_te = get_flow(self.img_x, img_y_te, w_patch=self.w_patch, w_ext_in=w_ext) info = get_info() for epoch in range(self.epochs): n_segm.train(flow_tr, flow_te, epochs=1, verbose=2, info=info) y_pred = n_segm.predict(self.img_x) thresh_single = optimal_test_thresh_equal_distribution( img_y_all, y_pred) data_single_i = {'k': self.k, 'i_fold': i_fold, 'epoch': epoch} data_single_i.update( foo_performance(img_y_te, y_pred, thresh_single)) lst_data_single = [data_single_i] df_single = pd.DataFrame(lst_data_single) pandas_save(path_single, df_single, append=True) return