def visualize(model, model_path, nr_visualize=100, output_dir='output'): """ Visualize some intermediate results (proposals, raw predictions) inside the pipeline. """ df = get_train_dataflow() # we don't visualize mask stuff df.reset_state() pred = OfflinePredictor(PredictConfig( model=model, session_init=get_model_loader(model_path), input_names=['image', 'gt_boxes', 'gt_labels'], output_names=[ 'generate_{}_proposals/boxes'.format('fpn' if cfg.MODE_FPN else 'rpn'), 'generate_{}_proposals/scores'.format('fpn' if cfg.MODE_FPN else 'rpn'), 'fastrcnn_all_scores', 'output/boxes', 'output/scores', 'output/labels', ])) if os.path.isdir(output_dir): shutil.rmtree(output_dir) utils.fs.mkdir_p(output_dir) with tqdm.tqdm(total=nr_visualize) as pbar: for idx, dp in itertools.islice(enumerate(df), nr_visualize): img, gt_boxes, gt_labels = dp['image'], dp['gt_boxes'], dp['gt_labels'] rpn_boxes, rpn_scores, all_scores, \ final_boxes, final_scores, final_labels = pred(img, gt_boxes, gt_labels) # draw groundtruth boxes gt_viz = draw_annotation(img, gt_boxes, gt_labels) # draw best proposals for each groundtruth, to show recall proposal_viz, good_proposals_ind = draw_proposal_recall(img, rpn_boxes, rpn_scores, gt_boxes) # draw the scores for the above proposals score_viz = draw_predictions(img, rpn_boxes[good_proposals_ind], all_scores[good_proposals_ind]) results = [DetectionResult(*args) for args in zip(final_boxes, final_scores, final_labels, [None] * len(final_labels))] final_viz = draw_final_outputs(img, results) viz = tpviz.stack_patches([ gt_viz, proposal_viz, score_viz, final_viz], 2, 2) if os.environ.get('DISPLAY', None): tpviz.interactive_imshow(viz) cv2.imwrite("{}/{:03d}.png".format(output_dir, idx), viz) pbar.update()
def draw_outputs(img, final_boxes, final_scores, final_labels, threshold=0.8): """ Args: results: [DetectionResult] """ results = [DetectionResult(*args) for args in zip(final_boxes, final_scores, final_labels, [None] * len(final_labels)) if args[1]>threshold] if len(results) == 0: return img tags = [] for r in results: tags.append( "{},{:.2f}".format(cfg.DATA.CLASS_NAMES[r.class_id], r.score)) boxes = np.asarray([r.box for r in results]) ret = viz.draw_boxes(img, boxes, tags) for r in results: if r.mask is not None: ret = draw_mask(ret, r.mask) return ret
def do_sanity_check(pred_func, output_dir='/root/dentalpoc/logs/xxxxx', font_rs=10, thickness_rs=10): # num_tower = max(cfg.TRAIN.NUM_GPUS, 1) # graph_funcs = MultiTowerOfflinePredictor( # pred_config, list(range(num_tower))).get_predictors() os.makedirs(output_dir, exist_ok=True) for dataset in cfg.DATA.VAL: logger.info("sanity checking {} ...".format(dataset)) # dataflows = [ # get_eval_dataflow(dataset, shard=k, num_shards=num_tower, add_gt=True) # for k in range(num_tower)] # all_results = multithread_predict_dataflow(dataflows, graph_funcs) coco_format_detection = DatasetRegistry.get(dataset) coco_object = coco_format_detection.coco for _im_id, _img_dic in list(coco_object.imgs.items())[1:]: _img_path = _img_dic['path'] _img_seg_polygons = coco_object.imgToAnns[_im_id] detection_ground_truths = list( map( lambda x: DetectionResult( box=convert_box_mode_xywh_2_xyxy(x['bbox']), score=1.0, class_id=x['category_id'], mask=coco_object.annToMask(x)), _img_seg_polygons)) print("S======check") _predict_with_gt(pred_func=pred_func, input_file=_img_path, ground_truths=detection_ground_truths, output_dir=output_dir, font_rs=font_rs, thickness_rs=thickness_rs) xxx = 0