Nodes/ComfyUI-ArchAi3d-Qwen/🎯 Metric3D Normal (Low VRAM)
ComfyUI Node

🎯 Metric3D Normal (Low VRAM)

Surface normals from one photo, without eating your VRAM

By amir84ferdosΒ·Created 11 months agoΒ·Updated 5 months agoΒ· 70
🎯 Metric3D Normal (Low VRAM)
  • image
  • normal_map
β—„namemetric3d_normalβ–Ί
β—„backbonevit-smallβ–Ί
β—„resolution512β–Ί
β—„use_cachetrueβ–Ί
β—„fx1000β–Ί
β—„fy1000β–Ί

A normal map is the "which way is each surface facing" map - a full-color image where the RGB channels encode the 3D direction of every pixel's surface. It's what makes a flat image behave like it has geometry in a 3D pipeline. ArchAi3D_Metric3D_Normal produces exactly that from a single photo, using the same Metric3D engine as its depth sibling, and it's the node you reach for when you need surface orientation rather than distance.

How it works

Identical machinery to ArchAi3D_Metric3D_Depth - same auto-downloaded metric_depth_*_800k.pth checkpoints from HuggingFace, same inference path - but instead of extracting the depth channel it extracts the normal channel. Since the underlying model computes depth and normals together (depth_and_normal=True in the source), both nodes share the heavy lifting and each just exposes half of it.

Inputs:

  • image - the source photo.
  • backbone - vit-small (~1–2GB VRAM) / vit-large / vit-giant2 (~4–6GB). Small is the low-VRAM recommendation; giant2 is the quality ceiling.
  • resolution - default 512; drop it when VRAM is tight.
  • use_cache (default True) - disk-caches identical inputs so re-runs skip inference.
  • fx / fy - focal lengths, default 1000. Metric3D uses these intrinsics; real camera values from EXIF make the geometry more faithful.

Output: normal_map, an IMAGE. Feed it into a ControlNet that accepts normal maps (SD 1.5's normal ControlNet is a classic), use it to relight convincingly, or push it into a 3D app as tangent-space geometry data.

Where it fits

The KB's depth essay covers the general depth-model landscape but normal maps are the orientation cousin of that family. In practice: if you want ControlNet-guided redraws that respect surface structure, a normal map is often better than a depth map because it encodes angle, not just distance. This node is also the pair for relighting work - normals + metric depth is basically everything a relight pass needs to reason about a scene.

Install and the honest tradeoffs

cd ComfyUI/custom_nodes
git clone https://github.com/amir84ferdos/ComfyUI-ArchAi3d-Qwen.git
cd ComfyUI-ArchAi3d-Qwen && pip install -r requirements.txt

Same heavy ML deps as the depth node (opencv, timm, scipy, matplotlib, addict, yapf) - install just the Metric3D group via ArchAi3D_Dependency_Installer if you'd rather not pull everything. ComfyUI Manager β†’ search "ArchAi3d Qwen" also works.

Two honest notes. First-run model downloads can be multi-GB, so the first execution isn't a quick one. And metric geometry is only as good as your fx/fy calibration - at the default 1000 with a phone photo you get plausible normals, not survey-grade. For casual ControlNet work that's plenty. Standing pack license: free personal, paid commercial.

CategoryArchAi3d/3D

Inputs (7)

NameTypeDefaultDescription
nameSTRINGmetric3d_normalIdentifier name for this input (used by web interface)
imageIMAGEβ€”
backboneCOMBOvit-smallModel backbone. vit-small uses less VRAM (~1-2GB), vit-giant2 uses most (~4-6GB)
resolutionINT51264–8192Processing resolution. Lower = faster + less VRAM
use_cacheBOOLEANtrueUse disk cache to avoid reprocessing identical inputs
fxoptINT10001–8192Focal length X (camera intrinsic)
fyoptINT10001–8192Focal length Y (camera intrinsic)

Outputs (1)

NameTypeDescription
normal_mapIMAGEβ€”