Spaces:
Running
Running
# Copyright (c) 2018-present, Facebook, Inc. | |
# All rights reserved. | |
# | |
# This source code is licensed under the license found in the | |
# LICENSE file in the root directory of this source tree. | |
# | |
import h5py | |
import numpy as np | |
mpii_metadata = { | |
'layout_name': 'mpii', | |
'num_joints': 16, | |
'keypoints_symmetry': [ | |
[3, 4, 5, 13, 14, 15], | |
[0, 1, 2, 10, 11, 12], | |
] | |
} | |
coco_metadata = { | |
'layout_name': 'coco', | |
'num_joints': 17, | |
'keypoints_symmetry': [ | |
[1, 3, 5, 7, 9, 11, 13, 15], | |
[2, 4, 6, 8, 10, 12, 14, 16], | |
] | |
} | |
h36m_metadata = { | |
'layout_name': 'h36m', | |
'num_joints': 17, | |
'keypoints_symmetry': [ | |
[4, 5, 6, 11, 12, 13], | |
[1, 2, 3, 14, 15, 16], | |
] | |
} | |
humaneva15_metadata = { | |
'layout_name': 'humaneva15', | |
'num_joints': 15, | |
'keypoints_symmetry': [ | |
[2, 3, 4, 8, 9, 10], | |
[5, 6, 7, 11, 12, 13] | |
] | |
} | |
humaneva20_metadata = { | |
'layout_name': 'humaneva20', | |
'num_joints': 20, | |
'keypoints_symmetry': [ | |
[3, 4, 5, 6, 11, 12, 13, 14], | |
[7, 8, 9, 10, 15, 16, 17, 18] | |
] | |
} | |
def suggest_metadata(name): | |
names = [] | |
for metadata in [mpii_metadata, coco_metadata, h36m_metadata, humaneva15_metadata, humaneva20_metadata]: | |
if metadata['layout_name'] in name: | |
return metadata | |
names.append(metadata['layout_name']) | |
raise KeyError('Cannot infer keypoint layout from name "{}". Tried {}.'.format(name, names)) | |
def import_detectron_poses(path): | |
# Latin1 encoding because Detectron runs on Python 2.7 | |
data = np.load(path, encoding='latin1') | |
kp = data['keypoints'] | |
bb = data['boxes'] | |
results = [] | |
for i in range(len(bb)): | |
if len(bb[i][1]) == 0: | |
assert i > 0 | |
# Use last pose in case of detection failure | |
results.append(results[-1]) | |
continue | |
best_match = np.argmax(bb[i][1][:, 4]) | |
# import ipdb;ipdb.set_trace() | |
keypoints = kp[i][1][best_match].T.copy() | |
results.append(keypoints) | |
results = np.array(results) | |
# return results[:, :, 4:6] # Soft-argmax | |
return results[:, :, [0, 1, 3]] # Argmax + score | |
def my_pose(path): | |
data = np.load(path, encoding='latin1') | |
def import_cpn_poses(path): | |
data = np.load(path) | |
kp = data['keypoints'] | |
return kp[:, :, :2] | |
def import_sh_poses(path): | |
with h5py.File(path) as hf: | |
positions = hf['poses'].value | |
return positions.astype('float32') | |
def suggest_pose_importer(name): | |
if 'detectron' in name: | |
return import_detectron_poses | |
if 'cpn' in name: | |
return import_cpn_poses | |
if 'sh' in name: | |
return import_sh_poses | |
raise KeyError('Cannot infer keypoint format from name "{}". Tried detectron, cpn, sh.'.format(name)) | |