ComfyUI Node Runs on cloud

Render Pose JSON (Human)

Turn edited pose keypoints back into an OpenPose image

By Fannovel16·Created 3 years ago·Updated 4 months ago· 4,134
Render Pose JSON (Human)
  • kps
  • IMAGE
render_bodytrue
render_handtrue
render_facetrue

Pose estimation happens in two steps that people usually blur together: detect the keypoints, then draw the stick figure. This node is the second step, split out on its own. It takes a POSE_KEYPOINT (the raw OpenPose/DWPose JSON - joints, hands, face landmarks) and renders it into the familiar colorful skeleton image that a pose ControlNet actually reads. Detection and drawing being separate is the whole point: in between, you get to change things.

Why you'd want the drawing step by itself

Two reasons, and both come up constantly.

First, control over what gets drawn. The three booleans let you turn body, hands, and face on or off independently. That's not cosmetic - it's damage control. Hand detection is the flakiest part of pose estimation, and a garbled 21-point hand skeleton can drag your generation toward mangled hands rather than away from them. Switch render_hand off and the ControlNet only sees the clean body pose you trust. Same logic for face landmarks when you only care about the body.

Second, editing. If you route a detector's keypoints through a pose editor and nudge a limb, this node is what re-renders the corrected skeleton into an image the ControlNet can use. Detect once, tweak the JSON, render - without re-running the detector on a new photo.

The inputs and output

Everything here is required and there's nothing obscure:

  • kps (a POSE_KEYPOINT) - the pose data. This comes from the POSE_KEYPOINT output of a DWPreprocessor or OpenposePreprocessor, or from a pose editor node that emits the same format.
  • render_body / render_hand / render_face (all default true) - which parts of the skeleton to draw. Toggle off whichever detection you don't trust or don't need.

The single output is an IMAGE: the rendered pose skeleton. Wire it into a ControlNet Apply node with an OpenPose ControlNet (control_v11p_sd15_openpose and friends) exactly like you'd use the direct output of a pose preprocessor.

Installing it

ComfyUI Manager: search ComfyUI's ControlNet Auxiliary Preprocessors, install, restart. Or:

cd ComfyUI/custom_nodes
git clone https://github.com/Fannovel16/comfyui_controlnet_aux
pip install -r requirements.txt

Restart ComfyUI. This node itself is pure rendering - no model to download. The detector upstream that produces the keypoints is where the weights come from.

Where people get burned

The most common mistake is expecting this node to detect a pose. It doesn't. It draws one. If you feed it an image expecting a skeleton to pop out, you've skipped a step - you need a POSE_KEYPOINT on the kps input, which means running DWPreprocessor or OpenposePreprocessor first (or an editor). This node is downstream of detection, hence the "Pose Keypoint Postprocess" category.

The other gotcha is subtle and worth knowing: a pose ControlNet keys off what's drawn. If bad hand keypoints are quietly wrecking your results, the fix isn't a stronger prompt - it's flipping render_hand to false so those points never make it into the skeleton in the first place. That single toggle has rescued more pose workflows than any amount of prompt-wrangling.

CategoryControlNet Preprocessors/Pose Keypoint Postprocess

Inputs (4)

NameTypeDefaultDescription
kpsPOSE_KEYPOINT
render_bodyBOOLEANtrue
render_handBOOLEANtrue
render_faceBOOLEANtrue

Outputs (1)

NameTypeDescription
IMAGEIMAGE