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 5 months ago·Updated 5 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—