def average_out_pred(r=2):
        model_name = 'ti-unet'

        path = os.path.join(
            folder_base,
            f'net_weight/{data}/{model_name}_d1_k{k}_n80/w_{1}.h5')
        model_i = load_model_quick(path)

        neural_net_i = NeuralNet(model_i, w_ext=10, norm_x=True)

        y_pred_lst = []
        r = 2
        for epoch_i in range(epoch - r, epoch + r + 1):  # epochs

            neural_net_i.load(path.rsplit('/', 1)[0], epoch_i)  # Load

            try:
                y_pred_i = neural_net_i.predict(img_x)
            except Exception as e:
                print(e)
                continue

            y_pred_lst.append(y_pred_i[..., 1])
        y_pred_avg = np.mean(y_pred_lst, axis=0)

        return y_pred_avg
def eval_3outputs():

    folder_base = 'C:/Users/admin/Data/ghent_altar/' if os.name == 'nt' else '/scratch/lameeus/data/ghent_altar/'

    assert data == '19botrightcrack3'

    k = 9
    epoch = 25
    model_name = 'ti-unet'

    folder_base = 'C:/Users/admin/Data/ghent_altar/' if os.name == 'nt' else '/scratch/lameeus/data/ghent_altar/'
    path = os.path.join(
        folder_base,
        f'net_weight/{data}/{model_name}_d1_k{k}_n80/w_{epoch}.h5')

    model = load_model_quick(path)
    neural_net = NeuralNet(model, w_ext=10, norm_x=True)

    from scripts.journal_paper.comparison_sh.shared import load_data
    a = load_data("19botright", 80)
    img_x, y_eval = a.get_x_train(), a.get_y_test()

    y_pred = neural_net.predict(img_x)

    assert y_pred.shape[-1] == 3
    y_pred2 = np.stack([1 - y_pred[..., 1], y_pred[..., 1]], axis=-1)

    data_i = _eval_func_single(y_eval, y_pred2)

    print(data_i)

    return
    def __init__(self, k=None, n_per_class=None):

        if k is not None:
            self.k = k

        if n_per_class is not None:
            self.n_per_class = n_per_class

        # Get net
        self.model_train = self.main_net(set_net)
        from methods.basic import NeuralNet

        self.neural_net = NeuralNet(self.model_train, w_ext=self.w_ext_in)

        # Get data
        train_data = self.main_data(set_data)

        n_val_datas = len(self.val_datas)
        lst_data = [[] for _ in range(n_val_datas + 1)]
        for _ in range(self.epochs):
            # Train
            self.main_train(train_data)

            # Evaluate
            data_lst = self.main_eval(train_data)

            for i, data_i in enumerate(data_lst):
                data_i.update({'epoch': self.neural_net.epoch})

                lst_data[i].append(data_i)

        for i in range(n_val_datas + 1):
            df = pd.DataFrame(lst_data[i])
            print(df)

            if i == 0:
                data_name = 'val'
            else:
                data_name = self.val_datas[i - 1]['name']
            model_name = f'{set_net["name"]}_data{data_name}_d{self.d}_k{self.k}_n{self.n_per_class}'
            pandas_save(
                f'C:/Users/admin/OneDrive - ugentbe/data/dataframes/{model_name}.csv',
                df,
                append=True)

        if 0:
            if 0:
                self.neural_net.load(
                    'C:/Users/admin/Data/ghent_altar/net_weight/tiunet_d1_k10_n80',
                    4)
            self.main_eval(train_data, b_plot=True)

        print("Finished init")
