示例#1
0
def train_test_dense_net_split(args):
    filepath = check_path("weights/{}_split/weights.hdf5".format(
        args['dataset']))

    train_df = get_train_dataset_info(args['dataset'])
    test_df = get_test_dataset_info(args['dataset'])

    trn_flow, val_flow = get_training_and_validation_flow(args,
                                                          train_df,
                                                          split_size=0.10)
    tst_flow = create_flow(args, test_df, batch_size=1, shuffle=False)

    model = train_or_load_model(args, trn_flow, val_flow, filepath, trn_flow.n,
                                val_flow.n)
    y_pred_prob = model.predict_generator(generator=tst_flow,
                                          verbose=1,
                                          steps=tst_flow.n)

    y_pred_prob, y_pred, y_test = calculate_prediction(args, y_pred_prob,
                                                       trn_flow, test_df)
    metrics_dict = accuracy_precision_recall_fscore(args, y_test, y_pred)
    y_pred_prob_classes = list(zip(y_pred_prob.tolist(), y_test))

    print_classifications(args, tst_flow.filenames, test_df, y_pred)
    print_results(args, metrics_dict)

    calculate_average_precision_ks(args, y_pred_prob_classes)
    calculate_accuracy_per_class(args, y_test, y_pred)

    draw_class_activation_map(args, model, test_df)
示例#2
0
def train_test_dense_net_cv(args):
    info = get_train_dataset_info(args['dataset'])
    x, y, = info.iloc[:, 0].values, info.iloc[:, 1].values

    metrics_dict, y_pred_prob_classes, fold_nr = defaultdict(int), [], 1
    k_fold = StratifiedKFold(n_splits=args['nr_folds'],
                             shuffle=True,
                             random_state=args['random_seed'])

    for train, test in k_fold.split(x, y):
        filepath = "weights/{}_cv/weights_fold_{}_from_{}.hdf5"
        filepath = check_path(
            filepath.format(args['dataset'], fold_nr, args['nr_folds']))

        train_data_frame = pd.DataFrame(data={
            'filename': x[train],
            'class': y[train]
        })
        test_data_frame = pd.DataFrame(data={
            'filename': x[test],
            'class': y[test]
        })

        trn_flow, val_flow = get_training_and_validation_flow(
            args, train_data_frame)
        tst_flow = create_flow(args,
                               test_data_frame,
                               batch_size=1,
                               shuffle=False)

        model = train_or_load_model(args, trn_flow, val_flow, filepath,
                                    trn_flow.n, val_flow.n)
        y_pred_prob = model.predict_generator(generator=tst_flow,
                                              verbose=1,
                                              steps=tst_flow.n)

        y_pred_prob, y_pred, y_test = calculate_prediction(
            args, y_pred_prob, trn_flow, test_data_frame)
        metrics_it = accuracy_precision_recall_fscore(args, y_test, y_pred)
        y_pred_prob_classes += list(zip(y_pred_prob.tolist(), y_test))

        print_fold_results(args, metrics_it)
        print_classifications(args, tst_flow.filenames, test_data_frame,
                              y_pred)
        calculate_accuracy_per_class(args, y_test, y_pred)
        draw_class_activation_map(args, model, test_data_frame)

        metrics_dict = dict(
            (k, metrics_dict[k] + v) for k, v in metrics_it.items())
        K.clear_session()
        fold_nr += 1

    metrics_dict = dict(
        (k, v / args['nr_folds']) for k, v in metrics_dict.items())
    print_results(args, metrics_dict)
    calculate_average_precision_ks(args, y_pred_prob_classes)
