mirror of
https://github.com/gosticks/body-pose-animation.git
synced 2025-10-16 11:45:42 +00:00
- update renderer (unify methods and simplify) - expose more configs to the yaml file - add interpolation to video - fix unstable camera while in video mode
103 lines
2.9 KiB
Python
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
|