|
import argparse |
|
import jsonlines |
|
from tqdm import tqdm |
|
import json |
|
from pycocotools.coco import COCO |
|
|
|
|
|
|
|
|
|
|
|
id_map = {0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, 6: 7, 7: 8, 8: 9, 9: 10, 10: 11, 11: 13, 12: 14, 13: 15, 14: 16, 15: 17, 16: 18, 17: 19, 18: 20, 19: 21, 20: 22, 21: 23, 22: 24, 23: 25, 24: 27, 25: 28, 26: 31, 27: 32, 28: 33, 29: 34, 30: 35, 31: 36, 32: 37, 33: 38, 34: 39, 35: 40, 36: 41, 37: 42, 38: 43, 39: 44, 40: 46, 41: 47, 42: 48, 43: 49, 44: 50, 45: 51, 46: 52, 47: 53, 48: 54, 49: 55, 50: 56, 51: 57, 52: 58, 53: 59, 54: 60, 55: 61, 56: 62, 57: 63, 58: 64, 59: 65, 60: 67, 61: 70, 62: 72, 63: 73, 64: 74, 65: 75, 66: 76, 67: 77, 68: 78, 69: 79, 70: 80, 71: 81, 72: 82, 73: 84, 74: 85, 75: 86, 76: 87, 77: 88, 78: 89, 79: 90} |
|
key_list=list(id_map.keys()) |
|
val_list=list(id_map.values()) |
|
|
|
def dump_label_map(output="./out.json"): |
|
ori_map = {"1": "person", "2": "bicycle", "3": "car", "4": "motorcycle", "5": "airplane", "6": "bus", "7": "train", "8": "truck", "9": "boat", "10": "traffic light", "11": "fire hydrant", "13": "stop sign", "14": "parking meter", "15": "bench", "16": "bird", "17": "cat", "18": "dog", "19": "horse", "20": "sheep", "21": "cow", "22": "elephant", "23": "bear", "24": "zebra", "25": "giraffe", "27": "backpack", "28": "umbrella", "31": "handbag", "32": "tie", "33": "suitcase", "34": "frisbee", "35": "skis", "36": "snowboard", "37": "sports ball", "38": "kite", "39": "baseball bat", "40": "baseball glove", "41": "skateboard", "42": "surfboard", "43": "tennis racket", "44": "bottle", "46": "wine glass", "47": "cup", "48": "fork", "49": "knife", "50": "spoon", "51": "bowl", "52": "banana", "53": "apple", "54": "sandwich", "55": "orange", "56": "broccoli", "57": "carrot", "58": "hot dog", "59": "pizza", "60": "donut", "61": "cake", "62": "chair", "63": "couch", "64": "potted plant", "65": "bed", "67": "dining table", "70": "toilet", "72": "tv", "73": "laptop", "74": "mouse", "75": "remote", "76": "keyboard", "77": "cell phone", "78": "microwave", "79": "oven", "80": "toaster", "81": "sink", "82": "refrigerator", "84": "book", "85": "clock", "86": "vase", "87": "scissors", "88": "teddy bear", "89": "hair drier", "90": "toothbrush"} |
|
new_map = {} |
|
for key, value in ori_map.items(): |
|
label = int(key) |
|
ind=val_list.index(label) |
|
label_trans = key_list[ind] |
|
new_map[label_trans] = value |
|
with open(output,"w") as f: |
|
json.dump(new_map, 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] |
|
ind=val_list.index(label) |
|
label_trans = key_list[ind] |
|
instance_list.append({ |
|
"bbox": bbox_xyxy, |
|
"label": label_trans, |
|
"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") |
|
args = parser.parse_args() |
|
|
|
coco2odvg(args) |
|
|