| 1042 | |
| 1043 | |
| 1044 | def build_parser(): |
| 1045 | parser = argparse.ArgumentParser( |
| 1046 | description="Batch streaming/windowed inference + headless video rendering for LingBot-MAP", |
| 1047 | formatter_class=argparse.RawDescriptionHelpFormatter, |
| 1048 | epilog=""" |
| 1049 | Examples: |
| 1050 | python examples/batch_demo.py \\ |
| 1051 | --input_folder /data/scenes \\ |
| 1052 | --output_folder /data/outputs \\ |
| 1053 | --model_path /path/to/checkpoint.pt --mode streaming |
| 1054 | |
| 1055 | python examples/batch_demo.py \\ |
| 1056 | --video_path /data/video.mp4 --fps 10 \\ |
| 1057 | --output_folder /data/outputs \\ |
| 1058 | --model_path /path/to/checkpoint.pt --mode windowed --window_size 64 --overlap_size 16 |
| 1059 | |
| 1060 | python examples/batch_demo.py \\ |
| 1061 | --load_predictions pred1.npz pred2.npz \\ |
| 1062 | --output_folder /data/outputs |
| 1063 | """, |
| 1064 | ) |
| 1065 | |
| 1066 | parser.add_argument("--input_folder", type=str, default=None, help="Root folder containing scene folders") |
| 1067 | parser.add_argument("--video_path", type=str, default=None, help="Input video path") |
| 1068 | parser.add_argument("--fps", type=int, default=None, help="Target FPS for frame extraction from video") |
| 1069 | parser.add_argument("--target_frames", type=int, default=None, |
| 1070 | help="Target number of frames to extract from video (auto-computes fps)") |
| 1071 | parser.add_argument("--save_frames_dir", type=str, default=None, |
| 1072 | help="Save extracted video frames as PNG for reuse. " |
| 1073 | "If the directory already has frames, skip video decoding.") |
| 1074 | parser.add_argument("--load_predictions", type=str, nargs="+", default=None, help="Render saved NPZ predictions") |
| 1075 | parser.add_argument("--output_folder", type=str, required=True, help="Output folder") |
| 1076 | parser.add_argument( |
| 1077 | "--config", type=str, default=None, |
| 1078 | help="YAML preset to seed render/scene/camera/overlay defaults " |
| 1079 | "(e.g. demo_render/config/indoor.yaml). CLI flags still override " |
| 1080 | "any value the user explicitly passes.", |
| 1081 | ) |
| 1082 | |
| 1083 | parser.add_argument("--model_path", type=str, default=None, help="Path to model checkpoint") |
| 1084 | parser.add_argument("--image_size", type=int, default=518) |
| 1085 | parser.add_argument("--patch_size", type=int, default=14) |
| 1086 | parser.add_argument( |
| 1087 | "--mode", |
| 1088 | type=str, |
| 1089 | default="streaming", |
| 1090 | choices=["streaming", "windowed"], |
| 1091 | help="Inference mode: streaming with KV cache, or windowed with overlap alignment", |
| 1092 | ) |
| 1093 | parser.add_argument("--enable_3d_rope", action="store_true", default=True) |
| 1094 | parser.add_argument("--max_frame_num", type=int, default=1024) |
| 1095 | parser.add_argument("--num_scale_frames", type=int, default=8) |
| 1096 | parser.add_argument("--keyframe_interval", type=int, default=1) |
| 1097 | parser.add_argument( |
| 1098 | "--flow_threshold", |
| 1099 | type=float, |
| 1100 | default=0.0, |
| 1101 | help="Flow-based keyframe threshold in pixels. >0 enables flow-based mode " |