Download projects/gesture_recognition/parse_pose.py from niobures/mmaction2: direct link, hf CLI and curl.
- Browser
- Download file 5.61 kB
-
https://huggingface.co/niobures/mmaction2/resolve/main/projects/gesture_recognition/parse_pose.py
- Command line
-
hf download hf://niobures/mmaction2/projects/gesture_recognition/parse_pose.py
-
curl -L -o parse_pose.py https://huggingface.co/niobures/mmaction2/resolve/main/projects/gesture_recognition/parse_pose.py
5.61 kB
| # Copyright (c) OpenMMLab. All rights reserved. | |
| import argparse | |
| import json | |
| import os | |
| import numpy as np | |
| def parse_args(): | |
| parser = argparse.ArgumentParser( | |
| description='Convert and merge hand pose dataset to COCO style') | |
| parser.add_argument( | |
| '--data_root', | |
| type=str, | |
| default='./data/', | |
| help='the root to all involved datasets') | |
| parser.add_argument( | |
| '--out_anno_prefix', | |
| type=str, | |
| default='hand_det', | |
| help='the prefix of output annotation files') | |
| args = parser.parse_args() | |
| return args | |
| def get_data_root(path): | |
| path = path.split('/') | |
| index = path.index('annotations') - 1 | |
| root = path[index] | |
| if root == 'halpe': | |
| root = 'halpe/hico_20160224_det/images/train2015/' | |
| return root | |
| def parse_coco_style(file_path, anno_idx=0): | |
| with open(file_path) as f: | |
| contents = json.load(f) | |
| data_root = get_data_root(file_path) + '/' | |
| images = contents['images'] | |
| annos = contents['annotations'] | |
| images_out, annos_out = [], [] | |
| for img, anno in zip(images, annos): | |
| assert img['id'] == anno['image_id'] | |
| img_out = dict( | |
| file_name=data_root + img['file_name'], | |
| height=img['height'], | |
| width=img['width'], | |
| id=anno_idx) | |
| anno_out = dict( | |
| area=anno['area'], | |
| iscrowd=anno['iscrowd'], | |
| image_id=anno_idx, | |
| bbox=anno['bbox'], | |
| category_id=0, | |
| id=anno_idx) | |
| anno_idx += 1 | |
| images_out.append(img_out) | |
| annos_out.append(anno_out) | |
| return images_out, annos_out, anno_idx | |
| def parse_halpe(file_path, anno_idx): | |
| def get_bbox(keypoints): | |
| """Get bbox from keypoints.""" | |
| if len(keypoints) == 0: | |
| return [0, 0, 0, 0] | |
| x1, y1, _ = np.amin(keypoints, axis=0) | |
| x2, y2, _ = np.amax(keypoints, axis=0) | |
| w, h = x2 - x1, y2 - y1 | |
| return [x1, y1, w, h] | |
| with open(file_path) as f: | |
| contents = json.load(f) | |
| data_root = get_data_root(file_path) + '/' | |
| images = contents['images'] | |
| annos = contents['annotations'] | |
| images_out, annos_out = [], [] | |
| for img, anno in zip(images, annos): | |
| assert img['id'] == anno['image_id'] | |
| keypoints = np.array(anno['keypoints']).reshape(-1, 3) | |
| lefthand_kpts = keypoints[-42:-21, :] | |
| righthand_kpts = keypoints[-21:, :] | |
| left_mask = lefthand_kpts[:, 2] > 0 | |
| right_mask = righthand_kpts[:, 2] > 0 | |
| lefthand_box = get_bbox(lefthand_kpts[left_mask]) | |
| righthand_box = get_bbox(righthand_kpts[right_mask]) | |
| if max(lefthand_box) > 0: | |
| img_out = dict( | |
| file_name=data_root + img['file_name'], | |
| height=img['height'], | |
| width=img['width'], | |
| id=anno_idx) | |
| anno_out = dict( | |
| area=lefthand_box[2] * lefthand_box[3], | |
| iscrowd=anno['iscrowd'], | |
| image_id=anno_idx, | |
| bbox=lefthand_box, | |
| category_id=0, | |
| id=anno_idx) | |
| anno_idx += 1 | |
| images_out.append(img_out) | |
| annos_out.append(anno_out) | |
| if max(righthand_box) > 0: | |
| img_out = dict( | |
| file_name=data_root + img['file_name'], | |
| height=img['height'], | |
| width=img['width'], | |
| id=anno_idx) | |
| anno_out = dict( | |
| area=righthand_box[2] * righthand_box[3], | |
| iscrowd=anno['iscrowd'], | |
| image_id=anno_idx, | |
| bbox=righthand_box, | |
| category_id=0, | |
| id=anno_idx) | |
| anno_idx += 1 | |
| images_out.append(img_out) | |
| annos_out.append(anno_out) | |
| return images_out, annos_out, anno_idx | |
| train_files = [ | |
| 'freihand/annotations/freihand_train.json', | |
| 'halpe/annotations/halpe_train_v1.json', | |
| 'onehand10k/annotations/onehand10k_train.json', | |
| '/rhd/annotations/rhd_train.json' | |
| ] | |
| val_files = ['onehand10k/annotations/onehand10k_test.json'] | |
| def convert2dict(data_root, anno_files): | |
| anno_files = [data_root + _ for _ in anno_files] | |
| images, annos, anno_idx = [], [], 0 | |
| for anno_file in anno_files: | |
| if 'freihand' in anno_file or 'onehand10k' in anno_file \ | |
| or 'rhd' in anno_file: | |
| images_out, annos_out, anno_idx = parse_coco_style( | |
| anno_file, anno_idx) | |
| images += images_out | |
| annos += annos_out | |
| elif 'halpe' in anno_file: | |
| images_out, annos_out, anno_idx = parse_halpe(anno_file, anno_idx) | |
| images += images_out | |
| annos += annos_out | |
| else: | |
| print(f'{anno_file} not supported') | |
| result = dict( | |
| images=images, | |
| annotations=annos, | |
| categories=[{ | |
| 'id': 0, | |
| 'name': 'hand' | |
| }]) | |
| return result | |
| if __name__ == '__main__': | |
| args = parse_args() | |
| data_root = args.data_root + '/' | |
| prefix = args.out_anno_prefix | |
| os.makedirs('hand_det', exist_ok=True) | |
| result = convert2dict(data_root, train_files) | |
| with open(f'hand_det/{prefix}_train.json', 'w') as f: | |
| json.dump(result, f) | |
| result = convert2dict(data_root, val_files) | |
| with open(f'hand_det/{prefix}_val.json', 'w') as f: | |
| json.dump(result, f) | |