Spaces:
Runtime error
Runtime error
# -*- coding: utf-8 -*- | |
# Max-Planck-Gesellschaft zur Förderung der Wissenschaften e.V. (MPG) is | |
# holder of all proprietary rights on this computer program. | |
# You can only use this computer program if you have closed | |
# a license agreement with MPG or you get the right to use the computer | |
# program from someone who is authorized to grant you that right. | |
# Any use of the computer program without a valid license is prohibited and | |
# liable to prosecution. | |
# | |
# Copyright©2020 Max-Planck-Gesellschaft zur Förderung | |
# der Wissenschaften e.V. (MPG). acting on behalf of its Max Planck Institute | |
# for Intelligent Systems. All rights reserved. | |
# | |
# Contact: Vassilis Choutas, [email protected] | |
import os | |
import os.path as osp | |
import sys | |
import pickle | |
import numpy as np | |
import open3d as o3d | |
import torch | |
from loguru import logger | |
from tqdm import tqdm | |
from SMPLX.smplx import build_layer | |
from SMPLX.transfer_model.config import parse_args | |
from SMPLX.transfer_model.data import build_dataloader | |
from SMPLX.transfer_model.transfer_model import run_fitting | |
from SMPLX.transfer_model.utils import read_deformation_transfer, np_mesh_to_o3d | |
def trans_one_sequence(): | |
exp_cfg = parse_args() | |
if torch.cuda.is_available() and exp_cfg["use_cuda"]: | |
device = torch.device('cuda') | |
else: | |
device = torch.device('cpu') | |
if exp_cfg["use_cuda"]: | |
if input("use_cuda=True and GPU is not available, using CPU instead," | |
" would you like to continue? (y/n)") != "y": | |
sys.exit(3) | |
logger.remove() | |
logger.add( | |
lambda x: tqdm.write(x, end=''), level=exp_cfg.logger_level.upper(), | |
colorize=True) | |
output_folder = osp.expanduser(osp.expandvars(exp_cfg.output_folder)) | |
logger.info(f'Saving output to: {output_folder}') | |
os.makedirs(output_folder, exist_ok=True) | |
model_path = exp_cfg.body_model.folder | |
body_model = build_layer(model_path, **exp_cfg.body_model) | |
logger.info(body_model) | |
body_model = body_model.to(device=device) | |
deformation_transfer_path = exp_cfg.get('deformation_transfer_path', '') | |
def_matrix = read_deformation_transfer( | |
deformation_transfer_path, device=device) | |
# Read mask for valid vertex ids | |
mask_ids_fname = osp.expandvars(exp_cfg.mask_ids_fname) | |
mask_ids = None | |
if osp.exists(mask_ids_fname): | |
logger.info(f'Loading mask ids from: {mask_ids_fname}') | |
mask_ids = np.load(mask_ids_fname) | |
mask_ids = torch.from_numpy(mask_ids).to(device=device) | |
else: | |
logger.warning(f'Mask ids fname not found: {mask_ids_fname}') | |
data_obj_dict = build_dataloader(exp_cfg) | |
dataloader = data_obj_dict['dataloader'] | |
for ii, batch in enumerate(tqdm(dataloader)): | |
for key in batch: | |
if torch.is_tensor(batch[key]): | |
batch[key] = batch[key].to(device=device) | |
var_dict = run_fitting( | |
exp_cfg, batch, body_model, def_matrix, mask_ids) | |
paths = batch['paths'] | |
for ii, path in enumerate(paths): | |
_, fname = osp.split(path) | |
output_path = osp.join( | |
output_folder, f'{osp.splitext(fname)[0]}.npz') | |
for key in var_dict.keys(): | |
try: | |
var_dict[key] = var_dict[key].detach().cpu().numpy() | |
except: | |
pass | |
np.savez(output_path, **var_dict) |