Spaces:
Running
Running
| import json | |
| import os | |
| import shutil | |
| import sys | |
| import numpy as np | |
| from xtcocotools.coco import COCO | |
| def search_match(bbox, num_keypoints, segmentation): | |
| found = [] | |
| checked = 0 | |
| for json_file, coco in COCO_DICT.items(): | |
| cat_ids = coco.getCatIds() | |
| for cat_id in cat_ids: | |
| img_ids = coco.getImgIds(catIds=cat_id) | |
| for img_id in img_ids: | |
| annotations = coco.loadAnns(coco.getAnnIds(imgIds=img_id, catIds=cat_id)) | |
| for ann in annotations: | |
| checked += 1 | |
| if (ann['num_keypoints'] == num_keypoints and ann['bbox'] == bbox and ann[ | |
| 'segmentation'] == segmentation): | |
| src_file = coco.loadImgs(img_id)[0]["file_name"] | |
| split = "test" if "test" in json_file else "train" | |
| found.append((src_file, ann, split)) | |
| # return src_file, ann, split | |
| if len(found) == 0: | |
| raise Exception("No match found out of {} images".format(checked)) | |
| elif len(found) > 1: | |
| raise Exception("More than one match! ".format(found)) | |
| return found[0] | |
| if __name__ == "__main__": | |
| carfusion_dir_path = sys.argv[1] | |
| mp100_dataset_path = sys.argv[2] | |
| os.makedirs('output', exist_ok=True) | |
| for cat in ['car', 'bus', 'suv']: | |
| os.makedirs(os.path.join('output', cat), exist_ok=True) | |
| COCO_DICT = {} | |
| ann_files = os.path.join(carfusion_dir_path, 'annotations') | |
| for json_file in os.listdir(ann_files): | |
| COCO_DICT[json_file] = COCO(os.path.join(carfusion_dir_path, 'annotations', json_file)) | |
| count = 0 | |
| print_log = [] | |
| for json_file in os.listdir(mp100_dataset_path): | |
| print("Processing {}".format(json_file)) | |
| cats = {} | |
| coco = COCO(os.path.join(mp100_dataset_path, json_file)) | |
| cat_ids = coco.getCatIds() | |
| for cat_id in cat_ids: | |
| category_info = coco.loadCats(cat_id) | |
| cat_name = category_info[0]['name'] | |
| if cat_name in ['car', 'bus', 'suv']: | |
| cats[cat_name] = cat_id | |
| for cat_name, cat_id in cats.items(): | |
| img_ids = coco.getImgIds(catIds=cat_id) | |
| count += len(img_ids) | |
| print_log.append(f'{json_file} : {cat_name}: {len(img_ids)}') | |
| for img_id in img_ids: | |
| img = coco.loadImgs(img_id)[0] | |
| dst_file_name = img['file_name'] | |
| annotation = coco.loadAnns(coco.getAnnIds(imgIds=img_id, catIds=cat_id, iscrowd=None)) | |
| bbox = annotation[0]['bbox'] | |
| keypoints = annotation[0]['keypoints'] | |
| segmentation = annotation[0]['segmentation'] | |
| num_keypoints = annotation[0]['num_keypoints'] | |
| # Search for a match: | |
| src_img, src_ann, split = search_match(bbox, num_keypoints, segmentation) | |
| shutil.copyfile( | |
| os.path.join(carfusion_dir_path, split, src_img), | |
| os.path.join('output', dst_file_name)) |