123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- # Copyright (c) OpenMMLab. All rights reserved.
- import json
- import os
- import time
- import cv2
- import h5py
- import numpy as np
- np.random.seed(0)
- def save_coco_anno(keypoints_all,
- annotated_all,
- imgs_all,
- keypoints_info,
- skeleton_info,
- dataset,
- img_root,
- save_path,
- start_img_id=0,
- start_ann_id=0):
- """Save annotations in coco-format.
- :param keypoints_all: keypoint annotations.
- :param annotated_all: images annotated or not.
- :param imgs_all: the array of images.
- :param keypoints_info: information about keypoint name.
- :param skeleton_info: information about skeleton connection.
- :param dataset: information about dataset name.
- :param img_root: the path to save images.
- :param save_path: the path to save transformed annotation file.
- :param start_img_id: the starting point to count the image id.
- :param start_ann_id: the starting point to count the annotation id.
- """
- images = []
- annotations = []
- img_id = start_img_id
- ann_id = start_ann_id
- num_annotations, keypoints_num, _ = keypoints_all.shape
- for i in range(num_annotations):
- img = imgs_all[i]
- keypoints = np.concatenate(
- [keypoints_all[i], annotated_all[i][:, None] * 2], axis=1)
- min_x, min_y = np.min(keypoints[keypoints[:, 2] > 0, :2], axis=0)
- max_x, max_y = np.max(keypoints[keypoints[:, 2] > 0, :2], axis=0)
- anno = {}
- anno['keypoints'] = keypoints.reshape(-1).tolist()
- anno['image_id'] = img_id
- anno['id'] = ann_id
- anno['num_keypoints'] = int(sum(keypoints[:, 2] > 0))
- anno['bbox'] = [
- float(min_x),
- float(min_y),
- float(max_x - min_x + 1),
- float(max_y - min_y + 1)
- ]
- anno['iscrowd'] = 0
- anno['area'] = anno['bbox'][2] * anno['bbox'][3]
- anno['category_id'] = 1
- annotations.append(anno)
- ann_id += 1
- image = {}
- image['id'] = img_id
- image['file_name'] = f'{img_id}.jpg'
- image['height'] = img.shape[0]
- image['width'] = img.shape[1]
- images.append(image)
- img_id += 1
- cv2.imwrite(os.path.join(img_root, image['file_name']), img)
- skeleton = np.concatenate(
- [np.arange(keypoints_num)[:, None], skeleton_info[:, 0][:, None]],
- axis=1) + 1
- skeleton = skeleton[skeleton.min(axis=1) > 0]
- cocotype = {}
- cocotype['info'] = {}
- cocotype['info'][
- 'description'] = 'DeepPoseKit-Data Generated by MMPose Team'
- cocotype['info']['version'] = '1.0'
- cocotype['info']['year'] = time.strftime('%Y', time.localtime())
- cocotype['info']['date_created'] = time.strftime('%Y/%m/%d',
- time.localtime())
- cocotype['images'] = images
- cocotype['annotations'] = annotations
- cocotype['categories'] = [{
- 'supercategory': 'animal',
- 'id': 1,
- 'name': dataset,
- 'keypoints': keypoints_info,
- 'skeleton': skeleton.tolist()
- }]
- os.makedirs(os.path.dirname(save_path), exist_ok=True)
- json.dump(cocotype, open(save_path, 'w'), indent=4)
- print('number of images:', img_id)
- print('number of annotations:', ann_id)
- print(f'done {save_path}')
- for dataset in ['fly', 'locust', 'zebra']:
- keypoints_info = []
- if dataset == 'fly':
- keypoints_info = [
- 'head', 'eyeL', 'eyeR', 'neck', 'thorax', 'abdomen', 'forelegR1',
- 'forelegR2', 'forelegR3', 'forelegR4', 'midlegR1', 'midlegR2',
- 'midlegR3', 'midlegR4', 'hindlegR1', 'hindlegR2', 'hindlegR3',
- 'hindlegR4', 'forelegL1', 'forelegL2', 'forelegL3', 'forelegL4',
- 'midlegL1', 'midlegL2', 'midlegL3', 'midlegL4', 'hindlegL1',
- 'hindlegL2', 'hindlegL3', 'hindlegL4', 'wingL', 'wingR'
- ]
- elif dataset == 'locust':
- keypoints_info = [
- 'head', 'neck', 'thorax', 'abdomen1', 'abdomen2', 'anttipL',
- 'antbaseL', 'eyeL', 'forelegL1', 'forelegL2', 'forelegL3',
- 'forelegL4', 'midlegL1', 'midlegL2', 'midlegL3', 'midlegL4',
- 'hindlegL1', 'hindlegL2', 'hindlegL3', 'hindlegL4', 'anttipR',
- 'antbaseR', 'eyeR', 'forelegR1', 'forelegR2', 'forelegR3',
- 'forelegR4', 'midlegR1', 'midlegR2', 'midlegR3', 'midlegR4',
- 'hindlegR1', 'hindlegR2', 'hindlegR3', 'hindlegR4'
- ]
- elif dataset == 'zebra':
- keypoints_info = [
- 'snout', 'head', 'neck', 'forelegL1', 'forelegR1', 'hindlegL1',
- 'hindlegR1', 'tailbase', 'tailtip'
- ]
- else:
- NotImplementedError()
- dataset_dir = f'data/DeepPoseKit-Data/datasets/{dataset}'
- with h5py.File(
- os.path.join(dataset_dir, 'annotation_data_release.h5'), 'r') as f:
- # List all groups
- annotations = np.array(f['annotations'])
- annotated = np.array(f['annotated'])
- images = np.array(f['images'])
- skeleton_info = np.array(f['skeleton'])
- annotation_num, kpt_num, _ = annotations.shape
- data_list = np.arange(0, annotation_num)
- np.random.shuffle(data_list)
- val_data_num = annotation_num // 10
- train_data_num = annotation_num - val_data_num
- train_list = data_list[0:train_data_num]
- val_list = data_list[train_data_num:]
- img_root = os.path.join(dataset_dir, 'images')
- os.makedirs(img_root, exist_ok=True)
- save_coco_anno(
- annotations[train_list], annotated[train_list], images[train_list],
- keypoints_info, skeleton_info, dataset, img_root,
- os.path.join(dataset_dir, 'annotations', f'{dataset}_train.json'))
- save_coco_anno(
- annotations[val_list],
- annotated[val_list],
- images[val_list],
- keypoints_info,
- skeleton_info,
- dataset,
- img_root,
- os.path.join(dataset_dir, 'annotations', f'{dataset}_test.json'),
- start_img_id=train_data_num,
- start_ann_id=train_data_num)
|