def visualize_from_png_path(refvg_split,
                            png_path,
                            out_path=None,
                            all_task_num=-1,
                            subset_task_num=0,
                            pred_plot=True,
                            gt_skip_exist=True,
                            verbose=True):
    if out_path is None:
        out_path = os.path.normpath(os.path.join(png_path, os.pardir))

    if pred_plot:
        plot_path = os.path.join(out_path, 'pred_plots')
        png_path_dict = None
    else:
        plot_path = None
        png_path_dict = {'prediction': png_path}

    fnames = os.listdir(png_path)
    if all_task_num < 0:
        all_task_num = len(fnames)

    visualizer = Visualizer(refvg_split=refvg_split,
                            png_path_dict=png_path_dict,
                            pred_plot_path=plot_path,
                            pred_skip_exist=True,
                            gt_skip_exist=gt_skip_exist,
                            all_task_num=all_task_num,
                            subset_task_num=subset_task_num)
    random.shuffle(fnames)
    for fname in fnames:
        if not fname.endswith('.png'):
            continue
        task_id = fname.split('.')[0]
        img_id = int(task_id.split('__')[0])
        if visualizer.task_is_needed(img_id, task_id):
            if not pred_plot:
                visualizer.plot_single_task(img_id, task_id, verbose=verbose)
            else:
                pred_mask = png_to_pred_mask(os.path.join(png_path, fname))
                visualizer.plot_single_task(img_id,
                                            task_id, {'pred_mask': pred_mask},
                                            pred_bin_tags=('pred_mask', ),
                                            verbose=verbose)
            if visualizer.is_enough_plots():
                break

    # generate html
    html_path = os.path.join(out_path, 'htmls')
    result_path = os.path.join(out_path, 'results.txt')
    if not os.path.exists(result_path):
        result_path = None
    visualizer.generate_html(html_path,
                             enable_subsets=subset_task_num > 0,
                             result_txt_path=result_path)
    return
def visualize_from_pred_dict(pred_eval_dict=None,
                             pred_eval_dict_path=None,
                             refvg_split=None,
                             out_path=None,
                             pred_bin_tags=None,
                             pred_score_tags=None,
                             pred_box_tags=None,
                             all_task_num=40,
                             subset_task_num=20,
                             gt_skip_exist=True,
                             pred_skip_exist=True,
                             verbose=True):
    if pred_eval_dict is None:
        predictions = np.load(pred_eval_dict_path, allow_pickle=True).item()
        assert isinstance(predictions, dict)
    else:
        predictions = pred_eval_dict

    # sample
    if subset_task_num > 0:
        subsets = subset_utils.subsets
    else:
        subsets = ['all']
    subset_dict = dict()
    for s in subsets:
        subset_dict[s] = list()

    for img_id, img_pred in predictions.items():
        for task_id, pred in img_pred.items():
            if 'subsets' in pred:
                for subset in pred['subsets']:
                    if subset in subset_dict:
                        subset_dict[subset].append((img_id, task_id))
            else:
                pred['subsets'] = ['all']
                subset_dict['all'].append((img_id, task_id))

    to_plot = list()
    for subset in subset_utils.subsets:
        if subset not in subset_dict:
            continue
        img_task_ids = subset_dict[subset]
        if subset == 'all':
            sample_num = all_task_num
        else:
            sample_num = subset_task_num
        if len(img_task_ids) > sample_num:
            img_task_ids = random.sample(img_task_ids, sample_num)
        to_plot += img_task_ids

    # plot
    visualizer = Visualizer(refvg_split=refvg_split,
                            pred_plot_path=os.path.join(
                                out_path, 'pred_plots'),
                            pred_skip_exist=pred_skip_exist,
                            gt_skip_exist=gt_skip_exist)
    for img_id, task_id in to_plot:
        visualizer.plot_single_task(img_id,
                                    task_id,
                                    predictions[img_id][task_id],
                                    pred_bin_tags=pred_bin_tags,
                                    pred_score_tags=pred_score_tags,
                                    pred_box_tags=pred_box_tags,
                                    verbose=verbose)

    # generate html
    html_path = os.path.join(out_path, 'htmls')
    result_path = os.path.join(out_path, 'results.txt')
    if not os.path.exists(result_path):
        result_path = None

    visualizer.generate_html(html_path,
                             enable_subsets=subset_task_num > 0,
                             result_txt_path=result_path)
    return