|
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/') |
|
|