diff --git a/nerfstudio/viewer/metrics_panel.py b/nerfstudio/viewer/metrics_panel.py index 40a90b12e..387e1c087 100644 --- a/nerfstudio/viewer/metrics_panel.py +++ b/nerfstudio/viewer/metrics_panel.py @@ -14,18 +14,49 @@ from __future__ import annotations +import dataclasses from pathlib import Path - from typing import Literal import viser +from nerfstudio.models.base_model import Model +from nerfstudio.models.splatfacto import SplatfactoModel from nerfstudio.viewer.control_panel import ControlPanel +from nerfstudio.viewer.viewer_elements import ViewerPlot +@dataclasses.dataclass +class MetricsPanel: + server: viser.ViserServer + control_panel: ControlPanel + config_path: Path + viewer_model: Model def populate_metrics_tab( server: viser.ViserServer, control_panel: ControlPanel, config_path: Path, + viewer_model: Model, ) -> None: - pass \ No newline at end of file + viewing_gsplat = isinstance(viewer_model, SplatfactoModel) + + with server.add_gui_folder("Training Metrics"): + populate_train_metrics_tab(server, control_panel, config_path, viewing_gsplat) + # with server.add_gui_folder("Training Loss"): + # populate_train_loss_tab(server, control_panel, config_path, viewing_gsplat) + #training rays? + # with server.add_gui_folder("Eval Metrics"): + # populate_eval_metrics_tab(server, control_panel, config_path, viewing_gsplat) + # with server.add_gui_folder("Eval Metrics (All Images)"): + # populate_eval_metrics_all_images_tab(server, control_panel, config_path, viewing_gsplat) + # with server.add_gui_folder("Eval Loss"): + # populate_eval_loss_tab(server, control_panel, config_path, viewing_gsplat) + + +def populate_train_metrics_tab( + server: viser.ViserServer, + control_panel: ControlPanel, + config_path: Path, + viewing_gsplat: bool, +) -> None: + ViewerPlot() \ No newline at end of file diff --git a/nerfstudio/viewer/viewer.py b/nerfstudio/viewer/viewer.py index a5093f0da..101d72fce 100644 --- a/nerfstudio/viewer/viewer.py +++ b/nerfstudio/viewer/viewer.py @@ -40,6 +40,7 @@ from nerfstudio.utils.decorators import check_main_thread, decorate_all from nerfstudio.utils.writer import GLOBAL_BUFFER, EventName from nerfstudio.viewer.control_panel import ControlPanel from nerfstudio.viewer.export_panel import populate_export_tab +from nerfstudio.viewer.metrics_panel import populate_metrics_tab from nerfstudio.viewer.render_panel import populate_render_tab from nerfstudio.viewer.render_state_machine import RenderAction, RenderStateMachine from nerfstudio.viewer.utils import CameraState, parse_object @@ -199,6 +200,7 @@ class Viewer: self._output_split_type_change, default_composite_depth=self.config.default_composite_depth, ) + config_path = self.log_filename.parents[0] / "config.yml" with tabs.add_tab("Render", viser.Icon.CAMERA): self.render_tab_state = populate_render_tab( @@ -208,6 +210,9 @@ class Viewer: with tabs.add_tab("Export", viser.Icon.PACKAGE_EXPORT): populate_export_tab(self.viser_server, self.control_panel, config_path, self.pipeline.model) + with tabs.add_tab("Metrics", viser.Icon.GRAPH): + populate_metrics_tab(self.viser_server, self.control_panel, config_path, self.pipeline.model) + # Keep track of the pointers to generated GUI folders, because each generated folder holds a unique ID. viewer_gui_folders = dict()