IBB Pose — Load Model
Load the actual pose brain — SDPose is a diffusion model, and it shows
- IBB_POSE_MODEL
Yes, this is a pose detector built out of an image-diffusion UNet. That's the whole trick of SDPose, and it's why this node loads like it's loading a checkpoint for Stable Diffusion rather than a CV model. The payoff is that the "pose" it estimates is unusually robust - it's a diffusion model literally denoising a keypoint heatmap out of the image, which is why it holds up on hard poses and cluttered scenes where classic detectors give up. It's a genuine research lineage (T-S-Liang's SDPose-OOD, wrapped for ComfyUI by judian17, re-wrapped here), and it's niche enough that most people hit it through pack like this one.
How it works
Under the hood this is a diffusers load, full stop. The node pulls a HuggingFace repo - teemosliang/SDPose-Body or teemosliang/SDPose-Wholebody - and assembles a UNet2DConditionModel, an AutoencoderKL, and a DDPMScheduler, then wraps the UNet with a modified forward pass and bolts on a heatmap-head decoder loaded from decoder.safetensors. It even needs an empty text embedding - that's what the repo's empty_text_encoder/empty_embedding.safetensors is for, and there's a generate_empty_embedding.py if you ever need to rebuild it. Models auto-download on first use into ComfyUI/models/IBB_POSE/, so there's nothing to hunt down.
The inputs that matter
model_type-Body(17 COCO keypoints) orWholeBody(133 keypoints, adding face, hands, and feet). WholeBody is the better-control option but it drags in an onnxruntime dependency for its detector and heavier inference. Start withBodyunless you specifically need hand/face keypoints for your ControlNet or editor.unet_precision-fp32,fp16, orbf16. If your device is CPU, don't bother: the node force-falls back to fp32, because fp16/bf16 aren't supported there. On CUDA, fp16 is the sensible default; bf16 if your card is new enough to like it.device-autopicks your torch device, otherwisecudaorcpu.unload_on_finish- offloads the model back to CPU after every run. Turn this on if pose is a one-shot preprocess in a big workflow and you want the VRAM back; leave it off if you're running the processor repeatedly.
The output is a single IBB_POSE_MODEL - you feed it into the processor's ibb_pose_model input. There's no image in, no image out. This node is purely "load and cache."
Installing it
Pack-wide steps: ComfyUI Manager (search "IBB_POSE") or clone into custom_nodes, then pip install -r requirements.txt. That file is deliberately minimal - the SDPose load itself lazily imports diffusers, huggingface_hub, and safetensors, none of which are listed. If your environment doesn't already have them:
pip install diffusers huggingface_hub safetensors
If you chose WholeBody, you also need onnxruntime (or onnxruntime-gpu for GPU). The README calls for Python 3.13 / torch 2.10+, so keep that in mind on older setups.
Troubleshooting
- First run is slow - it's downloading a couple of hundred MB of SDPose weights to
models/IBB_POSE/. Normal, once. - ImportError on
diffusers/huggingface_hub- the missing lazy dependency above. Install and restart. - "Empty embedding not found" - the repo normally ships it, but if you've cloned weirdly, run
generate_empty_embedding.pyto rebuild it. - WholeBody errors on import -
onnxruntimeisn't installed. See above.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| model_type | COMBO | 2 options: Body, WholeBody | |
| unet_precision | COMBO | 3 options: fp32, fp16, bf16 | |
| device | COMBO | 3 options: auto, cuda, cpu | |
| unload_on_finish | BOOLEAN | false | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IBB_POSE_MODEL | IBB_POSE_MODEL | — |