MaskListComposite(FaceParsing)
Collapse a list of masks into one
- mask
- MASK
The list-shaped twin of MaskBatchComposite. Same job - take many masks, fold them into one using a boolean/arithmetic operation - but where MaskBatchComposite expects a proper batched tensor (a uniform stack, every mask the same size), this one expects a ComfyUI list connection instead. That distinction matters more than it sounds: a list can carry masks of varying sizes and is how a lot of nodes that output "one thing per detection" or "one thing per class" actually structure their output, versus a fixed batch.
Why the pack ships two of these
If you've spent time in ComfyUI you'll have run into the batch-vs-list split before - it's one of the more confusing parts of the graph model for newcomers, because both connections look identical on the canvas and only reveal themselves as different when a node errors out expecting one and getting the other. Face parsing is exactly the kind of task that produces this ambiguity: depending on how a given node in the pack (or a community workflow built around it) is wired, the per-class masks coming out of the segmentation step might arrive as a batch or as a list. Rather than force you to convert one into the other before you can reduce it, the pack just ships a composite node for each shape. If your upstream masks are behaving like a list (each one connects and disconnects independently, or a "batch to list"-style conversion happened somewhere earlier in the graph), this is the node you want; if they're a genuine stacked batch, use MaskBatchComposite instead.
Inputs and outputs
mask- the list of masks to combine. Because this is a list connection rather than a batched tensor, ComfyUI iterates it, so the masks feeding in don't strictly need to be the same resolution the way a batch does.operation- the same five-option dropdown as its batch sibling:multiply,add,and,or,xor. Nosubtract, for the same reason - an unordered reduction over an arbitrary number of masks doesn't have a natural "subtract from what" direction.add/orfor a union of everything in the list is the common case;and/multiplyfor an intersection across the whole list is the less common but real one.
Output is a single MASK. From there it flows into the same downstream nodes as everything else in this pack - MaskBorderDissolve for softening the composite's edge, or MaskInsertWithBBox to place it back at full-image scale if the masks in the list were crop-sized.
Installing it
ComfyUI Manager: search comfyui_face_parsing, install, restart. Manual install:
cd ComfyUI/custom_nodes
git clone https://github.com/Ryuukeisyou/comfyui_face_parsing.git
Restart ComfyUI. As with every node in this pack, the actual model weights - the face-parsing segmentation model and a YOLOv8 face detector - aren't part of the git clone; they download automatically on first use to models/face_parsing/ and models/ultralytics/bbox. The README has manual download links for both (jonathandinu/face-parsing and Bingsu/adetailer on HuggingFace) if your setup can't reach HuggingFace directly.
What to watch for
The main failure mode is connecting a batch where this node expects a list, or vice versa - ComfyUI will generally complain rather than silently do the wrong thing, but the error message ("expected list, got Tensor" or similar) doesn't always make it obvious which upstream node produced the mismatched shape in a bigger graph. If you hit that, trace back to whichever node is producing your per-class masks and check its actual output type before assuming this node is misconfigured - the fix is almost always either swapping to MaskBatchComposite or inserting a batch/list conversion node upstream, not anything about this node's own settings.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| mask | MASK | — | |
| operation | COMBO | 5 options: multiply, add, and, or, xor |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| MASK | MASK | — |