diff --git a/README.md b/README.md index e2f66207..d2f44cc9 100644 --- a/README.md +++ b/README.md @@ -16,9 +16,10 @@ To run SV3D_u on a single image: - Download `sv3d_u.safetensors` from https://huggingface.co/stabilityai/sv3d to `checkpoints/sv3d_u.safetensors` - Run `python scripts/sampling/simple_video_sample.py --input_path --version sv3d_u` -Additionally for SV3D_p, -- Specify sequences of 21 elevations and 21 azimuths (in degrees) to `elevations_deg` ([-90, 90]), and `azimuths_deg` [0, 360] in sorted order from 0 to 360. For example: -`python scripts/sampling/simple_video_sample.py --input_path --version sv3d_p --elevations_deg [] --azimuths_deg []` +To run SV3D_u on a single image: +- Download `sv3d_p.safetensors` from https://huggingface.co/stabilityai/sv3d to `checkpoints/sv3d_p.safetensors` +1. Generate static orbit at a specified elevation eg. 10 : `python scripts/sampling/simple_video_sample.py --input_path --version sv3d_p --elevations_deg 10.0` +2. Generate dynamic orbit at a specified elevations and azimuths: specify sequences of 21 elevations (in degrees) to `elevations_deg` ([-90, 90]), and 21 azimuths (in degrees) to `azimuths_deg` [0, 360] in sorted order from 0 to 360. For example: `python scripts/sampling/simple_video_sample.py --input_path --version sv3d_p --elevations_deg [] --azimuths_deg []` To run SVD or SV3D on a streamlit server: `streamlit run scripts/demo/video_sampling.py` diff --git a/scripts/sampling/simple_video_sample.py b/scripts/sampling/simple_video_sample.py index 6d34e7cd..29a8b858 100644 --- a/scripts/sampling/simple_video_sample.py +++ b/scripts/sampling/simple_video_sample.py @@ -34,7 +34,7 @@ def sample( device: str = "cuda", output_folder: Optional[str] = None, elevations_deg: Optional[float | List[float]] = 10.0, # For SV3D - azimuths_deg: Optional[float | List[float]] = None, # For SV3D + azimuths_deg: Optional[List[float]] = None, # For SV3D image_frame_ratio: Optional[float] = None, verbose: Optional[bool] = False, ): @@ -81,10 +81,17 @@ def sample( cond_aug = 1e-5 if isinstance(elevations_deg, float) or isinstance(elevations_deg, int): elevations_deg = [elevations_deg] * num_frames + assert ( + len(elevations_deg) == num_frames + ), f"Please provide 1 value, or a list of {num_frames} values for elevations_deg! Given {len(elevations_deg)}" polars_rad = [np.deg2rad(90 - e) for e in elevations_deg] if azimuths_deg is None: azimuths_deg = np.linspace(0, 360, num_frames + 1)[1:] % 360 - azimuths_rad = [np.deg2rad(a) for a in azimuths_deg] + assert ( + len(azimuths_deg) == num_frames + ), f"Please provide a list of {num_frames} values for azimuths_deg! Given {len(azimuths_deg)}" + azimuths_rad = [np.deg2rad((a - azimuths_deg[-1]) % 360) for a in azimuths_deg] + azimuths_rad[:-1].sort() else: raise ValueError(f"Version {version} does not exist.")