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 the question, listing only the ones that can. Within a family the smaller is quicker and the larger more accurate: `Depth Anything V2 Small` is 99 MB against `Large` at 1.3 GB. `Marigold v2` is the sharpest, and the one read from the three inputs at the bottom rather than downloaded. |
| resolution | INT | 51264–8192 | Longest edge the work is done at before the answer is scaled back to the image's own size. 512 is a sensible start; 1024 resolves finer detail and costs more. Anything above the image's own longest edge is held to it. `openpose`, `animal_pose`, `line_segments`, `denoise` and `low_light` ignore it. |
| threshold_low | FLOAT | 1000–256 | The lower cut-off, or the only one where a question takes one. Each preprocessor reads it over a range of its own, which the widget shows: `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 moves it to that one's start. |
| 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` reads 0.5 to 32.0 as the blur each pixel is compared against: 6.0 gives normal line weight, 2.0 fine lines and 16.0 heavy ones. `normal_map` reads 0 to 8 as how far the surface slope is measured across: 3 suits a depth model, 0 is the sharpest and 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` reads it as the displacement: `0` and `1` scramble the same picture two different ways, and one seed always gives one scramble. `albedo`, `roughness`, `metallicity`, `material`, `shading` and `residual` read it as the noise their first step starts from, and every frame of a batch starts from the same one. |
| tile | INT | 00–4096 | Work a square at a time instead of the whole frame, which holds VRAM down on a large picture. 0 reads the whole frame. 512 reads a 512 pixel square at a time, overlapping a quarter and faded together, 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`. One transformer answers every map; `adapter_name` puts the adapter on it here. | |
| 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. |