Пример #1
0
def calc_score(conf):

    dataset = ds.DatasetVilar(conf)
    dir_ = os.path.join(conf.dataOutDir, 'vilar')
    preds = np.asarray([
        dataset.get_pred_frame(f, dir_)
        for f in range(len(conf.frameFileNames))
    ]).transpose(1, 2, 0)
    gts = dataset.gt
    y_true = utls.make_y_array_true(gts, dataset.get_labels())
    y_pred = utls.make_y_array_true(preds, dataset.get_labels())
    f1_sp = f1_score(y_true[:, 2], y_pred[:, 2])
    f1_px = f1_score(gts.ravel(), preds.ravel())
    file_out = os.path.join(conf.dataOutDir, 'score.csv')

    C = pd.Index(['F1_sp', 'F1_px'], name="columns")
    data = np.asarray([f1_sp, f1_px]).reshape(1, 2)
    df = pd.DataFrame(data=data, columns=C)
    df.to_csv(path_or_buf=file_out)
Пример #2
0
def make_training_patches_and_fit(arg_cfg, out_dir=None):
    data = dict()

    # Update config
    cfg_dict = cfg.cfg()
    arg_cfg['seq_type'] = cfg.datasetdir_to_type(arg_cfg['ds_dir'])
    cfg_dict.update(arg_cfg)
    conf = cfg.Bunch(cfg_dict)
    conf.out_dir_prefix = 'exp_vilar'

    # Write config to result dir
    if (out_dir is None):
        if ('dataOutDir' not in arg_cfg):
            conf.dataOutDir = utls.getDataOutDir(conf.dataOutRoot, conf.ds_dir,
                                                 conf.resultDir,
                                                 conf.out_dir_prefix,
                                                 conf.testing)
    else:
        conf.dataOutDir = out_dir

    conf.myGaze_fg = utls.readCsv(
        os.path.join(conf.root_path, conf.ds_dir, conf.locs_dir,
                     conf.csvFileName_fg))

    # Set logger
    utls.setup_logging(conf.dataOutDir)

    logger = logging.getLogger('vilar')

    logger.info('---------------------------')
    logger.info('Extracting training a patches and fit on: ' + conf.ds_dir)
    logger.info('type of sequence: ' + conf.seq_type)
    logger.info('gaze filename: ' + conf.csvFileName_fg)
    logger.info('Result dir:')
    logger.info(conf.dataOutDir)
    logger.info('n_frames : ' + str(conf.vilar_n_frames))
    logger.info('(gamma,C) = (' + str(conf.gamma) + ', ' + str(conf.C) + ')')
    logger.info(conf.dataOutDir)
    logger.info('---------------------------')

    # Make frame file names
    gt_dir = os.path.join(conf.root_path, conf.ds_dir, conf.truth_dir)
    gtFileNames = utls.makeFrameFileNames(conf.frame_prefix, conf.frameDigits,
                                          conf.truth_dir, conf.root_path,
                                          conf.ds_dir, conf.frame_extension)

    conf.frameFileNames = utls.makeFrameFileNames(conf.frame_prefix,
                                                  conf.frameDigits,
                                                  conf.frameDir,
                                                  conf.root_path, conf.ds_dir,
                                                  conf.frame_extension)

    # conf.myGaze_fg = utls.readCsv(conf.csvName_fg)
    conf.myGaze_fg = utls.readCsv(
        os.path.join(conf.root_path, conf.ds_dir, conf.locs_dir,
                     conf.csvFileName_fg))

    # conf.myGaze_bg = utls.readCsv(conf.csvName_bg)
    gt_positives = utls.getPositives(gtFileNames)

    conf.precomp_desc_path = os.path.join(conf.dataOutRoot, conf.ds_dir,
                                          conf.feats_dir)

    my_dataset = ds.DatasetVilar(conf)

    with open(os.path.join(conf.dataOutDir, 'cfg.yml'), 'w') as outfile:
        yaml.dump(conf, outfile, default_flow_style=True)

    # Extract seen and unseen patches (to fit SVC)
    if (os.path.exists(
            os.path.join(conf.dataOutDir, 'vilar', 'vilar_seen_patches_df.p'))
            & os.path.exists(
                os.path.join(conf.dataOutDir, 'vilar',
                             'vilar_unseen_patches_df.p'))):
        logger.info('seen and unseen patches already computed. Skipping.')
    else:
        my_dataset.calc_training_patches(save=True)

    if (not os.path.exists(os.path.join(conf.dataOutDir, 'clf.p'))):

        my_dataset.load_patches()

        X_pos = df_to_mat(my_dataset.seen_patches_df)
        X_neg = df_to_mat(my_dataset.unseen_patches_df)
        X_train = np.concatenate((X_pos, X_neg))

        y_pos = np.ones(df_to_mat(my_dataset.seen_patches_df).shape[0])
        y_neg = np.zeros(df_to_mat(my_dataset.unseen_patches_df).shape[0])
        y_train = np.concatenate((y_pos, y_neg))

        clf = SVC(gamma=conf.gamma,
                  C=conf.C,
                  class_weight='balanced',
                  verbose=True)
        logger.info('fitting')
        clf.fit(X_train, y_train)
        with open(os.path.join(conf.dataOutDir, 'clf.p'), 'wb') as f:
            pk.dump(clf, f)
        logger.info('Saved classifier.')
    else:
        with open(os.path.join(conf.dataOutDir, 'clf.p'), 'rb') as f:
            clf = pk.load(f)

    return conf, clf
