Spaces:
Runtime error
Runtime error
| # COCO categories for zero-shot setting | |
| # 65 categories in total, 48 base categories for training, 17 unseen categories are only used in testing | |
| # from http://ankan.umiacs.io/files/mscoco_seen_classes.json, http://ankan.umiacs.io/files/mscoco_unseen_classes.json | |
| # 17 class names in order, obtained from load_coco_json() function | |
| COCO_UNSEEN_CLS = ['airplane', 'bus', 'cat', 'dog', 'cow', 'elephant', 'umbrella', \ | |
| 'tie', 'snowboard', 'skateboard', 'cup', 'knife', 'cake', 'couch', 'keyboard', \ | |
| 'sink', 'scissors'] | |
| # 48 class names in order, obtained from load_coco_json() function | |
| COCO_SEEN_CLS = ['person', 'bicycle', 'car', 'motorcycle', 'train', 'truck', \ | |
| 'boat', 'bench', 'bird', 'horse', 'sheep', 'bear', 'zebra', 'giraffe', \ | |
| 'backpack', 'handbag', 'suitcase', 'frisbee', 'skis', 'kite', 'surfboard', \ | |
| 'bottle', 'fork', 'spoon', 'bowl', 'banana', 'apple', 'sandwich', 'orange', \ | |
| 'broccoli', 'carrot', 'pizza', 'donut', 'chair', 'bed', 'toilet', 'tv', \ | |
| 'laptop', 'mouse', 'remote', 'microwave', 'oven', 'toaster', \ | |
| 'refrigerator', 'book', 'clock', 'vase', 'toothbrush'] | |
| # 65 class names in order, obtained from load_coco_json() function | |
| COCO_OVD_ALL_CLS = ['person', 'bicycle', 'car', 'motorcycle', 'airplane', \ | |
| 'bus', 'train', 'truck', 'boat', 'bench', 'bird', 'cat', 'dog', 'horse', \ | |
| 'sheep', 'cow', 'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', \ | |
| 'handbag', 'tie', 'suitcase', 'frisbee', 'skis', 'snowboard', 'kite', 'skateboard', \ | |
| 'surfboard', 'bottle', 'cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', \ | |
| 'apple', 'sandwich', 'orange', 'broccoli', 'carrot', 'pizza', 'donut', 'cake', \ | |
| 'chair', 'couch', 'bed', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', \ | |
| 'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock', 'vase', \ | |
| 'scissors', 'toothbrush'] | |
| # 80 class names | |
| COCO_80_ALL_CLS = {1: 'person', | |
| 2: 'bicycle', | |
| 3: 'car', | |
| 4: 'motorcycle', | |
| 5: 'airplane', | |
| 6: 'bus', | |
| 7: 'train', | |
| 8: 'truck', | |
| 9: 'boat', | |
| 10: 'traffic light', | |
| 11: 'fire hydrant', | |
| 12: 'stop sign', | |
| 13: 'parking meter', | |
| 14: 'bench', | |
| 15: 'bird', | |
| 16: 'cat', | |
| 17: 'dog', | |
| 18: 'horse', | |
| 19: 'sheep', | |
| 20: 'cow', | |
| 21: 'elephant', | |
| 22: 'bear', | |
| 23: 'zebra', | |
| 24: 'giraffe', | |
| 25: 'backpack', | |
| 26: 'umbrella', | |
| 27: 'handbag', | |
| 28: 'tie', | |
| 29: 'suitcase', | |
| 30: 'frisbee', | |
| 31: 'skis', | |
| 32: 'snowboard', | |
| 33: 'sports ball', | |
| 34: 'kite', | |
| 35: 'baseball bat', | |
| 36: 'baseball glove', | |
| 37: 'skateboard', | |
| 38: 'surfboard', | |
| 39: 'tennis racket', | |
| 40: 'bottle', | |
| 41: 'wine glass', | |
| 42: 'cup', | |
| 43: 'fork', | |
| 44: 'knife', | |
| 45: 'spoon', | |
| 46: 'bowl', | |
| 47: 'banana', | |
| 48: 'apple', | |
| 49: 'sandwich', | |
| 50: 'orange', | |
| 51: 'broccoli', | |
| 52: 'carrot', | |
| 53: 'hot dog', | |
| 54: 'pizza', | |
| 55: 'donut', | |
| 56: 'cake', | |
| 57: 'chair', | |
| 58: 'couch', | |
| 59: 'potted plant', | |
| 60: 'bed', | |
| 61: 'dining table', | |
| 62: 'toilet', | |
| 63: 'tv', | |
| 64: 'laptop', | |
| 65: 'mouse', | |
| 66: 'remote', | |
| 67: 'keyboard', | |
| 68: 'cell phone', | |
| 69: 'microwave', | |
| 70: 'oven', | |
| 71: 'toaster', | |
| 72: 'sink', | |
| 73: 'refrigerator', | |
| 74: 'book', | |
| 75: 'clock', | |
| 76: 'vase', | |
| 77: 'scissors', | |
| 78: 'teddy bear', | |
| 79: 'hair drier', | |
| 80: 'toothbrush'} | |
| if __name__ == "__main__": | |
| # from https://github.com/alirezazareian/ovr-cnn/blob/master/ipynb/001.ipynb | |
| # Create zero-shot setting data split in COCO | |
| import json | |
| import ipdb | |
| with open('./datasets/coco/annotations/instances_train2017.json', 'r') as fin: | |
| coco_train_anno_all = json.load(fin) | |
| with open('./datasets/coco/annotations/instances_train2017.json', 'r') as fin: | |
| coco_train_anno_seen = json.load(fin) | |
| with open('./datasets/coco/annotations/instances_train2017.json', 'r') as fin: | |
| coco_train_anno_unseen = json.load(fin) | |
| with open('./datasets/coco/annotations/instances_val2017.json', 'r') as fin: | |
| coco_val_anno_all = json.load(fin) | |
| with open('./datasets/coco/annotations/instances_val2017.json', 'r') as fin: | |
| coco_val_anno_seen = json.load(fin) | |
| with open('./datasets/coco/annotations/instances_val2017.json', 'r') as fin: | |
| coco_val_anno_unseen = json.load(fin) | |
| labels_seen = COCO_SEEN_CLS | |
| labels_unseen = COCO_UNSEEN_CLS | |
| labels_all = [item['name'] for item in coco_val_anno_all['categories']] # 80 class names | |
| # len(labels_seen), len(labels_unseen) | |
| # set(labels_seen) - set(labels_all) | |
| # set(labels_unseen) - set(labels_all) | |
| class_id_to_split = {} # {1: 'seen', 2: 'seen', 3: 'seen', 4: 'seen', 5: 'unseen',...} | |
| class_name_to_split = {} # {'person': 'seen', 'bicycle': 'seen', 'car': 'seen', 'motorcycle': 'seen', 'airplane': 'unseen',...} | |
| for item in coco_val_anno_all['categories']: | |
| if item['name'] in labels_seen: | |
| class_id_to_split[item['id']] = 'seen' | |
| class_name_to_split[item['name']] = 'seen' | |
| elif item['name'] in labels_unseen: | |
| class_id_to_split[item['id']] = 'unseen' | |
| class_name_to_split[item['name']] = 'unseen' | |
| # class_name_to_emb = {} | |
| # with open('../datasets/coco/zero-shot/glove.6B.300d.txt', 'r') as fin: | |
| # for row in fin: | |
| # row_tk = row.split() | |
| # if row_tk[0] in class_name_to_split: | |
| # class_name_to_emb[row_tk[0]] = [float(num) for num in row_tk[1:]] | |
| # len(class_name_to_emb), len(class_name_to_split) | |
| def filter_annotation(anno_dict, split_name_list): | |
| """ | |
| COCO annotations have fields: dict_keys(['info', 'licenses', 'images', 'annotations', 'categories']) | |
| This function (1) filters the category metadata (list) in 'categories'; | |
| (2) filter instance annotation in 'annotations'; (3) filter image metadata (list) in 'images | |
| """ | |
| filtered_categories = [] | |
| for item in anno_dict['categories']: | |
| if class_id_to_split.get(item['id']) in split_name_list: | |
| #item['embedding'] = class_name_to_emb[item['name']] | |
| item['split'] = class_id_to_split.get(item['id']) | |
| filtered_categories.append(item) | |
| anno_dict['categories'] = filtered_categories | |
| filtered_images = [] | |
| filtered_annotations = [] | |
| useful_image_ids = set() | |
| for item in anno_dict['annotations']: | |
| if class_id_to_split.get(item['category_id']) in split_name_list: | |
| filtered_annotations.append(item) | |
| useful_image_ids.add(item['image_id']) | |
| for item in anno_dict['images']: | |
| if item['id'] in useful_image_ids: | |
| filtered_images.append(item) | |
| anno_dict['annotations'] = filtered_annotations | |
| anno_dict['images'] = filtered_images | |
| filter_annotation(coco_train_anno_seen, ['seen']) | |
| filter_annotation(coco_train_anno_unseen, ['unseen']) | |
| filter_annotation(coco_train_anno_all, ['seen', 'unseen']) | |
| filter_annotation(coco_val_anno_seen, ['seen']) | |
| filter_annotation(coco_val_anno_unseen, ['unseen']) | |
| filter_annotation(coco_val_anno_all, ['seen', 'unseen']) | |
| with open('./datasets/coco/annotations/ovd_ins_train2017_b.json', 'w') as fout: | |
| json.dump(coco_train_anno_seen, fout) | |
| with open('./datasets/coco/annotations/ovd_ins_train2017_t.json', 'w') as fout: | |
| json.dump(coco_train_anno_unseen, fout) | |
| with open('./datasets/coco/annotations/ovd_ins_train2017_all.json', 'w') as fout: | |
| json.dump(coco_train_anno_all, fout) | |
| with open('./datasets/coco/annotations/ovd_ins_val2017_b.json', 'w') as fout: | |
| json.dump(coco_val_anno_seen, fout) | |
| with open('./datasets/coco/annotations/ovd_ins_val2017_t.json', 'w') as fout: | |
| json.dump(coco_val_anno_unseen, fout) | |
| with open('./datasets/coco/annotations/ovd_ins_val2017_all.json', 'w') as fout: | |
| json.dump(coco_val_anno_all, fout) |