diff --git a/nerfstudio/configs/method_configs.py b/nerfstudio/configs/method_configs.py index aa5eb0f67..e0a270ba9 100644 --- a/nerfstudio/configs/method_configs.py +++ b/nerfstudio/configs/method_configs.py @@ -158,7 +158,7 @@ method_configs["nerfacto-huge"] = TrainerConfig( mixed_precision=True, pipeline=VanillaPipelineConfig( datamanager=VanillaDataManagerConfig( - dataparser=NerfstudioDataParserConfig(downscale_factor=1), + dataparser=NerfstudioDataParserConfig(), train_num_rays_per_batch=16384, eval_num_rays_per_batch=4096, camera_optimizer=CameraOptimizerConfig( diff --git a/nerfstudio/process_data/process_data_utils.py b/nerfstudio/process_data/process_data_utils.py index f8441b319..459b90e70 100644 --- a/nerfstudio/process_data/process_data_utils.py +++ b/nerfstudio/process_data/process_data_utils.py @@ -15,7 +15,6 @@ """Helper utils for processing data into the nerfstudio format.""" import math -import os import shutil import sys from enum import Enum @@ -348,11 +347,8 @@ def downscale_images( assert isinstance(downscale_factor, int) downscale_dir = image_dir.parent / f"{folder_name}_{downscale_factor}" downscale_dir.mkdir(parents=True, exist_ok=True) - # Using %05d ffmpeg commands appears to be unreliable (skips images), so use scandir. - files = os.scandir(image_dir) - for f in files: - if f.is_dir(): - continue + # Using %05d ffmpeg commands appears to be unreliable (skips images). + for f in list_images(image_dir): filename = f.name nn_flag = "" if not nearest_neighbor else ":flags=neighbor" ffmpeg_cmd = [ diff --git a/nerfstudio/viewer_beta/render_state_machine.py b/nerfstudio/viewer_beta/render_state_machine.py index d18200761..6be9b3403 100644 --- a/nerfstudio/viewer_beta/render_state_machine.py +++ b/nerfstudio/viewer_beta/render_state_machine.py @@ -17,6 +17,7 @@ from __future__ import annotations import contextlib import threading +import time from dataclasses import dataclass from typing import TYPE_CHECKING, Any, Dict, Literal, Optional, Tuple, get_args @@ -97,12 +98,16 @@ class RenderStateMachine(threading.Thread): elif self.next_action == "rerender": # never overwrite rerenders pass + elif action.action == "static" and self.next_action.action == "move": + # don't overwrite a move action with a static: static is always self-fired + return else: # monimal use case, just set the next action self.next_action = action # handle interrupt logic if self.state == "high" and self.next_action.action in ("move", "rerender"): + print("interrupting render", self.next_action.action) self.interrupt_render_flag = True self.render_trigger.set() @@ -176,7 +181,10 @@ class RenderStateMachine(threading.Thread): continue self._send_output_to_viewer(outputs) # if we rendered a static low res, we need to self-trigger a static high-res - if self.state == "low_static": + if self.next_action is None: + # if there hasn't been an action, wait for 1/target_fps seconds in case we get another move command + time.sleep(1 / self.target_fps) + if self.state in ["low_static", "low_move"]: self.action(RenderAction("static", action.camera_state)) def check_interrupt(self, frame, event, arg): diff --git a/nerfstudio/viewer_beta/viewer.py b/nerfstudio/viewer_beta/viewer.py index f4e8d3429..51ca6ab14 100644 --- a/nerfstudio/viewer_beta/viewer.py +++ b/nerfstudio/viewer_beta/viewer.py @@ -126,8 +126,8 @@ class Viewer: def _interrupt_render(self, _) -> None: """Interrupt current render.""" - if self.camera_message is not None: - self.render_statemachine.action(RenderAction("rerender", self.camera_message)) + if self.camera_state is not None: + self.render_statemachine.action(RenderAction("rerender", self.camera_state)) def _crop_params_update(self, _) -> None: """Update crop parameters"""