Пример #3
0
def main(conf, plot_fname='metrics.pdf', csv_fname='score.csv', logger=None):

    logger = logging.getLogger('plot_results_vilar')

    logger.info('--------')
    logger.info('Self-learning on: ' + conf.dataOutDir)
    logger.info('--------')

    if (not os.path.exists(os.path.join(conf.dataOutDir, 'metrics.npz'))):

        my_dataset = ds.DatasetVilar(conf)
        my_dataset.load_labels_if_not_exist()
        #l_dataset = learning_dataset.Dataset(conf)
        l_dataset = learning_dataset.LearningDataset(conf)

        logger.info('[1/4] Loading predicted frames... ')
        pred_frames = np.asarray([
            my_dataset.get_pred_frame(f)
            for f in range(len(conf.frameFileNames))
        ]).transpose(1, 2, 0)

        logger.info('[2/4] Extracting seeds... ')
        seeds = utls.make_y_array_true(pred_frames, my_dataset.labels)

        l_dataset.make_y_array_true(l_dataset.gt)
        seeds_true = l_dataset.y_true

        logger.info('[3/4] Calculating metrics... ')
        f1 = f1_score(seeds_true[:, 2], seeds[:, 2])
        logger.info('f1 score: ' + str(f1))

        logger.info('[4/4] Calculating maps... ')

        # Saving metrics
        data = dict()
        data['f1'] = f1
        data['seeds'] = seeds
        data['seeds_true'] = seeds_true

        np.savez(os.path.join(conf.dataOutDir, 'metrics.npz'), **data)

    else:
        logger.info('Loading metrics.npz...')
        metrics = np.load(os.path.join(conf.dataOutDir, 'metrics.npz'))
        f1 = metrics['f1']
        seeds = metrics['seeds']
        seeds_true = metrics['seeds_true']

        my_dataset = ds.DatasetVilar(conf)
        my_dataset.load_labels_if_not_exist()
        l_dataset = learning_dataset.LearningDataset(conf, pos_thr=0.5)

    csv_out = os.path.join(conf.dataOutDir, csv_fname)
    logger.info('Saving f1 scores to: ' + csv_fname)
    C = pd.Index(["F1"], name="columns")
    data = np.asarray(f1).reshape(1, 1)
    df = pd.DataFrame(data=data, columns=C)
    df.to_csv(path_or_buf=csv_out)

    # Plot all iterations of PM

    # Make plots
    logger.info('Saving frames...')
    gt = l_dataset.gt
    frame_dir = 'vilar_frames'
    frame_path = os.path.join(conf.dataOutDir, frame_dir)
    if (os.path.exists(frame_path)):
        logger.info('[!!!] Frame dir: ' + frame_path +
                    ' exists. Delete to rerun.')
    else:
        os.mkdir(frame_path)
        seeds_true = seeds_true[np.where(seeds_true[:, 2])[0], 0:2]
        seeds = seeds[np.where(seeds[:, 2])[0], 0:2]
        scores_true = utls.seeds_to_scores(my_dataset.labels, seeds_true)
        scores = utls.seeds_to_scores(my_dataset.labels, seeds)
        with progressbar.ProgressBar(maxval=len(conf.frameFileNames)) as bar:
            for f in range(len(conf.frameFileNames)):
                cont_gt = segmentation.find_boundaries(gt[..., f],
                                                       mode='thick')
                idx_cont_gt = np.where(cont_gt)
                im = utls.imread(conf.frameFileNames[f])
                im[idx_cont_gt[0], idx_cont_gt[1], :] = (255, 0, 0)
                im = gaze.drawGazePoint(conf.myGaze_fg, f, im, radius=7)
                pred_frame = my_dataset.get_pred_frame(f)

                bar.update(f)
                plt.subplot(321)
                plt.imshow(scores_true[..., f])
                plt.title('True')
                plt.subplot(322)
                plt.imshow(scores[..., f])
                plt.title('Vilarino')
                plt.subplot(323)
                plt.imshow(im)
                plt.title('image')
                plt.subplot(324)
                plt.imshow(pred_frame)
                plt.title('pixel prediction')
                plt.suptitle('frame: ' + str(f))
                plt.savefig(os.path.join(frame_path, 'f_' + str(f) + '.png'),
                            dpi=200)