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)
示例#2
0
    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)
示例#5
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):
        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