add pre hi4d

This commit is contained in:
shuaiqing 2023-07-06 22:02:44 +08:00
parent ad0791fac6
commit 9a7d2c897b
2 changed files with 171 additions and 0 deletions

View File

@ -81,8 +81,21 @@ if __name__ == '__main__':
p = create_pcd(points, colors=data[:, 3:])
grids.append(p)
elif pcd.endswith('.ply'):
print('Load pcd: ', pcd)
p = o3d.io.read_point_cloud(pcd)
print(p)
grids.append(p)
elif pcd.endswith('.pkl'):
p = o3d.io.read_triangle_mesh(pcd)
grids.append(p)
elif pcd.endswith('.obj'):
p = o3d.io.read_triangle_mesh(pcd)
vertices = np.asarray(p.vertices)
print(vertices.shape)
print(vertices.min(axis=0))
print(vertices.max(axis=0))
grids.append(p)
center = o3d.geometry.TriangleMesh.create_coordinate_frame(
size=1, origin=[0, 0, 0])
grids.append(center)
@ -91,6 +104,7 @@ if __name__ == '__main__':
for ic, (cam, camera) in enumerate(cameras.items()):
if len(args.subs) > 0 and cam not in args.subs:continue
center = - camera['R'].T @ camera['T']
print('{}: {}'.format(cam, center.T[0]))
camera_locations.append(center)
center = o3d.geometry.TriangleMesh.create_coordinate_frame(
size=0.5, origin=[center[0, 0], center[1, 0], center[2, 0]])

157
scripts/dataset/pre_hi4d.py Normal file
View File

@ -0,0 +1,157 @@
import os
import shutil
import numpy as np
import cv2
import open3d as o3d
from os.path import join
from os.path import join
from glob import glob
from tqdm import tqdm
from easymocap.mytools.file_utils import read_json, write_keypoints3d, write_vertices, write_smpl
# Input and output path
database = '/nas/home/shuaiqing/datasets/HI4D'
outdatabase = '/nas/home/shuaiqing/datasets/HI4D_easymocap'
# After convering, use
# python3 apps/calibration/vis_camera_by_open3d.py ${data} --pcd ${data}/mesh-test.obj
# for visualization
seqlist = [
'pair10/dance10',
'pair32/pose32',
# 'pair09/hug09',
# 'pair00/fight00',
# 'pair00/hug00',
# 'pair12/fight12',
# 'pair12/hug12',
# 'pair14/dance14',
# 'pair28/dance28',
# 'pair32/pose32',
# 'pair37/pose37',
]
from easymocap.bodymodel.smpl import SMPLModel
body_model = SMPLModel(
model_path='data/bodymodels/SMPL_python_v.1.1.0/smpl/models/basicmodel_neutral_lbs_10_207_0_v1.1.0.pkl',
device = 'cuda',
regressor_path = 'data/smplx/J_regressor_body25.npy',
NUM_SHAPES = 10,
use_pose_blending =True
)
for seq in seqlist:
root = join(database, seq)
outroot = join(outdatabase, seq.replace('/', '_'))
cameraname = join(root, 'cameras', 'rgb_cameras.npz')
cameras = dict(np.load(cameraname))
cameras_out = {}
for i, cam in enumerate(cameras['ids']):
K = cameras['intrinsics'][i]
dist = cameras['dist_coeffs'][i:i+1]
RT = cameras['extrinsics'][i]
R = RT[:3, :3]
T = RT[:3, 3:]
cameras_out[str(cam)] = {
'K': K,
'dist': dist,
'R': R,
'T': T
}
# 绕x轴转90度
center = - R.T @ T
print(cam, center.T[0])
cameras = cameras_out
meshanme = sorted(glob(join(root, 'frames', '*.obj')))[0]
mesh = o3d.io.read_triangle_mesh(meshanme)
vertices = np.asarray(mesh.vertices)
R_global = cv2.Rodrigues(np.array([np.pi/2, 0, 0]))[0]
vertices_R = vertices @ R_global.T
z_min = np.min(vertices_R[:, 2])
T_global = np.array([0, 0, -z_min]).reshape(3, 1)
vertices_RT = vertices_R + T_global.T
mesh.vertices = o3d.utility.Vector3dVector(vertices_RT)
for key, cam in cameras.items():
cam['R'] = cam['R'] @ R_global.T
cam.pop('Rvec', '')
center = - cam['R'].T @ cam['T']
newcenter = center + T_global
newT = -cam['R'] @ newcenter
cam['T'] = newT
center = - cam['R'].T @ cam['T']
print(center.T)
from easymocap.mytools.camera_utils import write_camera
write_camera(cameras, outroot)
o3d.io.write_triangle_mesh(join(outroot, 'mesh-test.obj'), mesh)
regressor = np.load('data/smplx/J_regressor_body25.npy')
filenames = sorted(glob(join(root, 'smpl', '*.npz')))
for filename in tqdm(filenames):
data = dict(np.load(filename))
vertices = data['verts']
vertices = vertices @ R_global.T + T_global.T
joints = np.matmul(regressor[None], vertices)
# 绕x轴旋转90度
results = [{
'id': 0,
'keypoints3d': joints[0]
},
{
'id': 1,
'keypoints3d': joints[1]
}]
outname = join(outroot, 'body25', os.path.basename(filename).replace('.npz', '.json'))
if not os.path.exists(outname):
write_keypoints3d(outname, results)
results = [{
'id': 0,
'vertices': vertices[0]
},
{
'id': 1,
'vertices': vertices[1]
}]
outname = join(outroot, 'vertices-gt', os.path.basename(filename).replace('.npz', '.json'))
if not os.path.exists(outname):
write_vertices(outname, results)
params0 = {
'poses': np.hstack([data['global_orient'][0], data['body_pose'][0]]),
'shapes': data['betas'][0],
'Th': data['transl'][0]
}
params1 = {
'poses': np.hstack([data['global_orient'][1], data['body_pose'][1]]),
'shapes': data['betas'][1],
'Th': data['transl'][1]
}
outname = join(outroot, 'smpl-gt', os.path.basename(filename).replace('.npz', '.json'))
if not os.path.exists(outname) or True:
params = [params0, params1]
for i, param in enumerate(params):
for key in param.keys():
param[key] = param[key][None]
param['Rh'] = np.zeros_like(param['Th'])
param = body_model.convert_from_standard_smpl(param)
Rold = cv2.Rodrigues(param['Rh'])[0]
Told = param['Th']
Rnew = R_global @ Rold
Tnew = (R_global @ Told.T + T_global).T
param['Rh'] = cv2.Rodrigues(Rnew)[0].reshape(1, 3)
param['Th'] = Tnew.reshape(1, 3)
param['id'] = i
params[i] = param
write_smpl(outname, params)
if not os.path.exists(join(outroot, 'images')):
shutil.copytree(join(root, 'images'), join(outroot, 'images'))