Beispiel #1
0
def xyz2qrel(xyz_path, out_path, part):
    """Convert xyz data to quaternion data (angle between bone and Z axis)
    Args:
        xyz_path: (str) directory of processed xyz data
        out_path: (str) directory to save converted quaternion data
        part: (str) 'train' or 'eval' 
    """
    q_data_path = os.path.join(out_path, '{}_data.npy'.format(part))
    q_label_path = os.path.join(out_path, '{}_label.pkl'.format(part))
    xyz_data_path = os.path.join(xyz_path, '{}_data.npy'.format(part))
    xyz_label_path = os.path.join(xyz_path, '{}_label.pkl'.format(part))
    if not os.path.exists(q_label_path):
        copyfile(xyz_label_path, q_label_path)
    # Read xyz data (num_samples, 3, num_frame, num_joint, max_body)
    xyz_data = np.load(xyz_data_path, mmap_mode='r')
    num_sample, _, max_frame, num_joint, max_body = xyz_data.shape
    # Get num_frame
    with open(q_label_path, 'rb') as f:
        _, _, num_frame = pickle.load(f)
    # Open memory to write
    fp = open_memmap(q_data_path,
                     dtype='float32',
                     mode='w+',
                     shape=(num_sample, 4, max_frame, num_joint, max_body))
    fp[:, 0, ...] = 1.
    # Convert xyz to quaternion and save
    sk = Skeleton(ntu_info.PARENTS)
    xyz = xyz_data.transpose(
        0, 2, 4, 1, 3)  # (num_samples, num_frame, max_body, 3, num_joint)
    for i in tqdm(range(num_sample), ascii=True):
        fp[i][:, :num_frame[i], :, :] = sk.xyz2qrel(
            xyz[i][:num_frame[i]]).transpose(
                2, 0, 3, 1)  # (num_samples, 4, num_frame, num_joint, max_body)
Beispiel #2
0
def random_rotate_fromXYZ(xin):
    from data.fpha import fpha_info
    from utils.skel_utils.skeleton import Skeleton
    sk = Skeleton(fpha_info.PARENTS)
    xin = np.array(xin)
    xin = xin.transpose(0, 2, 3, 1) # (B,F,J,3)
    xin = sk.xyz_rotate(xin).transpose(0,1,3,2) # (B,F,3,J)
    xin = torch.from_numpy(sk.xyz2qrel(xin)).float().permute(0,2,1,3).unsqueeze(-1) # (B,4,F,J,1)
    return xin