import os.path as osp import mmcv import mmengine def convert_balloon_to_coco(ann_file, out_file, image_prefix): data_infos = mmengine.load(ann_file) annotations = [] images = [] obj_count = 0 for idx, v in enumerate(mmengine.track_iter_progress(data_infos.values())): filename = v['filename'] img_path = osp.join(image_prefix, filename) height, width = mmcv.imread(img_path).shape[:2] images.append( dict(id=idx, file_name=filename, height=height, width=width)) for _, obj in v['regions'].items(): assert not obj['region_attributes'] obj = obj['shape_attributes'] px = obj['all_points_x'] py = obj['all_points_y'] poly = [(x + 0.5, y + 0.5) for x, y in zip(px, py)] poly = [p for x in poly for p in x] x_min, y_min, x_max, y_max = (min(px), min(py), max(px), max(py)) data_anno = dict( image_id=idx, id=obj_count, category_id=0, bbox=[x_min, y_min, x_max - x_min, y_max - y_min], area=(x_max - x_min) * (y_max - y_min), segmentation=[poly], iscrowd=0) annotations.append(data_anno) obj_count += 1 coco_format_json = dict( images=images, annotations=annotations, categories=[{ 'id': 0, 'name': 'balloon' }]) mmengine.dump(coco_format_json, out_file) if __name__ == '__main__': convert_balloon_to_coco('data/balloon/train/via_region_data.json', 'data/balloon/train.json', 'data/balloon/train/') convert_balloon_to_coco('data/balloon/val/via_region_data.json', 'data/balloon/val.json', 'data/balloon/val/')