| import argparse |
| import jsonlines |
| from tqdm import tqdm |
| import json |
| from pycocotools.coco import COCO |
|
|
| def dump_label_map(args): |
| coco = COCO(args.input) |
| cats = coco.loadCats(coco.getCatIds()) |
| nms = {cat['id']-1:cat['name'] for cat in cats} |
| with open(args.output,"w") as f: |
| json.dump(nms, f) |
|
|
| def coco_to_xyxy(bbox): |
| x, y, width, height = bbox |
| x1 = round(x, 2) |
| y1 = round(y, 2) |
| x2 = round(x + width, 2) |
| y2 = round(y + height, 2) |
| return [x1, y1, x2, y2] |
|
|
|
|
| def coco2odvg(args): |
| coco = COCO(args.input) |
| cats = coco.loadCats(coco.getCatIds()) |
| nms = {cat['id']:cat['name'] for cat in cats} |
| metas = [] |
| for img_id, img_info in tqdm(coco.imgs.items()): |
| ann_ids = coco.getAnnIds(imgIds=img_id) |
| instance_list = [] |
| for ann_id in ann_ids: |
| ann = coco.anns[ann_id] |
| bbox = ann['bbox'] |
| bbox_xyxy = coco_to_xyxy(bbox) |
| label = ann['category_id'] |
| category = nms[label] |
| instance_list.append({ |
| "bbox": bbox_xyxy, |
| "label": label - 1, |
| "category": category |
| } |
| ) |
| metas.append( |
| { |
| "filename": img_info["file_name"], |
| "height": img_info["height"], |
| "width": img_info["width"], |
| "detection": { |
| "instances": instance_list |
| } |
| } |
| ) |
| print(" == dump meta ...") |
| with jsonlines.open(args.output, mode="w") as writer: |
| writer.write_all(metas) |
| print(" == done.") |
|
|
|
|
| if __name__ == "__main__": |
| parser = argparse.ArgumentParser("coco to odvg format.", add_help=True) |
| parser.add_argument("--input", '-i', required=True, type=str, help="input list name") |
| parser.add_argument("--output", '-o', required=True, type=str, help="output list name") |
| parser.add_argument("--output_label_map", '-olm', action="store_true", help="output label map or not") |
| args = parser.parse_args() |
|
|
| if args.output_label_map: |
| dump_label_map(args) |
| else: |
| coco2odvg(args) |