Example #4
0
    def model(self, b_optimal_lr=False):

        features_out = 3 if data_name == '19botrightcrack3' else 2

        if model_name == 'ti-unet':
            model = ti_unet(
                9,
                filters=self.k,
                w=w_patch,
                ext_in=w_ext_in // 2,
                batch_norm=True,
                max_depth=d,
                features_out=features_out,
            )

        elif model_name == 'unet':
            # model = ti_unet(9, filters=self.k, w=w_patch, ext_in=w_ext_in // 2, batch_norm=True,
            #                 max_depth=d)
            print('NO BATCH NORM? (not implemented)')
            model = unet(9,
                         filters=self.k,
                         w=w_patch,
                         ext_in=w_ext_in // 2,
                         max_depth=d,
                         n_per_block=1)

        else:
            raise ValueError(model_name)

        model.summary()

        compile_segm(model, lr=lr)

        if b_optimal_lr:
            from neuralNetwork.optimization import find_learning_rate

            global flow_tr
            find_learning_rate(model, flow_tr)

        self.neural_net = NeuralNet(model, w_ext=w_ext_in)

        if data_name[:5] == '1319_':  # pre Load model!
            # TODO which epoch to start from, I guess 10 should have an impact
            epoch_start = 50  # probably better (learned something)
            self.neural_net.load(
                f'C:/Users/admin/Data/ghent_altar/net_weight/1319/{model_name}_d{d}_k{self.k}',
                epoch=epoch_start)
Example #5
0
    def __init__(self):

        # data
        self.data()

        # Load model(s)

        model_name = 'unet'  # ['simple', 'ti-unet', 'unet']:

        folder = f'C:/Users/admin/Data/ghent_altar/net_weight/{model_name}_d1_k9_n80'
        epoch = 1
        path = f'C:/Users/admin/Data/ghent_altar/net_weight/{model_name}_d1_k9_n80/w_{epoch}.h5'

        from scripts.scripts_performance.main_performance import load_model_quick
        model = load_model_quick(path)
        neural_net = NeuralNet(model, w_ext=10, norm_x=True)

        model.summary()

        for epoch in range(1, 10 + 1):
            print('epoch', epoch)
            neural_net.load(folder, epoch)

            # Predict
            y_pred = neural_net.predict(self.img_x)

            if 0:
                plt.imshow(y_pred[..., 0])
                plt.show()

            for val_name in self.val:
                print(val_name)

                y_true_val = self.val[val_name]

                data_i = _eval_func_single(y_true_val, y_pred)

                print(data_i)

        # TODO best performing (ti-unet: 4)
        neural_net.load(folder, 4)

        y_pred = neural_net.predict(self.img_x)

        from performance.testing import get_y_pred_thresh
        y_pred_thresh = get_y_pred_thresh(y_pred, data_i['thresh'])

        concurrent([
            self.img_x[..., :3], self.img_y[..., 0], y_pred[..., 0],
            y_pred_thresh[..., 0]
        ])

        y_pred
def pred_epochs():
    img_x, img_y_val = data_lamb()

    d = 2
    k = 10
    model_name = 'ti-unet'

    train_data = '1319_10nat'

    w_ext = 10 if d == 1 else 26

    y_pred_lst = []
    n = []
    for epoch in range(10, 101, 10):
        print(epoch)

        epoch_start = 50
        epoch_corr = epoch + epoch_start if train_data[:5] == '1319_' else epoch
        path = f'C:/Users/admin/Data/ghent_altar/net_weight/{train_data}/{model_name}_d{d}_k{k}/w_{epoch_corr}.h5'

        try:
            model = load_model_quick(path)
        except Exception as e:
            print(e)
            continue

        neural_net = NeuralNet(model, w_ext=w_ext, norm_x=True)

        y_pred = neural_net.predict(img_x)

        if 0:
            data_i = _eval_func_single(img_y_val, y_pred, metric='kappa')
            print(data_i)
            data_i = _eval_func_single(img_y_val, y_pred, metric='jaccard')
            print(data_i)

        y_pred_lst.append(y_pred)
        n.append(epoch)

    concurrent([a[..., 1] for a in y_pred_lst], n)
    plt.show()

    return 1
    def get_n_model_regular(self, i_fold=None, k=None, epoch=None):

        n_in = 9

        model_tiunet = ti_unet(n_in,
                               filters=k,
                               w=self.w_patch,
                               ext_in=10 // 2,
                               batch_norm=True,
                               wrong_batch_norm=True)
        """ TODO wrong tiunet """

        n = NeuralNet(model_tiunet, w_ext=10)

        info = f'10lamb_kfold/ti_unet_k{k}_kfold{i_fold}'
        folder = os.path.join('/scratch/lameeus/data/ghent_altar/net_weight',
                              info)
        n.load(folder=folder, epoch=epoch)

        return n
        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
    def get_n_model(self, i_fold=None, k=None, epoch=None):

        n_in = 9

        model_tiunet = ti_unet(n_in,
                               filters=k,
                               w=self.w_patch,
                               ext_in=10 // 2,
                               batch_norm=True)

        n = NeuralNet(model_tiunet, w_ext=10)

        info_batchnorm = '_batchnorm'
        info_fixed = '_encfixed' if self.fixed_enc == 1 else '_prefixed' if self.fixed_enc == 2 else ''
        info_model = 'tiunet'
        info = f'10lamb_kfold_pretrained{info_fixed}{info_batchnorm}/{info_model}_d{1}_k{k}_ifold{i_fold}'
        folder = os.path.join('/scratch/lameeus/data/ghent_altar/net_weight',
                              info)
        n.load(folder=folder, epoch=epoch)

        return n
