| | 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()
|
| |
|