Iris Depth
A 12 GB model to make a grayscale map (and the mask you'll actually reuse)
- depth_model
- image
- depth
- depth_mask
- depth_3d
The display name is just "Iris Depth", which is a slightly unhelpful label for a node that estimates a depth map from any image in one pass. If you came here looking for MiDaS-in-a-box: this is bigger, slower and - at least on the images the author published - cleaner at the edges than the Depth Anything class of preprocessors. It also costs you a 12 GB download, which is the tradeoff that decides whether this is worth it for you.
What it produces
One model pass per image, then a whole lot of post-processing. The model itself is the same 3B DiT as the text-to-image checkpoint, fine-tuned for monocular depth, and it emits a single-channel prediction. The node then:
- Resizes the input so its long side is at most
max_side, rounding to the model's patch size, and runs it. - Resamples the depth back to your input's resolution, so the map lines up pixel-for-pixel with the image you fed in.
- Normalises the values to the 2nd–98th percentile of that specific image, with near = white.
That last point is the one that bites people. This is relative depth, not metric depth. There are no metres anywhere in the output. Two different images get independently rescaled, which means you can't compare a depth value from one picture to a depth value from another - a wall at 0.8 in one map is not the same distance as a wall at 0.8 in the next. What you get is a well-behaved per-image map, which is what conditioning and 3D display both want.
The percentile stretch is also why the results look contrasty and clean rather than flat grey with a couple of bright spots. It's the same trick the depth-estimation ecosystem generally uses; Iris just does it per image with a bounded quantile.
Inputs and outputs
depth_model - from Load Iris Depth Model. image - any IMAGE, batch fine.
max_side - default 1024, range 0 to 4096 in steps of 16. This is a speed control, not a quality one: it caps the long side the model sees, and the map is then resized back up to your input size. 0 means don't touch it and keep the input resolution - the tooltip's own words. For big photos, leave it at 1024 unless you're specifically chasing thin structures like wires or hair; the pass gets quadratically more expensive past that on a 3B model.
colors - grayscale (near = white), the default, or inferno. The tooltip sums it up: grayscale is what depth ControlNets expect. That's a formatting claim, not a promise about Iris - Iris is pixel-space and there's no Iris depth ControlNet. It's about handing the map to other pipelines you might have. Inferno is the pretty one for viewing; it needs matplotlib, and if that isn't installed the node logs a warning and quietly gives you grayscale instead.
Three outputs, and honestly the third is the one people forget exists:
depth- anIMAGE, three-channel, either the grayscale map or the inferno colormap. Save it, preview it, feed a preprocessor chain.depth_mask- the same map as a ComfyUIMASK, which is more useful than it sounds if you want to composite on distance: mask the foreground, mask the sky, blend two generations by depth band.depth_3d- anIRIS_DEPTHbundle carrying the raw log-depth alongside the source image. It exists purely to feed Iris Depth to 3D. Nothing else accepts it.
Install
ComfyUI-Manager, search Iris-3B. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/bani4kaskashka/Iris-3B-Comfy-Nodes
pip install -r requirements.txt
Grab matplotlib too if you want the inferno option - it isn't in the requirements. Then restart and open Iris-3B Depth from Templates, which wires photo → depth → 3D preview end to end.
Where it goes wrong
"Not a depth model." You loaded the t2i checkpoint into Load Iris Depth Model. The loader checks the task, but it's worth repeating because the three files are visually indistinguishable in a folder listing.
Everything is white, or everything is black. That's the per-image percentile normalisation doing its job on an image with almost no depth variation - a flat wall, a page of text, a tight portrait crop. The map is "correct" in the sense that there's nothing to normalise; you just can't get useful structure out of a scene that doesn't have any.
Colours came out grayscale when you asked for inferno. No matplotlib. Check the console for the warning.
It's slow. max_side at 1024 on a 3B model is not a real-time preprocessor. This is the node where you feel the difference between Iris depth and a 24M-parameter Depth Anything Small, and if you're generating depth maps in bulk for a video, you should probably be using something smaller.
The mask looks inverted from what you expected. Near is white - bright = close, on both the image and the mask. If your foreground mask is empty, you masked the sky.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| depth_model | IRIS_DEPTH_MODEL | — | |
| image | IMAGE | — | |
| max_side | INT | 10240–4096 | long side the model sees; the map is resized back to the input size. 0 keeps the input size |
| colors | COMBO | grayscale (near = white) | grayscale is what depth ControlNets expect |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| depth | IMAGE | — |
| depth_mask | MASK | — |
| depth_3d | IRIS_DEPTH | — |