| | |
| | |
| |
|
| | import argparse |
| | import json |
| | import numpy as np |
| | import os |
| | from collections import defaultdict |
| | import cv2 |
| | import tqdm |
| | from fvcore.common.file_io import PathManager |
| |
|
| | from detectron2.data import DatasetCatalog, MetadataCatalog |
| | from detectron2.structures import Boxes, BoxMode, Instances |
| | from detectron2.utils.logger import setup_logger |
| | from detectron2.utils.visualizer import Visualizer |
| |
|
| |
|
| | def create_instances(predictions, image_size): |
| | ret = Instances(image_size) |
| |
|
| | score = np.asarray([x["score"] for x in predictions]) |
| | chosen = (score > args.conf_threshold).nonzero()[0] |
| | score = score[chosen] |
| | bbox = np.asarray([predictions[i]["bbox"] for i in chosen]).reshape(-1, 4) |
| | bbox = BoxMode.convert(bbox, BoxMode.XYWH_ABS, BoxMode.XYXY_ABS) |
| |
|
| | labels = np.asarray([dataset_id_map(predictions[i]["category_id"]) for i in chosen]) |
| |
|
| | ret.scores = score |
| | ret.pred_boxes = Boxes(bbox) |
| | ret.pred_classes = labels |
| |
|
| | try: |
| | ret.pred_masks = [predictions[i]["segmentation"] for i in chosen] |
| | except KeyError: |
| | pass |
| | return ret |
| |
|
| |
|
| | if __name__ == "__main__": |
| | parser = argparse.ArgumentParser( |
| | description="A script that visualizes the json predictions from COCO or LVIS dataset." |
| | ) |
| | parser.add_argument("--input", required=True, help="JSON file produced by the model") |
| | parser.add_argument("--output", required=True, help="output directory") |
| | parser.add_argument("--dataset", help="name of the dataset", default="coco_2017_val") |
| | parser.add_argument("--conf-threshold", default=0.5, type=float, help="confidence threshold") |
| | args = parser.parse_args() |
| |
|
| | logger = setup_logger() |
| |
|
| | with PathManager.open(args.input, "r") as f: |
| | predictions = json.load(f) |
| |
|
| | pred_by_image = defaultdict(list) |
| | for p in predictions: |
| | pred_by_image[p["image_id"]].append(p) |
| |
|
| | dicts = list(DatasetCatalog.get(args.dataset)) |
| | metadata = MetadataCatalog.get(args.dataset) |
| | if hasattr(metadata, "thing_dataset_id_to_contiguous_id"): |
| |
|
| | def dataset_id_map(ds_id): |
| | return metadata.thing_dataset_id_to_contiguous_id[ds_id] |
| |
|
| | elif "lvis" in args.dataset: |
| | |
| | |
| | def dataset_id_map(ds_id): |
| | return ds_id - 1 |
| |
|
| | else: |
| | raise ValueError("Unsupported dataset: {}".format(args.dataset)) |
| |
|
| | os.makedirs(args.output, exist_ok=True) |
| |
|
| | for dic in tqdm.tqdm(dicts): |
| | img = cv2.imread(dic["file_name"], cv2.IMREAD_COLOR)[:, :, ::-1] |
| | basename = os.path.basename(dic["file_name"]) |
| |
|
| | predictions = create_instances(pred_by_image[dic["image_id"]], img.shape[:2]) |
| | vis = Visualizer(img, metadata) |
| | vis_pred = vis.draw_instance_predictions(predictions).get_image() |
| |
|
| | vis = Visualizer(img, metadata) |
| | vis_gt = vis.draw_dataset_dict(dic).get_image() |
| |
|
| | concat = np.concatenate((vis_pred, vis_gt), axis=1) |
| | cv2.imwrite(os.path.join(args.output, basename), concat[:, :, ::-1]) |
| |
|