import argparse import os.path as osp import cv2 import matplotlib.pyplot as plt import numpy as np from matplotlib.collections import PatchCollection from matplotlib.patches import Polygon from pycocotools.coco import COCO def show_coco_json(args): if args.data_root is not None: coco = COCO(osp.join(args.data_root, args.ann_file)) else: coco = COCO(args.ann_file) print(f'Total number of images:{len(coco.getImgIds())}') categories = coco.loadCats(coco.getCatIds()) category_names = [category['name'] for category in categories] print(f'Total number of Categories : {len(category_names)}') print('Categories: \n{}\n'.format(' '.join(category_names))) if args.category_names is None: category_ids = [] else: assert set(category_names) > set(args.category_names) category_ids = coco.getCatIds(args.category_names) image_ids = coco.getImgIds(catIds=category_ids) if args.shuffle: np.random.shuffle(image_ids) for i in range(len(image_ids)): image_data = coco.loadImgs(image_ids[i])[0] if args.data_root is not None: image_path = osp.join(args.data_root, args.img_dir, image_data['file_name']) else: image_path = osp.join(args.img_dir, image_data['file_name']) annotation_ids = coco.getAnnIds( imgIds=image_data['id'], catIds=category_ids, iscrowd=0) annotations = coco.loadAnns(annotation_ids) image = cv2.imread(image_path) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) plt.figure() plt.imshow(image) if args.disp_all: coco.showAnns(annotations) else: show_bbox_only(coco, annotations) if args.wait_time == 0: plt.show() else: plt.show(block=False) plt.pause(args.wait_time) plt.close() def show_bbox_only(coco, anns, show_label_bbox=True, is_filling=True): """Show bounding box of annotations Only.""" if len(anns) == 0: return ax = plt.gca() ax.set_autoscale_on(False) image2color = dict() for cat in coco.getCatIds(): image2color[cat] = (np.random.random((1, 3)) * 0.7 + 0.3).tolist()[0] polygons = [] colors = [] for ann in anns: color = image2color[ann['category_id']] bbox_x, bbox_y, bbox_w, bbox_h = ann['bbox'] poly = [[bbox_x, bbox_y], [bbox_x, bbox_y + bbox_h], [bbox_x + bbox_w, bbox_y + bbox_h], [bbox_x + bbox_w, bbox_y]] polygons.append(Polygon(np.array(poly).reshape((4, 2)))) colors.append(color) if show_label_bbox: label_bbox = dict(facecolor=color) else: label_bbox = None ax.text( bbox_x, bbox_y, '%s' % (coco.loadCats(ann['category_id'])[0]['name']), color='white', bbox=label_bbox) if is_filling: p = PatchCollection( polygons, facecolor=colors, linewidths=0, alpha=0.4) ax.add_collection(p) p = PatchCollection( polygons, facecolor='none', edgecolors=colors, linewidths=2) ax.add_collection(p) def parse_args(): parser = argparse.ArgumentParser(description='Show coco json file') parser.add_argument('--data-root', default=None, help='dataset root') parser.add_argument( '--img-dir', default='data/coco/train2017', help='image folder path') parser.add_argument( '--ann-file', default='data/coco/annotations/instances_train2017.json', help='ann file path') parser.add_argument( '--wait-time', type=float, default=2, help='the interval of show (s)') parser.add_argument( '--disp-all', action='store_true', help='Whether to display all types of data, ' 'such as bbox and mask.' ' Default is to display only bbox') parser.add_argument( '--category-names', type=str, default=None, nargs='+', help='Display category-specific data, e.g., "bicycle", "person"') parser.add_argument( '--shuffle', action='store_true', help='Whether to display in disorder') args = parser.parse_args() return args def main(): args = parse_args() show_coco_json(args) if __name__ == '__main__': main()