示例#3
0
def train_test_attention_guided_cnn_cv(args):
    info = get_train_dataset_info(args['dataset'])
    x, y, = info.iloc[:, 0].values, info.iloc[:, 1].values

    metrics_dict_glob, y_pred_prob_classes_glob = defaultdict(int), []
    metrics_dict, y_pred_prob_classes, fl_nr = defaultdict(int), [], 1

    k_fold = StratifiedKFold(n_splits=args['nr_folds'],
                             shuffle=True,
                             random_state=args['random_seed'])
    # y_test_final, y_prob_final, y_pred_final = [], [], []

    for train, test in k_fold.split(x, y):
        train_data_frame = pd.DataFrame(data={
            'filename': x[train],
            'class': y[train]
        })
        test_data_frame = pd.DataFrame(data={
            'filename': x[test],
            'class': y[test]
        })

        first_branch_path = "weights/{}_attention_guided_global_branch_cv/weights_fold_{}_from_{}.hdf5"
        first_branch_path = check_path(
            first_branch_path.format(args['dataset'], fl_nr, args['nr_folds']))

        second_branch_path = "weights/{}_attention_guided_local_branch_cv/weights_fold_{}_from_{}.hdf5"
        second_branch_path = check_path(
            second_branch_path.format(args['dataset'], fl_nr,
                                      args['nr_folds']))

        all_network_path = "weights/{}_attention_guided_all_cv/weights_fold_{}_from_{}.hdf5"
        all_network_path = check_path(
            all_network_path.format(args['dataset'], fl_nr, args['nr_folds']))

        trn_flow_1, val_flow_1 = get_training_and_validation_flow(
            args, train_data_frame)
        model_global = train_or_load_model(args, trn_flow_1, val_flow_1,
                                           first_branch_path, trn_flow_1.n,
                                           val_flow_1.n)

        tst_flow_1 = create_flow(args,
                                 test_data_frame,
                                 batch_size=1,
                                 shuffle=False)
        y_pred_prob = model_global.predict_generator(generator=tst_flow_1,
                                                     verbose=1,
                                                     steps=tst_flow_1.n)
        y_pred_prob, y_pred, y_test = calculate_prediction(
            args, y_pred_prob, trn_flow_1, test_data_frame)
        metrics_it_glob = accuracy_precision_recall_fscore(
            args, y_test, y_pred)
        y_pred_prob_classes_glob += list(zip(y_pred_prob.tolist(), y_test))

        print("Global branch results.")
        print_fold_results(args, metrics_it_glob)
        calculate_accuracy_per_class(args, y_test, y_pred)

        test_data_frame_2 = crop_and_draw_class_activation_map(
            args, model_global, test_data_frame, fl_nr)
        train_data_frame_2 = crop_and_draw_class_activation_map(
            args, model_global, train_data_frame, fl_nr)

        trn_flow_2, val_flow_2 = get_training_and_validation_flow(
            args, train_data_frame_2)
        model_local = train_or_load_model(args, trn_flow_2, val_flow_2,
                                          second_branch_path, trn_flow_2.n,
                                          val_flow_2.n)

        tst_flow_2 = create_flow(args,
                                 test_data_frame_2,
                                 batch_size=1,
                                 shuffle=False)
        y_pred_prob = model_local.predict_generator(generator=tst_flow_2,
                                                    verbose=1,
                                                    steps=tst_flow_2.n)
        y_pred_prob, y_pred, y_test = calculate_prediction(
            args, y_pred_prob, trn_flow_2, test_data_frame_2)
        metrics_it = accuracy_precision_recall_fscore(args, y_test, y_pred)

        print("Local branch results.")
        print_fold_results(args, metrics_it)
        calculate_accuracy_per_class(args, y_test, y_pred)

        trn_flow_merged = merge_input_generators(trn_flow_1, trn_flow_2)
        val_flow_merged = merge_input_generators(val_flow_1, val_flow_2)
        tst_flow_merged = merge_input_generators(tst_flow_1, tst_flow_2)

        models = {"model_global": model_global, "model_local": model_local}
        model = train_or_load_model(args,
                                    trn_flow_merged,
                                    val_flow_merged,
                                    all_network_path,
                                    trn_flow_1.n,
                                    val_flow_1.n,
                                    branches_models=models)

        y_pred_prob = model.predict_generator(generator=tst_flow_merged,
                                              verbose=1,
                                              steps=tst_flow_1.n)
        y_pred_prob, y_pred, y_test = calculate_prediction(
            args, y_pred_prob, trn_flow_1, test_data_frame)
        metrics_it = accuracy_precision_recall_fscore(args, y_test, y_pred)
        y_pred_prob_classes += list(zip(y_pred_prob.tolist(), y_test))

        print("Fused model results.")
        print_fold_results(args, metrics_it)
        print_classifications(args, tst_flow_1.filenames, test_data_frame,
                              y_pred)
        calculate_accuracy_per_class(args, y_test, y_pred)

        draw_class_activation_map(args, model, test_data_frame)

        # y_pred_final += y_pred
        # y_test_final += y_test.astype(int).tolist()
        # y_prob_final.extend([x.tolist() for x in y_pred_prob])

        metrics_dict = dict(
            (k, metrics_dict[k] + v) for k, v in metrics_it.items())
        metrics_dict_glob = dict(
            (k, metrics_dict_glob[k] + v) for k, v in metrics_it_glob.items())
        K.clear_session()
        fl_nr += 1

    print("Global branch results.")
    metrics_dict_glob = dict(
        (k, v / args['nr_folds']) for k, v in metrics_dict_glob.items())
    print_results(args, metrics_dict_glob)
    calculate_average_precision_ks(args, y_pred_prob_classes_glob)

    # precision, recall, average_precision = dict(), dict(), dict()
    # y_test_bin_final = label_binarize(y_test_final, classes=[0, 1, 2])
    # y_prob_final = np.array(y_prob_final)
    # for i in range(3):
    #     precision[i], recall[i], _ = precision_recall_curve(y_test_bin_final[:, i],
    #                                                         y_prob_final[:, i])
    #     average_precision[i] = average_precision_score(y_test_bin_final[:, i], y_prob_final[:, i])
    #
    # colors = cycle(['navy', 'turquoise', 'darkorange'])
    # tags = ["no flood", "water < 1m", "water > 1m"]
    # lines = []
    # labels = []
    # for i, color in zip(range(3), colors):
    #     l, = plt.plot(recall[i], precision[i], color=color, lw=2)
    #     lines.append(l)
    #     labels.append('Precision-recall for {0} (area = {1:0.2f})'
    #                   ''.format(tags[i], average_precision[i]))
    #
    # plt.xlim([0.0, 1.0])
    # plt.ylim([0.0, 1.05])
    # plt.xlabel('Recall')
    # plt.ylabel('Precision')
    # plt.legend(lines, labels)
    # plt.savefig('prec_rec.png')
    #
    # print(confusion_matrix(y_test_final, y_pred_final))

    print("Fused model results.")
    metrics_dict = dict(
        (k, v / args['nr_folds']) for k, v in metrics_dict.items())
    print_results(args, metrics_dict)
    calculate_average_precision_ks(args, y_pred_prob_classes)
