Spaces:
Runtime error
Runtime error
""" | |
Default config for PIXIE | |
""" | |
import argparse | |
import os | |
import yaml | |
from yacs.config import CfgNode as CN | |
from huggingface_hub import hf_hub_download | |
cfg = CN() | |
abs_pixie_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "..")) | |
cfg.pixie_dir = abs_pixie_dir | |
cfg.device = "cuda" | |
cfg.device_id = "0" | |
cfg.pretrained_modelpath = hf_hub_download( | |
repo_id="Yuliang/PIXIE", filename="pixie_model.tar", use_auth_token=os.environ["ICON"] | |
) | |
# smplx parameter settings | |
cfg.params = CN() | |
cfg.params.body_list = ["body_cam", "global_pose", "partbody_pose", "neck_pose"] | |
cfg.params.head_list = ["head_cam", "tex", "light"] | |
cfg.params.head_share_list = ["shape", "exp", "head_pose", "jaw_pose"] | |
cfg.params.hand_list = ["hand_cam"] | |
cfg.params.hand_share_list = [ | |
"right_wrist_pose", | |
"right_hand_pose", | |
] # only for right hand | |
# ---------------------------------------------------------------------------- # | |
# Options for Body model | |
# ---------------------------------------------------------------------------- # | |
cfg.model = CN() | |
cfg.model.topology_path = hf_hub_download( | |
repo_id="Yuliang/PIXIE", | |
use_auth_token=os.environ["ICON"], | |
filename="SMPL_X_template_FLAME_uv.obj" | |
) | |
cfg.model.topology_smplxtex_path = hf_hub_download( | |
repo_id="Yuliang/PIXIE", use_auth_token=os.environ["ICON"], filename="smplx_tex.obj" | |
) | |
cfg.model.topology_smplx_hand_path = hf_hub_download( | |
repo_id="Yuliang/PIXIE", use_auth_token=os.environ["ICON"], filename="smplx_hand.obj" | |
) | |
cfg.model.smplx_model_path = hf_hub_download( | |
repo_id="Yuliang/PIXIE", use_auth_token=os.environ["ICON"], filename="SMPLX_NEUTRAL_2020.npz" | |
) | |
cfg.model.face_mask_path = hf_hub_download( | |
repo_id="Yuliang/PIXIE", use_auth_token=os.environ["ICON"], filename="uv_face_mask.png" | |
) | |
cfg.model.face_eye_mask_path = hf_hub_download( | |
repo_id="Yuliang/PIXIE", use_auth_token=os.environ["ICON"], filename="uv_face_eye_mask.png" | |
) | |
cfg.model.extra_joint_path = hf_hub_download( | |
repo_id="Yuliang/PIXIE", use_auth_token=os.environ["ICON"], filename="smplx_extra_joints.yaml" | |
) | |
cfg.model.j14_regressor_path = hf_hub_download( | |
repo_id="Yuliang/PIXIE", use_auth_token=os.environ["ICON"], filename="SMPLX_to_J14.pkl" | |
) | |
cfg.model.flame2smplx_cached_path = hf_hub_download( | |
repo_id="Yuliang/PIXIE", use_auth_token=os.environ["ICON"], filename="flame2smplx_tex_1024.npy" | |
) | |
cfg.model.smplx_tex_path = hf_hub_download( | |
repo_id="Yuliang/PIXIE", use_auth_token=os.environ["ICON"], filename="smplx_tex.png" | |
) | |
cfg.model.mano_ids_path = hf_hub_download( | |
repo_id="Yuliang/PIXIE", | |
use_auth_token=os.environ["ICON"], | |
filename="MANO_SMPLX_vertex_ids.pkl" | |
) | |
cfg.model.flame_ids_path = hf_hub_download( | |
repo_id="Yuliang/PIXIE", | |
use_auth_token=os.environ["ICON"], | |
filename="SMPL-X__FLAME_vertex_ids.npy" | |
) | |
cfg.model.uv_size = 256 | |
cfg.model.n_shape = 200 | |
cfg.model.n_tex = 50 | |
cfg.model.n_exp = 50 | |
cfg.model.n_body_cam = 3 | |
cfg.model.n_head_cam = 3 | |
cfg.model.n_hand_cam = 3 | |
cfg.model.tex_type = "BFM" # BFM, FLAME, albedoMM | |
cfg.model.uvtex_type = "SMPLX" # FLAME or SMPLX | |
cfg.model.use_tex = False # whether to use flame texture model | |
cfg.model.flame_tex_path = "" | |
# pose | |
cfg.model.n_global_pose = 3 * 2 | |
cfg.model.n_head_pose = 3 * 2 | |
cfg.model.n_neck_pose = 3 * 2 | |
cfg.model.n_jaw_pose = 3 # euler angle | |
cfg.model.n_body_pose = 21 * 3 * 2 | |
cfg.model.n_partbody_pose = (21 - 4) * 3 * 2 | |
cfg.model.n_left_hand_pose = 15 * 3 * 2 | |
cfg.model.n_right_hand_pose = 15 * 3 * 2 | |
cfg.model.n_left_wrist_pose = 1 * 3 * 2 | |
cfg.model.n_right_wrist_pose = 1 * 3 * 2 | |
cfg.model.n_light = 27 | |
cfg.model.check_pose = True | |
# ---------------------------------------------------------------------------- # | |
# Options for Dataset | |
# ---------------------------------------------------------------------------- # | |
cfg.dataset = CN() | |
cfg.dataset.source = ["body", "head", "hand"] | |
# head/face dataset | |
cfg.dataset.head = CN() | |
cfg.dataset.head.batch_size = 24 | |
cfg.dataset.head.num_workers = 2 | |
cfg.dataset.head.from_body = True | |
cfg.dataset.head.image_size = 224 | |
cfg.dataset.head.image_hd_size = 224 | |
cfg.dataset.head.scale_min = 1.8 | |
cfg.dataset.head.scale_max = 2.2 | |
cfg.dataset.head.trans_scale = 0.3 | |
# body datset | |
cfg.dataset.body = CN() | |
cfg.dataset.body.batch_size = 24 | |
cfg.dataset.body.num_workers = 2 | |
cfg.dataset.body.image_size = 224 | |
cfg.dataset.body.image_hd_size = 1024 | |
cfg.dataset.body.use_hd = True | |
# hand datset | |
cfg.dataset.hand = CN() | |
cfg.dataset.hand.batch_size = 24 | |
cfg.dataset.hand.num_workers = 2 | |
cfg.dataset.hand.image_size = 224 | |
cfg.dataset.hand.image_hd_size = 512 | |
cfg.dataset.hand.scale_min = 2.2 | |
cfg.dataset.hand.scale_max = 2.6 | |
cfg.dataset.hand.trans_scale = 0.4 | |
# ---------------------------------------------------------------------------- # | |
# Options for Network | |
# ---------------------------------------------------------------------------- # | |
cfg.network = CN() | |
cfg.network.encoder = CN() | |
cfg.network.encoder.body = CN() | |
cfg.network.encoder.body.type = "hrnet" | |
cfg.network.encoder.head = CN() | |
cfg.network.encoder.head.type = "resnet50" | |
cfg.network.encoder.hand = CN() | |
cfg.network.encoder.hand.type = "resnet50" | |
cfg.network.regressor = CN() | |
cfg.network.regressor.head_share = CN() | |
cfg.network.regressor.head_share.type = "mlp" | |
cfg.network.regressor.head_share.channels = [1024, 1024] | |
cfg.network.regressor.hand_share = CN() | |
cfg.network.regressor.hand_share.type = "mlp" | |
cfg.network.regressor.hand_share.channels = [1024, 1024] | |
cfg.network.regressor.body = CN() | |
cfg.network.regressor.body.type = "mlp" | |
cfg.network.regressor.body.channels = [1024] | |
cfg.network.regressor.head = CN() | |
cfg.network.regressor.head.type = "mlp" | |
cfg.network.regressor.head.channels = [1024] | |
cfg.network.regressor.hand = CN() | |
cfg.network.regressor.hand.type = "mlp" | |
cfg.network.regressor.hand.channels = [1024] | |
cfg.network.extractor = CN() | |
cfg.network.extractor.head_share = CN() | |
cfg.network.extractor.head_share.type = "mlp" | |
cfg.network.extractor.head_share.channels = [] | |
cfg.network.extractor.left_hand_share = CN() | |
cfg.network.extractor.left_hand_share.type = "mlp" | |
cfg.network.extractor.left_hand_share.channels = [] | |
cfg.network.extractor.right_hand_share = CN() | |
cfg.network.extractor.right_hand_share.type = "mlp" | |
cfg.network.extractor.right_hand_share.channels = [] | |
cfg.network.moderator = CN() | |
cfg.network.moderator.head_share = CN() | |
cfg.network.moderator.head_share.detach_inputs = False | |
cfg.network.moderator.head_share.detach_feature = False | |
cfg.network.moderator.head_share.type = "temp-softmax" | |
cfg.network.moderator.head_share.channels = [1024, 1024] | |
cfg.network.moderator.head_share.reduction = 4 | |
cfg.network.moderator.head_share.scale_type = "scalars" | |
cfg.network.moderator.head_share.scale_init = 1.0 | |
cfg.network.moderator.hand_share = CN() | |
cfg.network.moderator.hand_share.detach_inputs = False | |
cfg.network.moderator.hand_share.detach_feature = False | |
cfg.network.moderator.hand_share.type = "temp-softmax" | |
cfg.network.moderator.hand_share.channels = [1024, 1024] | |
cfg.network.moderator.hand_share.reduction = 4 | |
cfg.network.moderator.hand_share.scale_type = "scalars" | |
cfg.network.moderator.hand_share.scale_init = 0.0 | |
def get_cfg_defaults(): | |
"""Get a yacs CfgNode object with default values for my_project.""" | |
# Return a clone so that the defaults will not be altered | |
# This is for the "local variable" use pattern | |
return cfg.clone() | |
def update_cfg(cfg, cfg_file): | |
# cfg.merge_from_file(cfg_file, allow_unsafe=True) | |
cfg.merge_from_file(cfg_file) | |
return cfg.clone() | |
def parse_args(): | |
parser = argparse.ArgumentParser() | |
parser.add_argument("--cfg", type=str, help="cfg file path") | |
args = parser.parse_args() | |
cfg = get_cfg_defaults() | |
if args.cfg is not None: | |
cfg_file = args.cfg | |
cfg = update_cfg(cfg, args.cfg) | |
cfg.cfg_file = cfg_file | |
return cfg | |