| |
| from tools.inferencer import PoseInferencerV2 |
| from tools.dtw import DTWForKeypoints |
| from tools.visualizer import FastVisualizer |
| from tools.utils import convert_video_to_playable_mp4 |
| from pathlib import Path |
| from tqdm import tqdm |
| import mmengine |
| import numpy as np |
| import mmcv |
| import cv2 |
| import gradio as gr |
|
|
| def concat(img1, img2, height=1080): |
| h1, w1, _ = img1.shape |
| h2, w2, _ = img2.shape |
|
|
| |
| scale1 = height / img1.shape[0] |
| scale2 = height / img2.shape[0] |
|
|
| |
| img1 = cv2.resize(img1, (int(w1*scale1), int(h1*scale1))) |
| img2 = cv2.resize(img2, (int(w2*scale2), int(h2*scale2))) |
|
|
| |
| image = cv2.hconcat([img1, img2]) |
| return image |
|
|
| def draw(vis: FastVisualizer, img, keypoint, box, oks, oks_unnorm, |
| draw_human_keypoints=True, |
| draw_score_bar=True): |
| vis.set_image(img) |
| vis.draw_non_transparent_area(box) |
| if draw_score_bar: |
| vis.draw_score_bar(oks) |
| if draw_human_keypoints: |
| vis.draw_human_keypoints(keypoint, oks_unnorm) |
| return vis.get_image() |
|
|
| def main(video1, video2, draw_human_keypoints, |
| progress=gr.Progress(track_tqdm=True)): |
| |
| config = 'configs/mark2.py' |
| cfg = mmengine.Config.fromfile(config) |
| pose_inferencer = PoseInferencerV2( |
| cfg.det_cfg, |
| cfg.pose_cfg, |
| device='cpu') |
| |
| v1 = mmcv.VideoReader(video1) |
| v2 = mmcv.VideoReader(video2) |
| video_writer = None |
|
|
| all_det1, all_pose1 = pose_inferencer.inference_video(video1) |
| all_det2, all_pose2 = pose_inferencer.inference_video(video2) |
|
|
| keypoints1 = np.stack([p.keypoints[0] for p in all_pose1]) |
| keypoints2 = np.stack([p.keypoints[0] for p in all_pose2]) |
| boxes1 = np.stack([d.bboxes[0] for d in all_det1]) |
| boxes2 = np.stack([d.bboxes[0] for d in all_det2]) |
|
|
| dtw_path, oks, oks_unnorm = DTWForKeypoints(keypoints1, keypoints2).get_dtw_path() |
|
|
| vis = FastVisualizer() |
| |
| for i, j in tqdm(dtw_path, desc='Visualizing'): |
| frame1 = v1[i] |
| frame2 = v2[j] |
|
|
| frame1_ = draw(vis, frame1.copy(), keypoints1[i], boxes1[i], |
| oks[i, j], oks_unnorm[i, j], draw_human_keypoints) |
| frame2_ = draw(vis, frame2.copy(), keypoints2[j], boxes2[j], |
| oks[i, j], oks_unnorm[i, j], draw_human_keypoints, draw_score_bar=False) |
| |
| frame = concat(frame1_, frame2_) |
| |
| vis.set_image(frame) |
| frame = vis.draw_logo().get_image() |
| |
| w, h = frame.shape[1], frame.shape[0] |
| if video_writer is None: |
| fourcc = cv2.VideoWriter_fourcc(*'mp4v') |
| video_writer = cv2.VideoWriter('dtw_compare.mp4', |
| fourcc, v1.fps, (w, h)) |
| video_writer.write(frame) |
| video_writer.release() |
| |
| convert_video_to_playable_mp4('dtw_compare.mp4') |
| output = str(Path('dtw_compare.mp4').resolve()) |
| return output |
|
|
| if __name__ == '__main__': |
| config = 'configs/mark2.py' |
| cfg = mmengine.Config.fromfile(config) |
|
|
| inputs = [ |
| gr.Video(label="Input video 1"), |
| gr.Video(label="Input video 2"), |
| "checkbox" |
| ] |
|
|
| output = gr.Video(label="Output video") |
|
|
| demo = gr.Interface(fn=main, inputs=inputs, outputs=output, |
| allow_flagging='never').queue() |
| demo.launch() |
|
|