Nodes/Atlas Camera/Atlas Depth Map 🌊
ComfyUI Node

Atlas Depth Map 🌊

The depth node that actually feeds the geometry

By mikejamesvfxΒ·Created 3 months agoΒ·Updated a day agoΒ· 1
Atlas Depth Map 🌊
  • image
  • solve
  • depth
β—„depth_modeldepth-anything/Depth-Anything-V2-Metric-Outdoor-Large-hfβ–Ί
β—„deviceautoβ–Ί
β—„moge_resolution_level9β–Ί
β—„moge_max_side0β–Ί
β—„moge_checkpoint_pathβ–Ί
β—„moge_tile_side0β–Ί
β—„moge_tile_overlap0.25β–Ί
β—„moge_report_free_focalfalseβ–Ί

In the Atlas pack there are two nodes that run a depth model, and confusing them costs you real time. AtlasDepthAnything returns a normalized IMAGE you can look at. AtlasDepthMap returns an ATLAS_DEPTH_MAP - a shared, metric depth object that every geometry-derivation, layer, and look node in the pack consumes. Same family, opposite purpose. This one is the workhorse: estimate once, feed several.

The pack's design philosophy is visible right here. Depth is estimated once and passed around by reference (the catalog notes it's a zero-serialization custom type, same pattern as ATLAS_SOLVE), so every downstream node - AtlasDeriveReliefMesh, AtlasDepthLayerMask, AtlasDefocus, the clean-plate layers - agrees on the exact same metric scale. Wire one AtlasDepthMap into three consumers and they can't drift apart.

How it works

It runs your chosen monocular model and wraps the raw result - depth plus validity - into the ATLAS_DEPTH_MAP. Which model you pick changes what the map can do. The default, Depth Anything V2 Metric-Outdoor, is metric and transformer-only. The big difference-maker is MoGe (Ruicheng/moge-2-*), which additionally carries a native metric pointmap (per-pixel 3D coordinates) and predicted normals plus its own focal estimate. The KB's depth essay backs this up: MoGe is the geometry-oriented pick, outputting a point map a plain depth value can't express. Feed the solve's focal into MoGe and it's echoed in as fov_x, which is why those moge_* knobs exist.

Inputs that matter

Required: image. Then a stack of optional dials, and most of them are MoGe-specific - ignore them until you're on MoGe:

  • depth_model - the same eleven-choice roster as its preview sibling (V2 Metric Outdoor/Indoor, V2 Small, DA3 variants, MoGe-2, DepthPro, Lotus-2). Default is V2 Metric-Outdoor-Large.
  • solve - optional. Supplies the solved focal for DA3-Metric's canonicalβ†’metric conversion. Ignored by V2.
  • moge_resolution_level - MoGe's token-budget dial; 9 is full detail, lower is faster/coarser.
  • moge_max_side - cap the long edge before inference to save VRAM/time. The tooltip's example is telling: an 8K plate is ~415 MB of float32 on-device before MoGe even runs. Depth still comes back at source size.
  • moge_tile_side - run inference on overlapping tiles at source resolution instead of downscaling, so a 36MP plate keeps fine structure. Costs one pass per tile plus a global pass (a 4Γ—4 tiling is ~17Γ— the time). Try 1024.
  • moge_report_free_focal - runs a second fov-free pass just to cross-check MoGe's independent focal against the solve's. ~+30% time; useful when you suspect a focal mismatch.

One output: depth, the ATLAS_DEPTH_MAP. That's it. Everything downstream pulls from it.

Where people get tripped up

  • Wiring the preview node into geometry. AtlasDepthAnything's IMAGE won't connect to a geometry node's depth socket - different type. Use this node.
  • V2 on panoramas. The AtlasEquirectMultiView node deliberately doesn't offer V2 because it mis-scales panorama crops ~4.4Γ—. Same principle applies to any very wide plate: MoGe is the safer interior/wide pick.
  • Non-commercial weights. V2-Large is CC BY-NC 4.0; V2 small/base and the DA3-Metric/Mono backends are Apache 2.0. Pick per your use case.

