| import os
|
| import cv2
|
| import argparse
|
| import numpy as np
|
| from tqdm import tqdm
|
| from PIL import Image
|
|
|
| from pose.script.tool import save_videos_from_pil
|
| from pose.script.dwpose import draw_pose
|
|
|
|
|
|
|
| def draw_dwpose(video_path, pose_path, out_path, draw_face):
|
|
|
|
|
| cap = cv2.VideoCapture(video_path)
|
| width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
|
| height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
|
| fps = cap.get(cv2.CAP_PROP_FPS)
|
| fps = int(np.around(fps))
|
|
|
| cap.release()
|
|
|
|
|
| k = float(1024) / min(width, height)
|
| h_render = int(k*height//2 * 2)
|
| w_render = int(k*width//2 * 2)
|
|
|
|
|
| k = float(768) / min(width, height)
|
| h_save = int(k*height//2 * 2)
|
| w_save = int(k*width//2 * 2)
|
|
|
| poses = np.load(pose_path, allow_pickle=True)
|
| poses = poses.tolist()
|
|
|
| frames = []
|
| for pose in tqdm(poses):
|
| detected_map = draw_pose(pose, h_render, w_render, draw_face)
|
| detected_map = cv2.resize(detected_map, (w_save, h_save), interpolation=cv2.INTER_AREA)
|
|
|
|
|
| detected_map = cv2.cvtColor(detected_map, cv2.COLOR_BGR2RGB)
|
| detected_map = Image.fromarray(detected_map)
|
| frames.append(detected_map)
|
|
|
| save_videos_from_pil(frames, out_path, fps)
|
|
|
|
|
|
|
| if __name__ == "__main__":
|
|
|
| parser = argparse.ArgumentParser()
|
| parser.add_argument("--video_dir", type=str, default="./UBC_fashion/test", help='dance video dir')
|
| parser.add_argument("--pose_dir", type=str, default=None, help='auto makedir')
|
| parser.add_argument("--save_dir", type=str, default=None, help='auto makedir')
|
| parser.add_argument("--draw_face", type=bool, default=False, help='whether draw face or not')
|
| args = parser.parse_args()
|
|
|
|
|
|
|
| video_dir = args.video_dir
|
|
|
|
|
| if args.pose_dir is None:
|
| pose_dir = args.video_dir + "_dwpose_keypoints"
|
| else:
|
| pose_dir = args.pose_dir
|
|
|
|
|
| if args.save_dir is None:
|
| if args.draw_face == True:
|
| save_dir = args.video_dir + "_dwpose"
|
| else:
|
| save_dir = args.video_dir + "_dwpose_without_face"
|
| else:
|
| save_dir = args.save_dir
|
| if not os.path.exists(save_dir):
|
| os.makedirs(save_dir)
|
|
|
|
|
|
|
| video_mp4_paths = set()
|
| for root, dirs, files in os.walk(args.video_dir):
|
| for name in files:
|
| if name.endswith(".mp4"):
|
| video_mp4_paths.add(os.path.join(root, name))
|
| video_mp4_paths = list(video_mp4_paths)
|
|
|
| video_mp4_paths.sort()
|
| print("Num of videos:", len(video_mp4_paths))
|
|
|
|
|
|
|
| for i in range(len(video_mp4_paths)):
|
| video_path = video_mp4_paths[i]
|
| video_name = os.path.relpath(video_path, video_dir)
|
| base_name = os.path.splitext(video_name)[0]
|
|
|
| pose_path = os.path.join(pose_dir, base_name + '.npy')
|
| if not os.path.exists(pose_path):
|
| print('no keypoint file:', pose_path)
|
|
|
| out_path = os.path.join(save_dir, base_name + '.mp4')
|
| if os.path.exists(out_path):
|
| print('already have rendered pose:', out_path)
|
| continue
|
|
|
| draw_dwpose(video_path, pose_path, out_path, args.draw_face)
|
| print(f"Process {i+1}/{len(video_mp4_paths)} video")
|
|
|
| print('all done!') |