Openpose Estimator Node
Openpose Estimator Node (ComfyUI-ultimate-openpose-estimator)
- images
- POSE_IMAGE
- POSE_KEYPOINT
- POSE_JSON
If you've ever pointed the standard DWPose preprocessor at a video and watched your VRAM climb or your generation crawl to a stop, this node is the fix people reach for. Openpose Estimator Node is a TensorRT-accelerated pose detector - it finds bodies, faces, and hands in an image and draws the OpenPose-style skeleton you feed into a ControlNet, but it does the detection through compiled TensorRT engines instead of plain ONNX Runtime. That's the whole pitch: same job as any DWPose preprocessor, noticeably faster, and with more knobs to control what actually gets drawn.
Where it fits. OpenPose is the classic ControlNet condition for "put a different character in this exact pose" - extract the skeleton from a reference image, feed it to an OpenPose ControlNet, and the model generates someone else standing/sitting/dancing the same way. DWPose is the modern detector behind that: better hand tracking than the original OpenPose model, which used to be the weak point of pose transfer. This node is built directly on top of yuvraj108c's ComfyUI-Dwpose-Tensorrt project - westNeighbor took that speed work and added the output/control options that were missing: per-part toggles, a detection threshold, canvas resolution, and marker sizing. It's a wrapper with taste, not a from-scratch reimplementation.
The catch, and it's a real one: this only works on an Nvidia CUDA card. There's no CPU fallback, no AMD path. If you're not on Nvidia, use the regular ControlNet Auxiliary Preprocessors' DWPose node instead - it's slower but it runs everywhere.
Inputs that matter
images is your reference frame or batch. Three booleans - show_face, show_hands, show_body - decide which parts get drawn on the output skeleton (all default on; turning ones off is handy if you only care about body pose and don't want face jitter polluting the ControlNet condition). detect_threshold (0–1, default 0.3) is the confidence cutoff below which a keypoint gets dropped instead of drawn - raise it if you're getting phantom joints on a noisy or low-res source.
resolution_x controls the output canvas width in pixels (default -1, keeps the source size, capped at 12800) and preserves the original aspect ratio - worth knowing that anything under 64px silently falls back to 512px rather than erroring. The three marker-size ints (pose_marker_size, face_marker_size, hand_marker_size) set how thick the drawn joints and lines are; the defaults are tuned for roughly 1024px images, so scale them down if you're working smaller or the skeleton will look like a fat crayon drawing.
Outputs
You get three: POSE_IMAGE, the rendered skeleton - this is what plugs straight into your ControlNet apply node (or Preview Image if you're just checking the detection). POSE_KEYPOINT, the structured keypoint data for anything downstream that wants raw coordinates rather than a picture - the author's companion ultimate-openpose-editor node is built to consume exactly this if you want to hand-adjust a pose after detection. And POSE_JSON, the same data flattened to a string, useful for saving a pose out or moving it between workflows.
Installing it
Search "ComfyUI-ultimate-openpose-estimator" in ComfyUI Manager, or do it by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/westNeighbor/ComfyUI-ultimate-openpose-estimator
cd ComfyUI-ultimate-openpose-estimator
pip install -r requirements.txt
(Portable build: point python_embeded/python.exe -m pip install -r requirements.txt at it instead.) Restart ComfyUI and it shows up under Right Click → ultimate-openpose → Opnepose Estimator Node - yes, that's a typo in the pack's own menu, don't go hunting for a second node.
Here's the part that trips people up: installing the node isn't enough. You also need TensorRT engines. Download dw-ll_ucoco_384.onnx and yolox_l.onnx from the DWPose HuggingFace repo, run export_trt.py to compile them into .engine files, and drop those into ComfyUI/models/tensorrt/dwpose. That build step matters because TensorRT engines are compiled for your specific GPU and TensorRT/CUDA version - you can't just grab someone else's .engine file off a Discord and expect it to load. If it fails to load silently or errors out, mismatched CUDA/TensorRT versions between what built the engine and what's installed on your machine is the first thing to check.
One more thing worth knowing before you build a workflow around this: the license is CC BY-NC-SA - noncommercial use only, and the README asks you to contact the maintainers directly if you want to use it commercially. Fine for personal projects and experimentation, worth flagging if this is going into anything you're selling.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| show_face | BOOLEAN | true | — |
| show_hands | BOOLEAN | true | — |
| show_body | BOOLEAN | true | — |
| detect_threshold | FLOAT | 0.300–1 | — |
| resolution_x | INT | -1-1–12800 | — |
| pose_marker_size | INT | 40–100 | — |
| face_marker_size | INT | 30–100 | — |
| hand_marker_size | INT | 20–100 | — |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| POSE_IMAGE | IMAGE | — |
| POSE_KEYPOINT | POSE_KEYPOINT | — |
| POSE_JSON | STRING | — |