示例#4
0
def train_test_attention_guided_cnn_split(args):
    train_df = get_train_dataset_info(args['dataset'])
    test_df = get_test_dataset_info(args['dataset'])

    first_branch_path = "weights/{}_attention_guided_global_branch/weights.hdf5"
    first_branch_path = check_path(first_branch_path.format(args['dataset']))

    second_branch_path = "weights/{}_attention_guided_local_branch/weights.hdf5"
    second_branch_path = check_path(second_branch_path.format(args['dataset']))

    all_network_path = "weights/{}_attention_guided_all/weights.hdf5"
    all_network_path = check_path(all_network_path.format(args['dataset']))

    trn_flow_1, val_flow_1 = get_training_and_validation_flow(args, train_df)
    model_global = train_or_load_model(args, trn_flow_1, val_flow_1,
                                       first_branch_path, trn_flow_1.n,
                                       val_flow_1.n)

    tst_flow_1 = create_flow(args, test_df, batch_size=1, shuffle=False)
    y_pred_prob = model_global.predict_generator(generator=tst_flow_1,
                                                 verbose=1,
                                                 steps=tst_flow_1.n)

    y_pred_prob, y_pred, y_test = calculate_prediction(args, y_pred_prob,
                                                       trn_flow_1, test_df)
    metrics_dict = accuracy_precision_recall_fscore(args, y_test, y_pred)
    y_pred_prob_classes = list(zip(y_pred_prob.tolist(), y_test))

    print("Global branch results.")
    print_results(args, metrics_dict)
    calculate_accuracy_per_class(args, y_test, y_pred)
    calculate_average_precision_ks(args, y_pred_prob_classes)

    test_data_frame_2 = crop_and_draw_class_activation_map(
        args, model_global, test_df)
    train_data_frame_2 = crop_and_draw_class_activation_map(
        args, model_global, train_df)

    trn_flow_2, val_flow_2 = get_training_and_validation_flow(
        args, train_data_frame_2)
    model_local = train_or_load_model(args, trn_flow_2, val_flow_2,
                                      second_branch_path, trn_flow_2.n,
                                      val_flow_2.n)

    tst_flow_2 = create_flow(args,
                             test_data_frame_2,
                             batch_size=1,
                             shuffle=False)
    y_pred_prob = model_local.predict_generator(generator=tst_flow_2,
                                                verbose=1,
                                                steps=tst_flow_2.n)
    y_pred_prob, y_pred, y_test = calculate_prediction(args, y_pred_prob,
                                                       trn_flow_2,
                                                       test_data_frame_2)
    metrics_dict = accuracy_precision_recall_fscore(args, y_test, y_pred)
    y_pred_prob_classes = list(zip(y_pred_prob.tolist(), y_test))

    print("Local branch results.")
    print_results(args, metrics_dict)
    calculate_accuracy_per_class(args, y_test, y_pred)
    calculate_average_precision_ks(args, y_pred_prob_classes)

    trn_flow_merged = merge_input_generators(trn_flow_1, trn_flow_2)
    val_flow_merged = merge_input_generators(val_flow_1, val_flow_2)
    tst_flow_merged = merge_input_generators(tst_flow_1, tst_flow_2)

    models = {"model_global": model_global, "model_local": model_local}
    model = train_or_load_model(args,
                                trn_flow_merged,
                                val_flow_merged,
                                all_network_path,
                                trn_flow_1.n,
                                val_flow_1.n,
                                branches_models=models)

    y_pred_prob = model.predict_generator(generator=tst_flow_merged,
                                          verbose=1,
                                          steps=tst_flow_1.n)
    y_pred_prob, y_pred, y_test = calculate_prediction(args, y_pred_prob,
                                                       trn_flow_1, test_df)
    metrics_dict = accuracy_precision_recall_fscore(args, y_test, y_pred)
    y_pred_prob_classes = list(zip(y_pred_prob.tolist(), y_test))

    print("Fused model results.")
    print_results(args, metrics_dict)
    print_classifications(args, tst_flow_1.filenames, test_df, y_pred)
    calculate_accuracy_per_class(args, y_test, y_pred)
    calculate_average_precision_ks(args, y_pred_prob_classes)
