Pose Composer
Drag-and-drop multi-person poses for ControlNet
- photo_1
- photo_2
- photo_3
- pose_1
- pose_2
- pose_3
- pose_keypoint
- skeleton_image
Detecting a pose is easy. Detecting three people from three different photos and getting them onto one canvas where you want them - one person to the left, one small in the back, one cropped by the frame - is where pose workflows usually fall apart. You end up guessing with translate nodes or compositing skeleton images by hand. Pose Composer is the node that turns that chore into dragging skeletons around with a mouse.
How it works
It's a single node with an interactive canvas in its body. You connect up to three source photos (photo_1..3) and/or up to three already-detected poses (pose_1..3), hit queue once, and skeletons appear on the canvas at their proportional positions. Then you arrange them - drag the white centroid circle on a torso to move it, drag the square handle at its bounding-box corner to scale, use the eye icon to hide a person - and queue again for the output. The Python side applies your transforms and emits one merged POSE_KEYPOINT plus a rendered skeleton_image. No re-queueing between drags; the layout is stored in hidden state widgets (content_hash, detected_poses_json, composition_data) that persist across ComfyUI restarts. The canvas keeps fractional (0–1) positions and uniform scale, so resizing the canvas never distorts the people on it.
Photo inputs run RTMW-x internally - which, per the pack's pitch, recovers hands and arms better than DWPose. Pre-detected poses (Pattern B) exist so you can run different thresholds per image, or preview detection before committing.
Inputs and outputs
photo_1/2/3(IMAGE) - optional source photos; detection happens inside.pose_1/2/3(POSE_KEYPOINT) - optional pre-detected poses.score_threshold- keypoint confidence for the photo inputs. Default 0.3; drop to 0.15 when a photo has occluded arms/hands.det_score_thresh- person-detector confidence; leave it unless whole people are missed.
Outputs: pose_keypoint (merged data for all visible people at the output canvas size) and skeleton_image (rendered skeleton at canvas resolution). Both go to the usual places - skeleton_image into ControlNet.
The DWPose/Enhanced button in the ratio bar controls the skeleton_image output: DWPose mode draws 1px standard OpenPose rainbow (ControlNet-safe), Enhanced draws 2px warm/cool L/R colours for checking. The in-node canvas preview always uses enhanced colours for clarity regardless.
Installing it
ComfyUI Manager → search Eric Composer Studio → install → restart. Manual:
cd ComfyUI/custom_nodes
git clone https://github.com/EricRollei/Eric_Composer_Studio.git
cd Eric_Composer_Studio
python -m pip install -r requirements.txt
Photo detection needs rtmlib (in requirements) plus an ONNX provider, and the POSE_KEYPOINT type needs comfyui_controlnet_aux installed. Models auto-download on first use.
Where people get burned
- Can't grab a skeleton. Click directly on the white circle (the centroid dot on the torso) - its hit radius is only 9px. If the graph pans instead, the mouse handler hasn't taken over yet; wait half a second after creating the node and try again.
- State widgets visible / buttons dead. The Vue Nodes "Modern Node Design" setting breaks the hidden-widget mechanics. Settings → search "Vue Nodes" → disable it.
- ControlNet not following. Make sure the output is in DWPose colour mode -
enhancedis for your eyes only and confuses the model.
For three people on one canvas with individual control, this is genuinely the tool. For a single person you already have a pose for, you're usually better off with the cheaper Pose Transform node - the composer's power is the arrangement, not the transforms.
Inputs (11)
| Name | Type | Default | Description |
|---|---|---|---|
| photo_1opt | IMAGE | — | |
| photo_2opt | IMAGE | — | |
| photo_3opt | IMAGE | — | |
| pose_1opt | POSE_KEYPOINT | — | |
| pose_2opt | POSE_KEYPOINT | — | |
| pose_3opt | POSE_KEYPOINT | — | |
| score_thresholdopt | FLOAT | 0.300–1 | Keypoint confidence. Lower to 0.15-0.20 for occluded arms/hands. |
| det_score_threshopt | FLOAT | 0.500.1–1 | Person detector confidence. Lower only if whole people are missed. |
| content_hashopt | STRING | — | |
| detected_poses_jsonopt | STRING | — | |
| composition_dataopt | STRING | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| pose_keypoint | POSE_KEYPOINT | — |
| skeleton_image | IMAGE | — |