def main():
    ### Settings
    
    mod=5
    panel_nr = 19
    
    i_start ,i_end = 1, epochs_tot
    # i_start ,i_end = 1, 2
    
    k_lst = np.arange(1, 21)
    # k_lst = [1, 2]
    
    verbose=0
    b_plot = False
    
    ###
    
    if panel_nr == 13:
        train_data = get_13botleftshuang(mod=mod)
        folder_weights = '/scratch/lameeus/data/ghent_altar/net_weight/lamb_segmentation'
    elif panel_nr == 19:
        train_data = get_19SE_shuang(mod=mod)
        folder_weights = '/scratch/lameeus/data/ghent_altar/net_weight/19_hand_SE'
    else:
        raise ValueError(panel_nr)


    x, y_tr, _, y_te = get_training_data(train_data)

    (y_tr, y_te) = map(batch2img, (y_tr, y_te))
    


    assert i_end >= i_start
    
    if b_plot:
        # plotting
        pred_lst = []
        info_lst = []
    
    lst_data = []
    lst_data_avg_pred = []
    
    for k in k_lst:
    
        model = None
        
        pred_lst = []
        
        for epoch in np.arange(i_start, i_end + 1)[::-1]:
    
            info = f'settings: k {k}; epoch {epoch}'
            print('\n\t'+info)
            
            filepath_model = os.path.join(folder_weights, f'ti_unet_k{k}_imbalanced/w_{epoch}.h5')
    
            if epoch == i_end:
                model = load_model(filepath_model, custom_objects={'loss': loss,
                                                                   'accuracy_with0': accuracy_with0,
                                                                   'jaccard_with0': jaccard_with0,
                                                                   'kappa_loss': kappa_loss
                                                                   })
        
            else:
                model.load_weights(filepath_model)

            n = NeuralNet(model, w_ext=10)
    
            y_pred = n.predict(x)
            o = y_pred[..., 1]

            pred_lst.append(o)
            
            def print_conf(y_true, y_pred):
                    y_true = batch2img(y_true)
                    y_pred = batch2img(y_pred)
                    
                    b_annot = np.sum(y_true, axis=-1).astype(bool)
                    
                    y_true_annot = y_true[b_annot, :].argmax(axis=-1)
                    y_pred_annot = y_pred[b_annot, :].argmax(axis=-1)
                    
                    """
                    T0; predicted 1, but is 0
                    predicted 0, but is 1; T1
                    """
                    conf_mat = confusion_matrix(y_true_annot, y_pred_annot)
                    print(conf_mat)
                
            if 1:   # Single prediction
                
                if verbose == 1:
                    print_conf(y_tr, y_pred)
                    print_conf(y_te, y_pred)
                    
                if b_plot:
                    pred_lst.append(o)
                    info_lst.append(info)
    
                test_thresh = test_thresh_incremental(y_pred, y_tr, y_te, n=5, verbose=0)
                
                pred_thresh = np.greater_equal(o, test_thresh)
    
                pred_thresh_bin = np.stack([1-pred_thresh, pred_thresh], axis=-1)
    
                y_te_flat, y_pred_flat = filter_non_zero(y_te, pred_thresh_bin)
                y_te_argmax = np.argmax(y_te_flat, axis=-1)
                y_pred_argmax = np.argmax(y_pred_flat, axis=-1)
                acc, jacc, kappa = _get_scores(y_te_argmax, y_pred_argmax)
            
                if verbose == 1:
                    print_conf(y_tr, pred_thresh_bin)
                    print_conf(y_te, pred_thresh_bin)
    
                if 0: concurrent([pred_thresh])
                
                data_i = {'k':k,
                          'epoch':epoch,
                          'test_thresh':test_thresh,
                          'kappa':kappa,
                          'accuracy':acc,
                          'jaccard':jacc
                          }
                lst_data.append(data_i)
            
            if 1:   # avg prediction
    
                pred_i_average = np.mean(pred_lst, axis=0)
    
                # optimizing threshold prediction
                test_thresh = test_thresh_incremental(np.stack([1 - pred_i_average, pred_i_average], axis=-1), y_tr, y_te, n=5,
                                                      verbose=0)
                pred_thresh = np.greater_equal(pred_i_average, test_thresh)
                pred_thresh_bin = np.stack([1 - pred_thresh, pred_thresh], axis=-1)
    
                y_te_flat, y_pred_flat = filter_non_zero(y_te, pred_thresh_bin)
                y_te_argmax = np.argmax(y_te_flat, axis=-1)
                y_pred_argmax = np.argmax(y_pred_flat, axis=-1)
                acc, jacc, kappa = _get_scores(y_te_argmax, y_pred_argmax)
    
                data_i = {'k': k,
                          'epoch_start': epoch,
                          'test_thresh': test_thresh,
                          'kappa': kappa,
                          'accuracy': acc,
                          'jaccard': jacc
                          }
    
                lst_data_avg_pred.append(data_i)
            
    b = True
    if b:
        df = pd.DataFrame(lst_data)
        filename_save = f'tiunet_1pool_shaoguang{panel_nr}_imbalanced'
        filename_path = f'/scratch/lameeus/data/ghent_altar/dataframes/{filename_save}.csv'
        df.to_csv(filename_path, sep=';')
    
        df = pd.DataFrame(lst_data_avg_pred)
        filename_save = f'tiunet_1pool_shaoguang{panel_nr}_imbalanced_averaging'
        df.to_csv(f'/scratch/lameeus/data/ghent_altar/dataframes/{filename_save}.csv', sep=';')

    if b_plot:
        concurrent(pred_lst, info_lst)
    
    plt.show()
    
    return