Install

cd <ComfyUI>/custom_nodes
git clone https://github.com/mikejamesvfx/atlas-camera.git

Restart (or Manager β†’ "atlas-camera"). Requires the [neural] tier: torch + GeoCalib + transformers (GeoCalib is GitHub-only), and optionally the [moge] extra for MoGe - on portable ComfyUI install GitHub-only packages with --no-deps to protect your CUDA stack. The kornia <0.8.3 cap exists so these extras don't break ComfyUI-LTXVideo; if you see an import error about kornia.geometry.transform.pyramid, pip install "kornia==0.8.2" fixes it.

Brand-new pack, so no community folklore - the report strings and install docs are the truth. The habit to build: share one AtlasDepthMap across your whole graph.

CategoryAtlas/03 Β· Depth

Inputs (10)

NameTypeDefaultDescription
imageIMAGEβ€”
depth_modeloptCOMBOdepth-anything/Depth-Anything-V2-Metric-Outdoor-Large-hf10 options: depth-anything/Depth-Anything-V2-Metric-Outdoor-Large-hf, depth-anything/Depth-Anything-V2-Metric-Indoor-Large-hf, depth-anything/DA3METRIC-LARGE, depth-anything/DA3MONO-LARGE, depth-anything/DA3NESTED-GIANT-LARGE-1.1, Ruicheng/moge-2-vitl-normal, +4
deviceoptCOMBOauto4 options: auto, cuda, mps, cpu
solveoptATLAS_SOLVEOptional — supplies the SOLVED focal (GeoCalib/VP) for DA3METRIC's canonical→metric conversion (focal_source='solve' instead of the assumed normal-lens fallback). Ignored by V2 models.
moge_resolution_leveloptINT90–9MoGe ONLY. Its own token-budget dial; 9 is MoGe's default and full detail. Lower = faster and coarser. No effect on DA/V2/DepthPro.
moge_max_sideoptINT00–16384MoGe ONLY. Cap the longer edge BEFORE inference (0 = off). MoGe resamples internally anyway, so this buys VRAM and time, not quality β€” an 8K plate is ~415 MB of float32 on the device before MoGe touches it. Depth/normals still come back at SOURCE size.
moge_checkpoint_pathoptSTRINGMoGe ONLY. Local MoGe `model.pt` to load instead of downloading from HuggingFace (air-gapped / shared model dirs). NOT ComfyUI core's geometry_estimation/*.safetensors β€” different container, and it carries no model_config.
moge_tile_sideoptINT00–4096MoGe ONLY. Run inference on overlapping TILES of this size at SOURCE resolution (0 = off). The opposite lever to moge_max_side: that one downscales to save VRAM, this one refuses to downscale so a 36MP plate keeps its fine structure β€” the model spends its whole token budget on each tile instead of on the shrunken whole. Costs one inference pass PER TILE plus one global pass, so a 4x4 tiling is ~17x the time. Every tile is affine-fitted onto that global pass first: monocular depth is scale-ambiguous per input, so raw tiles disagree and pasting them steps at every seam. Try 1024.
moge_tile_overlapoptFLOAT0.250–0.5MoGe ONLY. Tile overlap as a fraction of tile size. More overlap = wider blend and more tiles (slower). Only used when moge_tile_side > 0.
moge_report_free_focaloptBOOLEANfalseMoGe ONLY. When a solve is wired, MoGe is FED the solve's focal, so its own intrinsics just echo it. This runs a second, fov-free pass (depth discarded, cheaper resolution level) and records MoGe's INDEPENDENT focal so the 🩺 debug report can flag a focal_mismatch (band 0.75-1.33). ~+30% time. sh001 example: solve 6207 px vs MoGe 5278 px β€” invisible without this.

Outputs (1)

NameTypeDescription
depthATLAS_DEPTH_MAPβ€”