gene-hoi-denoising / utils /common_tests.py
meow
init
d6d3a5b
# import tensorflow_probability as tfp
import numpy as np
import torch.nn as nn
# import layer_utils
import torch
# import data_utils_torch as data_utils
import math ##
import pickle
import os
import utils.model_util as model_util
import time
class DMTet:
def __init__(self): # triangle_table -> the triangle table #
self.triangle_table = torch.tensor([
[-1, -1, -1, -1, -1, -1],
[ 1, 0, 2, -1, -1, -1],
[ 4, 0, 3, -1, -1, -1],
[ 1, 4, 2, 1, 3, 4],
[ 3, 1, 5, -1, -1, -1],
[ 2, 3, 0, 2, 5, 3],
[ 1, 4, 0, 1, 5, 4],
[ 4, 2, 5, -1, -1, -1],
[ 4, 5, 2, -1, -1, -1],
[ 4, 1, 0, 4, 5, 1],
[ 3, 2, 0, 3, 5, 2],
[ 1, 3, 5, -1, -1, -1],
[ 4, 1, 2, 4, 3, 1],
[ 3, 0, 4, -1, -1, -1],
[ 2, 0, 1, -1, -1, -1],
[-1, -1, -1, -1, -1, -1]
], dtype=torch.long, device='cuda')
# triangles table; # base tet edges #
self.num_triangles_table = torch.tensor([0,1,1,2,1,2,2,1,1,2,2,1,2,1,1,0], dtype=torch.long, device='cuda')
self.base_tet_edges = torch.tensor([0,1,0,2,0,3,1,2,1,3,2,3], dtype=torch.long, device='cuda')
###############################################################################
# Utility functions
###############################################################################
# sorted edges #
def sort_edges(self, edges_ex2):
with torch.no_grad():
order = (edges_ex2[:,0] > edges_ex2[:,1]).long()
order = order.unsqueeze(dim=1)
a = torch.gather(input=edges_ex2, index=order, dim=1)
b = torch.gather(input=edges_ex2, index=1-order, dim=1)
return torch.stack([a, b],-1)
def map_uv(self, faces, face_gidx, max_idx):
N = int(np.ceil(np.sqrt((max_idx+1)//2)))
tex_y, tex_x = torch.meshgrid(
torch.linspace(0, 1 - (1 / N), N, dtype=torch.float32, device="cuda"),
torch.linspace(0, 1 - (1 / N), N, dtype=torch.float32, device="cuda"),
indexing='ij'
)
pad = 0.9 / N
uvs = torch.stack([
tex_x , tex_y,
tex_x + pad, tex_y,
tex_x + pad, tex_y + pad,
tex_x , tex_y + pad
], dim=-1).view(-1, 2)
def _idx(tet_idx, N):
x = tet_idx % N
y = torch.div(tet_idx, N, rounding_mode='trunc')
return y * N + x
tet_idx = _idx(torch.div(face_gidx, 2, rounding_mode='trunc'), N)
tri_idx = face_gidx % 2
uv_idx = torch.stack((
tet_idx * 4, tet_idx * 4 + tri_idx + 1, tet_idx * 4 + tri_idx + 2
), dim = -1). view(-1, 3)
return uvs, uv_idx
###############################################################################
# Marching tets implementation
###############################################################################
def __call__(self, pos_nx3, sdf_n, tet_fx4): # po
with torch.no_grad():
occ_n = sdf_n > 0
occ_fx4 = occ_n[tet_fx4.reshape(-1)].reshape(-1,4)
occ_sum = torch.sum(occ_fx4, -1)
valid_tets = (occ_sum>0) & (occ_sum<4)
occ_sum = occ_sum[valid_tets]
# find all vertices
all_edges = tet_fx4[valid_tets][:,self.base_tet_edges].reshape(-1,2)
all_edges = self.sort_edges(all_edges)
unique_edges, idx_map = torch.unique(all_edges,dim=0, return_inverse=True)
unique_edges = unique_edges.long()
mask_edges = occ_n[unique_edges.reshape(-1)].reshape(-1,2).sum(-1) == 1
mapping = torch.ones((unique_edges.shape[0]), dtype=torch.long, device="cuda") * -1
mapping[mask_edges] = torch.arange(mask_edges.sum(), dtype=torch.long,device="cuda")
idx_map = mapping[idx_map] # map edges to verts
interp_v = unique_edges[mask_edges]
edges_to_interp = pos_nx3[interp_v.reshape(-1)].reshape(-1,2,3)
edges_to_interp_sdf = sdf_n[interp_v.reshape(-1)].reshape(-1,2,1)
edges_to_interp_sdf[:,-1] *= -1
denominator = edges_to_interp_sdf.sum(1,keepdim = True)
edges_to_interp_sdf = torch.flip(edges_to_interp_sdf, [1])/denominator
verts = (edges_to_interp * edges_to_interp_sdf).sum(1)
idx_map = idx_map.reshape(-1,6)
v_id = torch.pow(2, torch.arange(4, dtype=torch.long, device="cuda"))
tetindex = (occ_fx4[valid_tets] * v_id.unsqueeze(0)).sum(-1)
num_triangles = self.num_triangles_table[tetindex]
# Generate triangle indices
faces = torch.cat((
torch.gather(input=idx_map[num_triangles == 1], dim=1, index=self.triangle_table[tetindex[num_triangles == 1]][:, :3]).reshape(-1,3),
torch.gather(input=idx_map[num_triangles == 2], dim=1, index=self.triangle_table[tetindex[num_triangles == 2]][:, :6]).reshape(-1,3),
), dim=0)
# Get global face index (static, does not depend on topology)
num_tets = tet_fx4.shape[0]
tet_gidx = torch.arange(num_tets, dtype=torch.long, device="cuda")[valid_tets]
face_gidx = torch.cat((
tet_gidx[num_triangles == 1]*2,
torch.stack((tet_gidx[num_triangles == 2]*2, tet_gidx[num_triangles == 2]*2 + 1), dim=-1).view(-1)
), dim=0)
uvs, uv_idx = self.map_uv(faces, face_gidx, num_tets*2)
face_to_valid_tet = torch.cat((
tet_gidx[num_triangles == 1],
torch.stack((tet_gidx[num_triangles == 2], tet_gidx[num_triangles == 2]), dim=-1).view(-1)
), dim=0)
valid_vert_idx = tet_fx4[tet_gidx[num_triangles > 0]].long().unique()
return verts, faces, uvs, uv_idx, face_to_valid_tet.long(), valid_vert_idx
def test_pickle(pkl_fn):
pkl_data = pickle.load(open(pkl_fn, "rb"), encoding='latin1')
# encoding='latin1'
print(pkl_data.keys())
for k in pkl_data:
print(f"key: {k}, value: {pkl_data[k].shape}")
def load_data_fr_th_sv(th_sv_fn, grid_res=64):
# /home/xueyi/sim/MeshDiffusion/nvdiffrec/dmtet_results/tets/dmt_dict_00001.pt
# th_sv_fn = "/home/xueyi/sim/MeshDiffusion/nvdiffrec/dmtet_results/tets/dmt_dict_00001.pt"
th_data = torch.load(th_sv_fn, map_location="cpu") # map location #
# repo # th_data #
sdf = th_data["sdf"]
deform = th_data["deform"]
deform_unmasked = th_data["deform_unmasked"]
root = "/home/xueyi/sim/MeshDiffusion/nvdiffrec" # get the root path #
# grid_res = 64
# grid_res of tets to be loaded #
tets = np.load(os.path.join(root, 'data/tets/{}_tets_cropped.npz'.format(grid_res)))
tet_verts = tets['vertices'] # tet _verts -> pose
tet_indices = tets['indices'] # indices
# sdf for each grids #
print(f"tet_verts: {tet_verts.shape}, tet_indices: {tet_indices.shape}")
dmt_net = DMTet()
# grid_res = 64
# 1) deform but not deformed -> so tet_verts + deform as the deformed pos #
# 2) deform but not
tet_verts = torch.from_numpy(tet_verts).float() # nn_verts x 3
# sdf = torch.from_numpy(sdf).float() # nn_verts --> the size of nn_verts #
tet_indices = torch.from_numpy(tet_indices).long() # nn_tets x 4 #
# __call__(self, pos_nx3, sdf_n, tet_fx4)
deform = deform.float()
deformed_verts = tet_verts + deform
# deformed_verts = deform
print(deform_unmasked)
deformed_verts[deform_unmasked.bool()] = tet_verts[deform_unmasked.bool()]
# verts, faces, uvs, uv_idx, face_to_valid_tet, valid_vert_idx = dmt_net(tet_verts.cuda(), sdf.cuda(), tet_indices.cuda())
verts, faces, uvs, uv_idx, face_to_valid_tet, valid_vert_idx = dmt_net(deformed_verts.cuda(), sdf.cuda(), tet_indices.cuda())
print(f"verts: {verts.size()}, faces: {faces.size()}")
sv_mesh_dict = {
'verts': verts.detach().cpu().numpy(),
'faces': faces.detach().cpu().numpy(), # deformed_verts #
}
# sv_mesh_fn = "/home/xueyi/sim/MeshDiffusion/nvdiffrec/dmtet_results/tets/mesh_extracted_00000.npy"
sv_mesh_fn = "/home/xueyi/sim/MeshDiffusion/nvdiffrec/dmtet_results/tets/mesh_extracted_00000_res_128.npy"
sv_mesh_fn = "/home/xueyi/sim/MeshDiffusion/nvdiffrec/dmtet_results_seq/tets/mesh_extracted_00002_res_128.npy"
np.save(sv_mesh_fn, sv_mesh_dict)
print(f"extracted mesh saved to {sv_mesh_fn}")
# self.verts = torch.tensor(tets['vertices'], dtype=torch.float32, device='cuda') # * scale
# self.indices = torch.tensor(tets['indices'], dtype=torch.long, device='cuda') #
#
# print()
def load_data_fr_th_sv_fr_pred(th_sv_fn, grid_res=64):
# /home/xueyi/sim/MeshDiffusion/nvdiffrec/dmtet_results/tets/dmt_dict_00001.pt
# th_sv_fn = "/home/xueyi/sim/MeshDiffusion/nvdiffrec/dmtet_results/tets/dmt_dict_00001.pt"
# th_data = torch.load(th_sv_fn, map_location="cpu") # map location #
# repo # th_data #
# cur_step_sv_dict = {
# "obj_sdf_inputs": sdf_obj.detach().cpu().numpy(),
# "hand_sdf_inputs": sdf_hand.detach().cpu().numpy(),
# "obj_sdf_outputs": sdf.squeeze(-1).detach().cpu().numpy(),
# "hand_sdf_outputs": sdf_obj2.squeeze(-1).detach().cpu().numpy(),
# }
cur_step_data = np.load(th_sv_fn, allow_pickle=True).item()
obj_sdf_inputs = cur_step_data["obj_sdf_inputs"]
obj_sdf_outputs = cur_step_data["obj_sdf_outputs"]
hand_sdf_inputs = cur_step_data["hand_sdf_inputs"]
hand_sdf_outputs = cur_step_data["hand_sdf_outputs"]
# sdf = th_data["sdf"]
# deform = th_data["deform"]
# deform_unmasked = th_data["deform_unmasked"]
root = "/home/xueyi/sim/MeshDiffusion/nvdiffrec" # get the root path #
# grid_res = 64
# grid_res of tets to be loaded #
tets = np.load(os.path.join(root, 'data/tets/{}_tets_cropped.npz'.format(grid_res)))
tet_verts = tets['vertices'] # tet _verts -> pose
tet_indices = tets['indices'] # indices
# sdf for each grids #
print(f"tet_verts: {tet_verts.shape}, tet_indices: {tet_indices.shape}")
dmt_net = DMTet()
# grid_res = 64
# 1) deform but not deformed -> so tet_verts + deform as the deformed pos #
# 2) deform but not
tet_verts = torch.from_numpy(tet_verts).float() # nn_verts x 3
# sdf = torch.from_numpy(sdf).float() # nn_verts --> the size of nn_verts #
tet_indices = torch.from_numpy(tet_indices).long() # nn_tets x 4 #
# __call__(self, pos_nx3, sdf_n, tet_fx4)
obj_sdf_inputs = torch.from_numpy(obj_sdf_inputs).float().squeeze(0)
obj_sdf_outputs = torch.from_numpy(obj_sdf_outputs).float().squeeze(0)
hand_sdf_inputs = torch.from_numpy(hand_sdf_inputs).float().squeeze(0)
hand_sdf_outputs = torch.from_numpy(hand_sdf_outputs).float().squeeze(0)
# print()
print(f"hand_sdf_inputs: {hand_sdf_inputs.size()}, hand_sdf_outputs: {hand_sdf_outputs.size()}")
hand_verts_inputs, hand_faces_inputs, uvs, uv_idx, face_to_valid_tet, valid_vert_idx = dmt_net(tet_verts.cuda(), hand_sdf_inputs.cuda(), tet_indices.cuda())
print(f"verts: {hand_verts_inputs.size()}, faces: {hand_faces_inputs.size()}")
hand_verts_outputs, hand_faces_outputs, uvs, uv_idx, face_to_valid_tet, valid_vert_idx = dmt_net(tet_verts.cuda(), hand_sdf_outputs.cuda(), tet_indices.cuda())
print(f"hand_verts_outputs: {hand_verts_outputs.size()}, hand_faces_outputs: {hand_faces_outputs.size()}")
obj_verts_inputs, obj_faces_inputs, uvs, uv_idx, face_to_valid_tet, valid_vert_idx = dmt_net(tet_verts.cuda(), obj_sdf_inputs.cuda(), tet_indices.cuda())
print(f"verts: {obj_verts_inputs.size()}, faces: {obj_faces_inputs.size()}")
obj_verts_outputs, obj_faces_outputs, uvs, uv_idx, face_to_valid_tet, valid_vert_idx = dmt_net(tet_verts.cuda(), obj_sdf_outputs.cuda(), tet_indices.cuda())
print(f"obj_verts_outputs: {obj_verts_outputs.size()}, obj_faces_outputs: {obj_faces_outputs.size()}")
sv_mesh_dict = {
'obj_input_verts': obj_verts_inputs.detach().cpu().numpy(),
'obj_input_faces': obj_faces_inputs.detach().cpu().numpy(), # deformed_verts #
'obj_verts_outputs': obj_verts_outputs.detach().cpu().numpy(),
'obj_faces_outputs': obj_faces_outputs.detach().cpu().numpy(), # deformed_verts #
'hand_verts_inputs': hand_verts_inputs.detach().cpu().numpy(),
'hand_faces_inputs': hand_faces_inputs.detach().cpu().numpy(), # deformed_verts #
'hand_verts_outputs': hand_verts_outputs.detach().cpu().numpy(),
'hand_faces_outputs': hand_faces_outputs.detach().cpu().numpy(), # deformed_verts #
}
# sv_mesh_fn = "/home/xueyi/sim/MeshDiffusion/nvdiffrec/dmtet_results/tets/mesh_extracted_00000.npy"
# sv_mesh_fn = "/home/xueyi/sim/MeshDiffusion/nvdiffrec/dmtet_results/tets/mesh_extracted_00000_res_128.npy"
logging_dir = "/data2/sim/implicit_ae/logging/00041-stylegan2-rendering-gpus1-batch4-gamma80"
# sv_mesh_fn = os.path.join(logging_dir, "pred_out_iter_2_batch_5_extracted.npy")
# sv_mesh_fn = os.path.join(logging_dir, "pred_out_iter_3_batch_0_extracted.npy")
sv_mesh_fn = os.path.join(logging_dir, "pred_out_iter_56_batch_0_extracted.npy")
# iter_39_batch_0_nreg
sv_mesh_fn = os.path.join(logging_dir, "pred_out_iter_63_batch_0_nreg_extracted.npy") #
np.save(sv_mesh_fn, sv_mesh_dict)
print(f"extracted mesh saved to {sv_mesh_fn}")
# deform = deform.float()
# deformed_verts = tet_verts + deform
# # deformed_verts = deform
# print(deform_unmasked)
# deformed_verts[deform_unmasked.bool()] = tet_verts[deform_unmasked.bool()]
# verts, faces, uvs, uv_idx, face_to_valid_tet, valid_vert_idx = dmt_net(tet_verts.cuda(), sdf.cuda(), tet_indices.cuda())
# verts, faces, uvs, uv_idx, face_to_valid_tet, valid_vert_idx = dmt_net(deformed_verts.cuda(), sdf.cuda(), tet_indices.cuda())
# print(f"verts: {verts.size()}, faces: {faces.size()}")
# sv_mesh_dict = {
# 'verts': verts.detach().cpu().numpy(),
# 'faces': faces.detach().cpu().numpy(), # deformed_verts #
# }
# # sv_mesh_fn = "/home/xueyi/sim/MeshDiffusion/nvdiffrec/dmtet_results/tets/mesh_extracted_00000.npy"
# sv_mesh_fn = "/home/xueyi/sim/MeshDiffusion/nvdiffrec/dmtet_results/tets/mesh_extracted_00000_res_128.npy"
# sv_mesh_fn = "/home/xueyi/sim/MeshDiffusion/nvdiffrec/dmtet_results_seq/tets/mesh_extracted_00002_res_128.npy"
# np.save(sv_mesh_fn, sv_mesh_dict)
# print(f"extracted mesh saved to {sv_mesh_fn}")
# self.verts = torch.tensor(tets['vertices'], dtype=torch.float32, device='cuda') # * scale
# self.indices = torch.tensor(tets['indices'], dtype=torch.long, device='cuda') #
#
# print()
import trimesh
from open3d import io as o3dio
def load_ply_data(ply_fn, rt_normals=False):
# obj_mesh = o3dio.read_triangle_mesh(ply_fn)
# obj_verts = np.array(obj_mesh.vertices, dtype=np.float32)
# obj_faces = np.array(obj_mesh.triangles)
# # obj_vertex_normals = np.array(obj_mesh.vertex_normals)
# # obj_face_normals = np.array(obj_mesh.face_normals)
obj_mesh = trimesh.load(ply_fn, process=False)
# obj_mesh.remove_degenerate_faces(height=1e-06)
verts_obj = np.array(obj_mesh.vertices)
faces_obj = np.array(obj_mesh.faces)
obj_face_normals = np.array(obj_mesh.face_normals)
obj_vertex_normals = np.array(obj_mesh.vertex_normals)
print(f"vertex: {verts_obj.shape}, obj_faces: {faces_obj.shape}, obj_face_normals: {obj_face_normals.shape}, obj_vertex_normals: {obj_vertex_normals.shape}")
if not rt_normals:
return verts_obj, faces_obj
else:
return verts_obj, faces_obj, obj_vertex_normals
def load_and_save_verts(rt_path):
ws = 60
tot_obj_verts =[]
for i_fr in range(ws):
cur_fr_obj_nm = f"object_{i_fr}.obj"
cur_fr_obj_path = os.path.join(rt_path, cur_fr_obj_nm)
cur_obj_verts, cur_obj_faces = load_ply_data(cur_fr_obj_path)
tot_obj_verts.append(cur_obj_verts)
tot_obj_verts = np.stack(tot_obj_verts, axis=0) # ws x nn_obj_verts x 3 -> for obj verts here #
bundle_obj_verts_sv_fn = os.path.join(rt_path, f"obj_verts_ws_{ws}.npy")
np.save(bundle_obj_verts_sv_fn, tot_obj_verts)
print(f"Object vertices saved to {bundle_obj_verts_sv_fn}")
def get_penetration_depth_rnk_data(sv_dict_fn):
sv_dict = np.load(sv_dict_fn, allow_pickle=True).item()
pred_fn_to_APD = {}
for cur_fn in sv_dict:
pred_fn_to_APD[cur_fn] = sv_dict[cur_fn][0]
sorted_pred_fn_with_APD = sorted(pred_fn_to_APD.items(), key=lambda i: i[1])
# print(sorted_pred_fn_with_APD)
# predicted_infos_seq_300_seed_169_tag_rep_res_jts_hoi4d_scissors_t_300_.npy
sorted_seed_APD_pair = []
selected_seeds = []
for cur_item in sorted_pred_fn_with_APD:
cur_fn = cur_item[0]
cur_seed =cur_fn.split("/")[-1].split("_")[5]
cur_seed = int(cur_seed)
sorted_seed_APD_pair.append((cur_seed, cur_item[1]))
if cur_item[1] == 0.:
selected_seeds.append(cur_seed)
print(sorted_seed_APD_pair)
print(f"selected_seeds:")
print(selected_seeds)
# case_flag
def get_meta_info(sv_dict_fn):
meta_info = np.load(sv_dict_fn, allow_pickle=True).item()
# ZY20210800001/H1/C9/N12/S33/s01/T2
case_flag = meta_info["case_flag"]
print(case_flag)
return case_flag
# average on all hand vertices #
### not a very accurate metric for penetration here ###
def calculate_penetration_depth(subj_seq, obj_verts, obj_faces): # subj seq -> can be any vertices as well #
# obj_verts: nn_verts x 3 -> numpy array
# obj_faces: nn_faces x 3 -> numpy array
# obj_mesh = trimesh.Trimesh(vertices=obj_verts, faces=obj_faces,
# process=False, use_embree=True)
obj_mesh = trimesh.Trimesh(vertices=obj_verts, faces=obj_faces,
)
# subj_seq: nf x nn_subj_pts x 3 #
tot_penetration_depth = []
for i_f in range(subj_seq.shape[0]): ## total sequence length ##
# for i_f in range(10):
cur_subj_seq = subj_seq[i_f]
cur_subj_seq_in_obj = obj_mesh.contains(cur_subj_seq) # nn_subj_pts #
dist_cur_subj_to_obj_verts = np.sum( # nn_subj_pts x nn_obj_pts #
(np.reshape(cur_subj_seq, (cur_subj_seq.shape[0], 1, 3)) - np.reshape(obj_verts, (1, obj_verts.shape[0], 3))) ** 2, axis=-1
)
# dist_cur_subj_to_obj_verts
nearest_obj_dist = np.min(dist_cur_subj_to_obj_verts, axis=-1) # nn_subj_pts
nearest_obj_dist = np.sqrt(nearest_obj_dist)
cur_pene_depth = np.zeros_like(nearest_obj_dist)
cur_pene_depth[cur_subj_seq_in_obj] = nearest_obj_dist[cur_subj_seq_in_obj]
tot_penetration_depth.append(cur_pene_depth)
tot_penetration_depth = np.stack(tot_penetration_depth, axis=0) # nf x nn_subj_pts
tot_penetration_depth = np.mean(tot_penetration_depth).item()
return tot_penetration_depth
### not a very accurate metric for penetration here ###
def calculate_penetration_depth_obj_seq(subj_seq, tot_obj_verts, tot_frames_obj_normals, obj_faces): # subj seq -> can be any vertices as well #
# obj_verts: nn_verts x 3 -> numpy array
# obj_faces: nn_faces x 3 -> numpy array
# obj_mesh = trimesh.Trimesh(vertices=obj_verts, faces=obj_faces,
# process=False, use_embree=True)
# obj_mesh = trimesh.Trimesh(vertices=obj_verts, faces=obj_faces,
# )
# subj_seq: nf x nn_subj_pts x 3 #
tot_penetration_depth = []
for i_f in range(subj_seq.shape[0]): ## total sequence length ##
obj_verts = tot_obj_verts[i_f]
obj_mesh = trimesh.Trimesh(vertices=obj_verts, faces=obj_faces,
)
cur_subj_seq = subj_seq[i_f]
cur_subj_seq_in_obj = obj_mesh.contains(cur_subj_seq) # nn_subj_pts #
dist_cur_subj_to_obj_verts = np.sum( # nn_subj_pts x nn_obj_pts #
(np.reshape(cur_subj_seq, (cur_subj_seq.shape[0], 1, 3)) - np.reshape(obj_verts, (1, obj_verts.shape[0], 3))) ** 2, axis=-1
)
# dist_cur_subj_to_obj_verts
nearest_obj_dist = np.min(dist_cur_subj_to_obj_verts, axis=-1) # nn_subj_pts
nearest_obj_dist = np.sqrt(nearest_obj_dist)
cur_pene_depth = np.zeros_like(nearest_obj_dist)
cur_pene_depth[cur_subj_seq_in_obj] = nearest_obj_dist[cur_subj_seq_in_obj]
tot_penetration_depth.append(cur_pene_depth)
tot_penetration_depth = np.stack(tot_penetration_depth, axis=0) # nf x nn_subj_pts
tot_penetration_depth = np.mean(tot_penetration_depth).item()
return tot_penetration_depth
### not a very accurate metric for penetration here ###
def calculate_penetration_depth_obj_seq_v2(subj_seq, tot_obj_verts, tot_frames_obj_normals, obj_faces): # subj seq -> can be any vertices as well #
# obj_verts: nn_verts x 3 -> numpy array
# obj_faces: nn_faces x 3 -> numpy array
# obj_mesh = trimesh.Trimesh(vertices=obj_verts, faces=obj_faces,
# process=False, use_embree=True)
# obj_mesh = trimesh.Trimesh(vertices=obj_verts, faces=obj_faces,
# )
# subj_seq: nf x nn_subj_pts x 3 #
tot_penetration_depth = []
for i_f in range(subj_seq.shape[0]): ## total sequence length ##
obj_verts = tot_obj_verts[i_f]
obj_normals = tot_frames_obj_normals[i_f]
# obj_mesh = trimesh.Trimesh(vertices=obj_verts, faces=obj_faces,
# )
cur_subj_seq = subj_seq[i_f]
# cur_subj_seq_in_obj = obj_mesh.contains(cur_subj_seq) # nn_subj_pts #
dist_cur_subj_to_obj_verts = np.sum( # nn_subj_pts x nn_obj_pts #
(np.reshape(cur_subj_seq, (cur_subj_seq.shape[0], 1, 3)) - np.reshape(obj_verts, (1, obj_verts.shape[0], 3))) ** 2, axis=-1
)
# dist_cur_subj_to_obj_verts
nearest_obj_pts_idx = np.argmin(dist_cur_subj_to_obj_verts, axis=-1) # nn_subj_pts #
nearest_obj_dist = np.min(dist_cur_subj_to_obj_verts, axis=-1) # nn_subj_pts
nearest_obj_dist = np.sqrt(nearest_obj_dist)
cur_pene_depth = np.zeros_like(nearest_obj_dist)
nearest_obj_pts_idx_th = torch.from_numpy(nearest_obj_pts_idx).long().cuda() ###
obj_verts_th = torch.from_numpy(obj_verts).float().cuda() ### nn_obj_verts x 3
obj_normals_th = torch.from_numpy(obj_normals).float().cuda() ### nn_obj_verts x 3
## nn_hand_verts x 3 ##
nearest_obj_pts = model_util.batched_index_select_ours(obj_verts_th, indices=nearest_obj_pts_idx_th, dim=0) ## nn_hand_verts x 3
nearest_obj_normals = model_util.batched_index_select_ours(obj_normals_th, indices=nearest_obj_pts_idx_th, dim=0) ## nn_hand_verts x 3
cur_subj_seq_th = torch.from_numpy(cur_subj_seq).float().cuda()
rel_obj_verts_to_subj_pts = cur_subj_seq_th - nearest_obj_pts
dot_rel_with_obj_normals = torch.sum(nearest_obj_normals * rel_obj_verts_to_subj_pts, dim=-1)
cur_subj_seq_in_obj = dot_rel_with_obj_normals < 0.
cur_subj_seq_in_obj = cur_subj_seq_in_obj.cpu().numpy().astype(np.bool8)
cur_pene_depth[cur_subj_seq_in_obj] = nearest_obj_dist[cur_subj_seq_in_obj]
tot_penetration_depth.append(cur_pene_depth)
tot_penetration_depth = np.stack(tot_penetration_depth, axis=0) # nf x nn_subj_pts
tot_penetration_depth = np.mean(tot_penetration_depth).item()
return tot_penetration_depth
def calculate_subj_smoothness(joint_seq):
# joint_seq: nf x nnjoints x 3
disp_seq = joint_seq[1:] - joint_seq[:-1] # (nf - 1) x nnjoints x 3 #
disp_seq = np.sum(disp_seq ** 2, axis=-1)
disp_seq = np.mean(disp_seq)
# disp_seq = np.
disp_seq = disp_seq.item()
return disp_seq
def calculate_moving_consistency(base_pts_trans, joints_trans):
# base_pts_trans: nf x nn_base_pts x 3 #
# joints_trans: nf x nn_jts x 3 #
base_pts_trans = torch.from_numpy(base_pts_trans).float()
joints_trans = torch.from_numpy(joints_trans).float()
# dist_joints_to_base_pts = np.sum
dist_joints_to_base_pts = torch.sum(
(joints_trans.unsqueeze(2) - base_pts_trans.unsqueeze(1)) ** 2, dim=-1 # nf x nn_jts x nn_base_pts #
)
dist_joints_to_base_pts = torch.sqrt(dist_joints_to_base_pts)
dist_joints_to_base_pts, joints_to_base_pts_minn_idxes = torch.min(dist_joints_to_base_pts, dim=-1)
minn_dist_joints_to_base_pts_across_joints, minn_dist_joints_to_base_pts_idxes = torch.min(dist_joints_to_base_pts, dim=-1) # (nf - 1)
minn_dist_joints_to_base_pts_idxes = minn_dist_joints_to_base_pts_idxes[:-1]
disp_joints_to_base_pts_minn_idxes = joints_to_base_pts_minn_idxes[:-1]
disp_base_pts = base_pts_trans[1:] - base_pts_trans[:-1]
disp_joints = joints_trans[1:] - joints_trans[:-1] # (nf - 1) x nn_jts x 3
dist_joints_to_base_pts = dist_joints_to_base_pts[:-1]
k_f = 100.
k = torch.exp(
-k_f * dist_joints_to_base_pts
)
disp_joints_base_pts = model_util.batched_index_select_ours(disp_base_pts, indices=disp_joints_to_base_pts_minn_idxes, dim=1) # (nf - 1) x nn_jts x 3
nearest_joints_disp = model_util.batched_index_select_ours(disp_joints_base_pts, indices=minn_dist_joints_to_base_pts_idxes.unsqueeze(-1), dim=1) # (nf - 1) x 1
nearest_joints_disp = nearest_joints_disp.squeeze(1) # (nf - 1) x 3 #
disp_joints = model_util.batched_index_select_ours(disp_joints, indices=minn_dist_joints_to_base_pts_idxes.unsqueeze(-1), dim=1).squeeze(1) # (nf - 1) x 3
nearest_k = model_util.batched_index_select_ours(k, indices=minn_dist_joints_to_base_pts_idxes.unsqueeze(-1), dim=1).squeeze(1) # (nf - 1)
##### use k for weighting disp #####
disp_joints_to_nearest_base_pts = disp_joints * nearest_k.unsqueeze(-1) # ### (nf - 1 ) x 3
diff_disp_joints_to_nearest_base_pts_disp = torch.sum(
(disp_joints_to_nearest_base_pts - nearest_joints_disp) ** 2, dim=-1
)
diff_disp_joints_base_pts = diff_disp_joints_to_nearest_base_pts_disp.mean()
##### use k for weighting disp #####
return diff_disp_joints_base_pts.item()
# i_test_seq
def get_test_settings_to_statistics(i_test_seq, test_tag, start_idx=50, ws=60, use_toch=False):
# optimized_sv_infos_sv_fn_nm = f"optimized_infos_sv_dict_seq_{i_test_seq}_seed_{seed}_tag_{test_tag}_dist_thres_{dist_thres}_with_proj_{with_proj}.npy"
# optimized_infos_sv_dict_seq_0_seed_0_tag_jts_hoi4d_arti_t_400__dist_thres_0.005_with_proj_False.npy
tot_dist_thres = [0.005, 0.01, 0.02, 0.05, 0.1]
tot_dist_thres = [0.001, 0.005]
tot_with_proj = [True, False]
tot_seeds = range(0, 122, 11)
if use_toch:
tot_seeds = [0]
# tot_with_proj = [False]
tot_with_proj = [True, False]
# tot_dist_thres = [0.005]
tot_dist_thres = [0.001, 0.005]
# test_tag = ""
pred_infos_sv_folder = f"/data2/sim/eval_save/HOI_{cat_ty}/{cat_nm}"
if cat_nm in ["Scissors"]:
corr_infos_sv_folder = f"/data2/sim/HOI_Processed_Data_{cat_ty}/{cat_nm}/{cat_nm}"
else:
corr_infos_sv_folder = f"/data2/sim/HOI_Processed_Data_{cat_ty}/{cat_nm}"
test_setting_to_pene_depth = {}
corr_mesh_folder = os.path.join(corr_infos_sv_folder, f"case{i_test_seq}")
corr_mesh_folder = os.path.join(corr_mesh_folder, "corr_mesh")
tot_frames_obj_verts = []
tot_frames_obj_normals = []
# for i_idx in range(start_idx, start_idx + ws):
# cur_obj_fn = os.path.join(corr_mesh_folder, f"object_{i_idx}.obj")
# if not os.path.exists(cur_obj_fn):
# return []
# cur_obj_verts, cur_obj_faces, cur_obj_verts_normals = load_ply_data(cur_obj_fn, rt_normals=True) #### load verts and faces jfrom the ply data ##
# tot_frames_obj_verts.append(cur_obj_verts)
# tot_frames_obj_normals.append(cur_obj_verts_normals)
# tot_frames_obj_verts_np = np.stack(tot_frames_obj_verts, axis=0)
for seed in tot_seeds:
for dist_thres in tot_dist_thres:
for with_proj in tot_with_proj:
cur_optimized_sv_infos_fn = f"optimized_infos_sv_dict_seq_{i_test_seq}_seed_{seed}_tag_{test_tag}_dist_thres_{dist_thres}_with_proj_{with_proj}.npy"
cur_optimized_sv_infos_fn = f"optimized_infos_sv_dict_seq_{i_test_seq}_seed_{seed}_tag_{test_tag}_dist_thres_{dist_thres}_with_proj_{with_proj}_wjts_0.01.npy"
# f"optimized_infos_sv_dict_seq_{i_test_seq}_seed_{seed}_tag_{test_tag}_dist_thres_{dist_thres}_with_proj_{with_proj}.npy"
cur_optimized_sv_infos_fn = os.path.join(pred_infos_sv_folder, cur_optimized_sv_infos_fn)
print(f"cur_optimized_sv_infos_fn: {cur_optimized_sv_infos_fn}")
if not os.path.exists(cur_optimized_sv_infos_fn):
continue
optimized_infos = np.load(cur_optimized_sv_infos_fn, allow_pickle=True).item()
if len(tot_frames_obj_verts) == 0:
for i_idx in range(start_idx, start_idx + ws):
cur_obj_fn = os.path.join(corr_mesh_folder, f"object_{i_idx}.obj")
if not os.path.exists(cur_obj_fn):
return []
cur_obj_verts, cur_obj_faces, cur_obj_verts_normals = load_ply_data(cur_obj_fn, rt_normals=True) #### load verts and faces jfrom the ply data ##
tot_frames_obj_verts.append(cur_obj_verts)
tot_frames_obj_normals.append(cur_obj_verts_normals)
tot_frames_obj_verts_np = np.stack(tot_frames_obj_verts, axis=0)
tot_base_pts_trans = optimized_infos['tot_base_pts_trans'] # nn_frames x nn_base_pts x 3
tot_base_pts_trans_th = torch.from_numpy(tot_base_pts_trans).float()
tot_frames_obj_verts_th = torch.from_numpy(tot_frames_obj_verts_np).float()
diff_base_pts_trans_obj = torch.sum(
(tot_base_pts_trans_th.unsqueeze(-2) - tot_frames_obj_verts_th.unsqueeze(1)) ** 2, dim=-1 # nn_frames x nn_base x nn_obj
)
minn_diff_base_pts_trans_obj, minn_diff_base_pts_trans_obj_idxes = torch.min(diff_base_pts_trans_obj, dim=-1) # nn_frames x nn_base
tot_frames_obj_verts_th = model_util.batched_index_select_ours(tot_frames_obj_verts_th.cuda(), minn_diff_base_pts_trans_obj_idxes.cuda(), dim=1) # nn_frames x nn_base x 3
tot_frames_obj_normals_np = np.stack(tot_frames_obj_normals, axis=0)
tot_frames_obj_normals_th = torch.from_numpy(tot_frames_obj_normals_np).float()
tot_frames_obj_normals_th = model_util.batched_index_select_ours(tot_frames_obj_normals_th.cuda(), minn_diff_base_pts_trans_obj_idxes.cuda(), dim=1) # nn_frames x nn_base x 3
# tot_frames_obj_normals = tot_frames_obj_normals_th.cpu().numpy().tolist()
tot_frames_obj_normals = [tot_frames_obj_normals_th[ii].cpu().numpy() for ii in range(tot_frames_obj_normals_th.size(0))]
tot_frames_obj_verts_np = tot_frames_obj_verts_th.cpu().numpy()
# tot_frames_obj_verts = tot_frames_obj_verts_np.tolist()
tot_frames_obj_verts = [tot_frames_obj_verts_np[ii] for ii in range(tot_frames_obj_verts_np.shape[0])]
# if tot_frames_obj_verts
optimized_verts = optimized_infos["hand_verts"]
if use_toch:
toch_eval_sv_fn = f"/data2/sim/eval_save/HOI_{cat_ty}_toch/{cat_nm}/{i_test_seq}.npy"
toch_eval_sv_dict = np.load(toch_eval_sv_fn, allow_pickle=True).item()
optimized_verts = toch_eval_sv_dict["hand_verts_tot"]
### calculate penetration depth obj seq ###
# cur_penetration_depth = calculate_penetration_depth_obj_seq(optimized_verts, tot_frames_obj_verts, tot_frames_obj_normals, cur_obj_faces)
# calculate_penetration_depth_obj_seq_v2
st_time = time.time()
cur_penetration_depth = calculate_penetration_depth_obj_seq_v2(optimized_verts, tot_frames_obj_verts, tot_frames_obj_normals, cur_obj_faces)
cur_subj_smoothness = calculate_subj_smoothness(optimized_verts)
cur_moving_consistency = calculate_moving_consistency(tot_frames_obj_verts_np, optimized_verts)
ed_time = time.time()
print(f"Time used for calculating penetration depth (v2): {ed_time - st_time}")
test_setting_to_pene_depth[(seed, dist_thres, with_proj) ] = (cur_penetration_depth, cur_subj_smoothness, cur_moving_consistency)
print(f"i_test_seq: {i_test_seq}, seed: {seed}, dist_thres: {dist_thres}, with_proj: {with_proj}, penetration_depth: {cur_penetration_depth}, smoothness: {cur_subj_smoothness}, cur_moving_consistency: {cur_moving_consistency}")
sorted_setting_to_pene_depth = sorted(test_setting_to_pene_depth.items(), key=lambda ii: ii[1][0], reverse=False)
print(sorted_setting_to_pene_depth[:5])
return sorted_setting_to_pene_depth
def get_setting_to_stats(st_idx, ed_idx, use_toch=False):
# f"/data2/sim/eval_save/HOI_Arti/Scissors/setting_to_stats_seq_{i_test_seq}_toch.npy"
tot_penetrations = []
tot_smoothness = []
tot_moving_consistency = []
for test_idx in range(st_idx, ed_idx):
if test_idx == 12:
continue
if not use_toch:
cur_sv_dict_fn = f"/data2/sim/eval_save/HOI_{cat_ty}/{cat_nm}/setting_to_stats_seq_{test_idx}.npy"
else:
cur_sv_dict_fn = f"/data2/sim/eval_save/HOI_{cat_ty}/{cat_nm}/setting_to_stats_seq_{test_idx}_toch.npy"
sv_dict = np.load(cur_sv_dict_fn, allow_pickle=True)
# print(f"Test idx: {test_idx}, statistics: {sv_dict}")
# cur_sv_dict_fn = f"/data2/sim/eval_save/HOI_Arti/Scissors/setting_to_stats_seq_{test_idx}_toch.npy"
# sv_dict = np.load(cur_sv_dict_fn, allow_pickle=True)
# print(f"Test idx: {test_idx}, statistics: {sv_dict}")
if len(sv_dict) > 0:
print(sv_dict[0])
cur_stats = sv_dict[0][1]
tot_penetrations.append(cur_stats[0])
tot_smoothness.append(cur_stats[1])
tot_moving_consistency.append(cur_stats[2])
# cur_sv_dict_fn = f"/data2/sim/eval_save/HOI_Arti/Scissors/setting_to_stats_seq_{test_idx}_toch.npy"
# sv_dict = np.load(cur_sv_dict_fn, allow_pickle=True)
# print(f"Test idx: {test_idx}, statistics: {sv_dict}")
# the
avg_penetration = sum(tot_penetrations) / float(len(tot_penetrations))
avg_smoothness = sum(tot_smoothness) / float(len(tot_smoothness))
avg_consis = sum(tot_moving_consistency) / float(len(tot_moving_consistency))
print(f"avg_penetration: {avg_penetration}, avg_smoothness: {avg_smoothness}, avg_consis: {avg_consis}")
# [8, 11]
# avg_penetration: 7.019575241429266e-05, avg_smoothness: 2.841970498934643e-06, avg_consis: 4.051069936394924e-06
# avg_penetration: 4.745464866573457e-05, avg_smoothness: 8.250485916505568e-05, avg_consis: 4.235470646563044e-05
# Toch
# avg_penetration: 0.00011692142591831119, avg_smoothness: 6.375887634627968e-05, avg_consis: 3.023650837500706e-05
# Ours
# avg_penetration: 5.615660193143412e-05, avg_smoothness: 3.3161883834509354e-06, avg_consis: 3.632244261098094e-06
from manopth.manolayer import ManoLayer
def get_mano_model():
mano_path = "/data1/sim/mano_models/mano/models"
mano_layer = ManoLayer(
flat_hand_mean=True,
side='right',
mano_root=mano_path, # mano_root #
ncomps=24,
use_pca=True,
root_rot_mode='axisang',
joint_rot_mode='axisang'
)
return mano_layer
def get_arctic_mano_model(side='right'):
mano_path = "/data1/sim/mano_models/mano/models"
mano_layer = ManoLayer(
flat_hand_mean=False,
side=side,
mano_root=mano_path, # mano_root #
ncomps=45,
use_pca=False,
root_rot_mode='axisang',
joint_rot_mode='axisang'
)
return mano_layer
# load clean obj clip data #
import data_loaders.humanml.data.utils as utils
#
def load_grab_clip_data_clean_obj(clip_seq_idx, more_pert=False, other_noise=False, split='train'):
mano_model = get_mano_model()
grab_path = "/data1/sim/GRAB_extracted" # extracted # extracted
# split = "test"
window_size = 60
singe_seq_path = f"/data1/sim/GRAB_processed/{split}/{clip_seq_idx}.npy"
clip_clean = np.load(singe_seq_path)
subj_root_path = '/data1/sim/GRAB_processed_wsubj'
subj_seq_path = f"{clip_seq_idx}_subj.npy"
# load datas # grab path; grab sequences #
grab_path = "/data1/sim/GRAB_extracted"
obj_mesh_path = os.path.join(grab_path, 'tools/object_meshes/contact_meshes')
id2objmesh = []
obj_meshes = sorted(os.listdir(obj_mesh_path))
for i, fn in enumerate(obj_meshes):
id2objmesh.append(os.path.join(obj_mesh_path, fn))
subj_params_fn = os.path.join(subj_root_path, split, subj_seq_path)
subj_params = np.load(subj_params_fn, allow_pickle=True).item()
rhand_transl = subj_params["rhand_transl"][:window_size].astype(np.float32)
rhand_betas = subj_params["rhand_betas"].astype(np.float32)
rhand_pose = clip_clean['f2'][:window_size].astype(np.float32) ## rhand pose ## #
rhand_global_orient = clip_clean['f1'][:window_size].astype(np.float32)
# rhand_pose = clip_clean['f2'][:window_size].astype(np.float32)
object_global_orient = clip_clean['f5'].astype(np.float32) ## clip_len x 3 --> orientation
object_trcansl = clip_clean['f6'].astype(np.float32) ## cliplen x 3 --> translation
object_idx = clip_clean['f7'][0].item() # clip len x 3 # clip len x 3 for translations #
object_global_orient_mtx = utils.batched_get_orientation_matrices(object_global_orient)
object_global_orient_mtx_th = torch.from_numpy(object_global_orient_mtx).float()
object_trcansl_th = torch.from_numpy(object_trcansl).float()
obj_nm = id2objmesh[object_idx]
obj_mesh = trimesh.load(obj_nm, process=False) # obj mesh obj verts
obj_verts = np.array(obj_mesh.vertices)
obj_vertex_normals = np.array(obj_mesh.vertex_normals)
obj_faces = np.array(obj_mesh.faces)
obj_verts = torch.from_numpy(obj_verts).float() #
obj_verts = torch.matmul(obj_verts.unsqueeze(0), object_global_orient_mtx_th) + object_trcansl_th.unsqueeze(1) ### nn_frames x nn_obj x 3 ### as the object transformed meshes ##
obj_verts = obj_verts.detach().cpu().numpy() ### nn_frames x nn_obj_verts x 3 ###
return obj_verts, obj_faces
#
def load_grab_clip_data_clean_subj(clip_seq_idx, split = "train", pert=False, more_pert=False, other_noise=False):
mano_model = get_mano_model()
grab_path = "/data1/sim/GRAB_extracted" # extracted
# split = "test"
window_size = 60
singe_seq_path = f"/data1/sim/GRAB_processed/{split}/{clip_seq_idx}.npy"
clip_clean = np.load(singe_seq_path)
subj_root_path = '/data1/sim/GRAB_processed_wsubj'
subj_seq_path = f"{clip_seq_idx}_subj.npy"
subj_params_fn = os.path.join(subj_root_path, split, subj_seq_path)
subj_params = np.load(subj_params_fn, allow_pickle=True).item()
rhand_transl = subj_params["rhand_transl"][:window_size].astype(np.float32)
rhand_betas = subj_params["rhand_betas"].astype(np.float32)
rhand_pose = clip_clean['f2'][:window_size].astype(np.float32) ## rhand pose ## #
rhand_global_orient = clip_clean['f1'][:window_size].astype(np.float32)
# rhand_pose = clip_clean['f2'][:window_size].astype(np.float32)
rhand_global_orient_var = torch.from_numpy(rhand_global_orient).float()
rhand_pose_var = torch.from_numpy(rhand_pose).float()
rhand_beta_var = torch.from_numpy(rhand_betas).float()
rhand_transl_var = torch.from_numpy(rhand_transl).float()
aug_trans, aug_rot, aug_pose = 0.01, 0.05, 0.3
# aug_trans, aug_rot, aug_pose = 0.01, 0.1, 0.5
# aug_trans, aug_rot, aug_pose = 0.001, 0.05, 0.3
# aug_trans, aug_rot, aug_pose = 0.000, 0.05, 0.3
#
if pert:
if more_pert:
aug_trans, aug_rot, aug_pose = 0.04, 0.2, 0.8
if other_noise:
dist_beta = torch.distributions.beta.Beta(torch.tensor([8.]), torch.tensor([2.]))
print(f"here!")
aug_pose_var = dist_beta.sample(rhand_pose_var.size()).squeeze(-1) * aug_pose
aug_global_orient_var = dist_beta.sample(rhand_global_orient_var.size()).squeeze(-1) * aug_rot
print(f"aug_pose_var: {aug_pose_var.size()}, aug_global_orient_var: {aug_global_orient_var.size()}")
aug_transl_var = dist_beta.sample(rhand_transl_var.size()).squeeze(-1) * aug_trans
else:
aug_global_orient_var = torch.randn_like(rhand_global_orient_var) * aug_rot ### sigma = aug_rot
aug_pose_var = torch.randn_like(rhand_pose_var) * aug_pose ### sigma = aug_pose
aug_transl_var = torch.randn_like(rhand_transl_var) * aug_trans ### sigma = aug_trans
rnd_aug_global_orient_var = rhand_global_orient_var + aug_global_orient_var
rnd_aug_pose_var = rhand_pose_var + aug_pose_var
rnd_aug_transl_var = rhand_transl_var + aug_transl_var ### aug transl ###
else:
rnd_aug_global_orient_var = rhand_global_orient_var
rnd_aug_pose_var = rhand_pose_var
rnd_aug_transl_var = rhand_transl_var ### aug transl
rhand_verts, rhand_joints = mano_model(
torch.cat([rnd_aug_global_orient_var, rnd_aug_pose_var], dim=-1),
rhand_beta_var.unsqueeze(0).repeat(window_size, 1).view(-1, 10), rnd_aug_transl_var
)
### rhand_joints: for joints ###
rhand_verts = rhand_verts * 0.001
rhand_joints = rhand_joints * 0.001
return rhand_verts
def load_grab_clip_data(clip_seq_idx, more_pert=False, other_noise=False):
mano_model = get_mano_model()
grab_path = "/data1/sim/GRAB_extracted" # extracted
split = "test"
window_size = 60
singe_seq_path = f"/data1/sim/GRAB_processed/{split}/{clip_seq_idx}.npy"
clip_clean = np.load(singe_seq_path)
subj_root_path = '/data1/sim/GRAB_processed_wsubj'
subj_seq_path = f"{clip_seq_idx}_subj.npy"
subj_params_fn = os.path.join(subj_root_path, split, subj_seq_path)
subj_params = np.load(subj_params_fn, allow_pickle=True).item()
rhand_transl = subj_params["rhand_transl"][:window_size].astype(np.float32)
rhand_betas = subj_params["rhand_betas"].astype(np.float32)
rhand_pose = clip_clean['f2'][:window_size].astype(np.float32) ## rhand pose ## #
rhand_global_orient = clip_clean['f1'][:window_size].astype(np.float32)
# rhand_pose = clip_clean['f2'][:window_size].astype(np.float32)
rhand_global_orient_var = torch.from_numpy(rhand_global_orient).float()
rhand_pose_var = torch.from_numpy(rhand_pose).float()
rhand_beta_var = torch.from_numpy(rhand_betas).float()
rhand_transl_var = torch.from_numpy(rhand_transl).float()
aug_trans, aug_rot, aug_pose =0.01, 0.05, 0.3
# aug_trans, aug_rot, aug_pose = 0.01, 0.1, 0.5
# aug_trans, aug_rot, aug_pose = 0.001, 0.05, 0.3
# aug_trans, aug_rot, aug_pose = 0.000, 0.05, 0.3
if more_pert:
aug_trans, aug_rot, aug_pose = 0.04, 0.2, 0.8
if other_noise:
dist_beta = torch.distributions.beta.Beta(torch.tensor([8.]), torch.tensor([2.]))
print(f"here!")
aug_pose_var = dist_beta.sample(rhand_pose_var.size()).squeeze(-1) * aug_pose
aug_global_orient_var = dist_beta.sample(rhand_global_orient_var.size()).squeeze(-1) * aug_rot
print(f"aug_pose_var: {aug_pose_var.size()}, aug_global_orient_var: {aug_global_orient_var.size()}")
aug_transl_var = dist_beta.sample(rhand_transl_var.size()).squeeze(-1) * aug_trans
else:
aug_global_orient_var = torch.randn_like(rhand_global_orient_var) * aug_rot ### sigma = aug_rot
aug_pose_var = torch.randn_like(rhand_pose_var) * aug_pose ### sigma = aug_pose
aug_transl_var = torch.randn_like(rhand_transl_var) * aug_trans ### sigma = aug_trans
rnd_aug_global_orient_var = rhand_global_orient_var + aug_global_orient_var
rnd_aug_pose_var = rhand_pose_var + aug_pose_var
rnd_aug_transl_var = rhand_transl_var + aug_transl_var ### aug transl
rhand_verts, rhand_joints = mano_model(
torch.cat([rnd_aug_global_orient_var, rnd_aug_pose_var], dim=-1),
rhand_beta_var.unsqueeze(0).repeat(window_size, 1).view(-1, 10), rnd_aug_transl_var
)
### rhand_joints: for joints ###
rhand_verts = rhand_verts * 0.001
rhand_joints = rhand_joints * 0.001
return rhand_verts
def get_idx_to_objname():
# load datas # grab path; grab sequences #
grab_path = "/data1/sim/GRAB_extracted"
## grab contactmesh ## id2objmeshname
obj_mesh_path = os.path.join(grab_path, 'tools/object_meshes/contact_meshes')
id2objmeshname = []
obj_meshes = sorted(os.listdir(obj_mesh_path))
# objectmesh name #
id2objmeshname = [obj_meshes[i].split(".")[0] for i in range(len(obj_meshes))]
return id2objmeshname
def get_test_idx_to_obj_name():
id2objmeshname = get_idx_to_objname()
test_folder = "/data1/sim/GRAB_processed/test/"
tot_test_seqs = os.listdir(test_folder)
tot_test_seq_idxes = [ii for ii in range(246)]
test_seq_idx_to_mesh_nm = {}
for cur_test_seq_idx in tot_test_seq_idxes:
cur_test_seq_path = os.path.join(test_folder, f"{cur_test_seq_idx}.npy")
cur_test_seq = np.load(cur_test_seq_path)
object_idx = cur_test_seq['f7'][0].item()
cur_obj_mesh_nm = id2objmeshname[object_idx]
test_seq_idx_to_mesh_nm[cur_test_seq_idx] = cur_obj_mesh_nm
return test_seq_idx_to_mesh_nm
def get_category_nns():
cat_root_folder = "/data2/sim/HOI_Processed_Data_Arti"
tot_cat_nms = ["Bucket", "Laptop", "Pliers", "Scissors"]
# Scissors/Scissors
tot_cat_nms = ["Bucket", "Laptop", "Pliers", "Scissors/Scissors"]
cat_nm_to_case_nns = {}
for cur_cat_nm in tot_cat_nms:
cur_cat_folder = os.path.join(cat_root_folder, cur_cat_nm)
tot_cases = os.listdir(cur_cat_folder)
tot_cases = [cur_case_nm for cur_case_nm in tot_cases if "case" in cur_case_nm]
cat_nm_to_case_nns[cur_cat_nm] = len(tot_cases)
print(cat_nm_to_case_nns)
# {'Bucket': 42, 'Laptop': 155, 'Pliers': 187, 'Scissors/Scissors': 93}
# {'Bottle': 214, 'Bowl': 217, 'Chair': 167, 'Knife': 58, 'Mug': 249, 'ToyCar': 257}
cat_root_folder = "/data2/sim/HOI_Processed_Data_Rigid"
tot_cat_nms = ["Bottle", "Bowl", "Chair", "Knife", "Mug", "ToyCar"]
cat_nm_to_case_nns = {}
for cur_cat_nm in tot_cat_nms:
cur_cat_folder = os.path.join(cat_root_folder, cur_cat_nm)
tot_cases = os.listdir(cur_cat_folder)
tot_cases = [cur_case_nm for cur_case_nm in tot_cases if "case" in cur_case_nm]
cat_nm_to_case_nns[cur_cat_nm] = len(tot_cases)
print(cat_nm_to_case_nns)
def get_cat_avg_values():
# cat_nm_to_arti_objs_nn = {'Bucket': 42, 'Laptop': 155, 'Pliers': 187, 'Scissors': 93}
cat_nm_to_arti_objs_nn = {'Laptop': 155, 'Pliers': 187, 'Scissors': 93}
# cat_nm_to_rigid_objs_nn = {'Bottle': 214, 'Bowl': 217, 'Chair': 167, 'Knife': 58, 'Mug': 249, 'ToyCar': 257, 'Kettle': 58}
cat_nm_to_rigid_objs_nn = {'Bottle': 214, 'Bowl': 217, 'Chair': 167, 'Mug': 249, 'ToyCar': 257, 'Kettle': 58}
cat_nm_to_objs_nn = {}
cat_nm_to_objs_nn.update(cat_nm_to_arti_objs_nn)
cat_nm_to_objs_nn.update(cat_nm_to_rigid_objs_nn)
### TOCH
# cat_to_penetration_depth = {
# "Knife": 29.56, "Bottle": 187.69, "Pliers": 667.96, "Scissors": 11.69, "Bowl": 28.66, "Kettle": 34.3, "Mug": 21.47, "ToyCar": 60.42
# }
# cat_to_smoothness = {
# "Knife": 9.885, "Bottle": 3.5871, "Pliers": 5.594, "Scissors": 6.376, "Bowl": 10.54, "Kettle": 6.81, "Mug": 10.56, "ToyCar": 2.404
# }
# cat_to_ho_motion_consistency = {
# "Knife": 20.896, "Bottle": 55.083, "Pliers": 14.3, "Scissors": 3.024, "Bowl": 18.37, "Kettle": 19.7, "Mug": 26.89, "ToyCar": 15.45
# }
# tot_sum_value = 0.
# tot_sum_nns = 0
# for cat_nm in cat_to_penetration_depth:
# cur_cat_nn = cat_nm_to_objs_nn[cat_nm]
# cur_cat_penetration_depth = cat_to_penetration_depth[cat_nm]
# cur_cat_tot_pene_depth = cur_cat_penetration_depth * float(cur_cat_nn)
# tot_sum_nns += cur_cat_nn
# tot_sum_value += cur_cat_tot_pene_depth
# avg_pene_depth = tot_sum_value / float(tot_sum_nns)
# print(f"Avg_pene_depth: {avg_pene_depth}")
# tot_sum_value = 0.
# tot_sum_nns = 0
# for cat_nm in cat_to_smoothness:
# cur_cat_nn = cat_nm_to_objs_nn[cat_nm]
# cur_cat_smoothness = cat_to_smoothness[cat_nm]
# cur_cat_tot_smoothness = cur_cat_smoothness * float(cur_cat_nn)
# tot_sum_nns += cur_cat_nn
# tot_sum_value += cur_cat_tot_smoothness
# avg_smoothness = tot_sum_value / float(tot_sum_nns)
# print(f"Avg_smoothness: {avg_smoothness}")
# tot_sum_value = 0.
# tot_sum_nns = 0
# for cat_nm in cat_to_ho_motion_consistency:
# cur_cat_nn = cat_nm_to_objs_nn[cat_nm]
# cur_cat_consistency = cat_to_ho_motion_consistency[cat_nm]
# cur_cat_consistency = cur_cat_consistency * float(cur_cat_nn)
# tot_sum_nns += cur_cat_nn
# tot_sum_value += cur_cat_consistency
# avg_consistency = tot_sum_value / float(tot_sum_nns)
# print(f"Avg_consistency: {avg_consistency}")
# # Avg_pene_depth: 147.75575393848462
# # Avg_smoothness: 6.683753488372093
# # Avg_consistency: 23.818613653413355
### TOCH
cat_to_penetration_depth = {
"Knife": 1.5044, "Bottle": 135.51, "Pliers": 389.75, "Scissors": 5.616, "Bowl": 23.53, "Kettle": 38.64, "Mug": 7.446, "ToyCar": 19.19
}
cat_to_smoothness = {
"Knife":0.1232, "Bottle": 1.9689, "Pliers": 2.249, "Scissors": 0.3316, "Bowl": 1.186, "Kettle": 1.013, "Mug": 0.7445, "ToyCar": 1.066
}
cat_to_ho_motion_consistency = {
"Knife": 5.0841, "Bottle": 35.11, "Pliers": 10.86, "Scissors": 3.632, "Bowl": 4.983, "Kettle": 4.687, "Mug": 3.07, "ToyCar": 2.722
}
tot_sum_value = 0.
tot_sum_nns = 0
for cat_nm in cat_to_penetration_depth:
cur_cat_nn = cat_nm_to_objs_nn[cat_nm]
cur_cat_penetration_depth = cat_to_penetration_depth[cat_nm]
cur_cat_tot_pene_depth = cur_cat_penetration_depth * float(cur_cat_nn)
tot_sum_nns += cur_cat_nn
tot_sum_value += cur_cat_tot_pene_depth
avg_pene_depth = tot_sum_value / float(tot_sum_nns)
print(f"Avg_pene_depth: {avg_pene_depth}")
tot_sum_value = 0.
tot_sum_nns = 0
for cat_nm in cat_to_smoothness:
cur_cat_nn = cat_nm_to_objs_nn[cat_nm]
cur_cat_smoothness = cat_to_smoothness[cat_nm]
cur_cat_tot_smoothness = cur_cat_smoothness * float(cur_cat_nn)
tot_sum_nns += cur_cat_nn
tot_sum_value += cur_cat_tot_smoothness
avg_smoothness = tot_sum_value / float(tot_sum_nns)
print(f"Avg_smoothness: {avg_smoothness}")
tot_sum_value = 0.
tot_sum_nns = 0
for cat_nm in cat_to_ho_motion_consistency:
cur_cat_nn = cat_nm_to_objs_nn[cat_nm]
cur_cat_consistency = cat_to_ho_motion_consistency[cat_nm]
cur_cat_consistency = cur_cat_consistency * float(cur_cat_nn)
tot_sum_nns += cur_cat_nn
tot_sum_value += cur_cat_consistency
avg_consistency = tot_sum_value / float(tot_sum_nns)
print(f"Avg_consistency: {avg_consistency}")
# Avg_pene_depth: 87.49058304576144
# Avg_smoothness: 1.241823330832708
# Avg_consistency: 9.74805311327832
def get_obj_name_to_test_seqs():
id2objmeshname = get_idx_to_objname()
test_folder = "/data1/sim/GRAB_processed/test/"
test_folder = "/data1/sim/GRAB_processed/train/"
tot_test_seqs = os.listdir(test_folder)
# tot_test_seq_idxes = [ii for ii in range(246)]
tot_test_seq_idxes = [ii for ii in range(1392)]
test_seq_idx_to_mesh_nm = {}
mesh_nm_to_test_seqs = {}
for cur_test_seq_idx in tot_test_seq_idxes:
cur_test_seq_path = os.path.join(test_folder, f"{cur_test_seq_idx}.npy")
cur_test_seq = np.load(cur_test_seq_path)
object_idx = cur_test_seq['f7'][0].item()
cur_obj_mesh_nm = id2objmeshname[object_idx]
if cur_obj_mesh_nm in mesh_nm_to_test_seqs:
mesh_nm_to_test_seqs[cur_obj_mesh_nm].append(cur_test_seq_idx)
else:
mesh_nm_to_test_seqs[cur_obj_mesh_nm] = [cur_test_seq_idx]
# test_seq_idx_to_mesh_nm[cur_test_seq_idx] = cur_obj_mesh_nm
return mesh_nm_to_test_seqs
# and the test seqs for
# pert_rhand_verts, pert_rhand_verts_lft = load_arctic_clip_data(seq_path, more_pert=False, other_noise=False)
def load_arctic_clip_data(seq_path, more_pert=False, other_noise=False):
rgt_mano_model = get_arctic_mano_model(side='right')
lft_manp_model = get_arctic_mano_model(side='left') ### get mano models ###
grab_path = "/data1/sim/GRAB_extracted" # extracted
split = "test"
# window_size = 60
singe_seq_path = seq_path
clip_clean = np.load(singe_seq_path, allow_pickle=True).item()
c = clip_clean
# subj_root_path = '/data1/sim/GRAB_processed_wsubj'
# subj_seq_path = f"{clip_seq_idx}_subj.npy"
# subj_params_fn = os.path.join(subj_root_path, split, subj_seq_path)
# subj_params = np.load(subj_params_fn, allow_pickle=True).item()
### rot, pose, transl, betas for the rhand pose gt ####
rhand_global_orient_gt, rhand_pose_gt = c["rot_r"], c["pose_r"]
rhand_transl, rhand_betas = c["trans_r"], c["shape_r"][0]
rhand_transl = rhand_transl.reshape(rhand_global_orient_gt.shape[0], -1).astype(np.float32)
rhand_betas = rhand_betas.reshape(-1).astype(np.float32)
rhand_global_orient_var = torch.from_numpy(rhand_global_orient_gt).float()
rhand_pose_var = torch.from_numpy(rhand_pose_gt).float()
rhand_beta_var = torch.from_numpy(rhand_betas).float()
rhand_transl_var = torch.from_numpy(rhand_transl).float() # self.window_size x 3
# R.from_rotvec(obj_rot).as_matrix()
aug_trans, aug_rot, aug_pose = 0.01, 0.05, 0.3
aug_trans, aug_rot, aug_pose = 0.001, 0.05, 0.3
aug_trans, aug_rot, aug_pose = 0.00, 0.00, 0.2
# aug_trans, aug_rot, aug_pose = 0.000, 0.05, 0.3
# aug_trans, aug_rot, aug_pose = 0.000, 0.00, 0.00
## bsz x val_dim -> for each variable here #
aug_global_orient_var = torch.randn_like(rhand_global_orient_var) * aug_rot ### sigma = aug_rot
aug_pose_var = torch.randn_like(rhand_pose_var) * aug_pose ### sigma = aug_pose
aug_transl_var = torch.randn_like(rhand_transl_var) * aug_trans ### sigma = aug_trans
rnd_aug_global_orient_var = rhand_global_orient_var + aug_global_orient_var
rnd_aug_pose_var = rhand_pose_var + aug_pose_var
rnd_aug_transl_var = rhand_transl_var + aug_transl_var ### aug transl
pert_rhand_verts, pert_rhand_joints = rgt_mano_model(
torch.cat([rnd_aug_global_orient_var, rnd_aug_pose_var], dim=-1),
rhand_beta_var.unsqueeze(0).repeat(rhand_global_orient_gt.shape[0], 1).view(-1, 10), rnd_aug_transl_var
)
### rhand_joints: for joints ###
pert_rhand_verts = pert_rhand_verts * 0.001
pert_rhand_joints = pert_rhand_joints * 0.001
### rot, pose, transl, betas for the rhand pose gt ####
rhand_global_orient_gt_lft, rhand_pose_gt_lft = c["rot_l"], c["pose_l"]
rhand_transl_lft, rhand_betas_lft = c["trans_l"], c["shape_l"][0]
rhand_transl_lft = rhand_transl_lft.reshape(rhand_global_orient_gt_lft.shape[0], -1).astype(np.float32)
rhand_betas_lft = rhand_betas_lft.reshape(-1).astype(np.float32)
rhand_global_orient_var_lft = torch.from_numpy(rhand_global_orient_gt_lft).float()
rhand_pose_var_lft = torch.from_numpy(rhand_pose_gt_lft).float()
rhand_beta_var_lft = torch.from_numpy(rhand_betas_lft).float()
rhand_transl_var_lft = torch.from_numpy(rhand_transl_lft).float() # self.window_size x 3
# R.from_rotvec(obj_rot).as_matrix()
# aug_trans, aug_rot, aug_pose = 0.01, 0.05, 0.3
# aug_trans, aug_rot, aug_pose = 0.001, 0.05, 0.3
# aug_trans, aug_rot, aug_pose = 0.000, 0.05, 0.3
# aug_trans, aug_rot, aug_pose = 0.000, 0.00, 0.00
aug_global_orient_var = torch.randn_like(rhand_global_orient_var_lft) * aug_rot ### sigma = aug_rot
aug_pose_var = torch.randn_like(rhand_pose_var_lft) * aug_pose ### sigma = aug_pose
aug_transl_var = torch.randn_like(rhand_transl_var_lft) * aug_trans ### sigma = aug_trans
rnd_aug_global_orient_var_lft = rhand_global_orient_var_lft + aug_global_orient_var
rnd_aug_pose_var_lft = rhand_pose_var_lft + aug_pose_var
rnd_aug_transl_var_lft = rhand_transl_var_lft + aug_transl_var ### aug transl
pert_rhand_verts_lft, pert_rhand_joints_lft = lft_manp_model(
torch.cat([rnd_aug_global_orient_var_lft, rnd_aug_pose_var_lft], dim=-1),
rhand_beta_var_lft.unsqueeze(0).repeat(rhand_global_orient_gt.shape[0], 1).view(-1, 10), rnd_aug_transl_var_lft
)
### rhand_joints: for joints ###
pert_rhand_verts_lft = pert_rhand_verts_lft * 0.001
pert_rhand_joints_lft = pert_rhand_joints_lft * 0.001
return pert_rhand_verts, pert_rhand_verts_lft
# volume rendering and the sdf based rendering -> any differences #
# give a reasonable range for those properties #
# actions - actions #
# from pytorch3d.transforms import matrix_to_axis_angle # mano maodel # # v template # infer from actions for object properties # properties
def get_extracted_data(extracted_data_folder_fn, obj_ty):
# /home/xueyi/sim/arctic/data/arctic_data/data/meta/object_vtemplates
object_mesh_root_fn = "/home/xueyi/sim/arctic/data/arctic_data/data/meta/object_vtemplates"
obj_mesh_fn = os.path.join(object_mesh_root_fn, obj_ty, "mesh.obj")
##
print(f"Start loading form {obj_mesh_fn}")
obj_verts, obj_faces = load_ply_data(obj_mesh_fn)
#
beta_l_fn = "pred.mano.beta.l.pt"
beta_l_fn = os.path.join(extracted_data_folder_fn, beta_l_fn)
beta_r_fn = "pred.mano.beta.r.pt"
beta_r_fn = os.path.join(extracted_data_folder_fn, beta_r_fn)
pose_l_fn = "pred.mano.pose.l.pt"
pose_l_fn = os.path.join(extracted_data_folder_fn, pose_l_fn)
pose_r_fn = "pred.mano.pose.r.pt"
pose_r_fn = os.path.join(extracted_data_folder_fn, pose_r_fn) ## get pose_l and pose_r
trans_l_fn = "pred.mano.cam_t.l.pt"
trans_l_fn = os.path.join(extracted_data_folder_fn, trans_l_fn)
trans_r_fn = "pred.mano.cam_t.r.pt"
trans_r_fn = os.path.join(extracted_data_folder_fn, trans_r_fn)
trans_l = torch.load(trans_l_fn, map_location='cpu')
# print(trans_l.size())
print(f"trans_l: {trans_l.size()}")
pose_l = torch.load(pose_l_fn, map_location='cpu')
pose_l = matrix_to_axis_angle(pose_l)
print(f"pose_l: {pose_l.size()}")
beta_l = torch.load(beta_l_fn, map_location='cpu')
print(f"beta_l: {beta_l.size()}")
### extracted target data ###
def get_extracted_target_data(extracted_data_folder_fn, obj_ty):
# /home/xueyi/sim/arctic/data/arctic_data/data/meta/object_vtemplates
object_mesh_root_fn = "/home/xueyi/sim/arctic/data/arctic_data/data/meta/object_vtemplates"
obj_mesh_fn = os.path.join(object_mesh_root_fn, obj_ty, "mesh.obj")
##
print(f"Start loading form {obj_mesh_fn}")
obj_verts, obj_faces = load_ply_data(obj_mesh_fn)
#targets
beta_l_fn = "targets.mano.beta.l.pt"
beta_l_fn = os.path.join(extracted_data_folder_fn, beta_l_fn)
beta_r_fn = "targets.mano.beta.r.pt"
beta_r_fn = os.path.join(extracted_data_folder_fn, beta_r_fn)
pose_l_fn = "targets.mano.pose.l.pt"
pose_l_fn = os.path.join(extracted_data_folder_fn, pose_l_fn)
pose_r_fn = "targets.mano.pose.r.pt"
pose_r_fn = os.path.join(extracted_data_folder_fn, pose_r_fn) ## get pose_l and pose_r ##
trans_l_fn = "targets.mano.cam_t.l.pt"
trans_l_fn = os.path.join(extracted_data_folder_fn, trans_l_fn)
trans_r_fn = "targets.mano.cam_t.r.pt"
trans_r_fn = os.path.join(extracted_data_folder_fn, trans_r_fn)
trans_l = torch.load(trans_l_fn, map_location='cpu')
# print(trans_l.size())
print(f"trans_l: {trans_l.size()}")
pose_l = torch.load(pose_l_fn, map_location='cpu')
pose_l = matrix_to_axis_angle(pose_l)
print(f"pose_l: {pose_l.size()}")
beta_l = torch.load(beta_l_fn, map_location='cpu')
# pose_r = matrix_to_axis_angle()
print(f"beta_l: {beta_l.size()}")
# 0353.pkl
#
def get_arctic_seq_paths():
processed_arctic_root = "/data/datasets/genn/sim/arctic_processed_data/processed_seqs"
subj_folders = os.listdir(processed_arctic_root)
tot_arctic_seq_paths = []
tot_arctic_seq_tags = []
for cur_subj_folder in subj_folders:
full_cur_subj_folder = os.path.join(processed_arctic_root, cur_subj_folder)
cur_subj_seq_nms = os.listdir(full_cur_subj_folder)
cur_subj_seq_nms = [fn for fn in cur_subj_seq_nms if fn.endswith(".npy")]
for cur_subj_seq_nm in cur_subj_seq_nms:
full_seq_nm = os.path.join(full_cur_subj_folder, cur_subj_seq_nm)
tot_arctic_seq_paths.append(full_seq_nm)
cur_seq_tag = f"{cur_subj_folder}_{cur_subj_seq_nm.split('.')[0]}"
tot_arctic_seq_tags.append(cur_seq_tag)
return tot_arctic_seq_paths, tot_arctic_seq_tags
def filter_arctic_seqs():
arctic_root_path = "/data/datasets/genn/sim/arctic_processed_data/processed_seqs"
sv_path = "/data2/datasets/sim/arctic_processed_data/processed_split_seqs"
valid_st_idxes = f"{sv_path}/valid_st_idxes.npy"
tot_subjs = os.listdir(arctic_root_path)
mano_path = "/data1/sim/mano_models/mano/models"
cur_mano_layer = ManoLayer(
flat_hand_mean=False,
side='right',
mano_root=mano_path, # mano_root #
ncomps=45,
use_pca=False,
)
window_size = 60
step_size = 60
thres = 0.15
subj_to_seq_to_valid_st_idx = {}
for cur_subj in tot_subjs:
cur_subj_folder = os.path.join(arctic_root_path, cur_subj)
cur_subj_sv_folder = os.path.join(sv_path, cur_subj)
os.makedirs(cur_subj_sv_folder, exist_ok=True)
cur_subj_seqs = os.listdir(cur_subj_folder)
seq_to_valid_st_idx = {}
for cur_seq in cur_subj_seqs:
cur_seq_valid_st_idx = []
cur_subj_seq_path = os.path.join(cur_subj_folder, cur_seq)
cur_subj_seq = np.load(cur_subj_seq_path, allow_pickle=True).item()
obj_pc = cur_subj_seq["verts.object"]
rhand_rot, rhand_pose = cur_subj_seq["rot_r"], cur_subj_seq["pose_r"]
rhand_transl, rhand_betas =cur_subj_seq["trans_r"], cur_subj_seq["shape_r"][0]
rhand_betas = rhand_betas.reshape(-1).astype(np.float32)
obj_pc_var = torch.from_numpy(obj_pc).float()
nn_frmaes = obj_pc.shape[0]
rhand_rot_var = torch.from_numpy(rhand_rot).float()
rhand_pose_var = torch.from_numpy(rhand_pose).float()
rhand_beta_var = torch.from_numpy(rhand_betas).float()
rhand_transl_var = torch.from_numpy(rhand_transl).float() # self.window_size x 3
# window_size =
rhand_verts, rhand_joints = cur_mano_layer(
torch.cat([rhand_rot_var, rhand_pose_var], dim=-1),
rhand_beta_var.unsqueeze(0).repeat(nn_frmaes, 1).view(-1, 10), rhand_transl_var
)
### rhand_joints: for joints ###
rhand_verts = rhand_verts * 0.001
rhand_joints = rhand_joints * 0.001
wrist_positions = rhand_joints[:, 0] # nframes x 3
dist_wrist_to_obj_pc = torch.sum(
(wrist_positions.unsqueeze(1) - obj_pc_var) ** 2, dim=-1 ### nn_frames x nn_pc
)
dist_wrist_to_obj_pc, _ = torch.min(dist_wrist_to_obj_pc, dim=-1) ## the wrist to pc ##
for i_split in range(0, nn_frmaes - window_size, step_size):
cur_window_wrist_to_pc = dist_wrist_to_obj_pc[i_split: i_split + window_size] ## windowi_size x 3 #
maxx_dist = torch.max(cur_window_wrist_to_pc).item()
if maxx_dist > thres:
continue
cur_seq_valid_st_idx.append(i_split)
cur_sv_dict = {
'rhand_verts': rhand_verts[i_split: i_split + window_size].detach().cpu().numpy(),
'obj_pc': obj_pc[i_split: i_split + window_size],
}
cur_sv_dict_path = os.path.join(cur_subj_sv_folder, f"{cur_seq.split('.')[0]}_st_{i_split}_ed_{i_split + window_size}.npy")
np.save(cur_sv_dict_path, cur_sv_dict)
seq_to_valid_st_idx[cur_seq] = cur_seq_valid_st_idx
subj_to_seq_to_valid_st_idx[cur_subj] = seq_to_valid_st_idx
np.save(valid_st_idxes, subj_to_seq_to_valid_st_idx)
print(f"valid st idxes saved to {valid_st_idxes}")
def get_valid_seqs_nn():
valid_seqs_fn = "/data2/datasets/sim/arctic_processed_data/processed_split_seqs/valid_st_idxes.npy"
valid_seqs = np.load(valid_seqs_fn, allow_pickle=True).item()
train_nn = 0
for subj in valid_seqs:
cur_subj_to_valid_idxes = valid_seqs[subj]
tot_nn = 0
for seq_nm in cur_subj_to_valid_idxes:
tot_nn += len(cur_subj_to_valid_idxes[seq_nm])
print(f"subj: {subj}, nn: {tot_nn}")
if subj != "s01":
train_nn += tot_nn
print(f"train_nn: {train_nn}")
if __name__=='__main__':
# get_valid_seqs_nn()
# exit(0)
# filter_arctic_seqs()
# exit(0)
tot_arctic_seq_paths, tot_arctic_seq_tags = get_arctic_seq_paths()
tot_arctic_seq_tags_dict = {
idx: seq_tag for idx, seq_tag in enumerate(tot_arctic_seq_tags)
}
# raw_seq_sv_path = os.path.join("/data2/datasets/sim/arctic_save_res", f"arctic_seq_tags_dict.npy")
# if not os.path.exists(raw_seq_sv_path):
# np.save(raw_seq_sv_path, tot_arctic_seq_tags_dict)
# print(f"seq tags dict saved to {raw_seq_sv_path}")
# print(f"{tot_arctic_seq_tags_dict}")
# exit(0)
# extracted_data_folder_fn = "/home/xueyi/sim/arctic/logs/3558f1342/eval/s01_box_grab_01_1/targets"
# obj_ty = "box"
# get_extracted_target_data(extracted_data_folder_fn, obj_ty)
# exit(0)
# extracted_data_folder_fn = "/home/xueyi/sim/arctic/logs/3558f1342/eval/s01_box_grab_01_1/preds"
# obj_ty = "box"
# get_extracted_data(extracted_data_folder_fn, obj_ty)
# exit(0)
# get_cat_avg_values()
# exit(0)
# get_category_nns()
# exit(0)
# pkl_fn = "/data1/sim/oakink/OakInk-Shape/oakink_shape_v2/apple/C90001/0eec013c90/hand_param.pkl"
# test_pickle(pkl_fn)
# test_seq_idx_to_mesh_nm = get_test_idx_to_obj_name()
# print(test_seq_idx_to_mesh_nm)
# test_seq_idx_to_mesh_nm_sv_fn = "test_seq_idx_to_mesh_nm.npy"
# np.save(test_seq_idx_to_mesh_nm_sv_fn, test_seq_idx_to_mesh_nm)
# exit(0)
# mesh_nm_to_test_seqs = get_obj_name_to_test_seqs()
# print(mesh_nm_to_test_seqs)
# train_mesh_nm_to_test_seqs = {}
# test_mesh_nm_to_test_seqs = {}
# for cur_mesh_nm in mesh_nm_to_test_seqs: #
# cur_idxes = mesh_nm_to_test_seqs[cur_mesh_nm]
# cur_idxes_nn = len(cur_idxes)
# train_nns = int(float(cur_idxes_nn) * 0.8)
# test_nns = cur_idxes_nn - train_nns
# train_mesh_nm_to_test_seqs[cur_mesh_nm] = cur_idxes[:train_nns]
# test_mesh_nm_to_test_seqs[cur_mesh_nm] = cur_idxes[train_nns:]
# np.save("train_mesh_nm_to_test_seqs.npy", train_mesh_nm_to_test_seqs)
# np.save("test_mesh_nm_to_test_seqs.npy", test_mesh_nm_to_test_seqs)
# np.save("mesh_nm_to_test_seqs.npy", mesh_nm_to_test_seqs)
# exit(0)
split = 'train' ##
clip_seq_idx = 3
clip_seq_idx = 100
clip_seq_idx = 200
clip_seq_idx = 110
other_noise = True
other_noise = False # other noise #
# split = 'test'
# clip_seq_idx = 3
# clip_seq_idx = 80
# clip_seq_idx = 8
# split = 'test'
# clip_seq_idx = 5
# sepqrate #
# underlying template with some unknown parameters #
# underlying template with some unknown parameters #
# optimize the template to get the parameters #
# optimize the parameters in the template -- the geometry #
# optimize the parameters
# /home/xueyi/sim/motion-diffusion-model/utils/common_tests.py
### get obj data ##
# obj_verts, obj_faces = load_grab_clip_data_clean_obj(clip_seq_idx, more_pert=False, other_noise=False, split=split)
# # load_grab_clip_data_clean_subj(clip_seq_idx, pert=False, more_pert=False, other_noise=False):
# clean_rhand_verts = load_grab_clip_data_clean_subj(clip_seq_idx, pert=False, more_pert=False, other_noise=False, split=split)
# pert_rhand_verts = load_grab_clip_data_clean_subj(clip_seq_idx, pert=True, more_pert=False, other_noise=False, split=split)
## optimize the geometry ## # optimize the geometry #
## ffmpeg -i input -vf "pad=w=iw:h='max(720,ih)':x=0:y=0:color=white" output ##
#### perturb verts for the arctic dataset ###
subj_idx = "s01"
raw_seq_fn = "capsulemachine_use_01"
seq_path = f"/data/datasets/genn/sim/arctic_processed_data/processed_seqs/{subj_idx}/{raw_seq_fn}.npy"
#
subj_idx = "s01"
raw_seq_fn = "box_use_01"
subj_idx = "s01"
raw_seq_fn = "box_use_02"
seq_path = f"/data/datasets/genn/sim/arctic_processed_data/processed_seqs/{subj_idx}/{raw_seq_fn}.npy"
subj_idx = "s01"
raw_seq_fn = "box_use_02"
subj_idx = "s01"
raw_seq_fn = "espressomachine_use_01"
raw_seq_fn = "capsulemachine_grab_01"
raw_seq_fn = "espressomachine_use_02"
# needs train for the spatial diff as wel #
for seq_idx in range(0, 12):
cur_seq_raw_fn = tot_arctic_seq_tags_dict[seq_idx]
subj_idx = cur_seq_raw_fn.split("_")[0]
raw_seq_fn = "_".join(cur_seq_raw_fn.split("_")[1:])
# raw_seq_fn = "capsulemachine_use_01" # raw_seq_fn # # raw seq fn # # raw seq fn #
# raw_seq_fn = "capsulemachine_use_02"
seq_path = f"/data/datasets/genn/sim/arctic_processed_data/processed_seqs/{subj_idx}/{raw_seq_fn}.npy"
### seq_path ###
pert_rhand_verts, pert_rhand_verts_lft = load_arctic_clip_data(seq_path, more_pert=False, other_noise=False) #
cur_seq_pert_verts = {
"pert_rhand_verts": pert_rhand_verts,
"pert_rhand_verts_lft": pert_rhand_verts_lft,
}
sv_path = os.path.join("/data2/datasets/sim/arctic_save_res", f"pert_verts_{subj_idx}_{raw_seq_fn}.npy")
np.save(sv_path, cur_seq_pert_verts)
print(f"pert verts saved to {sv_path}")
exit(0)
### get obj data ##
obj_verts, obj_faces = load_grab_clip_data_clean_obj(clip_seq_idx, more_pert=False, other_noise=other_noise, split=split)
# load_grab_clip_data_clean_subj(clip_seq_idx, pert=False, more_pert=False, other_noise=False):
clean_rhand_verts = load_grab_clip_data_clean_subj(clip_seq_idx, pert=False, more_pert=False, other_noise=other_noise, split=split)
pert_rhand_verts = load_grab_clip_data_clean_subj(clip_seq_idx, pert=True, more_pert=False, other_noise=other_noise, split=split)
cur_clip_obj_hand_data = {
'pert_rhand_verts': pert_rhand_verts,
'clean_rhand_verts': clean_rhand_verts,
'obj_verts': obj_verts,
'obj_faces': obj_faces,
}
sv_dict_fn = f"tmp_sv_dict_grab_split_{split}_seq_{clip_seq_idx}.npy"
np.save(sv_dict_fn, cur_clip_obj_hand_data)
print(f"data with clip obj and subj saved to {sv_dict_fn}")
exit(0)
test_seq = 2
test_seq = 4
test_seq = 40
test_seq = 55
test_seq = 8
test_seq = 80
test_seq = 23
test_seq = 5
test_seq = 38
test_seq = 41
test_seq = 119
test_seq = 149
test_seq = 98
test_seq = 1
test_seq = 2
test_seq = 80
test_seq = 5
test_seq = 23
other_noise = True
pert_rhand_verts = load_grab_clip_data(test_seq, other_noise=other_noise)
pert_rhand_verts_more = load_grab_clip_data(test_seq, more_pert=True, other_noise=other_noise)
pert_rhand_verts = pert_rhand_verts.detach().cpu().numpy()
pert_rhand_verts_more = pert_rhand_verts_more.detach().cpu().numpy()
sv_dict = {
'pert_rhand_verts': pert_rhand_verts,
'pert_rhand_verts_more': pert_rhand_verts_more
}
sv_dict_fn = f"tmp_sv_dict_pert_grab_seq_{test_seq}_other_noise_{other_noise}.npy"
np.save(sv_dict_fn, sv_dict)
print(f"pert rhand verts saved to {sv_dict_fn}")
exit(0)
# RIGHT_HAND_POSE_ROOT = /data1/sim/handpose/refinehandpose_right
# SERVER_DATA_ROOT = /share/datasets/HOI4D_overall/
sv_dict_fn = "/data1/sim/HOI_Processed_Data_Arti/case7/meta_data.npy"
sv_dict_fn = "/data1/sim/HOI_Processed_Data_Arti/case70/meta_data.npy"
sv_dict_fn = "/data1/sim/HOI_Processed_Data_Arti/case175/meta_data.npy"
sv_dict_fn = "/data1/sim/HOI_Processed_Data_Arti/case174/meta_data.npy"
sv_dict_fn = "/data1/sim/HOI_Processed_Data_Arti/case173/meta_data.npy"
# /data1/sim/HOI_Processed_Data_Arti/case194
sv_dict_fn = "/data1/sim/HOI_Processed_Data_Arti/case194/meta_data.npy"
sv_dict_fn = "/data2/sim/HOI_Processed_Data_Arti/Scissors/Scissors/case47/meta_data.npy"
# /data2/sim/HOI_Processed_Data_Arti #
# get_meta_info(sv_dict_fn)
# exit(0)
tot_case_flag = []
##### Bucket #####
# ['ZY20210800001/H1/C8/N11/S73/s01/T1', 'ZY20210800001/H1/C8/N12/S73/s01/T1', 'ZY20210800001/H1/C8/N13/S73/s02/T1', 'ZY20210800001/H1/C8/N13/S73/s02/T2', 'ZY20210800001/H1/C8/N14/S73/s02/T2', 'ZY20210800001/H1/C8/N15/S73/s03/T2', 'ZY20210800001/H1/C8/N19/S74/s02/T1', 'ZY20210800001/H1/C8/N21/S74/s03/T2', 'ZY20210800001/H1/C8/N23/S76/s01/T2', 'ZY20210800001/H1/C8/N24/S76/s02/T2', 'ZY20210800001/H1/C8/N25/S76/s02/T1', 'ZY20210800001/H1/C8/N25/S76/s02/T2', 'ZY20210800001/H1/C8/N26/S76/s03/T1', 'ZY20210800001/H1/C8/N28/S78/s01/T2', 'ZY20210800001/H1/C8/N29/S77/s05/T1', 'ZY20210800001/H1/C8/N31/S77/s04/T1', 'ZY20210800001/H1/C8/N31/S77/s04/T2', 'ZY20210800001/H1/C8/N32/S77/s03/T1', 'ZY20210800001/H1/C8/N32/S77/s03/T2', 'ZY20210800001/H1/C8/N33/S77/s03/T1', 'ZY20210800001/H1/C8/N33/S77/s03/T2', 'ZY20210800001/H1/C8/N34/S77/s04/T1', 'ZY20210800001/H1/C8/N34/S77/s04/T2', 'ZY20210800001/H1/C8/N40/S77/s01/T2', 'ZY20210800001/H1/C8/N41/S77/s02/T2', 'ZY20210800002/H2/C8/N11/S80/s01/T1', 'ZY20210800002/H2/C8/N11/S80/s01/T2', 'ZY20210800002/H2/C8/N12/S80/s01/T1', 'ZY20210800002/H2/C8/N12/S80/s01/T2', 'ZY20210800002/H2/C8/N13/S80/s02/T1', 'ZY20210800002/H2/C8/N13/S80/s02/T2', 'ZY20210800002/H2/C8/N14/S80/s02/T1', 'ZY20210800002/H2/C8/N15/S80/s03/T1', 'ZY20210800002/H2/C8/N15/S80/s03/T2', 'ZY20210800003/H3/C8/N38/S74/s02/T2', 'ZY20210800003/H3/C8/N39/S74/s02/T1', 'ZY20210800003/H3/C8/N42/S74/s04/T1', 'ZY20210800004/H4/C8/N12/S71/s02/T1', 'ZY20210800004/H4/C8/N12/S71/s02/T2', 'ZY20210800004/H4/C8/N13/S71/s02/T1', 'ZY20210800004/H4/C8/N14/S71/s03/T1', 'ZY20210800004/H4/C8/N14/S71/s03/T2']
# T2: 10 - 70
# st_idx = 8
# ed_idx = 12
# st_idx = 14
# ed_idx = 15
# cat_nm = "Scissors"
# cat_nm = "Pliers"
# cat_ty = "Arti"
# cat_nm = "ToyCar"
# cat_ty = "Rigid"
# st_idx = 0
# ed_idx = 4
# use_toch = True
# # use_toch = False
# cat_nm = "Bottle"
# cat_ty = "Rigid"
# test_tag = "rep_res_jts_hoi4d_bottle_t_300_st_idx_0_"
# st_idx = 1
# ed_idx = 4
# get_setting_to_stats(st_idx, ed_idx, use_toch=use_toch)
# exit(0)
# 154
# for case_idx in range(92):
# for case_idx in range(42):
# for case_idx in range(187): # jpliers
# for case_idx in range(154): #
# try:
# print(f"Case idx: {case_idx}")
# # sv_dict_fn = f"/data2/sim/HOI_Processed_Data_Arti/Scissors/Scissors/case{case_idx}/meta_data.npy"
# # sv_dict_fn = f"/data2/sim/HOI_Processed_Data_Arti/Bucket/case{case_idx}/meta_data.npy"
# # sv_dict_fn = f"/data2/sim/HOI_Processed_Data_Arti/Pliers/case{case_idx}/meta_data.npy"
# sv_dict_fn = f"/data2/sim/HOI_Processed_Data_Arti/Laptop/case{case_idx}/meta_data.npy"
# # sv_dict_fn = f"/data2/sim/HOI_Processed_Data_Rigid/Mug/case{case_idx}/meta_data.npy"
# cur_case_flag = get_meta_info(sv_dict_fn)
# tot_case_flag.append(cur_case_flag)
# except:
# continue
# print(f"tot_case_flase")
# print(tot_case_flag)
# exit(0)
i_test_seq = 0
test_tag = "jts_hoi4d_arti_t_400_"
test_tag = "rep_res_jts_hoi4d_arti_scissors_t_400_"
test_tag = "rep_res_jts_hoi4d_toycar_t_300_st_idx_0_"
start_idx = 50
ws = 60
st_idx = 0
ed_idx = 44
st_idx = 8
ed_idx = 12
st_idx = 12
ed_idx = 15
cat_nm = "Scissors"
cat_nm = "Pliers"
cat_ty = "Arti"
cat_nm = "ToyCar"
cat_ty = "Rigid"
st_idx = 0
ed_idx = 4
cat_nm = "Pliers"
cat_ty = "Arti"
test_tag = "rep_res_jts_hoi4d_pliers_t_300_st_idx_30_"
st_idx = 1
ed_idx = 2
cat_nm = "Bottle"
cat_ty = "Rigid"
test_tag = "rep_res_jts_hoi4d_bottle_t_300_st_idx_0_"
st_idx = 0
ed_idx = 5
cat_nm = "Scissors"
cat_ty = "Arti"
test_tag = "rep_res_jts_hoi4d_bottle_t_300_st_idx_0_"
test_tag = "rep_res_jts_hoi4d_arti_scissors_t_300_st_idx_30_"
test_tag = "rep_res_jts_hoi4d_arti_scissors_t_300_st_idx_0_"
st_idx = 11
ed_idx = 12
cat_nm = "Knife"
cat_ty = "Rigid"
test_tag = "rep_res_jts_hoi4d_knife_t_300_st_idx_0_"
st_idx = 0
ed_idx = 8
cat_nm = "Chair"
cat_ty = "Rigid"
test_tag = "rep_res_jts_hoi4d_chair_t_300_st_idx_0_"
st_idx = 0
ed_idx = 8
# st_idx = 2
# ed_idx = 3
# seq_idx_to_setting_to_stats = {} ## get test settings to statistics
for i_test_seq in range(st_idx, ed_idx):
### ours ### # get_test_settings_to_statistics
cur_seq_setting_to_stats = get_test_settings_to_statistics(i_test_seq, test_tag, start_idx=start_idx, ws=ws)
# # seq_idx_to_setting_to_stats[i_test_seq] = cur_seq_setting_to_stats
cur_stats_sv_fn = f"/data2/sim/eval_save/HOI_{cat_ty}/{cat_nm}/setting_to_stats_seq_{i_test_seq}.npy"
np.save(cur_stats_sv_fn, cur_seq_setting_to_stats)
print(f"Setting to stats file saved to {cur_stats_sv_fn}")
# # (0.0016338544664904475, 1.5728545577076147e-06, 3.436529596001492e-06)
# (0.0017392054433003068, 4.550241555989487e-06, 7.405976703012129e-06))
# (0, 0.005, False), (0.0017126222373917699, 3.0001126560819102e-06, 6.4585701693431474e-06))
# knife
# ours
# i_test_seq: 2, seed: 0, dist_thres: 0.001, with_proj: True, penetration_depth: 1.5044701285660267e-05, smoothness: 1.232047111443535e-06, cur_moving_consistency: 5.0841890697483905e-06
# toch
# i_test_seq: 2, seed: 0, dist_thres: 0.005, with_proj: True, penetration_depth: 0.002956472337245941, smoothness: 9.885283361654729e-05, cur_moving_consistency: 2.0896763089695014e-05
### toch ###
# use_toch = True
# try:
# cur_seq_setting_to_stats = get_test_settings_to_statistics(i_test_seq, test_tag, start_idx=start_idx, ws=ws, use_toch=use_toch)
# # seq_idx_to_setting_to_stats[i_test_seq] = cur_seq_setting_to_stats
# cur_stats_sv_fn = f"/data2/sim/eval_save/HOI_{cat_ty}/{cat_nm}/setting_to_stats_seq_{i_test_seq}_toch.npy"
# np.save(cur_stats_sv_fn, cur_seq_setting_to_stats)
# print(f"Setting to stats file saved to {cur_stats_sv_fn}")
# except:
# continue
# /data2/sim/eval_save/HOI_Arti/Scissors
### stats to saved fn
# seq_idx_to_setting_to_stats_sv_fn = f"/data2/sim/eval_save/HOI_Arti/Scissors/seq_idx_to_setting_to_stats_v2_basepts.npy"
# np.save(seq_idx_to_setting_to_stats_sv_fn, seq_idx_to_setting_to_stats)
# print(f"seq_idx_to_setting_to_stats saved to {seq_idx_to_setting_to_stats_sv_fn}")
exit(0)
# th_sv_fn = "/home/xueyi/sim/MeshDiffusion/nvdiffrec/dmtet_results/tets/dmt_dict_00000.pt"
# dmt_dict_00000_res_128.pt
# th_sv_fn = "/home/xueyi/sim/MeshDiffusion/nvdiffrec/dmtet_results/tets/dmt_dict_00000_res_128.pt"
# th_sv_fn = "/home/xueyi/sim/MeshDiffusion/nvdiffrec/dmtet_results_seq/tets/dmt_dict_00002.pt"
# load_data_fr_th_sv(th_sv_fn, grid_res=128)
# rendering gpus,
# incorporate dynamics into the process # th_sv_fn # # th_sv_fn #
# dneoise accleration and
# representations, voxels,
th_sv_fn = "/data2/sim/implicit_ae/logging/00041-stylegan2-rendering-gpus1-batch4-gamma80/out_iter_2_batch_5.npy"
th_sv_fn = "/data2/sim/implicit_ae/logging/00045-stylegan2-rendering-gpus1-batch4-gamma80/out_iter_3_batch_0.npy"
th_sv_fn = "/data2/sim/implicit_ae/logging/00050-stylegan2-rendering-gpus1-batch4-gamma80/out_iter_23_batch_0.npy"
th_sv_fn = "/data2/sim/implicit_ae/logging/00050-stylegan2-rendering-gpus1-batch4-gamma80/out_iter_56_batch_0.npy"
th_sv_fn = "/data2/sim/implicit_ae/logging/00052-stylegan2-rendering-gpus1-batch4-gamma80/out_iter_39_batch_0_nreg.npy"
th_sv_fn = "/data2/sim/implicit_ae/logging/00054-stylegan2-rendering-gpus1-batch4-gamma80/out_iter_22_batch_0_nreg.npy"
th_sv_fn = "/data2/sim/implicit_ae/logging/00065-stylegan2-rendering-gpus1-batch4-gamma80/out_iter_63_batch_0_nreg.npy"
th_sv_fn = "/data2/sim/implicit_ae/logging/00065-stylegan2-rendering-gpus1-batch4-gamma80/out_iter_9420_batch_0_nreg.npy"
load_data_fr_th_sv_fr_pred(th_sv_fn, grid_res=128)
exit(0)
# meta_data.npy
# rt_path = "/data1/sim/mdm/tmp_data/case5"
# load_and_save_verts(rt_path)
rt_path = "/home/xueyi/sim/motion-diffusion-model/predicted_infos_fn_to_statistics.npy"
get_penetration_depth_rnk_data(rt_path)