NeuralBody / tools /process_snapshot.py
pengsida
initial commit
1ba539f
raw
history blame
3.9 kB
import pickle
import os
import h5py
import sys
import numpy as np
import open3d as o3d
from snapshot_smpl.smpl import Smpl
import cv2
import tqdm
def read_pickle(pkl_path):
with open(pkl_path, 'rb') as f:
u = pickle._Unpickler(f)
u.encoding = 'latin1'
return u.load()
def get_KRTD(camera):
K = np.zeros([3, 3])
K[0, 0] = camera['camera_f'][0]
K[1, 1] = camera['camera_f'][1]
K[:2, 2] = camera['camera_c']
K[2, 2] = 1
R = np.eye(3)
T = np.zeros([3])
D = camera['camera_k']
return K, R, T, D
def get_o3d_mesh(vertices, faces):
mesh = o3d.geometry.TriangleMesh()
mesh.vertices = o3d.utility.Vector3dVector(vertices)
mesh.triangles = o3d.utility.Vector3iVector(faces)
mesh.compute_vertex_normals()
return mesh
def get_smpl(base_smpl, betas, poses, trans):
base_smpl.betas = betas
base_smpl.pose = poses
base_smpl.trans = trans
vertices = np.array(base_smpl)
faces = base_smpl.f
mesh = get_o3d_mesh(vertices, faces)
return vertices, mesh
def render_smpl(mesh, img, K, R, T):
vertices = np.array(mesh.vertices)
rendered_img = renderer.render_multiview(vertices, K[None], R[None],
T[None, None], [img])[0]
return rendered_img
def extract_image(data_path):
data_root = os.path.dirname(data_path)
img_dir = os.path.join(data_root, 'image')
os.system('mkdir -p {}'.format(img_dir))
if len(os.listdir(img_dir)) >= 200:
return
cap = cv2.VideoCapture(data_path)
ret, frame = cap.read()
i = 0
while ret:
cv2.imwrite(os.path.join(img_dir, '{}.jpg'.format(i)), frame)
ret, frame = cap.read()
i = i + 1
cap.release()
def extract_mask(masks, mask_dir):
if len(os.listdir(mask_dir)) >= len(masks):
return
for i in tqdm.tqdm(range(len(masks))):
mask = masks[i].astype(np.uint8)
# erode the mask
border = 4
kernel = np.ones((border, border), np.uint8)
mask = cv2.erode(mask.copy(), kernel)
cv2.imwrite(os.path.join(mask_dir, '{}.png'.format(i)), mask)
data_root = 'data/people_snapshot'
videos = ['female-3-casual']
model_paths = [
'basicModel_f_lbs_10_207_0_v1.0.0.pkl',
'basicmodel_m_lbs_10_207_0_v1.0.0.pkl'
]
for video in videos:
camera_path = os.path.join(data_root, video, 'camera.pkl')
camera = read_pickle(camera_path)
K, R, T, D = get_KRTD(camera)
# process video
video_path = os.path.join(data_root, video, video + '.mp4')
extract_image(video_path)
# process mask
mask_path = os.path.join(data_root, video, 'masks.hdf5')
masks = h5py.File(mask_path)['masks']
mask_dir = os.path.join(data_root, video, 'mask')
os.system('mkdir -p {}'.format(mask_dir))
extract_mask(masks, mask_dir)
smpl_path = os.path.join(data_root, video, 'reconstructed_poses.hdf5')
smpl = h5py.File(smpl_path)
betas = smpl['betas']
pose = smpl['pose']
trans = smpl['trans']
pose = pose[len(pose) - len(masks):]
trans = trans[len(trans) - len(masks):]
# process smpl parameters
params = {'beta': np.array(betas), 'pose': pose, 'trans': trans}
params_path = os.path.join(data_root, video, 'params.npy')
np.save(params_path, params)
if 'female' in video:
model_path = model_paths[0]
else:
model_path = model_paths[1]
model_data = read_pickle(model_path)
img_dir = os.path.join(data_root, video, 'image')
vertices_dir = os.path.join(data_root, video, 'vertices')
os.system('mkdir -p {}'.format(vertices_dir))
num_img = len(os.listdir(img_dir))
for i in tqdm.tqdm(range(num_img)):
base_smpl = Smpl(model_data)
vertices, mesh = get_smpl(base_smpl, betas, pose[i], trans[i])
np.save(os.path.join(vertices_dir, '{}.npy'.format(i)), vertices)