File size: 2,954 Bytes
cd47a59
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import os
import shutil
import subprocess
import argparse

def main():
    parser = argparse.ArgumentParser(description="Batch process driving videos for generate_smpls")
    parser.add_argument('--max_videos', type=int, default=-1, help='Number of videos to process (integer). -1 means process all.')
    args = parser.parse_args()

    base_dir = r"D:\Users\roy\CV_final_project\champ-master"
    driving_videos_dir = os.path.join(base_dir, "driving_videos")
    guidance_motion_dir = os.path.join(base_dir, "guidance_motion")
    source_ref_base = os.path.join(base_dir, "reference_imgs")
    
    if not os.path.exists(source_ref_base):
        print(f"錯誤:找不到原始的參考圖片根目錄 {source_ref_base}")
        return

    # 取得所有的影片資料夾名稱
    video_names = [d for d in os.listdir(driving_videos_dir) if os.path.isdir(os.path.join(driving_videos_dir, d))]
    video_names.sort()
    
    if args.max_videos > 0:
        video_names = video_names[:args.max_videos]
        print(f"已指定處理前 {args.max_videos} 支影片。")
        
    print(f"總共找到 {len(video_names)} 支影片需要處理。")

    for video_name in video_names:
        target_ref_folder = os.path.join(guidance_motion_dir, video_name, "reference_imgs")
        video_smpl_output = os.path.join(driving_videos_dir, video_name, "smpl_results", "smpls_group.npz")
        
        # 檢查該影片的動作捕捉是否已完成 (smpls_group.npz 是所有幀處理完最後才產生的檔案)
        if os.path.exists(video_smpl_output):
            print(f"[{video_name}] 動作捕捉 (Task 2) 已全數完成,自動跳過...")
            continue
            
        print(f"\n========================================")
        print(f"正在處理影片: {video_name}")
        print(f"========================================")
        
        # 無論 reference_imgs 是否存在,都執行 copytree (搭配 dirs_exist_ok=True)
        # 這樣如果之前中斷,也能確保缺漏的參考圖片快取被補齊
        print(f"[{video_name}] 準備參考圖片快取 (Task 1)...")
        shutil.copytree(source_ref_base, target_ref_folder, dirs_exist_ok=True)
                
        # 執行 generate_smpls 指令 (若 Task 1 的快取都齊全,generate_smpls 會瞬間跳過 Task 1)
        cmd = [
            "python", "-m", "scripts.data_processors.smpl.generate_smpls",
            "--reference_imgs_folder", target_ref_folder,
            "--driving_video_path", os.path.join("driving_videos", video_name)
        ]
        
        print(f"[{video_name}] 啟動動作捕捉程式...")
        print(f"執行指令: {' '.join(cmd)}")
        result = subprocess.run(cmd, cwd=base_dir)
        
        if result.returncode != 0:
            print(f"[{video_name}] 執行時發生錯誤!")
        else:
            print(f"[{video_name}] 處理完成!\n")

if __name__ == "__main__":
    main()