예제 #1
0
def evaluate_user(user_name,
                  path_annots,
                  path_out,
                  path_dataset=None,
                  visual=False):
    """ evaluate single user statistic against consensus

    :param str user_name: annotator name
    :param str path_annots: path to the root of annotations
    :param str path_out: path for statistic and visualisation
    :param str path_dataset: path to image dataset
    :param bool visual: visualise also outputs
    :return int: processed items
    """
    tissue_sets = list_sub_folders(path_annots)
    path_visu = path_out if visual else None
    stats = []
    for p_set in tissue_sets:
        paths = list_sub_folders(p_set, '*_scale-*pc')
        user_names = [parse_path_user_scale(p)[0].lower() for p in paths]
        paths_lnds_user = [
            p for p, u in zip(paths, user_names) if u == user_name.lower()
        ]
        paths_lnds_refs = [
            p for p, u in zip(paths, user_names) if u != user_name.lower()
        ]
        if not paths_lnds_user or not paths_lnds_refs:
            continue
        for path_user in paths_lnds_user:
            stats += compute_statistic(path_user, paths_lnds_refs,
                                       path_dataset, path_visu)
    if not stats:
        logging.warning('no statistic collected')
        return 0

    df_stats = pd.DataFrame(stats)
    df_stats.set_index(['name_image_set', 'name_user', 'landmarks'],
                       inplace=True)
    path_csv = os.path.join(path_out, 'STATISTIC_%s.csv' % user_name)
    logging.debug('exporting CSV stat.: %s', path_csv)
    df_stats.to_csv(path_csv)
    df_stat_short = df_stats.describe().T[['count', 'mean', 'std', 'max']]
    logging.info('USER: %s \n%s \n %s' % (user_name, '=' * 10, df_stat_short))
    return len(df_stats)
def evaluate_user(user_name,
                  path_annots,
                  path_out,
                  path_dataset=None,
                  tp_consensus='mean',
                  visual=False):
    """ evaluate single user statistic against consensus

    :param str user_name: annotator name
    :param str path_annots: path to the root of annotations
    :param str tp_consensus: type of consensus landmarks
    :param str path_out: path for statistic and visualisation
    :param str path_dataset: path to image dataset
    :param bool visual: visualise also outputs
    :return int: processed items
    """
    tissue_sets = list_sub_folders(path_annots)
    path_visu = path_out if visual else None
    stats = []
    for p_set in tissue_sets:
        paths = list_sub_folders(p_set, '*_scale-*pc')
        user_names = [parse_path_user_scale(p)[0].lower() for p in paths]
        paths_lnds_user = [
            p for p, u in zip(paths, user_names) if u == user_name.lower()
        ]
        paths_lnds_refs = [
            p for p, u in zip(paths, user_names) if u != user_name.lower()
        ]
        if not paths_lnds_user or not paths_lnds_refs:
            continue
        for path_user in paths_lnds_user:
            stats += compute_statistic(path_user, paths_lnds_refs,
                                       tp_consensus, path_dataset, path_visu)
    if not stats:
        logging.warning('no statistic collected')
        return 0

    df_stats = pd.DataFrame(stats)
    return df_stats
def dataset_scale_landmarks(path_dataset, scales=SCALES, nb_jobs=NB_THREADS):
    """" scale whole dataset

    :param str path_dataset:
    :param [int] scales: selected output scales
    :param nb_jobs: run parallel jobs
    :return [int]:
    """
    list_sets = list_sub_folders(path_dataset)
    logging.info('Found sets: %i', len(list_sets))

    _wrap_scale = partial(scale_set_landmarks, scales=scales)
    counts = list(wrap_execute_parallel(
        _wrap_scale, sorted(list_sets), nb_jobs=nb_jobs, desc='scaling sets'))
    return counts
def dataset_generate_landmarks(path_annots, path_dataset,
                               nb_jobs=NB_THREADS):
    """ generate consensus landmarks in full scale (100%)

    :param str path_annots: path to folder with annotations
    :param str path_dataset: output dataset path
    :param nb_jobs: run parallel jobs
    :return [int]:
    """
    list_sets = list_sub_folders(path_annots)
    logging.info('Found sets: %i', len(list_sets))

    _wrap_lnds = partial(generate_consensus_landmarks, path_dataset=path_dataset)
    counts = list(wrap_execute_parallel(
        _wrap_lnds, sorted(list_sets), nb_jobs=nb_jobs, desc='consensus landmarks'))
    return counts
def generate_consensus_landmarks(path_set, path_dataset):
    """ generate consensus landmarks for a particular image/landmark set

    :param str path_set: path to the set with annotations
    :param str path_dataset: output dataset path (root)
    :return {str: int}:
    """
    path_annots = list_sub_folders(path_set, '*_scale-*pc')
    logging.debug('>> found annotations: %i', len(path_annots))

    dict_lnds, dict_lens = create_consensus_landmarks(path_annots)

    path_scale = os.path.join(path_dataset, os.path.basename(path_set),
                              TEMPLATE_FOLDER_SCALE % 100)
    create_folder_path(path_scale)
    for name in dict_lnds:
        dict_lnds[name].to_csv(os.path.join(path_scale, name))

    return {os.path.basename(path_set): dict_lens}