Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,26 @@ uv pip install projectaria-tools

# 3D interactive viewer for view_*.py scripts
uv pip install moderngl moderngl-window imgui-bundle

# (Optional) Browser-based remote viewer backend
uv pip install 'viser>=0.2.23'
```

For remote servers (SSH/headless), you can use the browser-based viewer backend:

```bash
# Example: tracker viewer over HTTP
python view_tracker.py --input nym10_gen1 --viewer_backend viser --host 0.0.0.0 --port 8080

# Example: fusion viewer over HTTP
python view_fusion.py --input nym10_gen1 --viewer_backend viser --host 0.0.0.0 --port 8080

# Example: prompt viewer over HTTP
python view_prompt.py --input nym10_gen1 --viewer_backend viser --host 0.0.0.0 --port 8080
```

Then open `http://<server-ip>:8080` in your browser.

## Download Model Checkpoints

We host model checkpoints for BoxerNet, DinoV3 and OWLv2 on [HuggingFace](https://huggingface.co/facebook/boxer). Download them to the `ckpts/` directory:
Expand Down
29 changes: 18 additions & 11 deletions utils/viewer_3d.py
Original file line number Diff line number Diff line change
Expand Up @@ -2733,16 +2733,18 @@ def _render_playback_controls(self) -> None:

if self.total_frames > 0:
imgui.push_item_width(300)
display_frame_idx = self.current_frame_idx + 1
changed, new_frame = imgui.slider_int(
"Frame",
self.current_frame_idx,
0,
max(0, self.total_frames - 1),
"Image Index",
display_frame_idx,
1,
max(1, self.total_frames),
)
if changed:
self.is_playing = False
self._step_to_frame(new_frame)
self._step_to_frame(new_frame - 1)
imgui.pop_item_width()
imgui.text(f"Image: {display_frame_idx} / {self.total_frames}")

imgui.push_item_width(200)
_changed, self.playback_fps = imgui.slider_float(
Expand Down Expand Up @@ -6087,22 +6089,27 @@ def render_ui(self) -> None:
self._step_to_frame(0)

imgui.push_item_width(300)
changed, new_frame = imgui.slider_int(
"Frame",
seek_frame_idx = (
self._seek_target_frame
if self._seek_dirty_time is not None
else self.current_frame_idx,
0,
max(0, self.total_frames - 1),
else self.current_frame_idx
)
display_seek_idx = seek_frame_idx + 1
changed, new_frame = imgui.slider_int(
"Image Index",
display_seek_idx,
1,
max(1, self.total_frames),
)
if changed:
self.is_playing = False
if self.follow_view:
self._snap_orbit_from_follow()
self.follow_view = False
self._seek_target_frame = new_frame
self._seek_target_frame = new_frame - 1
self._seek_dirty_time = time_module.time()
imgui.pop_item_width()
imgui.text(f"Image: {display_seek_idx} / {self.total_frames}")

imgui.push_item_width(200)
_changed, self.playback_fps = imgui.slider_float(
Expand Down
Loading