IBB Pose — Run SDPose Estimation
The node that turns your frames into skeletons — and JSON
- ibb_pose_model
- images
- data_from_florence2
- grounding_dino_model
- yolo_model
- images
- pose_keypoint
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:
- Detect - find every person in each frame (bounding boxes).
- Batch infer - crop each person and run SDPose on the crops in true batches (that's what
batch_sizeis for). - 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 atoverlay_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 onsave_for_editor(writes toComfyUI/output/poses/withfilename_prefix_edit) - the README explicitly points at ComfyUI-OpenPose-Editor-jd for that workflow.enable_confidence_filtergoverns 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_thresholda touch, or checkkeep_face/keep_hands/keep_feetif you stripped parts deliberately. - OOM on video -
batch_sizetoo high for your VRAM. Dial it back toward 1. - WholeBody import errors - you skipped
onnxruntime. The Body path needsultralytics; the WholeBody path needsonnxruntime; neither is inrequirements.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.
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| ibb_pose_model | IBB_POSE_MODEL | — | |
| images | IMAGE | — | |
| score_threshold | FLOAT | 0.300.1–0.9 | — |
| overlay_alpha | FLOAT | 1.000–1 | — |
| batch_size | INT | 11–64 | — |
| data_from_florence2opt | JSON | — | |
| grounding_dino_modelopt | GROUNDING_DINO_MODEL | — | |
| promptopt | STRING | person . | — |
| gd_thresholdopt | FLOAT | 0.300–1 | — |
| yolo_modelopt | YOLO_MODEL | — | |
| save_for_editoropt | BOOLEAN | false | — |
| filename_prefix_editopt | STRING | poses/ibb_pose | — |
| keep_faceopt | BOOLEAN | true | — |
| keep_handsopt | BOOLEAN | true | — |
| keep_feetopt | BOOLEAN | true | — |
| scale_for_xinsropt | BOOLEAN | false | — |
| pose_scale_factoropt | FLOAT | 1.00.1–10 | — |
| enable_confidence_filteropt | BOOLEAN | true | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| pose_keypoint | POSE_KEYPOINT | — |