File size: 2,212 Bytes
0dd9a1c | 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 67 68 69 70 71 72 73 74 | """
从 full_delta_frame_mapping.json 中为每个视频随机选取一个 mask pattern,
输出精简版 mapping,用于加速 oracle 推理。
随机性保证:
- 使用 os.urandom 生成种子(系统级熵源)
- 每条 entry 独立随机选取
- 打印种子方便复现
使用方式:
python select_single_pattern.py \
--input full_delta_frame_mapping.json \
--output single_delta_frame_mapping.json
"""
import argparse
import json
import os
import random
def main():
parser = argparse.ArgumentParser(
description="为每个视频随机选取一个 mask pattern"
)
parser.add_argument("--input", required=True, help="完整 mapping JSON")
parser.add_argument("--output", required=True, help="输出精简 mapping JSON")
parser.add_argument("--seed", type=int, default=None,
help="随机种子(不指定则用 os.urandom 自动生成)")
args = parser.parse_args()
# 随机种子:优先用户指定,否则用系统熵源
if args.seed is not None:
seed = args.seed
else:
seed = int.from_bytes(os.urandom(8), "big")
random.seed(seed)
print(f"Random seed: {seed} (可用 --seed {seed} 复现)")
with open(args.input) as f:
data = json.load(f)
mappings = data["mappings"]
print(f"输入: {len(mappings)} entries")
total_before = 0
total_after = 0
no_pattern = 0
for entry in mappings:
patterns = entry.get("mask_patterns", [])
total_before += len(patterns)
if patterns:
selected = random.choice(patterns)
entry["mask_patterns"] = [selected]
total_after += 1
else:
no_pattern += 1
data["metadata"]["selection"] = "single_random_pattern"
data["metadata"]["random_seed"] = seed
with open(args.output, "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
print(f"输出: {len(mappings)} entries")
print(f"Patterns: {total_before} → {total_after} ({total_before - total_after} 减少)")
print(f"无 pattern 的 entry: {no_pattern}")
print(f"Saved to {args.output}")
if __name__ == "__main__":
main()
|