Anymatix DWPose Estimator
DWPose pose estimation that works fully offline — no surprise Hugging Face calls at run time
- image
- IMAGE
- POSE_KEYPOINT
If you've ever watched a character animation keep a pose from frame to frame, DWPose is part of why. It's the improved pose detector - body keypoints, hands, and face landmarks all at once - and its stick-figure output is exactly the kind of clean condition ControlNet loves: prompt decides who, pose decides where. AnymatixDWPreprocessor is the pack's version of the DWPose estimator, and its reason to exist is a nasty edge case the stock nodes ignore: the standard comfyui_controlnet_aux implementation tries to download its weights from Hugging Face on first use. On a machine with no network - or with HF_HUB_OFFLINE=1 - that's a hard failure mid-workflow.
This node fixes it the Anymatix way: the weights arrive through AnymatixFetcher as local files first, and the node loads them straight from disk. The detection logic underneath is the exact same comfyui_controlnet_aux implementation (a wrapper, not a reimplementation), so the pose maps you get match what the upstream node produces - it's only the weight-loading path that changes.
How it works
You feed it an image plus two weight paths and it runs the standard two-model DWPose pipeline: a bounding-box detector (YOLO-style ONNX, typically yolo_...onnx) finds the person, then the pose estimator (...torchscript.pt, usually dw-ll_ucoco_384) extracts the keypoints. The key requirement: weights must exist before you run. Both bbox_detector and pose_estimator are STRING inputs that default empty; running with them unset raises a clear error telling you the fetchers haven't run. Wire the fetcher's outputs in - the fetcher understands dwpose_aux URL types and downloads into the annotator checkpoints folder - and it just works, offline included.
The rest of the inputs are familiar preprocessor controls:
- detect_hand / detect_body / detect_face - enable or disable each. Disabling what you don't need speeds things up and keeps the map clean.
- resolution (default 512) - the working resolution for detection.
- scale_stick_for_xinsr_cn - a scaling toggle for feeding pose maps into X-Insr-style ControlNet; leave disabled unless you know you need it.
Outputs: an IMAGE (the rendered pose map, for ControlNet) and POSE_KEYPOINT (structured keypoint data for nodes that want joints, not pixels).
Install
Two pieces. The pack, plus its optional dependency:
cd ComfyUI/custom_nodes
git clone https://github.com/Anymatix/anymatix-comfy-nodes
git clone https://github.com/Fannovel16/comfyui_controlnet_aux
restart, then let AnymatixFetcher provision the two ONNX/PT weights. This node only registers if comfyui_controlnet_aux is importable, so a missing sibling costs you this node and nothing else in the pack.
Issues to expect
The whole "why does the default DWPose call out to the internet" thing surprises people who've never run offline - that's the trap this node exists to remove, so the failure to plan for is the reverse: forgetting the fetcher runs first, then watching the node refuse with a file-not-found that lists exactly which weight is missing. Also, hand/face detection is the slow part; if a run feels interminable, you've probably left all three toggles on for a subject that only needs body keypoints.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| bbox_detector | STRING | — | |
| pose_estimator | STRING | — | |
| detect_hand | COMBO | enable | 2 options: enable, disable |
| detect_body | COMBO | enable | 2 options: enable, disable |
| detect_face | COMBO | enable | 2 options: enable, disable |
| resolution | INT | 51264–16384 | — |
| scale_stick_for_xinsr_cn | COMBO | disable | 2 options: disable, enable |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |
| POSE_KEYPOINT | POSE_KEYPOINT | — |