meow
a
710e818
raw
history blame
7.96 kB
import os
import sys
sys.path.append('.')
import pickle
import numpy as np
# import open3d as o3d
import torch
# import json
from tqdm import tqdm
import traceback
from manopth.manolayer import ManoLayer
# from utils.hoi_io2 import get_num_frame_v2
from utils.organize_dataset import load_sequence_names_from_organized_record, txt2intrinsic, load_simplied_nokov_objs_mesh, load_organized_mano_info, load_dates_from_organized_record
def load_objs_orientation(root, video_id, frame_list = None):
'''
return: tool_pose_batch, obj_pose_batch
'''
date = video_id[:8]
original_nokov_data_dir = os.path.join(root, date, video_id, 'nokov')
assert os.path.exists(original_nokov_data_dir)
nokov_data_filenames = os.listdir(original_nokov_data_dir)
if frame_list is not None:
frame_idx_list = [(int(frame)-1) for frame in frame_list]
tool_id = nokov_data_filenames[0].split("_")[1] # obj1
obj_id = nokov_data_filenames[0].split("_")[2] # obj2
tool_pose_path = os.path.join(root, 'HO_poses', date, video_id, 'objpose', f'{tool_id}.npy')
assert os.path.exists(tool_pose_path)
if frame_list is None:
tool_pose_batch = torch.from_numpy(np.load(tool_pose_path))
else:
tool_pose_batch = torch.from_numpy(np.load(tool_pose_path))[frame_idx_list, ...]
obj_pose_path = os.path.join(root, 'HO_poses', date, video_id, 'objpose', f'{obj_id}.npy')
assert os.path.exists(obj_pose_path)
if frame_list is None:
obj_pose_batch = torch.from_numpy(np.load(obj_pose_path))
else:
obj_pose_batch = torch.from_numpy(np.load(obj_pose_path))[frame_idx_list, ...]
return tool_pose_batch, obj_pose_batch
if __name__ == '__main__':
# date_list = ['20230930']
device = 'cuda:0'
root = '/data3/hlyang/results'
upload_root = '/data3/hlyang/HOI-mocap'
nokov_root = upload_root
dataset_root = os.path.join(root, 'dataset')
hand_pose_organized_record_path = os.path.join(dataset_root, 'organized_record.txt')
date_list = load_dates_from_organized_record(hand_pose_organized_record_path)
# save_root = '/data3/hlyang/results/test_data'
save_root = '/data3/datasets/xueyi/taco/processed_data'
mano_path = "/data1/xueyi/mano_models/mano/models"
for date in date_list:
video_list = load_sequence_names_from_organized_record(hand_pose_organized_record_path, date)
for video_id in tqdm(video_list):
try:
save_dir = os.path.join(save_root, date)
os.makedirs(save_dir, exist_ok=True)
(right_hand_pose, right_hand_trans, right_hand_shape) = load_organized_mano_info(dataset_root, date, video_id, frame_list = None, right_hand_bool=True)
(left_hand_pose, left_hand_trans, left_hand_shape) = load_organized_mano_info(dataset_root, date, video_id, frame_list = None, right_hand_bool=False)
tool_verts_batch, tool_faces, obj_verts_batch, obj_faces = load_simplied_nokov_objs_mesh(nokov_root, video_id, frame_list = None, use_cm = True)
tool_pose_batch, obj_pose_batch = load_objs_orientation(nokov_root, video_id, frame_list = None)
batch_size = right_hand_pose.shape[0]
if right_hand_shape is not None and left_hand_shape is not None:
use_shape = True
else:
use_shape = False
right_hand_pose = right_hand_pose.to(device)
right_hand_trans = right_hand_trans.to(device)
left_hand_pose = left_hand_pose.to(device)
left_hand_trans = left_hand_trans.to(device)
tool_verts_batch = tool_verts_batch.to(device)
obj_verts_batch = obj_verts_batch.to(device)
if use_shape:
right_hand_shape = right_hand_shape.to(device)
left_hand_shape = left_hand_shape.to(device)
# get hand meshes
use_pca = False
ncomps = 45
left_hand_mano_layer = ManoLayer(mano_root=mano_path, use_pca=use_pca, ncomps=ncomps, side='left', center_idx = 0).to(device)
right_hand_mano_layer = ManoLayer(mano_root=mano_path, use_pca=use_pca, ncomps=ncomps, side='right', center_idx = 0).to(device)
with torch.no_grad():
if use_shape:
right_hand_verts, _ = right_hand_mano_layer(right_hand_pose, right_hand_shape.unsqueeze(0).expand(batch_size, -1))
else:
right_hand_verts, _ = right_hand_mano_layer(right_hand_pose)
right_hand_verts = right_hand_verts
right_hand_verts = right_hand_verts / 1000.0
right_hand_verts += right_hand_trans.unsqueeze(1)
if use_shape:
left_hand_verts, _ = left_hand_mano_layer(left_hand_pose, left_hand_shape.unsqueeze(0).expand(batch_size, -1))
else:
left_hand_verts, _ = left_hand_mano_layer(left_hand_pose)
left_hand_verts = left_hand_verts
left_hand_verts = left_hand_verts / 1000.0
left_hand_verts += left_hand_trans.unsqueeze(1)
# left hand
hand_pose = left_hand_pose.cpu().numpy()
hand_trans = left_hand_trans.cpu().numpy()
if use_shape:
hand_shape = left_hand_shape.cpu().numpy()
else:
hand_shape = torch.zeros(10).cpu().numpy()
hand_verts = left_hand_verts.cpu().numpy()
hand_faces = left_hand_mano_layer.th_faces.cpu().numpy()
obj_verts = obj_verts_batch.cpu().numpy()
obj_faces = obj_faces.cpu().numpy()
#
rgt_hand_pose = right_hand_pose.cpu().numpy()
rgt_hand_trans = right_hand_trans.cpu().numpy()
if use_shape:
rgt_hand_shape = right_hand_shape.cpu().numpy()
else:
rgt_hand_shape = torch.zeros(10).cpu().numpy()
rgt_hand_verts = right_hand_verts.cpu().numpy()
rgt_hand_faces = right_hand_mano_layer.th_faces.cpu().numpy()
rgt_obj_verts = tool_verts_batch.cpu().numpy()
rgt_obj_faces = tool_faces.cpu().numpy()
# print(hand_verts.shape, hand_faces.shape, obj_verts.shape, obj_faces.shape)
save_path = os.path.join(save_dir, f'right_{video_id}.pkl')
# save_data = {
# 'hand_pose': hand_pose, 'hand_trans': hand_trans, 'hand_shape': hand_shape, 'hand_verts': hand_verts, 'hand_faces': hand_faces, 'obj_verts': obj_verts, 'obj_faces': obj_faces, 'obj_pose': obj_pose_batch.cpu().numpy(),
# }
save_data = {
'hand_pose': rgt_hand_pose, 'hand_trans': rgt_hand_trans, 'hand_shape': rgt_hand_shape, 'hand_verts': rgt_hand_verts, 'hand_faces': rgt_hand_faces, 'obj_verts': rgt_obj_verts, 'obj_faces': rgt_obj_faces, 'obj_pose': tool_pose_batch.cpu().numpy(),
}
# print(save_data['hand_pose'].shape, save_data['hand_trans'].shape, save_data['hand_shape'].shape, save_data['hand_verts'].shape, save_data['hand_faces'].shape, save_data['obj_verts'].shape, save_data['obj_faces'].shape, save_data['obj_pose'].shape)
pickle.dump(save_data, open(save_path, 'wb'))
except Exception as err:
traceback.print_exc()
print(err)
continue