Power Preprocessor
Depth, pose, edges, or what a ControlNet needs
- image
- model
- vae
- conditioning
- image
Power Preprocessor is the answer to "I need a depth map / pose / edge map and I don't want to install four different preprocessor packs to get it." Measure an image and it returns what you asked for: depth, surface direction, body pose, per-pixel segmentation, soft edges, drawn lineart, straight runs - even the paint color or the light a scene was lit by. Feeding a ControlNet is the usual reason it exists, and it's also used for relighting, defocus, masking and stylizing.
The smart part is that the model dropdown only lists the checkpoints that can actually answer the question you picked. Pick depth, and the menu shows the depth models; pick pose, and you see the pose models. One node, one mental model, no hunting through a hundred-node pack for the right preprocessor.
The models behind it
Five preprocessors need no model at all and download nothing: canny_pyramid, lineart_simple, scribble_xdog, binary and shuffle. The rest fetch a checkpoint on first use (only with features.network: true in config.yaml), or read one another pack already has - it searches ComfyUI's model folders before fetching, so if you run ControlNet Aux and already own the weights, this node finds them.
The families and their folders, from the pack's own MODELS.md:
| Family | Reads | Some options |
|---|---|---|
| Depth | models/depth_anything | Depth Anything V2 Small/Base/Large, DPT SwinV2 Tiny |
| Pose | models/pose | ViTPose Small, Wholebody (133 points), Animal |
| Segmentation | models/segmentation | SegFormer B0/B2/B4 |
| Soft edge | models/hed, pidi, teed | HED, PiDiNet, TEED |
| Lineart | models/lineart | Lineart, Lineart Coarse, Lineart Anime, Manga Line |
| Intrinsics | models/intrinsics | Marigold IID: albedo, shading, roughness |
| Denoise / low light | various | SCUNet, NAFNet, DarkIR, Retinexformer |
Marigold's six intrinsic maps (albedo, roughness, metallicity, material, shading, residual) are the headliner: those are the "paint and the light" answers that drive relighting and material edits, and they run in torch on the published safetensors with nothing else installed.
Inputs that matter
image is what you measure - a whole batch processes in one go. Then the knobs:
preprocessor- the question. Defaults tocanny_pyramid.model- which checkpoint answers, limited to the ones that can.resolution- the longest edge you work at before the answer scales back to the image's size. 512 is sensible for ControlNet; lower is faster, higher keeps more detail.threshold_low/threshold_high- edge-strength cutoffs where the preprocessor takes a pair. The node draws which controls each question reads, so a single-knob question likebinaryuses justthreshold_low.seed- chooses between equally-good random answers (shufflereads it as the displacement).tile- work a square at a time to hold VRAM down on large images.steps- how many denoise passes an intrinsic question takes.
The output is one image, the same size and batch length as the input - wired into a ControlNet Apply's image input in the standard flow.
Installing
Power Preprocessor ships in WAS Node Suite v3. ComfyUI Manager → search WAS Node Suite v3, or:
cd ComfyUI/custom_nodes
git clone https://github.com/WASasquatch/was-node-suite-comfyui
Restart after; needs ComfyUI 0.14.0+ and Python 3.10+. Here's the catch to plan for: the pack itself installs nothing, but the model-based preprocessors download weights on first use - and only when features.network: true is set in <ComfyUI user dir>/was-node-suite/config.yaml. With it off, a run that needs a missing checkpoint stops and names the file and every folder it searched. If you're offline or bandwidth-shy, pre-place weights in the folders above and you never need the network flag on.
Honest note: the five model-free options are genuinely the best place to start - canny, lineart-simple and scribble cover most character/structure ControlNet uses, and they're instant. Reach for the depth/pose models when the job actually needs depth or a skeleton, not because a menu listing them is tempting.
Inputs (17)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | The images to measure. A whole batch is processed. | |
| preprocessor | COMBO | canny_pyramid | What to work out. `canny_pyramid`, `lineart_simple`, `scribble_xdog`, `binary` and `shuffle` need no model; the rest run the model chosen below. |
| model_name | COMBO | Depth Anything V2 Small | Which model answers. In a family the smaller is quicker, the larger more accurate: `Depth Anything V2 Small` 99 MB, `Large` 1.3 GB. `Marigold v2` is the sharpest; choosing it wires a Load Diffusion Model into `model` and names any file still to download. |
| resolution | INT | 51264–8192 | Longest edge the work is done at, never above the image's own, then scaled back to its size. 512 = a sensible start; 1024 = finer detail, slower. Ignored by `openpose`, `animal_pose`, `line_segments`, `denoise` and `low_light`. |
| threshold_low | FLOAT | 1000–256 | The lower cut-off, or the only one. Each preprocessor reads its own range: `canny_pyramid` 1 to 255, `lineart_simple` 0 to 64, `openpose` 0.05 to 0.95, `line_segments` 0.01 to 0.40, `anyline` 1 to 256. Switching preprocessor resets it to that one's default. |
| threshold_high | FLOAT | 2000–255 | The upper cut-off, for a question that takes a pair. `canny_pyramid` reads 0 to 255 as the strength an edge must reach to start at all; `line_segments` reads 1 to 60 as the shortest run it keeps. |
| radius | FLOAT | 6.00–32 | A distance in pixels. `lineart_simple`, 0.5 to 32.0, the comparison blur: 2.0 = fine lines; 6.0 = normal; 16.0 = heavy. `normal_map`, 0 to 8, the span slope is measured over: 0 = sharpest; 3 = suits a depth model; 6 = flattens fine grain. |
| strength | FLOAT | 16.00.5–64 | How hard the answer is shaped. `normal_map` reads 0.5 to 64.0 as relief: 16.0 shows the folds in a coat, 2.0 is nearly flat and 48.0 exaggerates every slope. |
| seed | INT | 00–18446744073709550000 | Chooses between equally good random answers. `shuffle`: `0` and `1` give two different scrambles, and one seed always gives the same one. `albedo`, `roughness`, `metallicity`, `material`, `shading` and `residual`: the starting noise, shared by every frame of a batch. |
| tile | INT | 00–4096 | Work a square at a time to hold VRAM down. 0 = whole frame; 512 = 512 pixel squares, overlapped a quarter and blended so no join shows. A larger square is closer to the whole frame. Read only by `denoise` and `low_light`. |
| steps | INT | 41–20 | How many passes a question that denoises takes. `albedo`, `roughness`, `metallicity`, `material`, `shading` and `residual` read 1 to 20: 4 is what Marigold was tuned for, 1 is roughly twice as quick and coarser, and above 8 the answer stops changing much. |
| modelopt | MODEL | The transformer `Marigold v2` runs on: Load Diffusion Model on `qwen_image_edit_2509_int8_convrot` or another `qwen_image_edit_2509` build. Choosing `Marigold v2` wires one in, reusing one already in the graph. One transformer answers every map. | |
| vaeopt | VAE | A decoder to read the map through, in place of `vae_name`. Wire Load VAE, or anything answering a VAE, to use one this node cannot find by name. | |
| adapter_nameopt | COMBO | auto | `auto` = this map's adapter, found by name in the loras folder; `already on the model` = apply none, for a LoRA put on the transformer before it arrives; `marigold_v2_normals.safetensors` = that file. |
| vae_nameopt | COMBO | auto | `auto` = this map's decoder, found by name in the vae folder; `marigold_v2_normals_vae.safetensors` = that file. The `vae` socket beats this when wired. |
| conditioning_nameopt | COMBO | auto | `auto` = this map's prompt embedding, found by name in the embeddings folder; `marigold_v2_depth_conditioning.safetensors` = that file. The `conditioning` socket beats this when wired. |
| conditioningopt | CONDITIONING | A prompt embedding to read the map against, from a text encoder or a loaded conditioning. Used in place of `conditioning_name`. Keep it full length: a short prompt flattens the map, while the wording barely moves it. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | The answer, the same size and batch length as the input. An Apply ControlNet image input is the usual destination, and it is an ordinary image that any node taking one will read. |