Preprocessor Contact Sheet
Every ControlNet preprocessor on one grid, and a picker that hands you the winning workflow
- image
- contact_sheet
- report
The hardest part of ControlNet was never the ControlNet. It's standing in front of your reference image wondering whether Canny or Lineart will serve it better, whether HED's soft edges beat TEED's clean ones, whether you even need depth. The usual answer is to run three preprocessors in separate workflows and squint at the results side by side - which is exactly the chore this node deletes. Preprocessor Contact Sheet runs every ControlNet preprocessor you have installed (Canny, HED, Scribble, Lineart, DWPose, OpenPose, Depth Anything, Zoe, OneFormer, SAM, Tile, Shuffle, the lot) and lays the successes out in one labeled, color-coded grid. Then it does the thing that makes it more than a novelty: you click a thumbnail in its 🎯 Pick from Grid overlay, and it injects a ready-to-run preprocessor workflow into your canvas at the exact spot you click. Test first, wire up the winner.
How it works
The whole trick leans on one node that ships inside comfyui_controlnet_aux (Fannovel16's pack): the AIO_Preprocessor, the All-In-One dropdown that accepts any preprocessor name plus a resolution. This node just... calls it. At runtime it scans the controlnet_aux modules already loaded in your ComfyUI, works out which preprocessors actually registered, then invokes AIO's execute() once per entry at your chosen resolution. Failures are caught individually, so one crashing preprocessor doesn't kill the run - it lands in the report instead of the grid.
The grid itself is built with Pillow: each cell is a fit-and-pad thumbnail labeled with the preprocessor name, a category tag (EDGE, DEPTH, POSE, SEGMENT, LINEART, NORMAL…) and the resolution used, all color-coded. The report STRING output tells you exactly what ran, what crashed, and what's not available - plus why, like "DiffusionEdge isn't AIO-compatible, use its dedicated node."
The inputs that matter
- image - any IMAGE tensor.
- resolution (default 1024) - passed to every preprocessor. This is the one that matters most: 512 for SD1.5 work, 1024 for SDXL, and it's the single biggest lever on runtime.
- skip_preprocessors - comma-separated AIO names to skip. Your escape hatch for the slow heavyweights (SAM, OneFormer, Depth Anything) when you only want the fast edge maps.
- columns, cell_width, border, font_size, show_labels, show_original, title - grid cosmetics. Leave them alone until you care.
Outputs
Two: contact_sheet (IMAGE) and report (STRING). Wire the sheet into a preview and you're done. The report is what people skip and shouldn't - it's your ground truth for why half the grid is missing.
Installing it
Easiest route is ComfyUI Manager: search Preprocessor Contact Sheet. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/g4brielelori-byte/Custom-Nodes
Then restart ComfyUI. Heads-up: the README's own manual-clone block still says YOUR_USERNAME/ComfyUI-ContactSheet.git - a template leftover that won't resolve, so use the URL above.
The real dependency is comfyui_controlnet_aux. Install it first (Manager: search ControlNet Auxiliary Preprocessors) - this pack's own pyproject.toml only lists Pillow, numpy and torch, because all the actual work happens in aux. And aux drags in a lot: opencv, scikit-learn and friends, plus an automatic model download the first time each preprocessor runs. That first run after installing downloads a pile of ONNX weights and takes a while. Normal, not a hang.
Common issues
- Red sheet saying "comfyui_controlnet_aux not found!" - aux isn't installed or didn't load. Fix that first.
- Some preprocessors never appear, no matter what. They aren't AIO-compatible: DiffusionEdge needs scikit-learn, Unimatch needs two frames so it can't run on a single image. The report names them and points you at their dedicated nodes.
- Slow. Running 40 preprocessors at 1024 on one image is real work. Drop resolution, skip the heavy models, or both.
- Don't leave it in a production pipeline - it re-runs the entire menu on every queue. It's a compare-and-choose tool, and a good one.
If you've ever kept a "which preprocessor do I actually want" workflow pinned, this is that workflow, automated. The grid answers the question in one run, and the click-to-inject means you're generating from the winner instead of rebuilding it by hand.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| resolution | INT | 1024256–2048 | Resolution passed to each preprocessor |
| columns | INT | 51–12 | — |
| cell_width | INT | 384128–1024 | Cell width — height auto from aspect ratio |
| border | INT | 40–20 | — |
| font_size | INT | 168–48 | — |
| show_labels | BOOLEAN | true | Show/hide name + category + resolution labels |
| show_original | BOOLEAN | true | Include original image as first cell |
| title | STRING | Preprocessor Contact Sheet | — |
| skip_preprocessors | STRING | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| contact_sheet | IMAGE | — |
| report | STRING | — |