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)
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