[mv1p] add write_smpl_full
This commit is contained in:
parent
de7fe347dc
commit
0214f5e541
@ -2,8 +2,8 @@
|
|||||||
@ Date: 2021-04-13 19:46:51
|
@ Date: 2021-04-13 19:46:51
|
||||||
@ Author: Qing Shuai
|
@ Author: Qing Shuai
|
||||||
@ LastEditors: Qing Shuai
|
@ LastEditors: Qing Shuai
|
||||||
@ LastEditTime: 2021-04-14 11:33:00
|
@ LastEditTime: 2021-06-13 17:56:25
|
||||||
@ FilePath: /EasyMocapRelease/apps/demo/mv1p.py
|
@ FilePath: /EasyMocap/apps/demo/mv1p.py
|
||||||
'''
|
'''
|
||||||
from tqdm import tqdm
|
from tqdm import tqdm
|
||||||
from easymocap.smplmodel import check_keypoints, load_model, select_nf
|
from easymocap.smplmodel import check_keypoints, load_model, select_nf
|
||||||
@ -75,13 +75,21 @@ def mv1pmf_smpl(dataset, args, weight_pose=None, weight_shape=None):
|
|||||||
images, annots = dataset[nf]
|
images, annots = dataset[nf]
|
||||||
param = select_nf(params, nf-start)
|
param = select_nf(params, nf-start)
|
||||||
dataset.write_smpl(param, nf)
|
dataset.write_smpl(param, nf)
|
||||||
|
if args.write_smpl_full:
|
||||||
|
param_full = param.copy()
|
||||||
|
param_full['poses'] = body_model.full_poses(param['poses'])
|
||||||
|
dataset.write_smpl(param_full, nf, mode='smpl_full')
|
||||||
|
if args.write_vertices:
|
||||||
|
vertices = body_model(return_verts=True, return_tensor=False, **param)
|
||||||
|
write_data = [{'id': 0, 'vertices': vertices[0]}]
|
||||||
|
dataset.write_vertices(write_data, nf)
|
||||||
if args.vis_smpl:
|
if args.vis_smpl:
|
||||||
vertices = body_model(return_verts=True, return_tensor=False, **param)
|
vertices = body_model(return_verts=True, return_tensor=False, **param)
|
||||||
dataset.vis_smpl(vertices=vertices[0], faces=body_model.faces, images=images, nf=nf, sub_vis=args.sub_vis, add_back=True)
|
dataset.vis_smpl(vertices=vertices[0], faces=body_model.faces, images=images, nf=nf, sub_vis=args.sub_vis, add_back=True)
|
||||||
if args.vis_repro:
|
if args.vis_repro:
|
||||||
keypoints = body_model(return_verts=False, return_tensor=False, **param)[0]
|
keypoints = body_model(return_verts=False, return_tensor=False, **param)[0]
|
||||||
kpts_repro = projectN3(keypoints, dataset.Pall)
|
kpts_repro = projectN3(keypoints, dataset.Pall)
|
||||||
dataset.vis_repro(images, kpts_repro, nf=nf, sub_vis=args.sub_vis)
|
dataset.vis_repro(images, kpts_repro, nf=nf, sub_vis=args.sub_vis, mode='repro_smpl')
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
from easymocap.mytools import load_parser, parse_parser
|
from easymocap.mytools import load_parser, parse_parser
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
@ Date: 2021-01-15 12:09:27
|
@ Date: 2021-01-15 12:09:27
|
||||||
@ Author: Qing Shuai
|
@ Author: Qing Shuai
|
||||||
@ LastEditors: Qing Shuai
|
@ LastEditors: Qing Shuai
|
||||||
@ LastEditTime: 2021-06-09 19:52:41
|
@ LastEditTime: 2021-06-15 11:09:36
|
||||||
@ FilePath: /EasyMocap/easymocap/mytools/cmd_loader.py
|
@ FilePath: /EasyMocap/easymocap/mytools/cmd_loader.py
|
||||||
'''
|
'''
|
||||||
import os
|
import os
|
||||||
@ -31,6 +31,7 @@ def load_parser():
|
|||||||
#
|
#
|
||||||
# keypoints and body model
|
# keypoints and body model
|
||||||
#
|
#
|
||||||
|
parser.add_argument('--cfg_model', type=str, default=None)
|
||||||
parser.add_argument('--body', type=str, default='body25', choices=['body15', 'body25', 'h36m', 'bodyhand', 'bodyhandface', 'handl', 'handr', 'total'])
|
parser.add_argument('--body', type=str, default='body25', choices=['body15', 'body25', 'h36m', 'bodyhand', 'bodyhandface', 'handl', 'handr', 'total'])
|
||||||
parser.add_argument('--model', type=str, default='smpl', choices=['smpl', 'smplh', 'smplx', 'manol', 'manor'])
|
parser.add_argument('--model', type=str, default='smpl', choices=['smpl', 'smplh', 'smplx', 'manol', 'manor'])
|
||||||
parser.add_argument('--gender', type=str, default='neutral',
|
parser.add_argument('--gender', type=str, default='neutral',
|
||||||
@ -58,6 +59,7 @@ def load_parser():
|
|||||||
output.add_argument('--vis_repro', action='store_true')
|
output.add_argument('--vis_repro', action='store_true')
|
||||||
output.add_argument('--vis_smpl', action='store_true')
|
output.add_argument('--vis_smpl', action='store_true')
|
||||||
output.add_argument('--write_smpl_full', action='store_true')
|
output.add_argument('--write_smpl_full', action='store_true')
|
||||||
|
parser.add_argument('--write_vertices', action='store_true')
|
||||||
output.add_argument('--vis_mask', action='store_true')
|
output.add_argument('--vis_mask', action='store_true')
|
||||||
output.add_argument('--undis', action='store_true')
|
output.add_argument('--undis', action='store_true')
|
||||||
output.add_argument('--sub_vis', type=str, nargs='+', default=[],
|
output.add_argument('--sub_vis', type=str, nargs='+', default=[],
|
||||||
@ -73,7 +75,11 @@ def load_parser():
|
|||||||
parser.add_argument('--opts',
|
parser.add_argument('--opts',
|
||||||
help="Modify config options using the command-line",
|
help="Modify config options using the command-line",
|
||||||
default=[],
|
default=[],
|
||||||
nargs=argparse.REMAINDER)
|
nargs='+')
|
||||||
|
parser.add_argument('--cfg_opts',
|
||||||
|
help="Modify config options using the command-line",
|
||||||
|
default=[],
|
||||||
|
nargs='+')
|
||||||
return parser
|
return parser
|
||||||
|
|
||||||
from os.path import join
|
from os.path import join
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
@ Date: 2021-03-15 12:23:12
|
@ Date: 2021-03-15 12:23:12
|
||||||
@ Author: Qing Shuai
|
@ Author: Qing Shuai
|
||||||
@ LastEditors: Qing Shuai
|
@ LastEditors: Qing Shuai
|
||||||
@ LastEditTime: 2021-05-27 20:50:43
|
@ LastEditTime: 2021-06-14 22:25:58
|
||||||
@ FilePath: /EasyMocapRelease/easymocap/mytools/file_utils.py
|
@ FilePath: /EasyMocapRelease/easymocap/mytools/file_utils.py
|
||||||
'''
|
'''
|
||||||
import os
|
import os
|
||||||
@ -25,6 +25,8 @@ def save_json(file, data):
|
|||||||
with open(file, 'w') as f:
|
with open(file, 'w') as f:
|
||||||
json.dump(data, f, indent=4)
|
json.dump(data, f, indent=4)
|
||||||
|
|
||||||
|
save_annot = save_json
|
||||||
|
|
||||||
def getFileList(root, ext='.jpg'):
|
def getFileList(root, ext='.jpg'):
|
||||||
files = []
|
files = []
|
||||||
dirs = os.listdir(root)
|
dirs = os.listdir(root)
|
||||||
@ -89,14 +91,15 @@ def array2raw(array, separator=' ', fmt='%.3f'):
|
|||||||
res.append(separator.join([fmt%(d) for d in data]))
|
res.append(separator.join([fmt%(d) for d in data]))
|
||||||
|
|
||||||
|
|
||||||
def myarray2string(array, separator=', ', fmt='%.3f'):
|
def myarray2string(array, separator=', ', fmt='%.3f', indent=8):
|
||||||
assert len(array.shape) == 2, 'Only support MxN matrix, {}'.format(array.shape)
|
assert len(array.shape) == 2, 'Only support MxN matrix, {}'.format(array.shape)
|
||||||
|
blank = ' ' * indent
|
||||||
res = ['[']
|
res = ['[']
|
||||||
for i in range(array.shape[0]):
|
for i in range(array.shape[0]):
|
||||||
res.append(' [{}]'.format(separator.join([fmt%(d) for d in array[i]])))
|
res.append(blank + ' ' + '[{}]'.format(separator.join([fmt%(d) for d in array[i]])))
|
||||||
if i != array.shape[0] -1:
|
if i != array.shape[0] -1:
|
||||||
res[-1] += ', '
|
res[-1] += ', '
|
||||||
res.append(' ]')
|
res.append(blank + ']')
|
||||||
return '\r\n'.join(res)
|
return '\r\n'.join(res)
|
||||||
|
|
||||||
def write_common_results(dumpname=None, results=[], keys=[], fmt='%2.3f'):
|
def write_common_results(dumpname=None, results=[], keys=[], fmt='%2.3f'):
|
||||||
@ -144,6 +147,24 @@ def write_smpl(dumpname, results):
|
|||||||
keys = ['Rh', 'Th', 'poses', 'expression', 'shapes']
|
keys = ['Rh', 'Th', 'poses', 'expression', 'shapes']
|
||||||
write_common_results(dumpname, results, keys)
|
write_common_results(dumpname, results, keys)
|
||||||
|
|
||||||
|
def batch_bbox_from_pose(keypoints2d, height, width, rate=0.1):
|
||||||
|
# TODO:write this in batch
|
||||||
|
bboxes = np.zeros((keypoints2d.shape[0], 5), dtype=np.float32)
|
||||||
|
border = 20
|
||||||
|
for bn in range(keypoints2d.shape[0]):
|
||||||
|
valid = keypoints2d[bn, :, -1] > 0
|
||||||
|
if valid.sum() == 0:
|
||||||
|
continue
|
||||||
|
p2d = keypoints2d[bn, valid, :2]
|
||||||
|
x_min, y_min = p2d.min(axis=0)
|
||||||
|
x_max, y_max = p2d.max(axis=0)
|
||||||
|
x_mean, y_mean = p2d.mean(axis=0)
|
||||||
|
if x_mean < -border or y_mean < -border or x_mean > width + border or y_mean > height + border:
|
||||||
|
continue
|
||||||
|
dx = (x_max - x_min)*rate
|
||||||
|
dy = (y_max - y_min)*rate
|
||||||
|
bboxes[bn] = [x_min-dx, y_min-dy, x_max+dx, y_max+dy, 1]
|
||||||
|
return bboxes
|
||||||
|
|
||||||
def get_bbox_from_pose(pose_2d, img=None, rate = 0.1):
|
def get_bbox_from_pose(pose_2d, img=None, rate = 0.1):
|
||||||
# this function returns bounding box from the 2D pose
|
# this function returns bounding box from the 2D pose
|
||||||
|
@ -1,3 +1,10 @@
|
|||||||
|
'''
|
||||||
|
@ Date: 2021-04-21 15:19:21
|
||||||
|
@ Author: Qing Shuai
|
||||||
|
@ LastEditors: Qing Shuai
|
||||||
|
@ LastEditTime: 2021-06-15 11:30:00
|
||||||
|
@ FilePath: /EasyMocap/easymocap/mytools/reader.py
|
||||||
|
'''
|
||||||
# function to read data
|
# function to read data
|
||||||
"""
|
"""
|
||||||
This class provides:
|
This class provides:
|
||||||
@ -7,10 +14,13 @@
|
|||||||
- smpl | x | o
|
- smpl | x | o
|
||||||
"""
|
"""
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from .file_utils import read_json
|
import os
|
||||||
|
from os.path import join
|
||||||
|
from glob import glob
|
||||||
|
from .file_utils import read_json, read_annot
|
||||||
|
|
||||||
def read_keypoints2d(filename):
|
def read_keypoints2d(filename, mode):
|
||||||
pass
|
return read_annot(filename, mode)
|
||||||
|
|
||||||
def read_keypoints3d(filename):
|
def read_keypoints3d(filename):
|
||||||
data = read_json(filename)
|
data = read_json(filename)
|
||||||
@ -56,4 +66,25 @@ def read_keypoints3d_a4d(outname):
|
|||||||
# association4d 的关节顺序和正常的定义不一样
|
# association4d 的关节顺序和正常的定义不一样
|
||||||
pose3d = pose3d[[4, 1, 5, 9, 13, 6, 10, 14, 0, 2, 7, 11, 3, 8, 12], :]
|
pose3d = pose3d[[4, 1, 5, 9, 13, 6, 10, 14, 0, 2, 7, 11, 3, 8, 12], :]
|
||||||
res_.append({'id':trackId, 'keypoints3d':np.array(pose3d)})
|
res_.append({'id':trackId, 'keypoints3d':np.array(pose3d)})
|
||||||
return res_
|
return res_
|
||||||
|
|
||||||
|
def read_keypoints3d_all(path, key='keypoints3d', pids=[]):
|
||||||
|
assert os.path.exists(path), '{} not exists!'.format(path)
|
||||||
|
results = {}
|
||||||
|
filenames = sorted(glob(join(path, '*.json')))
|
||||||
|
for filename in filenames:
|
||||||
|
nf = int(os.path.basename(filename).replace('.json', ''))
|
||||||
|
datas = read_keypoints3d(filename)
|
||||||
|
for data in datas:
|
||||||
|
pid = data['id']
|
||||||
|
if len(pids) > 0 and pid not in pids:
|
||||||
|
continue
|
||||||
|
# 注意 这里没有考虑从哪开始的
|
||||||
|
if pid not in results.keys():
|
||||||
|
results[pid] = {key: [], 'frames': []}
|
||||||
|
results[pid][key].append(data[key])
|
||||||
|
results[pid]['frames'].append(nf)
|
||||||
|
if key == 'keypoints3d':
|
||||||
|
for pid, result in results.items():
|
||||||
|
result[key] = np.stack(result[key])
|
||||||
|
return results, filenames
|
@ -2,13 +2,24 @@
|
|||||||
@ Date: 2021-01-15 11:12:00
|
@ Date: 2021-01-15 11:12:00
|
||||||
@ Author: Qing Shuai
|
@ Author: Qing Shuai
|
||||||
@ LastEditors: Qing Shuai
|
@ LastEditors: Qing Shuai
|
||||||
@ LastEditTime: 2021-05-27 14:55:40
|
@ LastEditTime: 2021-06-16 14:05:39
|
||||||
@ FilePath: /EasyMocap/easymocap/mytools/utils.py
|
@ FilePath: /EasyMocap/easymocap/mytools/utils.py
|
||||||
'''
|
'''
|
||||||
import time
|
import time
|
||||||
import tabulate
|
import tabulate
|
||||||
class Timer:
|
class Timer:
|
||||||
records = {}
|
records = {}
|
||||||
|
tmp = None
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def tic(cls):
|
||||||
|
cls.tmp = time.time()
|
||||||
|
@classmethod
|
||||||
|
def toc(cls):
|
||||||
|
res = (time.time() - cls.tmp) * 1000
|
||||||
|
cls.tmp = None
|
||||||
|
return res
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def report(cls):
|
def report(cls):
|
||||||
header = ['', 'Time(ms)']
|
header = ['', 'Time(ms)']
|
||||||
@ -16,7 +27,7 @@ class Timer:
|
|||||||
for key, val in cls.records.items():
|
for key, val in cls.records.items():
|
||||||
contents.append(['{:20s}'.format(key), '{:.2f}'.format(sum(val)/len(val))])
|
contents.append(['{:20s}'.format(key), '{:.2f}'.format(sum(val)/len(val))])
|
||||||
print(tabulate.tabulate(contents, header, tablefmt='fancy_grid'))
|
print(tabulate.tabulate(contents, header, tablefmt='fancy_grid'))
|
||||||
|
|
||||||
def __init__(self, name, silent=False):
|
def __init__(self, name, silent=False):
|
||||||
self.name = name
|
self.name = name
|
||||||
self.silent = silent
|
self.silent = silent
|
||||||
|
Loading…
Reference in New Issue
Block a user