| import os |
| import os.path as osp |
| import numpy as np |
| from config import cfg |
| import copy |
| import json |
| import cv2 |
| import torch |
| from pycocotools.coco import COCO |
| from utils.human_models import smpl_x |
| from utils.preprocessing import load_img, process_bbox, augmentation, process_db_coord, process_human_model_output |
| import random |
| from humandata import Cache |
|
|
| class MSCOCO(torch.utils.data.Dataset): |
| def __init__(self, transform, data_split): |
| self.transform = transform |
| self.data_split = data_split |
| if os.path.exists(osp.join(cfg.data_dir, 'MSCOCO', 'images')): |
| self.img_path = osp.join(cfg.data_dir, 'MSCOCO', 'images') |
| self.annot_path = osp.join(cfg.data_dir, 'MSCOCO', 'annotations') |
| else: |
| self.img_path = osp.join(cfg.data_dir, 'coco') |
| self.annot_path = osp.join(cfg.data_dir, 'coco', 'annotations') |
|
|
| |
| self.joint_set = { |
| 'joint_num': 134, |
| 'joints_name': \ |
| ( |
| 'Nose', 'L_Eye', 'R_Eye', 'L_Ear', 'R_Ear', 'L_Shoulder', 'R_Shoulder', 'L_Elbow', 'R_Elbow', 'L_Wrist', |
| 'R_Wrist', 'L_Hip', 'R_Hip', 'L_Knee', 'R_Knee', 'L_Ankle', 'R_Ankle', 'Pelvis', 'L_Big_toe', |
| 'L_Small_toe', 'L_Heel', 'R_Big_toe', 'R_Small_toe', 'R_Heel', |
| 'L_Wrist_Hand', 'L_Thumb_1', 'L_Thumb_2', 'L_Thumb_3', 'L_Thumb_4', 'L_Index_1', 'L_Index_2', |
| 'L_Index_3', 'L_Index_4', 'L_Middle_1', 'L_Middle_2', 'L_Middle_3', 'L_Middle_4', 'L_Ring_1', |
| 'L_Ring_2', 'L_Ring_3', 'L_Ring_4', 'L_Pinky_1', 'L_Pinky_2', 'L_Pinky_3', 'L_Pinky_4', |
| 'R_Wrist_Hand', 'R_Thumb_1', 'R_Thumb_2', 'R_Thumb_3', 'R_Thumb_4', 'R_Index_1', 'R_Index_2', |
| 'R_Index_3', 'R_Index_4', 'R_Middle_1', 'R_Middle_2', 'R_Middle_3', 'R_Middle_4', 'R_Ring_1', |
| 'R_Ring_2', 'R_Ring_3', 'R_Ring_4', 'R_Pinky_1', 'R_Pinky_2', 'R_Pinky_3', 'R_Pinky_4', |
| *['Face_' + str(i) for i in range(56, 73)], |
| *['Face_' + str(i) for i in range(5, 56)] |
| ), |
| 'flip_pairs': \ |
| ((1, 2), (3, 4), (5, 6), (7, 8), (9, 10), (11, 12), (13, 14), (15, 16), (18, 21), (19, 22), (20, 23), |
| |
| (24, 45), (25, 46), (26, 47), (27, 48), (28, 49), (29, 50), (30, 51), (31, 52), (32, 53), (33, 54), |
| (34, 55), (35, 56), (36, 57), (37, 58), (38, 59), (39, 60), (40, 61), (41, 62), (42, 63), (43, 64), |
| (44, 65), |
| (66, 82), (67, 81), (68, 80), (69, 79), (70, 78), (71, 77), (72, 76), (73, 75), |
| (83, 92), (84, 91), (85, 90), (86, 89), (87, 88), |
| (97, 101), (98, 100), |
| (102, 111), (103, 110), (104, 109), (105, 108), (106, 113), (107, 112), |
| (114, 120), (115, 119), (116, 118), (121, 125), (122, 124), |
| (126, 130), (127, 129), (131, 133) |
| ) |
| } |
|
|
| |
|
|
| |
| self.use_cache = getattr(cfg, 'use_cache', False) |
| self.annot_path_cache = osp.join(cfg.data_dir, 'cache', f'MSCOCO_{data_split}.npz') |
| if self.use_cache and osp.isfile(self.annot_path_cache): |
| print(f'[{self.__class__.__name__}] loading cache from {self.annot_path_cache}') |
| datalist = Cache(self.annot_path_cache) |
| assert datalist.data_strategy == getattr(cfg, 'data_strategy', None), \ |
| f'Cache data strategy {datalist.data_strategy} does not match current data strategy ' \ |
| f'{getattr(cfg, "data_strategy", None)}' |
| self.datalist = datalist |
| else: |
| if self.use_cache: |
| print(f'[{self.__class__.__name__}] Cache not found, generating cache...') |
| self.datalist = self.load_data() |
| if self.use_cache: |
| print(f'[{self.__class__.__name__}] Caching datalist to {self.annot_path_cache}...') |
| Cache.save( |
| self.annot_path_cache, |
| self.datalist, |
| data_strategy=getattr(cfg, 'data_strategy', None) |
| ) |
|
|
|
|
| def merge_joint(self, joint_img, feet_img, lhand_img, rhand_img, face_img): |
| |
| lhip_idx = self.joint_set['joints_name'].index('L_Hip') |
| rhip_idx = self.joint_set['joints_name'].index('R_Hip') |
| pelvis = (joint_img[lhip_idx, :] + joint_img[rhip_idx, :]) * 0.5 |
| pelvis[2] = joint_img[lhip_idx, 2] * joint_img[rhip_idx, 2] |
| pelvis = pelvis.reshape(1, 3) |
|
|
| |
| lfoot = feet_img[:3, :] |
| rfoot = feet_img[3:, :] |
|
|
| joint_img = np.concatenate((joint_img, pelvis, lfoot, rfoot, lhand_img, rhand_img, face_img)).astype( |
| np.float32) |
| return joint_img |
|
|
| def load_data(self): |
| if self.data_split == 'train': |
| db = COCO(osp.join(self.annot_path, 'coco_wholebody_train_v1.0.json')) |
| smplx_json_path = osp.join(self.annot_path, 'MSCOCO_train_SMPLX_all_NeuralAnnot.json') |
| with open(smplx_json_path) as f: |
| print(f'load SMPLX parameters from {smplx_json_path}') |
| smplx_params = json.load(f) |
| else: |
| db = COCO(osp.join(self.annot_path, 'coco_wholebody_val_v1.0.json')) |
|
|
| |
| if self.data_split == 'train': |
| datalist = [] |
| i = 0 |
| for aid in db.anns.keys(): |
|
|
| i += 1 |
| if self.data_split == 'train' and i % getattr(cfg, 'MSCOCO_train_sample_interval', 1) != 0: |
| continue |
|
|
| ann = db.anns[aid] |
| img = db.loadImgs(ann['image_id'])[0] |
| imgname = osp.join('train2017', img['file_name']) |
| img_path = osp.join(self.img_path, imgname) |
|
|
| |
| if ann['iscrowd'] or (ann['num_keypoints'] == 0): continue |
|
|
| |
| bbox = process_bbox(ann['bbox'], img['width'], img['height'], ratio=getattr(cfg, 'bbox_ratio', 1.25)) |
| if bbox is None: continue |
|
|
| |
| joint_img = np.array(ann['keypoints'], dtype=np.float32).reshape(-1, 3) |
| foot_img = np.array(ann['foot_kpts'], dtype=np.float32).reshape(-1, 3) |
| lhand_img = np.array(ann['lefthand_kpts'], dtype=np.float32).reshape(-1, 3) |
| rhand_img = np.array(ann['righthand_kpts'], dtype=np.float32).reshape(-1, 3) |
| face_img = np.array(ann['face_kpts'], dtype=np.float32).reshape(-1, 3) |
| joint_img = self.merge_joint(joint_img, foot_img, lhand_img, rhand_img, face_img) |
|
|
| joint_valid = (joint_img[:, 2].copy().reshape(-1, 1) > 0).astype(np.float32) |
| joint_img[:, 2] = 0 |
|
|
| |
| for body_name, part_name in ( |
| ('L_Wrist', 'L_Wrist_Hand'), ('R_Wrist', 'R_Wrist_Hand'), ('Nose', 'Face_18')): |
| if joint_valid[self.joint_set['joints_name'].index(part_name), 0] == 0: |
| joint_img[self.joint_set['joints_name'].index(part_name)] = joint_img[ |
| self.joint_set['joints_name'].index(body_name)] |
| joint_valid[self.joint_set['joints_name'].index(part_name)] = joint_valid[ |
| self.joint_set['joints_name'].index(body_name)] |
|
|
| |
| if ann['lefthand_valid']: |
| lhand_bbox = np.array(ann['lefthand_box']).reshape(4) |
| if hasattr(cfg, 'bbox_ratio'): |
| lhand_bbox = process_bbox(lhand_bbox, img['width'], img['height'], ratio=cfg.bbox_ratio) |
| if lhand_bbox is not None: |
| lhand_bbox[2:] += lhand_bbox[:2] |
| else: |
| lhand_bbox = None |
| if ann['righthand_valid']: |
| rhand_bbox = np.array(ann['righthand_box']).reshape(4) |
| if hasattr(cfg, 'bbox_ratio'): |
| rhand_bbox = process_bbox(rhand_bbox, img['width'], img['height'], ratio=cfg.bbox_ratio) |
| if rhand_bbox is not None: |
| rhand_bbox[2:] += rhand_bbox[:2] |
| else: |
| rhand_bbox = None |
| if ann['face_valid']: |
| face_bbox = np.array(ann['face_box']).reshape(4) |
| if hasattr(cfg, 'bbox_ratio'): |
| face_bbox = process_bbox(face_bbox, img['width'], img['height'], ratio=cfg.bbox_ratio) |
| if face_bbox is not None: |
| face_bbox[2:] += face_bbox[:2] |
| else: |
| face_bbox = None |
|
|
| if str(aid) in smplx_params: |
| smplx_param = smplx_params[str(aid)] |
| if 'lhand_valid' not in smplx_param['smplx_param']: |
| smplx_param['smplx_param']['lhand_valid'] = ann['lefthand_valid'] |
| smplx_param['smplx_param']['rhand_valid'] = ann['righthand_valid'] |
| smplx_param['smplx_param']['face_valid'] = ann['face_valid'] |
| else: |
| smplx_param = None |
|
|
| data_dict = {'img_path': img_path, 'img_shape': (img['height'], img['width']), 'bbox': bbox, |
| 'joint_img': joint_img, 'joint_valid': joint_valid, 'smplx_param': smplx_param, |
| 'lhand_bbox': lhand_bbox, 'rhand_bbox': rhand_bbox, 'face_bbox': face_bbox} |
| datalist.append(data_dict) |
|
|
| print('[MSCOCO train] original size:', len(db.anns.keys()), |
| '. Sample interval:', getattr(cfg, 'MSCOCO_train_sample_interval', 1), |
| '. Sampled size:', len(datalist)) |
| |
| if getattr(cfg, 'data_strategy', None) == 'balance': |
| print(f"[MSCOCO] Using [balance] strategy with datalist shuffled...") |
| random.shuffle(datalist) |
|
|
| return datalist |
|
|
| |
| else: |
| datalist = [] |
| for aid in db.anns.keys(): |
| ann = db.anns[aid] |
| img = db.loadImgs(ann['image_id'])[0] |
| imgname = osp.join('val2017', img['file_name']) |
| img_path = osp.join(self.img_path, imgname) |
|
|
| |
| bbox = process_bbox(ann['bbox'], img['width'], img['height'], ratio=getattr(cfg, 'bbox_ratio', 1.25)) |
| if bbox is None: continue |
|
|
| |
| if ann['lefthand_valid']: |
| lhand_bbox = np.array(ann['lefthand_box']).reshape(4) |
| lhand_bbox[2:] += lhand_bbox[:2] |
| else: |
| lhand_bbox = None |
| if ann['righthand_valid']: |
| rhand_bbox = np.array(ann['righthand_box']).reshape(4) |
| rhand_bbox[2:] += rhand_bbox[:2] |
| else: |
| rhand_bbox = None |
| if ann['face_valid']: |
| face_bbox = np.array(ann['face_box']).reshape(4) |
| face_bbox[2:] += face_bbox[:2] |
| else: |
| face_bbox = None |
|
|
| data_dict = {'img_path': img_path, 'ann_id': aid, 'img_shape': (img['height'], img['width']), |
| 'bbox': bbox, 'lhand_bbox': lhand_bbox, 'rhand_bbox': rhand_bbox, 'face_bbox': face_bbox} |
| datalist.append(data_dict) |
| return datalist |
|
|
| def process_hand_face_bbox(self, bbox, do_flip, img_shape, img2bb_trans): |
| if bbox is None: |
| bbox = np.array([0, 0, 1, 1], dtype=np.float32).reshape(2, 2) |
| bbox_valid = float(False) |
| else: |
| |
| bbox = bbox.reshape(2, 2) |
|
|
| |
| if do_flip: |
| bbox[:, 0] = img_shape[1] - bbox[:, 0] - 1 |
| bbox[0, 0], bbox[1, 0] = bbox[1, 0].copy(), bbox[0, 0].copy() |
|
|
| |
| bbox = bbox.reshape(4).tolist() |
| xmin, ymin, xmax, ymax = bbox |
| bbox = np.array([[xmin, ymin], [xmax, ymin], [xmax, ymax], [xmin, ymax]], dtype=np.float32).reshape(4, 2) |
|
|
| |
| bbox_xy1 = np.concatenate((bbox, np.ones_like(bbox[:, :1])), 1) |
| bbox = np.dot(img2bb_trans, bbox_xy1.transpose(1, 0)).transpose(1, 0)[:, :2] |
| bbox[:, 0] = bbox[:, 0] / cfg.input_img_shape[1] * cfg.output_hm_shape[2] |
| bbox[:, 1] = bbox[:, 1] / cfg.input_img_shape[0] * cfg.output_hm_shape[1] |
|
|
| |
| xmin = np.min(bbox[:, 0]); |
| xmax = np.max(bbox[:, 0]); |
| ymin = np.min(bbox[:, 1]); |
| ymax = np.max(bbox[:, 1]); |
| bbox = np.array([xmin, ymin, xmax, ymax], dtype=np.float32) |
|
|
| bbox_valid = float(True) |
| bbox = bbox.reshape(2, 2) |
|
|
| return bbox, bbox_valid |
|
|
| def __len__(self): |
| return len(self.datalist) |
|
|
| def __getitem__(self, idx): |
| data = copy.deepcopy(self.datalist[idx]) |
|
|
| |
| if self.data_split == 'train': |
| img_path, img_shape = data['img_path'], data['img_shape'] |
|
|
| |
| img = load_img(img_path) |
| bbox = data['bbox'] |
| img, img2bb_trans, bb2img_trans, rot, do_flip = augmentation(img, bbox, self.data_split) |
| img = self.transform(img.astype(np.float32)) / 255. |
|
|
| |
| lhand_bbox, lhand_bbox_valid = self.process_hand_face_bbox(data['lhand_bbox'], do_flip, img_shape, |
| img2bb_trans) |
| rhand_bbox, rhand_bbox_valid = self.process_hand_face_bbox(data['rhand_bbox'], do_flip, img_shape, |
| img2bb_trans) |
| face_bbox, face_bbox_valid = self.process_hand_face_bbox(data['face_bbox'], do_flip, img_shape, |
| img2bb_trans) |
| if do_flip: |
| lhand_bbox, rhand_bbox = rhand_bbox, lhand_bbox |
| lhand_bbox_valid, rhand_bbox_valid = rhand_bbox_valid, lhand_bbox_valid |
| lhand_bbox_center = (lhand_bbox[0] + lhand_bbox[1]) / 2.; |
| rhand_bbox_center = (rhand_bbox[0] + rhand_bbox[1]) / 2.; |
| face_bbox_center = (face_bbox[0] + face_bbox[1]) / 2. |
| lhand_bbox_size = lhand_bbox[1] - lhand_bbox[0]; |
| rhand_bbox_size = rhand_bbox[1] - rhand_bbox[0]; |
| face_bbox_size = face_bbox[1] - face_bbox[0]; |
|
|
| |
| dummy_coord = np.zeros((self.joint_set['joint_num'], 3), dtype=np.float32) |
| joint_img = data['joint_img'] |
| joint_img = np.concatenate((joint_img[:, :2], np.zeros_like(joint_img[:, :1])), 1) |
| joint_img, joint_cam, joint_cam_ra, joint_valid, joint_trunc = process_db_coord(joint_img, dummy_coord, |
| data['joint_valid'], do_flip, img_shape, |
| self.joint_set['flip_pairs'], |
| img2bb_trans, rot, |
| self.joint_set['joints_name'], |
| smpl_x.joints_name) |
|
|
| |
| smplx_param = data['smplx_param'] |
| if smplx_param is not None: |
| smplx_joint_img, smplx_joint_cam, smplx_joint_trunc, smplx_pose, smplx_shape, smplx_expr, smplx_pose_valid, smplx_joint_valid, smplx_expr_valid, smplx_mesh_cam_orig \ |
| = process_human_model_output(smplx_param['smplx_param'], smplx_param['cam_param'], do_flip, |
| img_shape, img2bb_trans, rot, 'smplx') |
| is_valid_fit = True |
|
|
| else: |
| |
| smplx_joint_img = np.zeros((smpl_x.joint_num, 3), dtype=np.float32) |
| smplx_joint_cam = np.zeros((smpl_x.joint_num, 3), dtype=np.float32) |
| smplx_joint_trunc = np.zeros((smpl_x.joint_num, 1), dtype=np.float32) |
| smplx_joint_valid = np.zeros((smpl_x.joint_num), dtype=np.float32) |
| smplx_pose = np.zeros((smpl_x.orig_joint_num * 3), dtype=np.float32) |
| smplx_shape = np.zeros((smpl_x.shape_param_dim), dtype=np.float32) |
| smplx_expr = np.zeros((smpl_x.expr_code_dim), dtype=np.float32) |
| smplx_pose_valid = np.zeros((smpl_x.orig_joint_num), dtype=np.float32) |
| smplx_expr_valid = False |
| is_valid_fit = False |
|
|
| |
| smplx_pose_valid = np.tile(smplx_pose_valid[:, None], (1, 3)).reshape(-1) |
| |
| smplx_joint_valid = smplx_joint_valid[:, None] |
| smplx_joint_trunc = smplx_joint_valid * smplx_joint_trunc |
|
|
| |
| if not is_valid_fit: |
| smplx_pose_valid[:] = 0 |
| smplx_joint_valid[:] = 0 |
| smplx_joint_trunc[:] = 0 |
| smplx_shape_valid = False |
| else: |
| smplx_shape_valid = True |
|
|
| inputs = {'img': img} |
| targets = {'joint_img': joint_img, 'joint_cam': joint_cam, 'smplx_joint_img': smplx_joint_img, |
| 'smplx_joint_cam': smplx_joint_cam, |
| 'smplx_pose': smplx_pose, 'smplx_shape': smplx_shape, 'smplx_expr': smplx_expr, |
| 'lhand_bbox_center': lhand_bbox_center, |
| 'lhand_bbox_size': lhand_bbox_size, 'rhand_bbox_center': rhand_bbox_center, |
| 'rhand_bbox_size': rhand_bbox_size, |
| 'face_bbox_center': face_bbox_center, 'face_bbox_size': face_bbox_size} |
| meta_info = {'joint_valid': joint_valid, 'joint_trunc': joint_trunc, 'smplx_joint_valid': smplx_joint_valid, |
| 'smplx_joint_trunc': smplx_joint_trunc, |
| 'smplx_pose_valid': smplx_pose_valid, 'smplx_shape_valid': float(smplx_shape_valid), |
| 'smplx_expr_valid': float(smplx_expr_valid), 'is_3D': float(False), |
| |
| |
| 'lhand_bbox_valid': lhand_bbox_valid, |
| 'rhand_bbox_valid': rhand_bbox_valid, 'face_bbox_valid': face_bbox_valid} |
| return inputs, targets, meta_info |
|
|
| |
| else: |
| img_path, img_shape = data['img_path'], data['img_shape'] |
|
|
| |
| img = load_img(img_path) |
| bbox = data['bbox'] |
| img, img2bb_trans, bb2img_trans, rot, do_flip = augmentation(img, bbox, self.data_split) |
| img = self.transform(img.astype(np.float32)) / 255. |
|
|
| inputs = {'img': img} |
| targets = {} |
| meta_info = {'bb2img_trans': bb2img_trans} |
| return inputs, targets, meta_info |
|
|
| def evaluate(self, outs, cur_sample_idx): |
| annots = self.datalist |
| sample_num = len(outs) |
|
|
| for n in range(sample_num): |
| annot = annots[cur_sample_idx + n] |
| ann_id = annot['ann_id'] |
| out = outs[n] |
|
|
| if annot['lhand_bbox'] is not None: |
| lhand_bbox = out['lhand_bbox'].copy().reshape(2, 2) |
| lhand_bbox = np.concatenate((lhand_bbox, np.ones((2, 1))), 1) |
| lhand_bbox = np.dot(out['bb2img_trans'], lhand_bbox.transpose(1, 0)).transpose(1, 0)[:, :2] |
|
|
| if annot['rhand_bbox'] is not None: |
| rhand_bbox = out['rhand_bbox'].copy().reshape(2, 2) |
| rhand_bbox = np.concatenate((rhand_bbox, np.ones((2, 1))), 1) |
| rhand_bbox = np.dot(out['bb2img_trans'], rhand_bbox.transpose(1, 0)).transpose(1, 0)[:, :2] |
|
|
| if annot['face_bbox'] is not None: |
| face_bbox = out['face_bbox'].copy().reshape(2, 2) |
| face_bbox = np.concatenate((face_bbox, np.ones((2, 1))), 1) |
| face_bbox = np.dot(out['bb2img_trans'], face_bbox.transpose(1, 0)).transpose(1, 0)[:, :2] |
|
|
| vis = False |
| if vis: |
| img_path = annot['img_path'] |
|
|
| """ |
| img = (out['img'].transpose(1,2,0)[:,:,::-1] * 255).copy() |
| joint_img = out['joint_img'].copy() |
| joint_img[:,0] = joint_img[:,0] / cfg.output_hm_shape[2] * cfg.input_img_shape[1] |
| joint_img[:,1] = joint_img[:,1] / cfg.output_hm_shape[1] * cfg.input_img_shape[0] |
| for j in range(len(joint_img)): |
| if j in smpl_x.pos_joint_part['body']: |
| cv2.circle(img, (int(joint_img[j][0]), int(joint_img[j][1])), 3, (0,0,255), -1) |
| lhand_bbox = out['lhand_bbox'].reshape(2,2).copy() |
| cv2.rectangle(img, (int(lhand_bbox[0][0]), int(lhand_bbox[0][1])), (int(lhand_bbox[1][0]), int(lhand_bbox[1][1])), (255,0,0), 3) |
| rhand_bbox = out['rhand_bbox'].reshape(2,2).copy() |
| cv2.rectangle(img, (int(rhand_bbox[0][0]), int(rhand_bbox[0][1])), (int(rhand_bbox[1][0]), int(rhand_bbox[1][1])), (255,0,0), 3) |
| face_bbox = out['face_bbox'].reshape(2,2).copy() |
| cv2.rectangle(img, (int(face_bbox[0][0]), int(face_bbox[0][1])), (int(face_bbox[1][0]), int(face_bbox[1][1])), (255,0,0), 3) |
| cv2.imwrite(str(ann_id) + '.jpg', img) |
| """ |
|
|
| |
|
|
| """ |
| img = load_img(img_path)[:,:,::-1] |
| bbox = annot['bbox'] |
| focal = list(cfg.focal) |
| princpt = list(cfg.princpt) |
| focal[0] = focal[0] / cfg.input_body_shape[1] * bbox[2] |
| focal[1] = focal[1] / cfg.input_body_shape[0] * bbox[3] |
| princpt[0] = princpt[0] / cfg.input_body_shape[1] * bbox[2] + bbox[0] |
| princpt[1] = princpt[1] / cfg.input_body_shape[0] * bbox[3] + bbox[1] |
| img = render_mesh(img, out['smplx_mesh_cam'], smpl_x.face, {'focal': focal, 'princpt': princpt}) |
| #img = cv2.resize(img, (512,512)) |
| cv2.imwrite(img_id + '_' + str(ann_id) + '.jpg', img) |
| """ |
|
|
| bbox = annot['bbox'] |
| focal = list(cfg.focal) |
| princpt = list(cfg.princpt) |
| focal[0] = focal[0] / cfg.input_body_shape[1] * bbox[2] |
| focal[1] = focal[1] / cfg.input_body_shape[0] * bbox[3] |
| princpt[0] = princpt[0] / cfg.input_body_shape[1] * bbox[2] + bbox[0] |
| princpt[1] = princpt[1] / cfg.input_body_shape[0] * bbox[3] + bbox[1] |
| param_save = {'smplx_param': {'root_pose': out['smplx_root_pose'].tolist(), |
| 'body_pose': out['smplx_body_pose'].tolist(), |
| 'lhand_pose': out['smplx_lhand_pose'].tolist(), |
| 'rhand_pose': out['smplx_rhand_pose'].tolist(), |
| 'jaw_pose': out['smplx_jaw_pose'].tolist(), |
| 'shape': out['smplx_shape'].tolist(), 'expr': out['smplx_expr'].tolist(), |
| 'trans': out['cam_trans'].tolist()}, |
| 'cam_param': {'focal': focal, 'princpt': princpt} |
| } |
| with open(str(ann_id) + '.json', 'w') as f: |
| json.dump(param_save, f) |
|
|
| return {} |
|
|
| def print_eval_result(self, eval_result): |
| return |
|
|