24yearsold's picture
update: add ComfyUI Node Extension mention to description
b55a1fc verified
import sys
import os.path as osp
import os
import argparse
default_n_threads = 8
os.environ['OPENBLAS_NUM_THREADS'] = f"{default_n_threads}"
os.environ['MKL_NUM_THREADS'] = f"{default_n_threads}"
os.environ['OMP_NUM_THREADS'] = f"{default_n_threads}"
sys.path.append(osp.dirname(osp.dirname(osp.abspath(__file__))))
import numpy as np
from tqdm import tqdm
from PIL import Image
from utils.io_utils import json2dict, dict2json, save_psd, load_img_depth
from utils.torch_utils import seed_everything
eye_mesh_list = [
'1-2-3-2-2+eyebgs-l',
'1-2-3-3-2+irides-l',
'1-2-3-1-2+eyelashs-l',
'1-2-3-2-1+eyebgs-r',
'1-2-3-3-1+irides-r',
'1-2-3-1-1+eyelashs-r'
]
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--saved', type=str, default='workspace/datasets/tmp_output')
parser.add_argument('--srcd', type=str, default='workspace/datasets/testcaseall_output')
args = parser.parse_args()
srcd = args.srcd
saved = args.saved
os.makedirs(saved, exist_ok=True)
seed_everything(0)
for srcp in tqdm(os.listdir(srcd)):
srcp = osp.join(args.srcd, srcp)
from talking_head.preprocess import further_extr
further_extr(srcp, rotate=False)
import smug
from smug.utils.logging import set_logger
from smug import KeyPointsController, IRIAMSeparationController
controller_kp = KeyPointsController()
controller_sep = IRIAMSeparationController()
for srcp in tqdm(os.listdir(srcd)):
srcp = osp.join(args.srcd, srcp)
faceparsing_output = osp.join(srcp, 'face_parsing')
src_img = np.array(Image.open(osp.join(srcp, 'src_img.png')).convert('RGB'))
os.makedirs(faceparsing_output, exist_ok=True)
if len(os.listdir(faceparsing_output))> 1:
continue
try:
result = controller_kp.run(src_img)
landmark_dict = {
'pose': result.pose,
'face_landmarks': {'left': result.face_landmarks.left, 'top': result.face_landmarks.top, 'points': result.face_landmarks.points}
}
dict2json(landmark_dict, osp.join(faceparsing_output, 'pose.json'))
ls = controller_sep.run(src_img, {'output_folder': faceparsing_output})
except Exception as e:
print(f'failed to process {srcp}: {e}')
for srcp in tqdm(os.listdir(srcd)):
srcp = osp.join(args.srcd, srcp)
op_dir = osp.join(srcp, 'optimized')
faceparsing_output = osp.join(srcp, 'face_parsing')
face_parts = osp.join(faceparsing_output, 'parts.json')
face_list = None
if not osp.exists(face_parts):
# op_dir = srcp
pass
else:
face_parts = json2dict(face_parts)
face_list = []
eye_valid = True
for e in eye_mesh_list:
ep = osp.join(faceparsing_output, e) + '.png'
if not osp.exists(ep):
eye_valid = False
break
img = np.array(Image.open(ep))
x, y, w, h = face_parts[e]['x'], face_parts[e]['y'], face_parts[e]['w'], face_parts[e]['h']
face_list.append({'img': img, 'xyxy': [x, y, x+w, y+h], 'layer_name': e})
# if not eye_valid:
# continue
src_infop = osp.join(op_dir, 'info.json')
src_info = json2dict(src_infop)
load_img_depth(op_dir, src_info)
# part_dict_list.sort(key=lambda x: x['depth_median'], reverse=True)
img_list = []
for t, pd in src_info['parts'].items():
if 'xyxy' not in pd:
pd['xyxy'] = [0, 0, pd['img'].shape[1], pd['img'].shape[0]]
if 'depth_median' not in pd:
print(np.max(pd['mask']))
pd['depth_median'] = np.median(pd['depth'][pd['mask'] > 127])
pd['tag'] = t
img_list.append({'img': pd['img'], 'xyxy': pd['xyxy'], 'layer_name': pd['tag'], 'depth_median': pd['depth_median']})
img_list.sort(key=lambda x: x['depth_median'], reverse=True)
if face_list is not None:
img_list += face_list
psd_savep = osp.join(saved, osp.basename(srcp)) + '.psd'
save_psd(psd_savep, img_list, 1024, 1024)