90 lines
2.5 KiB
Python
Executable File
90 lines
2.5 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
import sys
|
|
from pathlib import Path
|
|
import shutil
|
|
import random
|
|
from fvd import compute_fvd_with_config, FVDConfig
|
|
|
|
script_path = Path(__file__).resolve()
|
|
fastvideo_root = script_path.parent.parent.parent
|
|
sys.path.insert(0, str(fastvideo_root))
|
|
|
|
|
|
def split_videos(video_dir: Path, n_per_subset: int = 128, seed: int = 42):
|
|
subset_a = video_dir.parent / 'bair_full_subset_A'
|
|
subset_b = video_dir.parent / 'bair_full_subset_B'
|
|
|
|
if subset_a.exists():
|
|
shutil.rmtree(subset_a)
|
|
if subset_b.exists():
|
|
shutil.rmtree(subset_b)
|
|
|
|
subset_a.mkdir(parents=True)
|
|
subset_b.mkdir(parents=True)
|
|
|
|
videos = sorted(video_dir.glob('*.mp4'))
|
|
|
|
random.seed(seed)
|
|
shuffled = list(videos)
|
|
random.shuffle(shuffled)
|
|
|
|
needed = n_per_subset * 2
|
|
if len(shuffled) > needed:
|
|
shuffled = shuffled[:needed]
|
|
|
|
mid = len(shuffled) // 2
|
|
|
|
print(f"\nSplitting {len(shuffled)} BAIR FULL videos:")
|
|
print(f" Subset A: {mid} videos")
|
|
print(f" Subset B: {len(shuffled) - mid} videos")
|
|
|
|
for v in shuffled[:mid]:
|
|
shutil.copy2(v, subset_a / v.name)
|
|
|
|
for v in shuffled[mid:]:
|
|
shutil.copy2(v, subset_b / v.name)
|
|
|
|
return subset_a, subset_b, mid
|
|
|
|
|
|
def validate_fvd(subset_a: Path, subset_b: Path, num_videos: int):
|
|
config = FVDConfig(num_videos=num_videos,
|
|
num_frames_per_clip=16,
|
|
clip_strategy='beginning',
|
|
batch_size=8,
|
|
device='cuda',
|
|
seed=42)
|
|
|
|
print("\n" + "=" * 70)
|
|
print("TEST 1: Identity Test")
|
|
print("=" * 70)
|
|
|
|
result1 = compute_fvd_with_config(real_videos=str(subset_a), gen_videos=str(subset_a), config=config, verbose=False)
|
|
fvd_identity = result1['fvd']
|
|
print(f"\nIdentity FVD: {fvd_identity:.2f}")
|
|
|
|
print("\n" + "=" * 70)
|
|
print("TEST 2: Real vs Real")
|
|
print("=" * 70)
|
|
|
|
result2 = compute_fvd_with_config(real_videos=str(subset_a), gen_videos=str(subset_b), config=config, verbose=False)
|
|
fvd_real = result2['fvd']
|
|
print(f"\nReal vs Real FVD: {fvd_real:.2f}")
|
|
|
|
print("\n" + "=" * 70)
|
|
print("RESULTS")
|
|
print("=" * 70)
|
|
print(f"Identity: {fvd_identity:.2f}")
|
|
print(f"Real vs Real: {fvd_real:.2f}")
|
|
|
|
|
|
def main() -> None:
|
|
bair_dir = Path('benchmarks/data/bair_full_videos')
|
|
|
|
subset_a, subset_b, count = split_videos(bair_dir, n_per_subset=128, seed=42)
|
|
validate_fvd(subset_a, subset_b, count)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|