Add HiRes Views to Dataset
Bolt real pinhole renders onto your SfM dataset without breaking it
- frames
- splat_mask
- dataset_dir
- report
- num_registered
- num_points
Once you've built a SphereSfM dataset, this is how you make it sharper without rebuilding anything. HiRes Pano Fly-Through renders full-resolution pinhole views straight from the panorama; this node registers those renders into your existing COLMAP reconstruction as their own PINHOLE cameras. The cube faces and their poses stay exactly as they are - by default the existing cameras are pinned during registration, so the add is purely additive and cannot shift a dataset that already trains. You just end up with high-res views mixed in among the 360×360 cube faces, and the result trains with no trainer-side change: same images/ + sparse/0/ layout.
The wiring is three required inputs: frames and cameras_json (both from the HiRes node - cameras_json carries the exact intrinsics K, so views register with their true focal length rather than an estimated one), and dataset_dir pointing at an existing dataset that was built with mode=colmap_now. The add needs the original spherical reconstruction in _spheresfm_work/ to register against, so a panorama_only dataset won't work.
The inputs you'll actually tune
retriangulate(default on) - re-triangulate the sparse cloud including the hires views so they contribute real 3D points to the splat's init cloud (measured +7% points on the cafe dataset). Off = poses only, cheaper.adjust_existing_cameras(default off) - this is the danger knob. On, bundle adjustment can move the existing panorama cameras to fit the new views. Only turn it on if the base reconstruction is shaky; off, the add is guaranteed additive.match_stride(default 1) - match each hires view against every Nth existing frame. On long base trajectories, 2–3 still ties views in while cutting the pair count.max_num_features(8192) andabs_pose_min_num_inliers(30) - the classic SfM registration knobs. Views failing to register? Raise features. Views sneaking in with bad poses? Raise inliers.splat_mask- wire the HiRes node'ssplat_maskhere (white = real pano detail, black = synthesized). Per-view masks land in<dataset>/masks/so trainers can exclude the fake pixels from the loss: nerfstudio trains with--masks-path masks, Brush picks the folder up automatically. Cube faces get all-white masks so every image has one (nerfstudio requires all-or-none).
Outputs: dataset_dir, report, num_registered (how many views accepted a pose), and num_points.
Install & gotchas
Standard pack install - clone, pip install -r requirements.txt, restart; MoGe auto-downloads on first use.
The one thing that bites people: render the hires views from the same panorama the dataset was built from. SfM matches them against the existing frames by image features, and views of a different scene simply fail to register - you'll see num_registered stall near zero. And remember this node only makes sense on top of the HiRes render path; if your base dataset used plain equirect-only output, the hires views are what carry the resolution gain, so pair them with a high point cap (~3M) when you train or the added detail gets bottlenecked away.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| frames | IMAGE | The HiRes node's 'frames' output. | |
| cameras_json | STRING | The HiRes node's 'cameras_json' output -- carries the exact intrinsics (K) so the views register with true, not estimated, focal length. | |
| dataset_dir | STRING | The EXISTING SphereSfM dataset to add to -- wire the Dataset Project node's dataset_dir here (the same value the base SphereSfM node used as output_name), or type the dataset folder name/path. It is the folder holding images/, sparse/ and _spheresfm_work/, and must have been built with mode=colmap_now -- the add needs the original spherical reconstruction to register against. | |
| retriangulateopt | BOOLEAN | true | Re-triangulate the sparse cloud including the hires views, so they contribute real 3D points to the splat's init cloud (measured +7% points on the cafe dataset). Off = poses only. |
| adjust_existing_camerasopt | BOOLEAN | false | Let bundle adjustment MOVE the existing panorama cameras to fit the new views. Off (default) pins them, so the add is purely additive and cannot break a dataset that already trains. Turn on only if the base reconstruction is shaky. |
| match_strideopt | INT | 11–10 | Match each hires view against every Nth existing frame. 1 = all (best). Raise it on very long base trajectories to cut the pair count -- neighbouring pano frames are near-duplicates, so 2-3 still ties the views in. |
| max_num_featuresopt | INT | 81921024–32768 | SIFT features per image. Raise if views fail to register. |
| abs_pose_min_num_inliersopt | INT | 3010–300 | Inliers needed to accept a view's pose. Lower = more views register, at the risk of a bad pose sneaking in. |
| splat_maskopt | IMAGE | The HiRes node's 'splat_mask' output (white = real pano detail, black = synthesized/stretched). When wired, per-view masks land in <dataset>/masks/ so splat trainers can exclude the fake pixels from the loss: nerfstudio trains with '--masks-path masks', Brush picks the folder up automatically. The cube faces get all-white masks so every image has one (nerfstudio requires all-or-none). |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| dataset_dir | STRING | — |
| report | STRING | — |
| num_registered | INT | — |
| num_points | INT | — |