DWPose v5.1.0
DWPose detection with a built-in JSON dump (no separate preprocessor pack needed)
- images
- IMAGE
- STRING
If you've done pose ControlNet work, you know DWPose as the better OpenPose: cleaner hand and face detection than the original openpose_full, and it's become the default pose preprocessor in most packs. tri3d-dwpose is that detector wrapped for TRI3D's virtual-try-on pipeline - same skeleton output you'd get from any DWPose node, plus a side effect that makes it genuinely different: it writes the detected keypoints to a JSON file for you.
What it does
Feed it an IMAGE (a batch works), and it runs DWPose detection and returns two things:
- IMAGE - the classic skeleton canvas (body + hands + face, per your toggles), the thing you'd normally feed an OpenPose ControlNet.
- STRING - the file path of the pose JSON it just saved, so you can wire it straight into
tri3d-pose-to-imageortri3d-adjust-neckwithout typing a path.
The four inputs are the ones you expect: detect_hand, detect_body, detect_face as enable/disable dropdowns, and filename_path, defaulting to dwpose/keypoints/input.json. Keep in mind the path is resolved inside the pack folder - the default works fine, but it means every run overwrites the same file rather than accumulating outputs.
Under the hood it's the standard DWPose stack: the yzd-v/DWPose ONNX models (yolox_l.onnx for detection, dw-ll_ucoco_384.onnx for pose) get downloaded from Hugging Face on first use into the pack's dwpose/ckpts cache. One thing worth knowing before you blame this node for being slow: it runs through OpenCV's DNN module on CPU - the code literally warns "DWPose doesn't support CUDA out-of-the-box". Detection is a few hundred milliseconds per image on CPU, which is fine for a single reference image and a bit tedious for long batches.
How it differs from the usual DWPose node
Most preprocessors (ControlNet Aux, ComfyUI's own) give you the skeleton image and nothing else. This one also serializes the keypoints in TRI3D's flattened 130-point format - the {"height", "width", "keypoints"} JSON their whole pose pipeline reads. That's what makes it the entry point for the pack's pose-adaptation machinery: detect on a mannequin, run tri3d-adjust-neck / tri3d-pose-adaption, render with tri3d-pose-to-image, and you have a ControlNet condition nobody else's stock nodes produce.
If you only want a pose image for a one-off ControlNet pass, use your usual DWPose node - this one's JSON side effect is the value, not the skeleton.
Installing
ComfyUI Manager, search "tri3d", or:
cd ComfyUI/custom_nodes
git clone https://github.com/TRI3D-LC/tri3d-comfyui-nodes
Restart, and make sure requirements are installed (Manager does this automatically; manual install is pip install -r custom_nodes/tri3d-comfyui-nodes/requirements.txt). First run downloads the two ONNX models, which needs network and a minute or two.
Troubleshooting
- CPU-only and you need speed - it is what it is; this pack's DWPose is OpenCV-DNN on CPU. For high-throughput pose extraction, reach for a CUDA-accelerated preprocessor pack instead.
- JSON saved, but pose-to-image shows blank - detection found no person, so the JSON is all
[-1, -1]markers. Check the input image actually has a person anddetect_bodyisenable. - Slow first run after install - that's the model download, not the node.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| detect_hand | COMBO | enable | 2 options: enable, disable |
| detect_body | COMBO | enable | 2 options: enable, disable |
| detect_face | COMBO | enable | 2 options: enable, disable |
| filename_path | STRING | dwpose/keypoints/input.json | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |
| STRING | STRING | — |