Nodes/ComfyUI-tbox/DWPose Estimator
ComfyUI Node

DWPose Estimator

Tbox's built-in pose extractor for ControlNet

By er1cw00·Created 2 years ago·Updated about a year ago· 26
DWPose Estimator
  • image
  • IMAGE
  • POSE_KEYPOINT
detect_handenable
detect_bodyenable
detect_faceenable
resolution512
bbox_detectoryolox_l.onnx
pose_estimatordw-ll_ucoco_384_bs5.torchscript.pt

If you want to lock a generation to a specific body pose, this is the node that turns a photo of a person into the skeleton map a Pose ControlNet actually understands. DWPose replaced OpenPose as the community default a while back for one simple reason: better hands. OpenPose's hand keypoints were notoriously flaky; DWPose is the "improved pose detector, better hand detection" successor, and tbox ships its own copy of it so you're not forced to install the separate comfyui_controlnet_aux pack just to get pose extraction.

How it works

It's a two-stage pipeline, not a single model. First a bounding-box detector (the yolox family) finds the people in your image, then a dedicated pose estimator (the dw-ll_ucoco family) runs inside each box to extract body, hand, and face keypoints. You get two outputs out of that: a rendered skeleton image, ready to feed straight into a Pose ControlNet, and the raw keypoint data as JSON, useful if you want to inspect, retarget, or hand the pose off to something other than a standard image-space ControlNet.

The inputs and outputs that matter

  • image (required) - your reference photo or frame.
  • detect_hand / detect_body / detect_face (all default enable) - the toggles a beginner actually touches. Turn one off if it's fighting you: hand keypoints in particular are the shakiest part of any pose estimator, so if your hands are coming out mangled downstream, disabling hand detection and letting the model improvise is a legitimate fix, not a cop-out.
  • resolution (default 512, 64–16384) - the internal detection resolution. Push it up for a small or distant figure where the default is too coarse to pick up detail; it costs speed.
  • bbox_detector and pose_estimator (enum choices, defaulting to yolox_l.onnx and dw-ll_ucoco_384_bs5.torchscript.pt) - which underlying checkpoint runs the detection. .torchscript.pt variants run through native PyTorch and are usually the faster choice on a working GPU setup; .onnx variants need onnxruntime and are a reasonable fallback if the torchscript path misbehaves.

Outputs: IMAGE (the rendered skeleton - wire this into your ControlNet's image input alongside a DWPose/OpenPose ControlNet model) and POSE_KEYPOINT (the raw keypoint JSON).

How to install it

Via ComfyUI Manager: search ComfyUI-tbox, install, restart. Manually:

cd ComfyUI/custom_nodes
git clone https://github.com/ai-shizuka/ComfyUI-tbox

then restart. One honest gap here: the pack's README doesn't document where the bbox/pose checkpoints come from or how they're fetched - it's three empty section headers, nothing more. Every other ComfyUI pose preprocessor pulls its model files down automatically on first use, so expect the same: the first run with a given bbox_detector/pose_estimator choice will likely try to download that file before it can do anything. If your executor has no outbound internet, that first run is where it'll hang or error - check the console output for what it's trying to fetch.

Common issues & troubleshooting

Hands look wrong or jittery. This is the known weak point of every pose estimator, DWPose included. Either disable detect_hand if it's making things worse than not having hand conditioning at all, or raise resolution for a cleaner detection pass.

First run is slow or appears to hang. Almost certainly the model download described above, not a crash - give it time on a normal connection, or pre-place the weights if you're offline.

Import error mentioning onnxruntime. You picked an .onnx detector/estimator variant without that package installed. Either install it or switch to one of the .torchscript.pt options, which don't need it.

No skeleton shows up at all. DWPose didn't find a person in the frame. Check detect_body is enabled and that your input actually contains a visible figure - cropped-too-tight or heavily obscured subjects are the usual culprit.

Categorytbox/ControlNet Preprocessors

Inputs (7)

NameTypeDefaultDescription
imageIMAGE
detect_handoptCOMBOenable2 options: enable, disable
detect_bodyoptCOMBOenable2 options: enable, disable
detect_faceoptCOMBOenable2 options: enable, disable
resolutionoptINT51264–16384
bbox_detectoroptCOMBOyolox_l.onnx5 options: yolox_l.torchscript.pt, yolox_l.onnx, yolo_nas_l_fp16.onnx, yolo_nas_m_fp16.onnx, yolo_nas_s_fp16.onnx
pose_estimatoroptCOMBOdw-ll_ucoco_384_bs5.torchscript.pt3 options: dw-ll_ucoco_384_bs5.torchscript.pt, dw-ll_ucoco_384.onnx, dw-ll_ucoco.onnx

Outputs (2)

NameTypeDescription
IMAGEIMAGE
POSE_KEYPOINTPOSE_KEYPOINT