Nodes/ComfyUI-SCAIL-Pose/Render NLF Poses
ComfyUI Node

Render NLF Poses

Turn a 3D pose prediction into an actual image

By kijai·Created 8 months ago·Updated 4 months ago· 322
Render NLF Poses
  • nlf_poses
  • dw_poses
  • ref_dw_pose
  • image
  • mask
width512
height512
draw_facetrue
draw_handstrue
render_devicegpu
scale_handstrue
render_backendtaichi

3D pose data is invisible until something draws it. RenderNLFPoses is that something - it takes the pose prediction out of NLFPredictPoses and turns it into an actual IMAGE and MASK you can look at, sanity-check, or wire straight into a pose-conditioned generation. It's the node that makes kijai's ComfyUI-SCAIL-Pose pipeline useful for anything beyond raw numbers: extract a pose in 3D with NLF, render it back down to 2D, feed that into your workflow (the "SCAIL pose control" example in ComfyUI-WanVideoWrapper does exactly this).

How it works

This isn't a simple stick-figure line drawer - it's a real renderer, built on Taichi, a Python framework for parallel/GPU compute, with a plain PyTorch fallback if Taichi isn't set up. You give it a canvas size and it projects the pose data onto it. The genuinely interesting part is the alignment machinery: you can optionally hand it dw_poses and ref_dw_pose, DWPose-format keypoints from this same pack's converter nodes, to align the NLF-based render against a 2D reference. That's a direct callback to the pack's own README: it swaps DWPose's face/hand detector for ViTPose but still outputs DWPose-format keypoints "for the optional alignment" - this is where that alignment actually happens.

The inputs and outputs that matter

  • nlf_poses (required, NLFPRED) - your pose prediction from NLFPredictPoses. The tooltip is short and to the point: "Input poses for the model".
  • width / height (required, default 512 each) - the output canvas size.
  • dw_poses / ref_dw_pose (optional, DWPOSES) - the tooltips explain the split: "Optional DW pose model for 2D drawing" and "Optional reference DW pose model for alignment" respectively. Feed these from PoseDetectionVitPoseToDWPose or ConvertOpenPoseKeypointsToDWPose if you want the render calibrated against a known 2D skeleton.
  • draw_face / draw_hands (default true, true) - straightforward toggles for whether face and hand keypoints get drawn.
  • scale_hands (default true) - "Whether to scale hand keypoints when aligning DW poses", so it only matters if you're actually using the alignment inputs above.
  • render_device (default gpu, choices gpu/cpu/opengl/cuda/vulkan/metal) - the tooltip is explicit that this is "Taichi device to use for rendering." These are Taichi backend targets, not a generic GPU-vendor picker, so match it to your actual hardware and OS rather than assuming cuda is always right.
  • render_backend (default taichi, choices taichi/torch) - which rendering engine runs the draw.
  • Outputs: image and mask - the rendered pose and its alpha, ready to feed into a conditioning branch or just to look at.

How to install it

Via ComfyUI Manager: search ComfyUI-SCAIL-Pose, install, restart. Manually: cd ComfyUI/custom_nodes && git clone https://github.com/kijai/ComfyUI-SCAIL-Pose, then pip install -r ComfyUI-SCAIL-Pose/requirements.txt, restart. This node is the one that actually exercises the taichi>=1.7.4 dependency in that requirements file - the loader and predictor don't touch it, but this one does the real GPU rendering work.

Common issues & troubleshooting

Taichi fails to install or init. Taichi is a less common dependency than a typical pip package and can be pickier about matching your GPU driver setup than opencv-python or pillow ever will be. If it won't build or errors on startup, switch render_backend to torch - the node ships that fallback specifically for this case, so you don't need to fight Taichi's build to get a usable render.

The render comes out blank. Check upstream first: if NLFPredictPoses didn't find anyone in the frame (usually a detector_threshold set too high), there's nothing here for RenderNLFPoses to draw - this node can't invent a pose that wasn't detected.

Face or hands are missing from the output. Confirm draw_face/draw_hands are actually on. If they are and the render still looks incomplete, that traces back to a weak detection upstream - complex or occluded poses are a known soft spot for the NLF detector, per the SCAIL developer's own advice to segment the subject before extraction.

render_device set to cuda does nothing on a non-Nvidia box. Remember these choices pick a Taichi backend, not "your GPU" in the abstract - metal on a Mac, vulkan as the cross-platform option, or just leave it on gpu and let Taichi figure out the right backend itself.

CategoryWanVideoWrapper

Inputs (10)

NameTypeDefaultDescription
nlf_posesNLFPREDInput poses for the model
widthINT512
heightINT512
dw_posesoptDWPOSESOptional DW pose model for 2D drawing
ref_dw_poseoptDWPOSESOptional reference DW pose model for alignment
draw_faceoptBOOLEANtrueWhether to draw face keypoints
draw_handsoptBOOLEANtrueWhether to draw hand keypoints
render_deviceoptCOMBOgpuTaichi device to use for rendering
scale_handsoptBOOLEANtrueWhether to scale hand keypoints when aligning DW poses
render_backendoptCOMBOtaichiRendering backend to use

Outputs (2)

NameTypeDescription
imageIMAGE
maskMASK