Spaces:
Sleeping
Sleeping
| import pandas as pd | |
| import numpy as np | |
| import torch | |
| from analysis.aistplusplus_api.convert_mat_to_euler import rot_mats_to_eulers | |
| import glob | |
| from mpl_toolkits.mplot3d import Axes3D | |
| import matplotlib.pyplot as plt | |
| %matplotlib | |
| import pickle | |
| # seqs = [x[:-1].split("_") for x in open("analysis/base_filenames.txt", "r").readlines()] | |
| seqs = [x[:-1] for x in open("analysis/base_filenames.txt", "r").readlines()] | |
| # seqs = [{"genre":x[0], "situation":x[1], "camera":x[2], "dancer":x[3], "musicId":x[4], "choreo":x[5]} for x in seqs] | |
| # | |
| # df = pd.DataFrame(seqs) | |
| data_dir="data/scaled_features/" | |
| # data = np.load(data_dir + seqs[10]+".joint_angles_scaled.npy") | |
| def get_scaling(seq_id): | |
| smpl_thing = pickle.load(open("../aistpp_data/aist_plusplus_final/motions/"+seq_id+".pkl", "rb")) | |
| smpl_poses = smpl_thing['smpl_poses'] | |
| smpl_scaling = smpl_thing['smpl_scaling'] | |
| smpl_trans = smpl_thing['smpl_trans'] | |
| return smpl_scaling[0] | |
| max_deriv = lambda seq: np.diff(np.load(data_dir + seq+".joint_angles_scaled.npy")).max() | |
| seqs = sorted(seqs, key=max_deriv) | |
| seqs2 = sorted(seqs, key=lambda seq: get_scaling(seq)) | |
| #%% | |
| seqs2[-35] | |
| get_scaling(seqs2[-35]) | |
| to_check_coz_big = [] | |
| with open("ones_to_check.txt", "a") as f: | |
| for seq in list(reversed(seqs2))[33:]: | |
| if get_scaling(seq) > 96: | |
| to_check_coz_big.append(seq) | |
| # seq = seq.split("_") | |
| # seq[2] = "c01" | |
| # seq = "_".join(seq) | |
| # f.writelines(seq+"\n") | |
| with open("ones_to_check2.txt", "w") as f: | |
| for seq in list(reversed(seqs))[14:]: | |
| if max_deriv(seq) > 20 and seq not in to_check_coz_big: | |
| seq = seq.split("_") | |
| seq[2] = "c01" | |
| seq = "_".join(seq) | |
| f.writelines(seq+"\n") | |
| np.diff(np.load(data_dir + seqs[-15]+".joint_angles_scaled.npy")).max() | |
| data = np.load(data_dir + seqs[-11]+".joint_angles_scaled.npy") | |
| #%% | |
| # with open("bad_ones.txt", "w") as f: | |
| # for seq in [x.split("/")[-1][:-4] for x in glob.glob("../aistplusplus_api/visualization/bad/*")]: | |
| # seq = seq.split("_") | |
| # seq[2] = "cAll" | |
| # seq = "_".join(seq) | |
| # f.writelines(seq+"\n") | |
| # f.writelines(seq+"\n") | |
| train_ones = [x[:-1] for x in open("analysis/aistpp_base_filenames_train_filtered.txt", "r").readlines()] | |
| bad_ones = [x[:-1] for x in open("analysis/aistpp_bad_ones.txt", "r").readlines()] | |
| with open("analysis/aistpp_base_filenames_train_filtered.txt", "w") as f: | |
| for line in train_ones: | |
| if line not in bad_ones: | |
| f.writelines(line+"\n") | |
| #%% | |
| # np.diff(data).max() | |
| plt.plot(np.diff(data[:900]).max(1)) | |
| # plt.plot(np.diff(data).mean(1)) | |
| #gHO_sFM_cAll_d20_mHO5_ch13 from 350 | |
| #gBR_sFM_cAll_d05_mBR4_ch13 up to 900 | |
| #gWA_sBM_cAll_d27_mWA4_ch08 except the end | |
| #%% | |
| # seqs.remove(max_diff_seq) | |
| max_diff = 0 | |
| max_diff_seq = "" | |
| for seq in seqs: | |
| data = np.load(data_dir + seq+".joint_angles_scaled.npy") | |
| diff = np.diff(data).max() | |
| if diff > max_diff: | |
| max_diff = diff | |
| max_diff_seq = seq | |
| max_diff | |
| max_diff_seq | |
| data = np.load(data_dir + max_diff_seq+".joint_angles_scaled.npy") | |
| #%% | |
| # | |
| # plt.ion() | |
| # plt.show() | |
| # for i in range(data.shape[1]): | |
| # plt.gca().clear() | |
| # plt.plot(data[:,i]) | |
| # plt.draw() | |
| # plt.pause(0.03) | |
| # | |
| # plt.plot(np.diff(data[:,0])) | |
| transform = pickle.load(open(data_dir+"/"+"pkl_joint_angles_mats_scaler"+'.pkl', "rb")) | |
| unscaled_data = transform.inverse_transform(data) | |
| unscaled_data.shape | |
| smpl_thing = rot_mats_to_eulers(np.expand_dims(unscaled_data, 1)) | |
| smpl_poses,smpl_scaling,smpl_trans = smpl_thing['smpl_poses'], smpl_thing['smpl_scaling'], smpl_thing['smpl_trans'] | |
| #%% | |
| import glob, os | |
| import pickle | |
| # for file in glob.glob("../aistpp_data/aist_plusplus_final/motions/*"): | |
| def get_scaling(seq_id): | |
| smpl_thing = pickle.load(open("../aistpp_data/aist_plusplus_final/motions/"+seq_id+".pkl", "rb")) | |
| smpl_poses = smpl_thing['smpl_poses'] | |
| smpl_scaling = smpl_thing['smpl_scaling'] | |
| smpl_trans = smpl_thing['smpl_trans'] | |
| return smpl_scaling[0] | |
| # smpl_thing['smpl_poses'], smpl_thing['smpl_scaling'], smpl_thing['smpl_trans'] = | |
| #%% | |
| from analysis.utils import run_bash_command | |
| from smplx import SMPL | |
| import os | |
| audio_file = "a" | |
| seq_id = "a" | |
| output_folder = "analysis/tmp" | |
| root_dir="analysis/tmp" | |
| def delete_images(): | |
| files = glob.glob(root_dir+'/img/*') | |
| for f in files: | |
| os.remove(f) | |
| smpl = SMPL(model_path="../aistplusplus_api", gender='MALE', batch_size=1) | |
| output = smpl.forward( | |
| global_orient=torch.from_numpy(smpl_poses[:, 0:1]).float(), | |
| body_pose=torch.from_numpy(smpl_poses[:, 1:]).float(), | |
| transl=torch.from_numpy(smpl_trans).float(), | |
| scaling=torch.from_numpy(smpl_scaling.reshape(1, 1)).float(), | |
| ) | |
| keypoints3d = output.joints.detach().numpy() | |
| keypoints3d = keypoints3d[:,:24] # the body joints (ignoring the extra head, feet and hand bones added onto it here https://github.com/vchoutas/smplx/blob/7547ee6656b942a68a97604d0cf7b6b834fad9eb/smplx/vertex_joint_selector.py) | |
| # that file takes the position of the vertices corresponding to certain joints | |
| # print(keypoints3d) | |
| # Plot as images | |
| delete_images() | |
| fig = plt.figure() | |
| plt.ion() | |
| plt.show() | |
| ax = Axes3D(fig) | |
| # print(keypoints3d.shape) | |
| # print(keypoints3d[0,:,2]) | |
| ax.scatter(keypoints3d[0,:,2], keypoints3d[0,:,0], keypoints3d[0,:,1]) | |
| plt.xlim([-100,100]) | |
| plt.ylim([-100,100]) | |
| ax.set_zlim([75,275]) | |
| ax.view_init(0, 0) | |
| plt.draw() | |
| plt.pause(0.001) | |
| for i in range(1,len(keypoints3d)): | |
| print(i) | |
| ax.clear() | |
| ax.scatter(keypoints3d[i,:,2], keypoints3d[i,:,0], keypoints3d[i,:,1]) | |
| plt.xlim([-100,100]) | |
| plt.ylim([-100,100]) | |
| ax.set_zlim([75,275]) | |
| ax.view_init(0, 0) | |
| plt.draw() | |
| plt.pause(0.001) | |
| plt.savefig(root_dir+"/img/img_"+str(i)+".png") | |
| video_file = output_folder+seq_id+".mp4" | |
| video_file2 = output_folder+seq_id+"_music.mp4" | |
| bash_command = "ffmpeg -y -r 60 -f image2 -s 1920x1080 -i "+root_dir+"/img/img_%d.png -vcodec libx264 -crf 25 -pix_fmt yuv420p "+video_file | |
| run_bash_command(bash_command) | |
| trim_audio=2 | |
| if audio_file is not None: | |
| new_audio_file = output_folder+seq_id+".mp3" | |
| bash_command = "ffprobe -v 0 -show_entries format=duration -of compact=p=0:nk=1 "+video_file | |
| duration = float(run_bash_command(bash_command)) | |
| bash_command = "ffmpeg -y -i "+audio_file+" -ss "+str(trim_audio)+" -t "+str(duration)+" "+new_audio_file | |
| run_bash_command(bash_command) | |
| bash_command = "ffmpeg -y -i "+video_file+" -i "+new_audio_file+" "+video_file2 | |
| run_bash_command(bash_command) | |