|
''' |
|
@Author: Jiapeng Zhou |
|
@Email: [email protected] |
|
@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() |
|
|
|
|