RS OpenPose Masks (Experimental)
A Skeleton PNG Without the ControlNet Baggage
- building_pipe
- pose_keypoints
- image
- building_pipe
- pose_preview
- person_masks
- pose_info
Here's the thing to get straight before you install anything: this node does not send a skeleton into the model. There's no ControlNet, no control weights, no trainable encoder copy, no pose model to download. If that's what you wanted, you want a ControlNet - and on 2026 anime bases you'll be lucky if one exists for your architecture at all.
What RS OpenPose Masks does is read a colored skeleton PNG and use it to draw person-shaped masks for this pack's regional sampler. Instead of hand-painting two silhouettes, you feed it the pose map you already made and it produces numbered regions that roughly follow the bodies. The name is honest: it makes masks, not poses.
What it does
Drop a colored OpenPose/DWPose PNG with a black or transparent background onto the node, and it renders person masks by drawing limbs at a selectable width. People are numbered left to right by their neck position, not by any identity detection. Then you go into Character Position, select each person number, and drag or resize them like any other mask.
You've got several ways in, in priority order: connected POSE_KEYPOINT, then a connected skeleton IMAGE, then the uploaded PNG, then pose_json. That's why pasting JSON "does nothing" while a PNG sits selected in the dropdown.
The optional body-part guidance is the experimental bit, and it's the part people misread. It doesn't lock joints. It puts a word for a body part near where that part was in your skeleton - the docs list six shared labels (head, hands, chest, thighs, legs, feet) - as very weak attention guidance. Defaults to 0, i.e. off, and the author's own SDXL A/B test did not show better high-five accuracy from turning it on. Names can also drag clothing and appearance around with them. Leave it off until you have a specific problem.
Inputs and outputs
The three required widgets:
- pose_json - advanced. A
peoplearray of COCO-18 (54 values) or BODY-25 (75 values) keypoints, in pixels. - thickness - 0.25 to 3.0, default 1.0. Limb width and body padding for the generated masks.
- body_part_strength - 0 to 0.8, default 0. Off means mask-only composition.
Optional ones you'll actually use: pose_image (pick a PNG already in your input folder), image (a skeleton from Load Image or a pose preprocessor), pose_keypoints (a DWPose POSE_KEYPOINT), confidence (default 0.2 - skip joints below it, and missing segments are never invented), plus canvas_width / canvas_height, which are fallback only for when your JSON has no canvas size. Set those to the original pose canvas, not your generation resolution. That mismatch is the classic "masks are all in the corner" bug.
Four outputs, and the pack doesn't hide them from you:
- building_pipe - onward to Finalize Character Pipe, then the sampler.
- pose_preview - an
IMAGE; wire it to Preview Image to see joints and the generated person masks before you sample. Do this. - person_masks - the mask batch, if you want to inspect or reuse it elsewhere.
- pose_info - a
STRINGsummary. Useful when the numbering looks wrong.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/raspie10032/ComfyUI_RS_MultiCharacter_Sampler.git
Restart and hard-refresh. Or search RS MultiCharacter Sampler in ComfyUI-Manager. No ControlNet models, no detector weights, nothing to download - the pack itself only wants Python 3.11+ with Torch, NumPy and Pillow. Category: RS MultiCharacter/Characters.
Common issues
The diagram is empty even though the mask works. If any source (including thickness) is a connected input rather than a widget, the browser can't evaluate upstream nodes. Run the graph once - the executed masks populate the diagram and the position editor. Change the upstream image and run again; a reloaded workflow starts blank until executed.
Nothing parses from the PNG. It has to be standard COCO-18 / DWPose coloring on black or transparent, original 64–2048 px, unlabelled, uncompressed to death, with neck and shoulders still in frame. BODY-25 and exact coordinates go through pose_json or POSE_KEYPOINT instead.
Two people, wrong numbering. PNG order is neck position, left to right, and a flat image has no person IDs - crossing limbs can't be recovered. Check pose_preview and rename your prompt rows to match.
You expected real pose control. Not happening, and it's worth knowing why. ControlNet-style pose conditioning feeds the skeleton to a trainable copy of the encoder and injects its features into the UNet's skip connections - a completely different mechanism from biasing prompt attention by region. Even that is shaky ground on newer anime bases: reports have OpenPose ControlNets training fine for Anima and then not firing at inference, while regional Control LoRAs and LLLite-style tools are where the work is happening. This node is the no-download way to say roughly here, for this character, not exactly this pose.
MOSS flattens the shape. Under MOSS native layout, masks become their enclosing rectangles. Use regional if the silhouette is the point.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| pose_json | STRING | Advanced coordinate input. Prefer Load Pose PNG. Connected keypoints override images; an image overrides this JSON. JSON array order maps to character numbers. | |
| thickness | FLOAT | 1.000.25–3 | Person-mask limb width and body padding. Position node moves/resizes the whole person and part masks together. |
| body_part_strength | FLOAT | 0.000–0.8 | Very weak attention guidance using body-part names at their mapped locations. 0 = OFF. / 뼈대 자체가 아니라 해당 위치에 부위 이름을 넣어 아주 약하게 어텐션을 유도합니다. 0 = 끄기. |
| building_pipeopt | RS_MC_BUILD_PIPE | — | |
| pose_keypointsopt | POSE_KEYPOINT | Optional DWPose/OpenPose single-frame coordinates; overrides the JSON text. | |
| canvas_widthopt | INT | 51264–2048 | Fallback only when JSON has no canvas_width. Use the ORIGINAL pose canvas size. |
| canvas_heightopt | INT | 76864–2048 | Fallback only when JSON has no canvas_height. Use the ORIGINAL pose canvas size. |
| confidenceopt | FLOAT | 0.200.05–1 | Skip missing or low-confidence joints. Missing segments are not invented. |
| pose_imageopt | COMBO | (none) | Load a colored OpenPose/DWPose PNG on black/transparent background. People are numbered left to right by neck. Overrides JSON; connected image/keypoints take priority. |
| imageopt | IMAGE | Optional skeleton image from Load Image or a pose preprocessor. One frame; overrides the selected file and JSON. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| building_pipe | RS_MC_BUILD_PIPE | — |
| pose_preview | IMAGE | — |
| person_masks | MASK | — |
| pose_info | STRING | — |