|
from data import ABDataset |
|
from utils.common.data_record import read_json, write_json |
|
from PIL import Image |
|
import os |
|
from utils.common.file import ensure_dir |
|
import numpy as np |
|
from itertools import groupby |
|
from skimage import morphology, measure |
|
from PIL import Image |
|
from scipy import misc |
|
import tqdm |
|
from PIL import ImageFile |
|
ImageFile.LOAD_TRUNCATED_IMAGES = True |
|
import shutil |
|
|
|
|
|
def convert_det_dataset_to_det(coco_ann_json_path, data_dir, target_data_dir, min_img_size=224): |
|
|
|
coco_ann = read_json(coco_ann_json_path) |
|
|
|
img_id_to_path = {} |
|
for img in coco_ann['images']: |
|
img_id_to_path[img['id']] = os.path.join(data_dir, img['file_name']) |
|
|
|
classes_imgs_id_map = {} |
|
for ann in tqdm.tqdm(coco_ann['annotations'], total=len(coco_ann['annotations']), dynamic_ncols=True): |
|
img_id = ann['image_id'] |
|
img_path = img_id_to_path[img_id] |
|
img = Image.open(img_path) |
|
|
|
bbox = ann['bbox'] |
|
if bbox[2] < min_img_size or bbox[3] < min_img_size: |
|
continue |
|
|
|
bbox = [bbox[0], bbox[1], bbox[0] + bbox[2], bbox[1] + bbox[3]] |
|
|
|
class_idx = str(ann['category_id']) |
|
if class_idx not in classes_imgs_id_map.keys(): |
|
classes_imgs_id_map[class_idx] = 0 |
|
target_cropped_img_path = os.path.join(target_data_dir, class_idx, |
|
f'{classes_imgs_id_map[class_idx]}.{img_path.split(".")[-1]}') |
|
classes_imgs_id_map[class_idx] += 1 |
|
|
|
ensure_dir(target_cropped_img_path) |
|
img.crop(bbox).save(target_cropped_img_path) |
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
convert_det_dataset_to_det( |
|
coco_ann_json_path='/data/zql/datasets/coco2017/train2017/coco_ann.json', |
|
data_dir='/data/zql/datasets/coco2017/train2017', |
|
target_data_dir='/data/zql/datasets/coco2017_for_cls_task', |
|
min_img_size=224 |
|
) |