from src.utils.mp_utils import LMKExtractor from src.utils.draw_utils import FaceMeshVisualizer from src.utils.img_utils import pil_to_cv2, cv2_to_pil, center_crop_cv2, pils_from_video, save_videos_from_pils, save_video_from_cv2_list from PIL import Image import cv2 from IPython import embed import numpy as np import copy from src.utils.motion_utils import motion_sync import pathlib import torch import pickle from glob import glob import os vis = FaceMeshVisualizer(draw_iris=False, draw_mouse=True, draw_eye=True, draw_nose=True, draw_eyebrow=True, draw_pupil=True) imsize = (512, 512) visualization = True driver_video = "./assets/driven_videos/a.mp4" # driver_videos = glob("/nas2/luoque.lym/evaluation/test_datasets/gt_data/OurDataset/*.mp4") ref_image = './assets/test_imgs/d.png' # ref_image = 'panda.png' lmk_extractor = LMKExtractor() input_frames_cv2 = [cv2.resize(center_crop_cv2(pil_to_cv2(i)), imsize) for i in pils_from_video(driver_video)] ref_frame =cv2.resize(cv2.imread(ref_image), (512, 512)) ref_det = lmk_extractor(ref_frame) # print(ref_det) sequence_driver_det = [] try: for frame in input_frames_cv2: result = lmk_extractor(frame) assert result is not None, "{}, bad video, face not detected".format(driver_video) sequence_driver_det.append(result) except: print("face detection failed") exit() print(len(sequence_driver_det)) if visualization: pose_frames_driver = [vis.draw_landmarks((512, 512), i["lmks"], normed=True) for i in sequence_driver_det] poses_add_driver = [(i * 0.5 + j * 0.5).clip(0,255).astype(np.uint8) for i, j in zip(input_frames_cv2, pose_frames_driver)] save_dir = './{}'.format(ref_image.split('/')[-1].replace('.png', '')) os.makedirs(save_dir, exist_ok=True) sequence_det_ms = motion_sync(sequence_driver_det, ref_det) for i in range(len(sequence_det_ms)): with open('{}/{}.pkl'.format(save_dir, i), 'wb') as file: pickle.dump(sequence_det_ms[i], file) if visualization: pose_frames = [vis.draw_landmarks((512, 512), i, normed=False) for i in sequence_det_ms] poses_add = [(i * 0.5 + ref_frame * 0.5).clip(0,255).astype(np.uint8) for i in pose_frames] # sequence_det_ms = motion_sync(sequence_driver_det, ref_det, per_landmark_align=False) # for i in range(len(sequence_det_ms)): # tmp = {} # tmp["lmks"] = sequence_det_ms[i] # with open('{}_v2/{}.pkl'.format(save_dir, i), 'wb') as file: # pickle.dump(tmp, file) # pose_frames_wo_lmkalign = [vis.draw_landmarks((512, 512), i, normed=False) for i in sequence_det_ms] # poses_add_wo_lmkalign = [(i * 0.5 + ref_frame * 0.5).clip(0,255).astype(np.uint8) for i in pose_frames_wo_lmkalign] poses_cat = [np.concatenate([i, j], axis=1) for i, j in zip(poses_add_driver, poses_add)] save_video_from_cv2_list(poses_cat, "./vis_example.mp4", fps=24.0) # for ref_image in ref_images[:1]: # # for driver_video in driver_videos: # # ref_image = "./samples/007.png" # # save_dir = '/nas2/jiajiong.caojiajio/data/test_pose/OurDataset/{}'.format(driver_video.split('/')[-1].replace('.mp4', '')) # save_dir = './{}'.format(ref_image.split('/')[-1].replace('.png', '')) # os.makedirs(save_dir+'_v1', exist_ok=True) # os.makedirs(save_dir+'_v2', exist_ok=True) # #"./samples/hedra_003.png" # #"./samples/video_temp_fix.mov" # input_frames_cv2 = [cv2.resize(center_crop_cv2(pil_to_cv2(i)), imsize) for i in pils_from_video(driver_video)] # # input_frames_cv2 = [cv2.resize(pil_to_cv2(i), imsize) for i in pils_from_video(driver_video)] # lmk_extractor = LMKExtractor() # ref_frame =cv2.resize(cv2.imread(ref_image), (512, 512)) # ref_det = lmk_extractor(ref_frame) # sequence_driver_det = [] # try: # for frame in input_frames_cv2: # result = lmk_extractor(frame) # assert result is not None, "{}, bad video, face not detected".format(driver_video) # sequence_driver_det.append(result) # except: # continue # print(len(sequence_driver_det)) # # os.makedirs(save_dir, exist_ok=True) # # for i in range(len(sequence_driver_det)): # # with open('{}/{}.pkl'.format(save_dir, i), 'wb') as file: # # pickle.dump(sequence_driver_det[i]["lmks"] * imsize[0], file) # #[vis.draw_landmarks(imsize, i["lmks"], normed=True, white=True) for i in det_results] # pose_frames_driver = [vis.draw_landmarks((512, 512), i["lmks"], normed=True) for i in sequence_driver_det] # poses_add_driver = [(i * 0.5 + j * 0.5).clip(0,255).astype(np.uint8) for i, j in zip(input_frames_cv2, pose_frames_driver)] # sequence_det_ms = motion_sync(sequence_driver_det, ref_det) # for i in range(len(sequence_det_ms)): # tmp = {} # tmp["lmks"] = sequence_det_ms[i] # with open('{}_v1/{}.pkl'.format(save_dir, i), 'wb') as file: # pickle.dump(tmp, file) # pose_frames = [vis.draw_landmarks((512, 512), i, normed=False) for i in sequence_det_ms] # poses_add = [(i * 0.5 + ref_frame * 0.5).clip(0,255).astype(np.uint8) for i in pose_frames] # sequence_det_ms = motion_sync(sequence_driver_det, ref_det, per_landmark_align=False) # for i in range(len(sequence_det_ms)): # tmp = {} # tmp["lmks"] = sequence_det_ms[i] # with open('{}_v2/{}.pkl'.format(save_dir, i), 'wb') as file: # pickle.dump(tmp, file) # pose_frames_wo_lmkalign = [vis.draw_landmarks((512, 512), i, normed=False) for i in sequence_det_ms] # poses_add_wo_lmkalign = [(i * 0.5 + ref_frame * 0.5).clip(0,255).astype(np.uint8) for i in pose_frames_wo_lmkalign] # poses_cat = [np.concatenate([i, j, k], axis=1) for i, j, k in zip(poses_add_driver, poses_add_wo_lmkalign, poses_add)] # save_video_from_cv2_list(poses_cat, "./output/example2.mp4", fps=24.0) # # exit() # #embed() # #poses_cat = [(i * 0.5 + j * 0.5).clip(0,255).astype(np.uint8) for i, j in zip(input_frames_cv2, pose_frames)] # #save_videos_from_pils([cv2_to_pil(i) for i in poses_cat], "./output/pose_cat.mp4", fps=24)