def transfer_learning(
        epoch=25,  # Could check a few
        b_plot=False):

    d = 2  # 1, 2

    img_x, img_y_val = data_lamb()

    k = 10

    model_name = 'ti-unet'

    w_ext = 10 if d == 1 else 26

    # train_data:
    y_pred_lst = []
    n = ['clean']

    # train_data_lst = ['1319_10', '10', '1319', '1319_101319']
    train_data_lst = ['10nat', '1319_10nat', '1319_10nat1319', '1319']

    data_i_lst = {}

    for train_data in train_data_lst:
        print(train_data)

        epoch_start = 50
        epoch_corr = epoch + epoch_start if train_data[:5] == '1319_' else epoch
        if train_data == '1319':
            epoch_corr = 50
        path = f'C:/Users/admin/Data/ghent_altar/net_weight/{train_data}/{model_name}_d{d}_k{k}/w_{epoch_corr}.h5'

        try:
            model = load_model_quick(path)
        except Exception as e:
            print(e)
            continue

        neural_net = NeuralNet(model, w_ext=w_ext, norm_x=True)

        y_pred = neural_net.predict(img_x)

        # baseline
        data_i = _eval_func_single(img_y_val, y_pred, metric='kappa')
        print(data_i)

        if 0:
            """
            Checking which 
            
            baseline ~ .22
            i = 0: .268, Remove huge improvement  ( a lot of "green" background annotated as paint loss)
            i = 1: .228 Keep!
            i = 2: .179 keep! Drop (keep!!
            i = 3: .159 keep! Even more important
            i = 4: .252 Remove (huge problem right top)
            i = 5: .233 Keep, quit relevant
            """

            from datasets.default_trainingsets import get_10lamb_6patches
            kFoldTrainData = get_10lamb_6patches(5)

            _eval_func_single(
                kFoldTrainData.k_split_i(0).get_y_train(),
                y_pred,
                metric='kappa')  # Check what is influence without!

        data_i_lst[train_data] = data_i

        data_i = _eval_func_single(img_y_val, y_pred, metric='jaccard')
        print(data_i)

        y_pred_lst.append(y_pred)
        n.append(train_data)

    # plt.imshow(neural_net.predict(img_x[::2,::2,:])[..., 1])

    if b_plot:
        concurrent([img_x[..., :3]] + [a[..., 1] for a in y_pred_lst], n)

    if 0:
        from figures_paper.overlay import semi_transparant
        from data.datatools import imread, imsave

        t = [data_i_lst[n_i]['thresh'] for n_i in train_data_lst]
        p = []
        for i, train_data in enumerate(train_data_lst):
            b = np.greater_equal(y_pred_lst[i][..., 1], t[i])

            k = semi_transparant(img_x[..., :3], b, 0)
            p.append(k)

            imsave(
                os.path.join(
                    "C:/Users/admin/OneDrive - ugentbe/data/images_paper",
                    train_data + '.png'), k)

        concurrent(p)

    return data_i_lst
