You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

visualize_data.py 3.7 kB

3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved
  2. import argparse
  3. import numpy as np
  4. import os
  5. from itertools import chain
  6. import cv2
  7. from PIL import Image
  8. from detectron2.config import get_cfg
  9. from detectron2.data import DatasetCatalog, MetadataCatalog, build_detection_train_loader
  10. from detectron2.data import detection_utils as utils
  11. from detectron2.data.build import filter_images_with_few_keypoints
  12. from detectron2.utils.logger import setup_logger
  13. from detectron2.utils.visualizer import Visualizer
  14. def setup(args):
  15. cfg = get_cfg()
  16. if args.config_file:
  17. cfg.merge_from_file(args.config_file)
  18. cfg.merge_from_list(args.opts)
  19. cfg.freeze()
  20. return cfg
  21. def parse_args(in_args=None):
  22. parser = argparse.ArgumentParser(description="Visualize ground-truth data")
  23. parser.add_argument(
  24. "--source",
  25. choices=["annotation", "dataloader"],
  26. required=True,
  27. help="visualize the annotations or the data loader (with pre-processing)",
  28. )
  29. parser.add_argument("--config-file", default="", metavar="FILE", help="path to config file")
  30. parser.add_argument("--output-dir", default="./", help="path to output directory")
  31. parser.add_argument("--show", action="store_true", help="show output in a window")
  32. parser.add_argument(
  33. "opts",
  34. help="Modify config options using the command-line",
  35. default=None,
  36. nargs=argparse.REMAINDER,
  37. )
  38. return parser.parse_args(in_args)
  39. if __name__ == "__main__":
  40. args = parse_args()
  41. logger = setup_logger()
  42. logger.info("Arguments: " + str(args))
  43. cfg = setup(args)
  44. dirname = args.output_dir
  45. os.makedirs(dirname, exist_ok=True)
  46. metadata = MetadataCatalog.get(cfg.DATASETS.TRAIN[0])
  47. def output(vis, fname):
  48. if args.show:
  49. print(fname)
  50. cv2.imshow("window", vis.get_image()[:, :, ::-1])
  51. cv2.waitKey()
  52. else:
  53. filepath = os.path.join(dirname, fname)
  54. print("Saving to {} ...".format(filepath))
  55. vis.save(filepath)
  56. scale = 2.0 if args.show else 1.0
  57. if args.source == "dataloader":
  58. train_data_loader = build_detection_train_loader(cfg)
  59. for batch in train_data_loader:
  60. for per_image in batch:
  61. # Pytorch tensor is in (C, H, W) format
  62. img = per_image["image"].permute(1, 2, 0)
  63. if cfg.INPUT.FORMAT == "BGR":
  64. img = img[:, :, [2, 1, 0]]
  65. else:
  66. img = np.asarray(Image.fromarray(img, mode=cfg.INPUT.FORMAT).convert("RGB"))
  67. visualizer = Visualizer(img, metadata=metadata, scale=scale)
  68. target_fields = per_image["instances"].get_fields()
  69. labels = [metadata.thing_classes[i] for i in target_fields["gt_classes"]]
  70. vis = visualizer.overlay_instances(
  71. labels=labels,
  72. boxes=target_fields.get("gt_boxes", None),
  73. masks=target_fields.get("gt_masks", None),
  74. keypoints=target_fields.get("gt_keypoints", None),
  75. )
  76. output(vis, str(per_image["image_id"]) + ".jpg")
  77. else:
  78. dicts = list(chain.from_iterable([DatasetCatalog.get(k) for k in cfg.DATASETS.TRAIN]))
  79. if cfg.MODEL.KEYPOINT_ON:
  80. dicts = filter_images_with_few_keypoints(dicts, 1)
  81. for dic in dicts:
  82. img = utils.read_image(dic["file_name"], "RGB")
  83. visualizer = Visualizer(img, metadata=metadata, scale=scale)
  84. vis = visualizer.draw_dataset_dict(dic)
  85. output(vis, os.path.basename(dic["file_name"]))

No Description