2021-04-14 15:22:51 +08:00
|
|
|
'''
|
|
|
|
@ Date: 2021-04-13 20:43:16
|
|
|
|
@ Author: Qing Shuai
|
|
|
|
@ LastEditors: Qing Shuai
|
2021-07-02 11:48:41 +08:00
|
|
|
@ LastEditTime: 2021-06-14 15:32:24
|
2021-05-27 21:12:17 +08:00
|
|
|
@ FilePath: /EasyMocap/easymocap/pipeline/basic.py
|
2021-04-14 15:22:51 +08:00
|
|
|
'''
|
|
|
|
from ..pyfitting import optimizeShape, optimizePose2D, optimizePose3D
|
|
|
|
from ..mytools import Timer
|
|
|
|
from ..dataset import CONFIG
|
|
|
|
from .weight import load_weight_pose, load_weight_shape
|
|
|
|
from .config import Config
|
|
|
|
|
|
|
|
def multi_stage_optimize(body_model, params, kp3ds, kp2ds=None, bboxes=None, Pall=None, weight={}, cfg=None):
|
|
|
|
with Timer('Optimize global RT'):
|
|
|
|
cfg.OPT_R = True
|
|
|
|
cfg.OPT_T = True
|
|
|
|
params = optimizePose3D(body_model, params, kp3ds, weight=weight, cfg=cfg)
|
|
|
|
# params = optimizePose(body_model, params, kp3ds, weight_loss=weight, kintree=config['kintree'], cfg=cfg)
|
|
|
|
with Timer('Optimize 3D Pose/{} frames'.format(kp3ds.shape[0])):
|
|
|
|
cfg.OPT_POSE = True
|
|
|
|
cfg.ROBUST_3D = False
|
|
|
|
params = optimizePose3D(body_model, params, kp3ds, weight=weight, cfg=cfg)
|
|
|
|
if False:
|
|
|
|
cfg.ROBUST_3D = True
|
|
|
|
params = optimizePose3D(body_model, params, kp3ds, weight=weight, cfg=cfg)
|
|
|
|
if cfg.model in ['smplh', 'smplx']:
|
|
|
|
cfg.OPT_HAND = True
|
|
|
|
params = optimizePose3D(body_model, params, kp3ds, weight=weight, cfg=cfg)
|
|
|
|
if cfg.model == 'smplx':
|
|
|
|
cfg.OPT_EXPR = True
|
|
|
|
params = optimizePose3D(body_model, params, kp3ds, weight=weight, cfg=cfg)
|
|
|
|
if kp2ds is not None:
|
|
|
|
with Timer('Optimize 2D Pose/{} frames'.format(kp3ds.shape[0])):
|
|
|
|
# bboxes => (nFrames, nViews, 5), keypoints2d => (nFrames, nViews, nJoints, 3)
|
|
|
|
params = optimizePose2D(body_model, params, bboxes, kp2ds, Pall, weight=weight, cfg=cfg)
|
|
|
|
return params
|
|
|
|
|
2021-05-27 21:12:17 +08:00
|
|
|
def multi_stage_optimize2d(body_model, params, kp2ds, bboxes, Pall, weight={}, args=None):
|
|
|
|
cfg = Config(args)
|
|
|
|
cfg.device = body_model.device
|
|
|
|
cfg.device = body_model.device
|
|
|
|
cfg.model = body_model.model_type
|
|
|
|
with Timer('Optimize global RT'):
|
|
|
|
cfg.OPT_R = True
|
|
|
|
cfg.OPT_T = True
|
|
|
|
params = optimizePose2D(body_model, params, bboxes, kp2ds, Pall, weight=weight, cfg=cfg)
|
|
|
|
with Timer('Optimize 2D Pose/{} frames'.format(kp2ds.shape[0])):
|
|
|
|
cfg.OPT_POSE = True
|
|
|
|
cfg.OPT_SHAPE = True
|
|
|
|
# bboxes => (nFrames, nViews, 5), keypoints2d => (nFrames, nViews, nJoints, 3)
|
|
|
|
params = optimizePose2D(body_model, params, bboxes, kp2ds, Pall, weight=weight, cfg=cfg)
|
|
|
|
return params
|
|
|
|
|
2021-04-14 15:22:51 +08:00
|
|
|
def smpl_from_keypoints3d2d(body_model, kp3ds, kp2ds, bboxes, Pall, config, args,
|
|
|
|
weight_shape=None, weight_pose=None):
|
|
|
|
model_type = body_model.model_type
|
2021-05-27 21:12:17 +08:00
|
|
|
params_init = body_model.init_params(nFrames=1)
|
2021-04-14 15:22:51 +08:00
|
|
|
if weight_shape is None:
|
2021-07-02 11:48:41 +08:00
|
|
|
weight_shape = load_weight_shape(model_type, args.opts)
|
2021-04-14 15:22:51 +08:00
|
|
|
if model_type in ['smpl', 'smplh', 'smplx']:
|
|
|
|
# when use SMPL model, optimize the shape only with first 1-14 limbs,
|
|
|
|
# don't use (nose, neck)
|
|
|
|
params_shape = optimizeShape(body_model, params_init, kp3ds,
|
|
|
|
weight_loss=weight_shape, kintree=CONFIG['body15']['kintree'][1:])
|
|
|
|
else:
|
|
|
|
params_shape = optimizeShape(body_model, params_init, kp3ds,
|
|
|
|
weight_loss=weight_shape, kintree=config['kintree'])
|
|
|
|
# optimize 3D pose
|
|
|
|
cfg = Config(args)
|
|
|
|
cfg.device = body_model.device
|
2021-05-27 21:12:17 +08:00
|
|
|
params = body_model.init_params(nFrames=kp3ds.shape[0])
|
2021-04-14 15:22:51 +08:00
|
|
|
params['shapes'] = params_shape['shapes'].copy()
|
|
|
|
if weight_pose is None:
|
|
|
|
weight_pose = load_weight_pose(model_type, args.opts)
|
|
|
|
# We divide this step to two functions, because we can have different initialization method
|
|
|
|
params = multi_stage_optimize(body_model, params, kp3ds, kp2ds, bboxes, Pall, weight_pose, cfg)
|
|
|
|
return params
|
|
|
|
|
|
|
|
def smpl_from_keypoints3d(body_model, kp3ds, config, args,
|
|
|
|
weight_shape=None, weight_pose=None):
|
|
|
|
model_type = body_model.model_type
|
2021-05-27 21:12:17 +08:00
|
|
|
params_init = body_model.init_params(nFrames=1)
|
2021-04-14 15:22:51 +08:00
|
|
|
if weight_shape is None:
|
2021-07-02 11:48:41 +08:00
|
|
|
weight_shape = load_weight_shape(model_type, args.opts)
|
2021-04-14 15:22:51 +08:00
|
|
|
if model_type in ['smpl', 'smplh', 'smplx']:
|
|
|
|
# when use SMPL model, optimize the shape only with first 1-14 limbs,
|
|
|
|
# don't use (nose, neck)
|
|
|
|
params_shape = optimizeShape(body_model, params_init, kp3ds,
|
|
|
|
weight_loss=weight_shape, kintree=CONFIG['body15']['kintree'][1:])
|
|
|
|
else:
|
|
|
|
params_shape = optimizeShape(body_model, params_init, kp3ds,
|
|
|
|
weight_loss=weight_shape, kintree=config['kintree'])
|
|
|
|
# optimize 3D pose
|
|
|
|
cfg = Config(args)
|
|
|
|
cfg.device = body_model.device
|
|
|
|
cfg.model_type = model_type
|
2021-05-27 21:12:17 +08:00
|
|
|
params = body_model.init_params(nFrames=kp3ds.shape[0])
|
2021-04-14 15:22:51 +08:00
|
|
|
params['shapes'] = params_shape['shapes'].copy()
|
|
|
|
if weight_pose is None:
|
|
|
|
weight_pose = load_weight_pose(model_type, args.opts)
|
|
|
|
# We divide this step to two functions, because we can have different initialization method
|
|
|
|
params = multi_stage_optimize(body_model, params, kp3ds, None, None, None, weight_pose, cfg)
|
|
|
|
return params
|