| ''' |
| @Author: Jiapeng Zhou |
| @Email: jiapengzhou@link.cuhk.edu.cn |
| @Desc: script to process all data of RECMV. |
| Before run this bash, what you only need to do is : |
| - run openpose to get keypoints.json file in the dir: (self.root, openpose) |
| - have a conda environment of videoavatar, named: "videoavatar" |
| Usage: python process_data_all.py --root ~/DeepDxxx/xinyu_a/ --gid 0 --gender female |
| ''' |
|
|
| import pdb, os, os.path as osp, sys, argparse |
| from typing import Any |
| import numpy as np, cv2 |
|
|
| class RECMVDataProcessor(): |
| def __init__(self, args) -> None: |
| self.args = args |
| self.gender = args.gender |
|
|
| self.root = args.root |
| |
| |
| self.img_dir = osp.join(self.root, 'imgs') |
| assert osp.exists(self.img_dir) and len(os.listdir(self.img_dir)) > 0, 'img file does not exist' |
| self.gid = args.gid |
| |
| def __len__(self): |
| return len(os.listdir(self.img_dir)) |
| |
| def __call__(self): |
| '''get normals, ATR-parsing, masks, camera, smpl_params, depth, featurelines''' |
|
|
| |
| self.get_ATR_parsing() |
| |
| |
| self.get_masks() |
|
|
| |
| self.get_normals() |
|
|
| '''cannot directly ca videoavatar |
| # get reconstructed_poses.hdf5 from videoavatar |
| self.get_poses() |
| |
| # get camera.npz and smpl_rec.npz |
| self.get_camera_smpl_rec() |
| |
| ''' |
| |
| |
| |
| |
| |
| |
|
|
| def get_featurelines(self): |
| fl_dir = osp.join(self.root, 'featurelines') |
| if osp.exists(fl_dir) and len(os.listdir(fl_dir)) >= self.__len__(): |
| print('featurelines files exists') |
| else: |
| print('featurelines file does not exist') |
| |
| def get_depth(self): |
| depth_dir = osp.join(self.root, 'depth') |
| if osp.exists(depth_dir) and len(os.listdir(depth_dir)) >= self.__len__(): |
| print('depth files exists') |
| else: |
| print('depth file does not exist') |
| |
| def get_masks(self): |
| mask_dir = osp.join(self.root, 'masks') |
| if osp.exists(mask_dir) and len(os.listdir(mask_dir)) >= self.__len__(): |
| print('mask files exists') |
| return |
| os.makedirs(mask_dir, exist_ok=True) |
| |
| print('\n-----------------Getting Masks-------------------------') |
| os.system(f'cd ./RobustVideoMatting && python inference_itw_rotate.py \ |
| --input_pth {self.img_dir} --output_pth {mask_dir} --device {self.gid}') |
|
|
| |
| def get_normals(self): |
| normal_dir = osp.join(self.root, 'normals') |
| if osp.exists(normal_dir) and len(os.listdir(normal_dir)) >= self.__len__(): |
| print('normal files exists') |
| return |
|
|
| print('\n-------------------Getting Normals----------------------') |
| os.makedirs(normal_dir, exist_ok=True) |
| os.system('cd ./pifuhd && python ./generate_normals.py --gid {} --imgpath {}'.format(self.gid, self.img_dir)) |
|
|
| def get_ATR_parsing(self): |
| input_dir = osp.join(self.root, 'imgs') |
| output_dir = osp.join(self.root, 'parsing_SCH_ATR') |
| if osp.exists(output_dir) and len(os.listdir(output_dir)) >= self.__len__(): |
| print('ATR parsing files exists') |
| return |
| print('\n--------------------Getting ATR_Parsing------------------') |
| os.makedirs(output_dir, exist_ok=True) |
|
|
| os.system(f'cd ./Self-Correction-Human-Parsing && python simple_extractor.py \ |
| --dataset atr --model-restore exp-schp-201908301523-atr.pth --gpu {self.gid} \ |
| --input-dir {self.img_dir} --output-dir {output_dir} --logits') |
|
|
|
|
| def get_poses(self): |
| openpose_p = osp.join(self.root, 'openpose') |
| assert osp.exists(openpose_p) and len(os.listdir(openpose_p)) >= self.__len__(), 'openpose keypoint folder doesnot exist or it is emtpy' |
|
|
| output_dir = osp.join(self.root, 'videoavatars') |
| if osp.exists(output_dir) and osp.exists(osp.join(output_dir, 'reconstructed_poses.hdf5')): |
| print('reconstructed_poses.hdf5 files exists') |
| return |
|
|
| print('\n------------------Getting Poses---------------------------') |
| os.makedirs(output_dir, exist_ok=True) |
| |
| os.system(f'cd ./videoavatars && bash get_reconstructed_poses.sh {self.root} {output_dir} {self.gender}') |
|
|
|
|
| def get_camera_smpl_rec(self): |
| if osp.exists(osp.join(self.root, 'camera.npz')) and osp.exists(osp.join(self.root, 'smpl_rec.npz')): |
| print('camera.npz and smpl_rec.npz files exists') |
| return |
|
|
| print('\n---------------------Getting camera and smpl_rec--------------------') |
| os.system(' python get_smpl_rec_camera.py --root {} --save_root {} --gender {}'.\ |
| format(osp.join(self.root, 'videoavatars'), self.root, self.gender)) |
|
|
|
|
| |
|
|
| def parse_args(): |
| parser = argparse.ArgumentParser() |
| parser.add_argument('--gid', type=int, default=0) |
| parser.add_argument('--root', type=str, required=True) |
| parser.add_argument('--gender', type=str, choices=['male', 'female'], required=True) |
| args = parser.parse_args() |
| return args |
|
|
| def main(): |
| args = parse_args() |
| processor = RECMVDataProcessor(args) |
| processor() |
| |
| if __name__ == '__main__': |
| main() |
| |
|
|