body-pose-animation/modules/utils.py
Wlad 72c2e60cfb update:
- update renderer (unify methods and simplify)
- expose more configs to the yaml file
- add interpolation to video
- fix unstable camera while in video mode
2021-02-18 23:57:12 +01:00

103 lines
2.9 KiB
Python

from modules.angle_clip import AngleClipper
from modules.angle_prior import AnglePriorsLoss
from modules.intersect import IntersectLoss
from modules.body_prior import BodyPrior
from modules.angle_sum import AngleSumLoss
from modules.change_loss import ChangeLoss
from model import VPoserModel
import smplx
import re
def is_loss_enabled(config, name):
return config['pose'][name]['enabled']
def toggle_loss_enabled(config, name, value):
config['pose'][name]['enabled'] = value
def get_loss_conf(config, name):
return config['pose'][name]
def camel_to_snake(name):
name = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name)
return re.sub('([a-z0-9])([A-Z])', r'\1_\2', name).lower()
def get_layer_config(config, name):
params = {}
layer_conf = config['pose'][name]
for k, v in layer_conf.items():
if k == 'enabled':
continue
params[camel_to_snake(k)] = v
return params
def get_loss_layers(config, model: smplx.SMPL, device, dtype):
""" Utility method to create loss layers based on a config file
Args:
config ([type]): [description]
device ([type]): [description]
dtype ([type]): [description]
"""
extra_loss_layers = []
if config['pose']['bodyPrior']['enabled']:
vmodel = VPoserModel.from_conf(config)
extra_loss_layers.append(BodyPrior(
device=device,
dtype=dtype,
vmodel=vmodel,
weight=config['pose']['bodyPrior']['weight']))
if config['pose']['anglePrior']['enabled']:
params = get_layer_config(config, "anglePrior")
extra_loss_layers.append(AnglePriorsLoss(
device=device,
dtype=dtype,
**params
))
if config['pose']['angleSumLoss']['enabled']:
extra_loss_layers.append(AngleSumLoss(
device=device,
dtype=dtype,
weight=config['pose']['angleSumLoss']['weight']))
if config['pose']['angleLimitLoss']['enabled']:
extra_loss_layers.append(AngleClipper(
device=device,
dtype=dtype,
weight=config['pose']['angleLimitLoss']['weight']))
if config['pose']['intersectLoss']['enabled']:
extra_loss_layers.append(IntersectLoss(
model=model,
device=device,
dtype=dtype,
weight=config['pose']['intersectLoss']['weight'],
sigma=config['pose']['intersectLoss']['sigma'],
max_collisions=config['pose']['intersectLoss']['maxCollisions']
))
changeLoss = get_loss_conf(config, "changeLoss")
if changeLoss['enabled']:
model_out = model()
params = get_layer_config(config, "changeLoss")
extra_loss_layers.append(ChangeLoss(
device=device,
dtype=dtype,
compare_pose=model_out.body_pose,
**params))
return extra_loss_layers