myTest01 / feature_extraction /process_motions.py
meng2003's picture
Upload 357 files
2d5fdd1
import numpy as np
# import librosa
from pathlib import Path
import json
import os.path
import sys
import argparse
import pickle
import torch
THIS_DIR = os.path.dirname(os.path.abspath(__file__))
ROOT_DIR = os.path.abspath(os.path.join(THIS_DIR, os.pardir))
DATA_DIR = os.path.join(ROOT_DIR, 'data')
sys.path.append(ROOT_DIR)
from utils import distribute_tasks
from analysis.pymo.parsers import BVHParser
from analysis.pymo.data import Joint, MocapData
from analysis.pymo.preprocessing import *
from sklearn.pipeline import Pipeline
import joblib as jl
parser = argparse.ArgumentParser(description="Preprocess motion data")
parser.add_argument("data_path", type=str, help="Directory contining Beat Saber level folders")
parser.add_argument("--param", type=str, default="expmap", help="expmap, position")
parser.add_argument("--replace_existing", action="store_true")
parser.add_argument("--do_mirror", action="store_true", help="whether to augment the data with mirrored motion")
parser.add_argument("--fps", type=int, default=60)
args = parser.parse_args()
# makes arugments into global variables of the same name, used later in the code
globals().update(vars(args))
data_path = Path(data_path)
## distributing tasks accross nodes ##
from mpi4py import MPI
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()
print(rank)
p = BVHParser()
if do_mirror:
data_pipe = Pipeline([
('dwnsampl', DownSampler(tgt_fps=fps, keep_all=False)),
('mir', Mirror(axis='X', append=True)),
('root', RootTransformer('pos_rot_deltas')),
# ('jtsel', JointSelector(['Spine', 'Spine1', 'Spine2', 'Neck', 'Head', 'RightShoulder', 'RightArm', 'RightForeArm', 'RightHand', 'LeftShoulder', 'LeftArm', 'LeftForeArm', 'LeftHand', 'RightUpLeg', 'RightLeg', 'RightFoot', 'RightToeBase', 'LeftUpLeg', 'LeftLeg', 'LeftFoot', 'LeftToeBase'], include_root=True)),
('jtsel', JointSelector(['Spine', 'Spine1', 'Neck', 'Head', 'RightShoulder', 'RightArm', 'RightForeArm', 'RightHand', 'LeftShoulder', 'LeftArm', 'LeftForeArm', 'LeftHand', 'RightUpLeg', 'RightLeg', 'RightFoot', 'RightToeBase', 'LeftUpLeg', 'LeftLeg', 'LeftFoot', 'LeftToeBase'], include_root=True)),
(param, MocapParameterizer(param)),
('cnst', ConstantsRemover(only_cols=["Hips_Xposition", "Hips_Zposition"])),
('np', Numpyfier())
])
else:
data_pipe = Pipeline([
('dwnsampl', DownSampler(tgt_fps=fps, keep_all=False)),
('root', RootTransformer('pos_rot_deltas')),
# ('mir', Mirror(axis='X', append=True)),
# ('jtsel', JointSelector(['Spine', 'Spine1', 'Spine2', 'Neck', 'Head', 'RightShoulder', 'RightArm', 'RightForeArm', 'RightHand', 'LeftShoulder', 'LeftArm', 'LeftForeArm', 'LeftHand', 'RightUpLeg', 'RightLeg', 'RightFoot', 'RightToeBase', 'LeftUpLeg', 'LeftLeg', 'LeftFoot', 'LeftToeBase'], include_root=True)),
('jtsel', JointSelector(['Spine', 'Spine1', 'Neck', 'Head', 'RightShoulder', 'RightArm', 'RightForeArm', 'RightHand', 'LeftShoulder', 'LeftArm', 'LeftForeArm', 'LeftHand', 'RightUpLeg', 'RightLeg', 'RightFoot', 'RightToeBase', 'LeftUpLeg', 'LeftLeg', 'LeftFoot', 'LeftToeBase'], include_root=True)),
(param, MocapParameterizer(param)),
('cnst', ConstantsRemover(only_cols=["Hips_Xposition", "Hips_Zposition"])),
('np', Numpyfier())
])
def extract_joint_angles(files):
if len(files)>0:
data_all = list()
for f in files:
data_all.append(p.parse(f))
out_data = data_pipe.fit_transform(data_all)
if do_mirror:
# NOTE: the datapipe will append the mirrored files to the end
assert len(out_data) == 2*len(files)
else:
assert len(out_data) == len(files)
if rank == 0:
jl.dump(data_pipe, os.path.join(data_path, 'motion_'+param+'_data_pipe.sav'))
fi=0
if do_mirror:
for f in files:
features_file = f + "_"+param+".npy"
if replace_existing or not os.path.isfile(features_file):
np.save(features_file, out_data[fi])
features_file_mirror = f[:-4]+"_mirrored" + ".bvh_"+param+".npy"
if replace_existing or not os.path.isfile(features_file_mirror):
np.save(features_file_mirror, out_data[len(files)+fi])
fi=fi+1
else:
for f in files:
features_file = f + "_"+param+".npy"
if replace_existing or not os.path.isfile(features_file):
np.save(features_file, out_data[fi])
fi=fi+1
candidate_motion_files = sorted(data_path.glob('**/*.bvh'), key=lambda path: path.parent.__str__())
#candidate_motion_files = candidate_motion_files[:32]
tasks = distribute_tasks(candidate_motion_files,rank,size)
files = [path.__str__() for i, path in enumerate(candidate_motion_files) if i in tasks]
extract_joint_angles(files)