2022-09-18 10:11:55 +08:00
|
|
|
|
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):
|
2022-11-22 10:51:42 +08:00
|
|
|
|
if args.data_root is not None:
|
|
|
|
|
coco = COCO(osp.join(args.data_root, args.ann_file))
|
|
|
|
|
else:
|
|
|
|
|
coco = COCO(args.ann_file)
|
2022-09-18 10:11:55 +08:00
|
|
|
|
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]
|
2022-11-22 10:51:42 +08:00
|
|
|
|
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'])
|
2022-09-18 10:11:55 +08:00
|
|
|
|
|
|
|
|
|
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')
|
2022-11-22 10:51:42 +08:00
|
|
|
|
parser.add_argument('--data-root', default=None, help='dataset root')
|
2022-09-18 10:11:55 +08:00
|
|
|
|
parser.add_argument(
|
2022-11-22 10:51:42 +08:00
|
|
|
|
'--img-dir', default='data/coco/train2017', help='image folder path')
|
2022-09-18 10:11:55 +08:00
|
|
|
|
parser.add_argument(
|
2022-11-22 10:51:42 +08:00
|
|
|
|
'--ann-file',
|
|
|
|
|
default='data/coco/annotations/instances_train2017.json',
|
2022-09-18 10:11:55 +08:00
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
2022-11-22 10:51:42 +08:00
|
|
|
|
def main():
|
2022-09-18 10:11:55 +08:00
|
|
|
|
args = parse_args()
|
|
|
|
|
show_coco_json(args)
|
2022-11-22 10:51:42 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
main()
|