示例#5
0
def train_test_attention_guided_cnn_split_regression(args):
    train_df = get_train_dataset_info(args['dataset'])
    test_df = get_test_dataset_info(args['dataset'])

    first_branch_path = "weights/{}_attention_guided_global_branch/weights.hdf5"
    first_branch_path = check_path(first_branch_path.format(args['dataset']))

    second_branch_path = "weights/{}_attention_guided_local_branch/weights.hdf5"
    second_branch_path = check_path(second_branch_path.format(args['dataset']))

    all_network_path = "weights/{}_attention_guided_all/weights.hdf5"
    all_network_path = check_path(all_network_path.format(args['dataset']))

    trn_df_1_global = pd.DataFrame(data={
        'filename': train_df['filename'].values,
        'class': train_df['class'].values
    })
    trn_df_2_global = pd.DataFrame(
        data={
            'filename': train_df['filename'].values,
            'class': train_df['height'].values
        })

    tst_df_1_global = pd.DataFrame(data={
        'filename': test_df['filename'].values,
        'class': test_df['class'].values
    })
    tst_df_2_global = pd.DataFrame(data={
        'filename': test_df['filename'].values,
        'class': test_df['height'].values
    })

    trn_flow_1_global, val_flow_1_global = get_training_and_validation_flow(
        args, trn_df_1_global, class_mode="categorical", split_size=0.10)
    trn_flow_2_global, val_flow_2_global = get_training_and_validation_flow(
        args, trn_df_2_global, split_size=0.10)

    tst_flow_1_global = create_flow(args,
                                    tst_df_1_global,
                                    batch_size=1,
                                    shuffle=False)
    tst_flow_2_global = create_flow(args,
                                    tst_df_2_global,
                                    batch_size=1,
                                    shuffle=False)

    trn_flow_global = merge_output_generators(trn_flow_1_global,
                                              trn_flow_2_global)
    val_flow_global = merge_output_generators(val_flow_1_global,
                                              val_flow_2_global)
    tst_flow_global = merge_output_generators(tst_flow_1_global,
                                              tst_flow_2_global)

    model_global = train_or_load_model(args,
                                       trn_flow_global,
                                       val_flow_global,
                                       first_branch_path,
                                       trn_flow_1_global.n,
                                       val_flow_1_global.n,
                                       branch="global")
    y_pred_prob = model_global.predict_generator(generator=tst_flow_global,
                                                 verbose=1,
                                                 steps=tst_flow_1_global.n)[1]
    y_pred_prob, y_pred, y_test = calculate_prediction(args, y_pred_prob,
                                                       trn_flow_global,
                                                       tst_df_2_global)
    metrics_dict = accuracy_precision_recall_fscore(
        args, y_test, y_pred, y_test2=tst_df_1_global['class'].values)

    print("Global branch results.")
    print_results(args, metrics_dict)
    calculate_accuracy_per_class(args, y_test, y_pred)

    tst_local_df = crop_and_draw_class_activation_map(args, model_global,
                                                      test_df)
    trn_local_df = crop_and_draw_class_activation_map(args, model_global,
                                                      train_df)

    tst_local_df_1 = pd.DataFrame(
        data={
            'filename': tst_local_df['filename'].values,
            'class': tst_local_df['class'].values
        })
    tst_local_df_2 = pd.DataFrame(
        data={
            'filename': tst_local_df['filename'].values,
            'class': tst_local_df['height'].values
        })

    trn_local_df_1 = pd.DataFrame(
        data={
            'filename': trn_local_df['filename'].values,
            'class': trn_local_df['class'].values
        })
    trn_local_df_2 = pd.DataFrame(
        data={
            'filename': trn_local_df['filename'].values,
            'class': trn_local_df['height'].values
        })

    trn_flow_1_local, val_flow_1_local = get_training_and_validation_flow(
        args, trn_local_df_1, class_mode="categorical", split_size=0.10)
    trn_flow_2_local, val_flow_2_local = get_training_and_validation_flow(
        args, trn_local_df_2, split_size=0.10)

    tst_flow_1_local = create_flow(args,
                                   tst_local_df_1,
                                   batch_size=1,
                                   shuffle=False)
    tst_flow_2_local = create_flow(args,
                                   tst_local_df_2,
                                   batch_size=1,
                                   shuffle=False)

    trn_flow_local = merge_output_generators(trn_flow_1_local,
                                             trn_flow_2_local)
    val_flow_local = merge_output_generators(val_flow_1_local,
                                             val_flow_2_local)
    tst_flow_local = merge_output_generators(tst_flow_1_local,
                                             tst_flow_2_local)

    model_local = train_or_load_model(args,
                                      trn_flow_local,
                                      val_flow_local,
                                      second_branch_path,
                                      trn_flow_2_local.n,
                                      val_flow_2_local.n,
                                      branch="local")
    y_pred_prob = model_local.predict_generator(generator=tst_flow_local,
                                                verbose=1,
                                                steps=tst_flow_2_local.n)[1]
    y_pred_prob, y_pred, y_test = calculate_prediction(args, y_pred_prob,
                                                       trn_flow_2_local,
                                                       tst_local_df_2)
    metrics_dict = accuracy_precision_recall_fscore(
        args, y_test, y_pred, y_test2=tst_local_df_1['class'].values)

    print("Local branch results.")
    print_results(args, metrics_dict)
    calculate_accuracy_per_class(args, y_test, y_pred)

    trn_flow_merged = merge_all_generators(trn_flow_1_global, trn_flow_2_local)
    val_flow_merged = merge_all_generators(val_flow_1_global, val_flow_2_local)
    tst_flow_merged = merge_all_generators(tst_flow_1_global, tst_flow_2_local)

    models = {"model_global": model_global, "model_local": model_local}
    model = train_or_load_model(args,
                                trn_flow_merged,
                                val_flow_merged,
                                all_network_path,
                                trn_flow_1_local.n,
                                val_flow_1_local.n,
                                branches_models=models)

    y_pred_prob = model.predict_generator(generator=tst_flow_merged,
                                          verbose=1,
                                          steps=tst_flow_1_local.n)[1]
    y_pred_prob, y_pred, y_test = calculate_prediction(args, y_pred_prob,
                                                       trn_flow_1_global,
                                                       tst_df_2_global)
    metrics_dict = accuracy_precision_recall_fscore(
        args, y_test, y_pred, y_test2=tst_df_1_global['class'].values)

    print("Fused model results.")
    print_results(args, metrics_dict)
    print_classifications(args, tst_flow_1_global.filenames, test_df, y_pred)
    calculate_accuracy_per_class(args, y_test, y_pred)
