Zoe Depth Map
The old depth default, and when it still fits
- image
- IMAGE
Zoe produces a depth map - grayscale, close-is-bright, far-is-dark - that you feed into a depth ControlNet to lock a generation's spatial layout. For a long stretch of 2023 it was the depth preprocessor a lot of people reached for, and it still works fine. But let's be straight up front: for most ControlNet work in 2026, Depth Anything V2 (a sibling node in this same pack) is the better default. Zoe is worth understanding, worth keeping in your back pocket, and occasionally the right pick - but it's no longer the automatic one.
How it works, and the metric-depth twist
ZoeDepth came out of Microsoft Research as one of the first widely-used metric depth estimators - it tries to predict real-world distances in meters, trained on indoor (NYU) and outdoor (KITTI) datasets. That sounds like an upgrade over relative-depth models, and geometrically it is. But here's the counterintuitive lesson the community learned early and it's held ever since: metric accuracy is worse for ControlNet. The canonical r/StableDiffusion A/B test literally titled its conclusion "Use MiDaS" - because Zoe's precision came at the cost of edge sharpness, and sharp edges are exactly what conditioning needs to follow. Softer, gradient-heavy depth is harder for the ControlNet to lock onto than a crisp relative map.
So the mental model is: Zoe gives you smooth, physically-plausible depth gradients. Sometimes that softness is what you want (gentle, atmospheric scene depth). More often, for architectural precision or tight layout adherence, you want the crisper edges of Depth Anything.
The inputs and output
This node is refreshingly simple - there's essentially nothing to tune:
image- the picture to estimate depth from.resolution(default 512) - the working size. Match it to your generation resolution so the map doesn't get rescaled; thePixelPerfectResolutionnode in this pack can compute the ideal value.
That's it - no checkpoint choice, no thresholds. The single output is an IMAGE: the depth map. It goes into a ControlNet Apply node paired with a depth ControlNet that matches your base model (control_v11f1p_sd15_depth for SD1.5, and so on). As always with this pack, the node makes the hint image; the ControlNet model is a separate download.
Installing it
ComfyUI Manager: search ComfyUI's ControlNet Auxiliary Preprocessors, install, restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/Fannovel16/comfyui_controlnet_aux
pip install -r requirements.txt
Restart ComfyUI. The Zoe weight (ZoeD_M12_N.pt) downloads from HuggingFace on first run - expect a one-time pause.
Where people get burned
First, the everyone-does-it mistake: a depth map alone does nothing; you need a depth ControlNet loaded and this node's IMAGE wired into it. Second, don't reach for Zoe because it's "metric and therefore more accurate" - for conditioning that reasoning is backwards, and you'll usually get a mushier result than Depth Anything would give you. Keep metric depth for pipelines that genuinely consume distances (measurement, robotics), not image generation. Third, standard depth-ControlNet weight discipline applies: 0.4–0.7 for loose guidance, 0.8–1.1 to lock the layout, and end the ControlNet around halfway through the steps for cleaner detail. If you're starting a fresh workflow today and just want depth conditioning that works, use the Depth Anything V2 node instead and treat Zoe as a fallback when its smoother gradients happen to suit the shot.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| resolutionopt | INT | 51264–16384 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |