add pre hi4d
This commit is contained in:
parent
ad0791fac6
commit
9a7d2c897b
@ -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
157
scripts/dataset/pre_hi4d.py
Normal 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'))
|
Loading…
Reference in New Issue
Block a user