示例#6
0
def train_test_dense_net_split_regression(args):
    filepath = check_path("weights/{}_split/weights.hdf5".format(
        args['dataset']))

    train_df = get_train_dataset_info(args['dataset'])
    test_df = get_test_dataset_info(args['dataset'])

    trn_df_1 = pd.DataFrame(data={
        'filename': train_df['filename'].values,
        'class': train_df['class'].values
    })
    trn_df_2 = pd.DataFrame(
        data={
            'filename': train_df['filename'].values,
            'class': train_df['height'].values
        })

    test_data_frame_1 = pd.DataFrame(data={
        'filename': test_df['filename'].values,
        'class': test_df['class'].values
    })
    test_data_frame_2 = pd.DataFrame(data={
        'filename': test_df['filename'].values,
        'class': test_df['height'].values
    })

    trn_flow_1, val_flow_1 = get_training_and_validation_flow(
        args, trn_df_1, class_mode="categorical", split_size=0.10)
    trn_flow_2, val_flow_2 = get_training_and_validation_flow(args,
                                                              trn_df_2,
                                                              split_size=0.10)

    tst_flow_1 = create_flow(args,
                             test_data_frame_1,
                             batch_size=1,
                             shuffle=False)
    tst_flow_2 = create_flow(args,
                             test_data_frame_2,
                             batch_size=1,
                             shuffle=False)

    trn_flow = merge_output_generators(trn_flow_1, trn_flow_2)
    val_flow = merge_output_generators(val_flow_1, val_flow_2)
    tst_flow = merge_output_generators(tst_flow_1, tst_flow_2)

    model = train_or_load_model(args,
                                trn_flow,
                                val_flow,
                                filepath,
                                trn_flow_1.n,
                                val_flow_1.n,
                                branch="global")
    y_pred_prob = model.predict_generator(generator=tst_flow,
                                          verbose=1,
                                          steps=tst_flow_1.n)[1]
    y_pred_prob, y_pred, y_test = calculate_prediction(args, y_pred_prob,
                                                       trn_flow,
                                                       test_data_frame_2)

    metrics_dict = accuracy_precision_recall_fscore(
        args, y_test, y_pred, y_test2=test_data_frame_1['class'].values)
    print_classifications(args, tst_flow_1.filenames, test_data_frame_2,
                          y_pred)
    print_results(args, metrics_dict)