ComfyUI Node

Pose Renderer

Turning skeletons into ControlNet food (the right way)

By EricRollei·Created 5 months ago·Updated 4 months ago· 3
Pose Renderer
  • pose_keypoint
  • skeleton_image
keep_input_sizetrue
canvas_width1024
canvas_height1024
color_modedwpose
line_width4
joint_radius4
face_dot_radius2
draw_facetrue
draw_handstrue
draw_feettrue
body_onlyfalse
xinsr_stick_scalingfalse

Pose detection gives you a POSE_KEYPOINT; ControlNet doesn't eat that. It eats a picture of a skeleton - the classic 18-colour OpenPose stick figure on black, rendered at exactly the size you're generating. Pose Renderer is the node that bridges the two, and if you've ever had ControlNet "mostly follow" a pose but drift on proportions, it's probably because this step was done wrong.

How it works

The node draws the stored keypoints onto a canvas using the same limb definitions and colour arrays as comfyui_controlnet_aux's renderer - DWPose mode reproduces the exact training-data format every pose ControlNet expects, with 1px lines. That's the key subtlety: ControlNet models are trained on a specific stick-figure look, and deviating from it (thicker sticks, different colours) quietly degrades how well they follow.

The inputs that matter

  • pose_keypoint - whatever detection or composition produced it.
  • keep_input_size - keep it true for ControlNet. It renders at the exact resolution stored in the pose data, so the skeleton lines up pixel-for-pixel with your generation. Set it false and you're asking for a rescale that misaligns everything.
  • color_mode - dwpose for ControlNet (the training format). enhanced uses warm/cool L/R colour-coding for visual analysis - great for eyeballing, terrible for conditioning. The README says it plainly: don't feed enhanced to ControlNet.
  • body_only - kills face, hands and feet in one click, overriding the individual toggles. Handy for tight multi-person shots where fine detail would just merge into noise.
  • face_dot_radius - drop to 1 when many small skeletons overlap and the face dots (70 of them) fill in like a blob.
  • xinsr_stick_scaling - this one is specific: enable it only for xinsir/controlnet-openpose-sdxl-1.0, whose training drew scaled-up sticks. At 1024px it renders stick width 12 instead of 4. For everything else - standard SDXL, SD 1.5, Flux Union, SD3 pose - leave it off.

Output

skeleton_image - the rendered IMAGE. Straight into a ControlNet's image input, then out to your KSampler.

Installing it

Same pack, same drill: ComfyUI Manager → search Eric Composer Studio → install → restart, or clone https://github.com/EricRollei/Eric_Composer_Studio.git into custom_nodes and pip install -r requirements.txt. Rendering itself only needs numpy/OpenCV, but since it consumes POSE_KEYPOINT, the pose pipeline (detector, comfyui_controlnet_aux) has to be installed for the data type to exist.

Where people get burned

The classic three: rendering at the wrong size (keep_input_size false), feeding enhanced colours to ControlNet, and using the Xinsir toggle on a model that doesn't want it. And one more that's easy to miss - if you compose several scaled-down people onto one canvas, the hands and face dots merge into solid noise. Drop face_dot_radius to 1, or just hit body_only: ControlNet still reads the body skeleton accurately, and your output will look a lot less "ink blot at head height".

CategoryEric_Composer_Studio

Inputs (13)

NameTypeDefaultDescription
pose_keypointPOSE_KEYPOINT
keep_input_sizeBOOLEANtrueTrue: render at POSE_KEYPOINT canvas size (recommended for ControlNet). False: use explicit dimensions below.
canvas_widthINT102464–8192
canvas_heightINT102464–8192
color_modeCOMBOdwpose2 options: dwpose, enhanced
line_widthINT41–16Enhanced mode only. DWPose mode always uses stickwidth=4.
joint_radiusINT41–20Enhanced mode only. DWPose mode always uses radius=4.
face_dot_radiusINT21–8Face keypoint dot size. Default 2 for DWPose, scales with joint_radius in Enhanced.
draw_faceBOOLEANtrue
draw_handsBOOLEANtrue
draw_feetBOOLEANtrue
body_onlyBOOLEANfalseDisable face, hands and feet in one click. Overrides the individual toggles above.
xinsr_stick_scalingBOOLEANfalseScale stick thickness for xinsir/controlnet-openpose-sdxl-1.0. At 1024px: stickwidth=12.

Outputs (1)

NameTypeDescription
skeleton_imageIMAGE