Nodes/was-node-suite-comfyui/Power Preprocessor
ComfyUI Node Runs on cloud

Power Preprocessor

Depth, pose, edges, or what a ControlNet needs

By WASasquatch·Created 4 years ago·Updated about 9 hours ago· 1,884
Power Preprocessor
  • image
  • model
  • vae
  • conditioning
  • image
◄preprocessorcanny_pyramid►
◄model_nameDepth Anything V2 Small►
◄resolution512►
◄threshold_low100►
◄threshold_high200►
◄radius6.0►
◄strength16.0►
◄seed0►
◄tile0►
◄steps4►
◄adapter_nameauto►
◄vae_nameauto►
◄conditioning_nameauto►

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 to canny_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 like binary uses just threshold_low.
  • seed - chooses between equally-good random answers (shuffle reads 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.

CategoryWAS Suite/Image/Preprocess

Inputs (17)

NameTypeDefaultDescription
imageIMAGEThe images to measure. A whole batch is processed.
preprocessorCOMBOcanny_pyramidWhat to work out. `canny_pyramid`, `lineart_simple`, `scribble_xdog`, `binary` and `shuffle` need no model; the rest run the model chosen below.
model_nameCOMBODepth Anything V2 SmallWhich 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.
resolutionINT51264–8192Longest 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_lowFLOAT1000–256The 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_highFLOAT2000–255The 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.
radiusFLOAT6.00–32A 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.
strengthFLOAT16.00.5–64How 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.
seedINT00–18446744073709550000Chooses 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.
tileINT00–4096Work 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`.
stepsINT41–20How 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.
modeloptMODELThe 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.
vaeoptVAEA 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_nameoptCOMBOauto`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_nameoptCOMBOauto`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_nameoptCOMBOauto`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.
conditioningoptCONDITIONINGA 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)

NameTypeDescription
imageIMAGEThe 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.