Spaces:
Runtime error
Runtime error
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) | |