Skip to content

Commit f243ff8

Browse files
committed
update rendering
1 parent c249fd2 commit f243ff8

3 files changed

Lines changed: 474 additions & 17 deletions

File tree

CHANGELOG.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,18 @@
11
# Changelog
22

3+
## 0.3.1 - 2026-04-24
4+
5+
### Added
6+
7+
- Headless camera-pose rendering for `rgb`, `depth`, `normal`, `feature`, `query-score`, and `query-mask` layers.
8+
- `--camera-state` support for rendering one PNG from `.tmp/camera_state.json`.
9+
- Feature-map and query-score video rendering from exported `outputs/camera_path.json`.
10+
- Optional `--frame-output-dir` PNG sequence export and `--score-output` per-splat query-score export.
11+
12+
### Changed
13+
14+
- `scripts/render_camera_path.py` now renders feature maps by replacing per-splat RGB with aligned feature preview/query-score colors before projection.
15+
316
## 0.3.0 - 2026-04-24
417

518
### Added

README.md

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,83 @@ python scripts/render_camera_path.py \
347347
--backend torch
348348
```
349349

350+
### Render feature maps from saved camera poses
351+
352+
The headless renderer can use the same exported camera pose/path to render feature-space outputs instead of RGB. The projection is defined by the camera JSON; the rendered colors are selected by `--render-layer`.
353+
354+
Supported layers:
355+
356+
```text
357+
rgb Original splat RGB.
358+
depth Expected-depth visualization from the same pose.
359+
normal Per-splat normal colors.
360+
feature PCA/preview colors from the aligned feature tensor.
361+
query-score Heatmap of cosine score against a text/image/vector query.
362+
query-mask Binary threshold mask from the same score.
363+
```
364+
365+
Render one PNG from the current camera saved by **Save current camera**:
366+
367+
```bash
368+
python scripts/render_camera_path.py \
369+
--folder-npy /path/to/scene_folder \
370+
--feature-file /path/to/features.npy \
371+
--render-layer feature \
372+
--camera-state .tmp/camera_state.json \
373+
--output outputs/feature_map.png \
374+
--device cuda \
375+
--backend gsplat
376+
```
377+
378+
Render a feature-map video from an exported camera path:
379+
380+
```bash
381+
python scripts/render_camera_path.py \
382+
--folder-npy /path/to/scene_folder \
383+
--feature-file /path/to/features.npy \
384+
--render-layer feature \
385+
--camera-path outputs/camera_path.json \
386+
--output outputs/feature_map.mp4 \
387+
--device cuda \
388+
--backend gsplat
389+
```
390+
391+
Render a SigLIP2 text-query score map from the camera path:
392+
393+
```bash
394+
python scripts/render_camera_path.py \
395+
--folder-npy /path/to/scene_folder \
396+
--feature-file /path/to/siglip2_features.npy \
397+
--feature-type siglip2 \
398+
--query-text "chair" \
399+
--render-layer query-score \
400+
--camera-path outputs/camera_path.json \
401+
--output outputs/chair_score.mp4 \
402+
--score-output outputs/chair_scores.npy \
403+
--device cuda
404+
```
405+
406+
Render a DINOv2 image-query mask from a camera pose:
407+
408+
```bash
409+
python scripts/render_camera_path.py \
410+
--folder-npy /path/to/scene_folder \
411+
--dino-feature /path/to/dino_features.npy \
412+
--feature-type dinov2 \
413+
--query-image /path/to/query_crop.png \
414+
--render-layer query-mask \
415+
--threshold 0.55 \
416+
--camera-state .tmp/camera_state.json \
417+
--output outputs/dino_query_mask.png \
418+
--device cuda
419+
```
420+
421+
For exact frame-by-frame inspection, add:
422+
423+
```bash
424+
--frame-output-dir outputs/feature_frames
425+
```
426+
350427
## Static bbox scripts with `viser_bbox`
351428

352429
Install once:
@@ -395,6 +472,11 @@ bbox0 = Bbox(Sofa, 0.8, 0.3, 0.7, 0.0, 1.5, 0.9, 1.0)
395472
--max-cpu-splats INT CPU renderer downsample cap.
396473
--enable-feature-model-on-cpu Allow SigLIP/CLIP/DINO encoders on CPU.
397474
--camera-path PATH Camera-path JSON output/input path.
475+
--camera-state PATH Headless render from one saved camera pose.
476+
--render-layer LAYER Headless layer: rgb/depth/normal/feature/query-score/query-mask.
477+
--query-text TEXT Headless SigLIP/CLIP text query for score maps.
478+
--score-output PATH Save normalized per-splat query scores as .npy.
479+
--frame-output-dir PATH Also save rendered frames as PNGs.
398480
--video-output PATH GUI video output path.
399481
--render-width INT
400482
--render-height INT

0 commit comments

Comments
 (0)