Example #12
0
def main():
    """

    :return:
    """
    
    ### Settings
    
    k_range = range(2, 30 + 1)
    # k_range = [10,11]

    fold_range = range(6)
    # fold_range = [0, 1]

    epoch_range = range(1, 40 + 1)
    # epoch_range = [39, 40]

    filename_single = f'tiunet_10lamb_kfold_single'
    filename_avg_pred =f'tiunet_10lamb_kfold_avgpred'

    if os.name == 'nt':     # windows laptop
        folder_weights = 'C:/Users/Laurens_laptop_w/data'
        folder_save = 'C:/Users/Laurens_laptop_w/data/ghent_altar/dataframes'
    else:
        folder_weights = '/scratch/lameeus/data/ghent_altar/net_weight'
        folder_save = '/home/lameeus/data/ghent_altar/dataframes'

    ### Init
    epoch_range_desc = np.sort(epoch_range)[::-1]

    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_y_all = train_data_all.get_y_train()

    for k in k_range:
        for i_fold in fold_range:
            
            ### Reinit to make sure
            model = None
            list_y_pred = []

            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()

            ###
            lst_data_single = []
            lst_data_avg_pred = []
            
            for epoch in epoch_range_desc:
    
                """
                Load model
                """
                filepath_model = os.path.join(folder_weights, f'10lamb_kfold/ti_unet_k{k}_kfold{i_fold}/w_{epoch}.h5')

                if epoch == epoch_range_desc[0]:
                    assert model is None
                    assert len(list_y_pred) == 0

                model = load_model_quick(filepath_model, model)

                """
                Inference
                """
        
                n = NeuralNet(model, w_ext=10)
                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 based on GT
                """

                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)
                
                """
                Get scores
                """
                
                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': epoch_range_desc[0]}
                
                data_single_i.update(foo_performance(img_y_te, y_pred, thresh_single))
                data_avg_pred_i.update(foo_performance(img_y_te, y_avg_pred, thresh_avg_pred))
                
                if 1:
                    print('single', data_single_i)
                    print('avg pred', data_avg_pred_i)

                lst_data_single.append(data_single_i)
                lst_data_avg_pred.append(data_avg_pred_i)
        
            """
            Save data
            """
            
            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')
            if os.path.exists(path_single):
                df_single.to_csv(path_single, mode='a', header=False, index=False)
            else:
                df_single.to_csv(path_single, index=False)

            if os.path.exists(path_avg_pred):
                df_avg_pred.to_csv(path_avg_pred, mode='a', header=False, index=False)
            else:
                df_avg_pred.to_csv(path_avg_pred, index=False)
    
    return
Example #13
0
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):
        from figures_paper.overlay import semi_transparant

        if self.fixed_enc == -2:

            def get_n_model_regular(i_fold=None, k=None, epoch=None):

                n_in = 9

                model_tiunet = ti_unet(n_in,
                                       filters=k,
                                       w=self.w_patch,
                                       ext_in=10 // 2,
                                       batch_norm=True,
                                       wrong_batch_norm=True)
                compile_segm(model_tiunet, 1e-4)
                """ TODO wrong tiunet """

                n = NeuralNet(model_tiunet, w_ext=10)

                info = f'10lamb_kfold/ti_unet_k{k}_kfold{i_fold}'
                folder = os.path.join(
                    '/scratch/lameeus/data/ghent_altar/net_weight', info)
                n.load(folder=folder, epoch=epoch)

                return n

            n_segm = get_n_model_regular(i_fold=self.i_fold,
                                         k=self.k,
                                         epoch=40)

        elif self.fixed_enc == -1:
            # No init
            model_segm = self.get_tiunet_preenc(k=self.k, lr=self.lr_opt)
            n_segm = NeuralNet(model_segm, w_ext=self.w_ext_in_ti)

        elif self.fixed_enc in [0, 1, 2]:

            # Load model
            model_segm = self.get_tiunet_preenc(k=self.k, lr=self.lr_opt)
            n_segm = NeuralNet(model_segm, w_ext=self.w_ext_in_ti)

            # Train on set
            folder_weights = '/scratch/lameeus/data/ghent_altar/net_weight'
            if self.fixed_enc == 0:
                folder1 = '10lamb_kfold_pretrained_batchnorm'
            elif self.fixed_enc == 1:
                folder1 = '10lamb_kfold_pretrained_encfixed_batchnorm'
            elif self.fixed_enc == 2:
                folder1 = '10lamb_kfold_pretrained_prefixed_batchnorm'

            folder2 = f'{"tiunet"}_d{self.depth}_k{self.k}_ifold{self.i_fold}'

            n_segm.load(os.path.join(folder_weights, folder1, folder2), 100)

        elif self.fixed_enc == 3:

            model_segm = self.get_tiunet_preenc(k=self.k,
                                                lr=self.lr_opt,
                                                set_info=f'_{self.set_nr}',
                                                epoch_start=100)
            n_segm = NeuralNet(model_segm, w_ext=self.w_ext_in_ti)

        else:
            NotImplementedError()

        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 set_encoder_state(model, trainable=False):

            assert len(model.layers) == 14
            for layer in model.layers[:7]:
                layer.trainable = trainable
            compile_segm(model)

        n_segm.epoch = 0

        # Without pretraining
        foo(n_segm)

        # epochs

        set_encoder_state(n_segm.model, trainable=False)

        for _ in range(10):
            n_segm.train(self.flow_tr_10, epochs=1, verbose=2)

        foo(n_segm, 0)

        if 0:
            set_encoder_state(n_segm.model, trainable=True)

            for _ in range(1):
                n_segm.train(self.flow_tr_set_10, epochs=10, verbose=2)
                foo(n_segm, 0)

        set_encoder_state(n_segm.model, trainable=True)

        for _ in range(10):
            n_segm.train(self.flow_tr_set, epochs=1, verbose=2)

        foo(n_segm, 0)
    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
                     delimiter=';')

    i_max = df['kappa'].idxmax()

    k, epoch = map(int, df.iloc[i_max][['k', 'epoch']])

    model_name = 'ti-unet'

    folder_base = 'C:/Users/admin/Data/ghent_altar/' if os.name == 'nt' else '/scratch/lameeus/data/ghent_altar/'

    path = os.path.join(
        folder_base,
        f'net_weight/{data}/{model_name}_d1_k{k}_n80/w_{epoch}.h5')

    model = load_model_quick(path)
    neural_net = NeuralNet(model, w_ext=10, norm_x=True)

    # Image

    from scripts.journal_paper.comparison_sh.shared import load_data

    if data == '1319botright':
        a = load_data("19botright", n_per_class=80)
    else:
        a = load_data(data, n_per_class=80)
    img_x, img_y = a.get_x_train(), a.get_y_test()

    y_pred = neural_net.predict(img_x)

    if 1:
        Evaluater(img_y, y_pred).summary()
Example #18
0
class Main(object):
    def __init__(self, k=None, seed=None):

        if k is not None:
            self.k = k

        self.seed = seed

        self.model()

        self.train()

    def model(self, b_optimal_lr=False):

        features_out = 3 if data_name == '19botrightcrack3' else 2

        if model_name == 'ti-unet':
            model = ti_unet(
                9,
                filters=self.k,
                w=w_patch,
                ext_in=w_ext_in // 2,
                batch_norm=True,
                max_depth=d,
                features_out=features_out,
            )

        elif model_name == 'unet':
            # model = ti_unet(9, filters=self.k, w=w_patch, ext_in=w_ext_in // 2, batch_norm=True,
            #                 max_depth=d)
            print('NO BATCH NORM? (not implemented)')
            model = unet(9,
                         filters=self.k,
                         w=w_patch,
                         ext_in=w_ext_in // 2,
                         max_depth=d,
                         n_per_block=1)

        else:
            raise ValueError(model_name)

        model.summary()

        compile_segm(model, lr=lr)

        if b_optimal_lr:
            from neuralNetwork.optimization import find_learning_rate

            global flow_tr
            find_learning_rate(model, flow_tr)

        self.neural_net = NeuralNet(model, w_ext=w_ext_in)

        if data_name[:5] == '1319_':  # pre Load model!
            # TODO which epoch to start from, I guess 10 should have an impact
            epoch_start = 50  # probably better (learned something)
            self.neural_net.load(
                f'C:/Users/admin/Data/ghent_altar/net_weight/1319/{model_name}_d{d}_k{self.k}',
                epoch=epoch_start)

    def train(self, epochs=epochs, steps_per_epoch=100):

        global flow_tr

        info = f'{data_name}/{model_name}_d{d}_k{self.k}'

        try:
            if n_per_class is not None:
                info = '_'.join([info, f'n{n_per_class}'])
        except NameError:
            pass  # If n_per_class does not exist, don't add it

        if self.seed is not None:
            info += f'_s{self.seed}'

        self.neural_net.train(
            flow_tr,
            # validation=flow_va,
            epochs=epochs,
            steps_per_epoch=steps_per_epoch,
            info=info)

        # Solve Memory problems?
        del self.neural_net

    def eval(self):
        pass
Example #19
0
class Main(object):

    k = 8
    n_per_class = 80
    d = 1

    epochs = 100

    if d == 1:
        w_ext_in = 10
    elif d == 2:
        w_ext_in = 26

    w_patch = 10

    if 0:
        lr = 1e-3
        steps_per_epoch = 100
    else:
        lr = 1e-4
        steps_per_epoch = 1000

    def __init__(self, k=None, n_per_class=None):

        if k is not None:
            self.k = k

        if n_per_class is not None:
            self.n_per_class = n_per_class

        # Get net
        self.model_train = self.main_net(set_net)
        from methods.basic import NeuralNet

        self.neural_net = NeuralNet(self.model_train, w_ext=self.w_ext_in)

        # Get data
        train_data = self.main_data(set_data)

        n_val_datas = len(self.val_datas)
        lst_data = [[] for _ in range(n_val_datas + 1)]
        for _ in range(self.epochs):
            # Train
            self.main_train(train_data)

            # Evaluate
            data_lst = self.main_eval(train_data)

            for i, data_i in enumerate(data_lst):
                data_i.update({'epoch': self.neural_net.epoch})

                lst_data[i].append(data_i)

        for i in range(n_val_datas + 1):
            df = pd.DataFrame(lst_data[i])
            print(df)

            if i == 0:
                data_name = 'val'
            else:
                data_name = self.val_datas[i - 1]['name']
            model_name = f'{set_net["name"]}_data{data_name}_d{self.d}_k{self.k}_n{self.n_per_class}'
            pandas_save(
                f'C:/Users/admin/OneDrive - ugentbe/data/dataframes/{model_name}.csv',
                df,
                append=True)

        if 0:
            if 0:
                self.neural_net.load(
                    'C:/Users/admin/Data/ghent_altar/net_weight/tiunet_d1_k10_n80',
                    4)
            self.main_eval(train_data, b_plot=True)

        print("Finished init")

    def main_net(self, set_n):
        from methods.examples import compile_segm
        from neuralNetwork.architectures import ti_unet, convNet, unet

        n_name = set_n['name'].lower()
        if n_name == 'ti-unet':
            model = ti_unet(9,
                            filters=self.k,
                            w=self.w_patch,
                            ext_in=self.w_ext_in // 2,
                            batch_norm=True,
                            max_depth=self.d)
        elif n_name == 'simple':
            model = convNet(9,
                            self.k,
                            w_in=self.w_patch + self.w_ext_in,
                            n_convs=5,
                            batch_norm=False,
                            padding='valid')

            assert model.output_shape[-3:] == (self.w_patch, self.w_patch, 2)

        elif n_name == 'unet':
            print('NO BATCH NORM? (not implemented)')
            model = unet(9,
                         filters=self.k,
                         w=self.w_patch,
                         ext_in=self.w_ext_in // 2,
                         max_depth=self.d,
                         n_per_block=1)
        else:
            raise ValueError(n_name)

            # raise NotImplementedError('Unet is not well implemented: * Double, batchnorm? f per layer etc?')

        model.summary()
        compile_segm(
            model, lr=self.lr)  # instead of 10e-3, 10e-4 is probs more stable.

        return model

    def main_data(self, set_data):

        if set_data['name'] == 'zach_sh':
            from datasets.default_trainingsets import get_13botleftshuang
            train_data = get_13botleftshuang(mod, n_per_class=self.n_per_class)
        else:
            raise NotImplementedError()

        from data.preprocessing import rescale0to1
        train_data.x = rescale0to1(train_data.x)

        from datasets.default_trainingsets import xy_from_df, panel13withoutRightBot
        from datasets.examples import get_13zach

        _, img_y = xy_from_df(get_13zach(), mod)
        img_y_top2, _ = panel13withoutRightBot(img_y)

        img_y_test = np.logical_or(img_y_top2, train_data.get_y_test())

        self.val_datas = [{
            'name': '13_top2',
            'y': img_y_top2
        }, {
            'name': '13_test',
            'y': img_y_test
        }]

        return train_data

    def main_train(self, train_data, steps_per_epoch=None):
        if steps_per_epoch is None:
            steps_per_epoch = self.steps_per_epoch

        from main_general import get_training_data

        from preprocessing.image import get_flow

        # TODO train
        x_train, y_train, x_val, y_val = get_training_data(train_data)

        # Generator
        flow_tr = get_flow(x_train,
                           y_train,
                           w_patch=self.w_patch,
                           w_ext_in=self.w_ext_in)

        flow_va = get_flow(x_val,
                           y_val,
                           w_patch=self.w_patch,
                           w_ext_in=self.w_ext_in)

        epochs = 1

        self.neural_net.train(
            flow_tr,
            validation=flow_va,
            epochs=epochs,
            steps_per_epoch=steps_per_epoch,
            info=f'{set_net["name"]}_d{self.d}_k{self.k}_n{self.n_per_class}')

    def main_eval(
        self,
        train_data,
        b_plot=False,
    ):

        x = train_data.get_x_test()

        y_pred = self.neural_net.predict(x)

        if b_plot:
            concurrent([x[..., :3], y_pred[..., 1]], ['input', 'prediction'])

        val_datas = [{'y': train_data.get_y_test()}] + self.val_datas

        return _eval_func(y_pred, val_datas, b_plot=b_plot)