| import os
|
| import sys
|
|
|
| this_dir = os.path.dirname(__file__)
|
|
|
| mmcv_pkg_root = os.path.join(os.path.dirname(this_dir), "mmcv")
|
| if os.path.exists(mmcv_pkg_root):
|
| print(f"please make sure you have mmcv package successfully installed in local mmcv folder {mmcv_pkg_root}")
|
| print(f">>> [check] sys.path before mmcv insert = {sys.path}")
|
| print(f">>> [check] mmcv_pkg_root = {mmcv_pkg_root}")
|
| if mmcv_pkg_root in sys.path:
|
| sys.path.remove(mmcv_pkg_root)
|
| sys.path.insert(0, mmcv_pkg_root)
|
| print(f">>> [check] sys.path after mmcv insert = {sys.path}")
|
| else:
|
| print(f">>> [check] mmcv_pkg_root not exists: {mmcv_pkg_root}")
|
| print(f"please make sure you have mmcv package successfully installed by 'pip install mmcv' or 'mim install mmcv'")
|
| import mmcv
|
| print(">>> [check] mmcv __file__ =", getattr(mmcv, "__file__", None))
|
| print(">>> [check] mmcv __version__ =", getattr(mmcv, "__version__", None))
|
| assert mmcv.__version__ >= "2.0.0" and mmcv.__version__ < "2.2.0", "mmcv version must be >=2.0.0 and <2.2.0"
|
|
|
| import numpy as np
|
| import argparse
|
| import torch
|
| import copy
|
| import cv2
|
| import os
|
| import moviepy.video.io.ImageSequenceClip
|
|
|
| from pose.script.dwpose import DWposeDetector, draw_pose
|
| from pose.script.util import size_calculate, warpAffine_kps
|
| from utils_aug import pose_aug_diff
|
|
|
|
|
| def run_align_video_with_filterPose_translate_smooth(args):
|
|
|
| vidfn=args.vidfn
|
|
|
| outfn_all=args.outfn_all
|
|
|
| video = cv2.VideoCapture(vidfn)
|
| width= video.get(cv2.CAP_PROP_FRAME_WIDTH)
|
| height= video.get(cv2.CAP_PROP_FRAME_HEIGHT)
|
|
|
| total_frame= video.get(cv2.CAP_PROP_FRAME_COUNT)
|
| fps= video.get(cv2.CAP_PROP_FPS)
|
|
|
| print("height:", height)
|
| print("width:", width)
|
| print("fps:", fps)
|
|
|
| H_in, W_in = height, width
|
| H_out, W_out = size_calculate(H_in,W_in,args.detect_resolution)
|
| H_out, W_out = size_calculate(H_out,W_out,args.image_resolution)
|
|
|
| device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
|
| detector = DWposeDetector(
|
| det_config = args.yolox_config,
|
| det_ckpt = args.yolox_ckpt,
|
| pose_config = args.dwpose_config,
|
| pose_ckpt = args.dwpose_ckpt,
|
| keypoints_only=False
|
| )
|
| detector = detector.to(device)
|
|
|
| skip_frames = args.align_frame
|
| max_frame = args.max_frame
|
| pose_list, video_frame_buffer, video_pose_buffer = [], [], []
|
|
|
| for i in range(max_frame):
|
| ret, img = video.read()
|
| if img is None:
|
| break
|
| else:
|
| if i < skip_frames:
|
| continue
|
| video_frame_buffer.append(img)
|
|
|
|
|
| pose_img, pose_ori = detector(img, args.detect_resolution, args.image_resolution, output_type='cv2', return_pose_dict=True)
|
| video_pose_buffer.append(pose_img)
|
|
|
| H = 768
|
|
|
|
|
| W2 = int((H/height * width)//2 *2)
|
| result_demo = []
|
| result_pose_only = []
|
| for i in range(len(video_frame_buffer)):
|
|
|
| video_frame = cv2.resize(video_frame_buffer[i], (W2, H), interpolation=cv2.INTER_CUBIC)
|
| video_frame = cv2.cvtColor(video_frame, cv2.COLOR_BGR2RGB)
|
| video_pose = cv2.resize(video_pose_buffer[i], (W2, H), interpolation=cv2.INTER_CUBIC)
|
|
|
| res_all = np.concatenate([video_frame, video_pose], axis=1)
|
| result_demo.append(res_all)
|
| res_single = np.concatenate([video_pose], axis=1)
|
| result_pose_only.append(res_single)
|
|
|
| print(f"pose_list len: {len(pose_list)}")
|
| clip = moviepy.video.io.ImageSequenceClip.ImageSequenceClip(result_demo, fps=fps)
|
| clip.write_videofile(outfn_all, fps=fps, codec="libx264")
|
|
|
| clip = moviepy.video.io.ImageSequenceClip.ImageSequenceClip(result_pose_only, fps=fps)
|
| clip.write_videofile(args.outfn_single, fps=fps, codec="libx264")
|
|
|
| print('pose align done')
|
|
|
|
|
|
|
| def main():
|
| parser = argparse.ArgumentParser()
|
|
|
|
|
| parser.add_argument('--detect_resolution', type=int, default=1024, help='detect_resolution')
|
| parser.add_argument('--image_resolution', type=int, default=720, help='image_resolution')
|
|
|
| parser.add_argument("--yolox_config", type=str, default=f"{this_dir}/pose/config/yolox_l_8xb8-300e_coco.py")
|
| parser.add_argument("--dwpose_config", type=str, default=f"{this_dir}/pose/config/dwpose-l_384x288.py")
|
| parser.add_argument("--yolox_ckpt", type=str, default=f"{this_dir}/pretrained_weights/dwpose/yolox_l_8x8_300e_coco.pth")
|
| parser.add_argument("--dwpose_ckpt", type=str, default=f"{this_dir}/pretrained_weights/dwpose/dw-ll_ucoco_384.pth")
|
|
|
| parser.add_argument('--align_frame', type=int, default=0, help='the frame index of the video to align')
|
| parser.add_argument('--max_frame', type=int, default=300, help='maximum frame number of the video to align')
|
| parser.add_argument('--vidfn', type=str, default="./assets/videos/0.mp4", help='Input video path')
|
| parser.add_argument('--outfn_all', type=str, default=None, help='Output path of the alignment visualization')
|
| parser.add_argument('--outfn_single', type=str, default=None, help='output path of the aligned video of the refer img')
|
| args = parser.parse_args()
|
|
|
| os.makedirs(os.path.dirname(args.outfn_all), exist_ok=True)
|
| os.makedirs(os.path.dirname(args.outfn_single), exist_ok=True)
|
|
|
| run_align_video_with_filterPose_translate_smooth(args)
|
|
|
|
|
|
|
| if __name__ == '__main__':
|
| main()
|
|
|