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}