Nodes/IBB_POSE/IBB Pose — Run SDPose Estimation
ComfyUI Node

IBB Pose — Run SDPose Estimation

The node that turns your frames into skeletons — and JSON

By IBB666·Created 4 months ago·Updated 4 months ago· 0
IBB Pose — Run SDPose Estimation
  • ibb_pose_model
  • images
  • data_from_florence2
  • grounding_dino_model
  • yolo_model
  • images
  • pose_keypoint
score_threshold0.30
overlay_alpha1.00
batch_size1
promptperson .
gd_threshold0.30
save_for_editorfalse
filename_prefix_editposes/ibb_pose
keep_facetrue
keep_handstrue
keep_feettrue
scale_for_xinsrfalse
pose_scale_factor1.0
enable_confidence_filtertrue

This is the node you actually came for. The two loaders set everything up; IBBPoseProcessor is where the pose estimation happens, and it's the difference between "IBB Pose is a pack I installed" and "IBB Pose is in my ControlNet workflow." Feed it an image or a batch of frames, get back a skeleton overlay and OpenPose-format JSON - the raw material for pose ControlNet, pose-driven video, or OpenPose Editor edits.

The mental model is a three-stage pipeline, and knowing it saves you from blaming the wrong stage when output looks wrong:

  1. Detect - find every person in each frame (bounding boxes).
  2. Batch infer - crop each person and run SDPose on the crops in true batches (that's what batch_size is for).
  3. Reconstruct - map keypoints back to original coordinates, draw the skeleton, build the JSON.

The inputs that matter

Required are few. ibb_pose_model and images are the obvious ones. Then:

  • score_threshold (0.1–0.9, default 0.3) - minimum keypoint confidence before a point is drawn. Low it to 0.1–0.2 if you're losing limbs, raise it to clean up jitter.
  • overlay_alpha (0–1, default 1) - 1 is pure skeleton on a black canvas (the classic ControlNet conditioning image); 0 would be the untouched photo, which you don't want here.
  • batch_size (1–64, default 1) - persons processed per inference batch. For video with many frames, raise it; the tradeoff is VRAM.

The optional slots are where it gets interesting. You can drive detection with yolo_model (the fast default), grounding_dino_model plus a prompt (default "person .") and gd_threshold, or data_from_florence2 JSON from a Florence2 node. Detection priority runs Florence2 → GroundingDINO → YOLO → whole frame. For WholeBody models, keep_face / keep_hands / keep_feet (all default true) let you strip facial/hand/foot keypoints out of the output - handy when hands are noise and you only want the body line.

Outputs

  • images (IMAGE) - the skeleton overlay, alpha-blended onto the original at overlay_alpha. Wire this into an OpenPose ControlNet.
  • pose_keypoint (POSE_KEYPOINT) - OpenPose-format JSON per frame: keypoints plus confidence scores. Save it to disk for editing by turning on save_for_editor (writes to ComfyUI/output/poses/ with filename_prefix_edit) - the README explicitly points at ComfyUI-OpenPose-Editor-jd for that workflow. enable_confidence_filter governs whether low-confidence keypoints get dropped from the saved JSON.

There's also pose_scale_factor (0.1–10) for line/dot thickness, and scale_for_xinsr for Xinsr ControlNet scaling - niche, leave them alone until you have a reason.

Install and the gotchas

Base install is the pack-wide one: ComfyUI Manager → search "IBB_POSE", or clone https://github.com/IBB666/IBB_POSE into custom_nodes, then pip install -r requirements.txt and restart. Beyond that, which backend you need depends on your model type: pip install ultralytics for Body/OpenPose, onnxruntime (or onnxruntime-gpu) for WholeBody. Models auto-download on first use.

Where people get burned:

  • Skeleton drawn over the whole frame as one blob - detection failed and it fell back to "full image as one person." Check your YOLO model and the image. This is the #1 "why is my pose broken" cause.
  • Missing limbs / floating dots - raise score_threshold a touch, or check keep_face/keep_hands/keep_feet if you stripped parts deliberately.
  • OOM on video - batch_size too high for your VRAM. Dial it back toward 1.
  • WholeBody import errors - you skipped onnxruntime. The Body path needs ultralytics; the WholeBody path needs onnxruntime; neither is in requirements.txt.
  • First run is slow - models are auto-downloading to ComfyUI/models/IBB_POSE/. Let it finish once.

One honest caveat: SDPose is a diffusion model doing pose estimation, so it's slower than a lightweight DWPose pass - you're trading speed for robustness. For ControlNet work where you're rendering a single conditioning image, that's usually a fine trade. For per-frame video preprocessing, batch wisely.

CategoryIBB_POSE

Inputs (18)

NameTypeDefaultDescription
ibb_pose_modelIBB_POSE_MODEL
imagesIMAGE
score_thresholdFLOAT0.300.1–0.9
overlay_alphaFLOAT1.000–1
batch_sizeINT11–64
data_from_florence2optJSON
grounding_dino_modeloptGROUNDING_DINO_MODEL
promptoptSTRINGperson .
gd_thresholdoptFLOAT0.300–1
yolo_modeloptYOLO_MODEL
save_for_editoroptBOOLEANfalse
filename_prefix_editoptSTRINGposes/ibb_pose
keep_faceoptBOOLEANtrue
keep_handsoptBOOLEANtrue
keep_feetoptBOOLEANtrue
scale_for_xinsroptBOOLEANfalse
pose_scale_factoroptFLOAT1.00.1–10
enable_confidence_filteroptBOOLEANtrue

Outputs (2)

NameTypeDescription
imagesIMAGE
pose_keypointPOSE_KEYPOINT