Nodes/ComfyUI-ControlNet-Nodes/Composite Control Guide ⚡
ComfyUI Node

Composite Control Guide ⚡

Depth for the scene, face keypoints for the face

By ChrisColeTech·Created 7 days ago·Updated about 15 hours ago· 2
Composite Control Guide ⚡
  • image
  • IMAGE
body_controldepth
face_controlpose_face
mask_grow16
resolution512
depth_ckptdepth_anything_v2_vitl.pth
canny_low0.20
canny_high0.60
batch_size8

The name overpromises a little - this node doesn't "composite" anything with an API or a key. What it actually does is give you one clean control video that would otherwise take four nodes and a mask workflow to build, and it does it in the exact shape the LTX video-to-video "guide" recipe wants. If you've ever tried a person-swap video and watched the face wobble while the rest of the scene holds, this is aimed squarely at that.

What it is

The Composite Control Guide ⚡ is the pack's convenience node: one input image batch (your video frames), one control video out. Over the whole frame it renders a body-level control map - Depth Anything V2 by default, which carries scene geometry and camera motion. Inside the detected face region it composites a second treatment: OpenPose facial keypoints by default. That depth-plus-face-keypoints combo is the pack author's verified swap-guide recipe, and the whole point is that it all travels down one wire into the LTX v2v node's video input, unchanged downstream.

This matters because in the LTX video-to-video workflow the guide gets downscaled and re-encoded, and treatments that survive that encode win. Face keypoints survive; canny edges mostly dissolve (the source is explicit, from A/B testing on real generations). So the face is handled differently from the scene on purpose, and this node automates that difference.

How it works

Three phases, all in one estimate() call, with a real progress bar and honor for Cancel between chunks:

  1. Body render - the body_control map over the whole frame.
  2. Face pass - a single OpenPose pass runs per frame with only the face detector's output kept. One pass gives you both the keypoint overlay and the face region, which is the filled convex hull of the detected facial keypoints, dilated by mask_grow. No second model, no external mask wiring, no extra widget.
  3. Mask post - the face treatment is composited inside that region.

Frames where no face is detected just keep the body control alone (logged once), which is the graceful behavior you want in a video where the subject turns their head away.

The inputs that matter

Most of these are fire-and-forget; the two dropdowns are the whole personality of the node:

  • body_control - what covers the whole frame: depth (default), openpose_body, canny, softedge, lineart. Depth is the verified default; it transfers scene geometry and camera motion.
  • face_control - what goes inside the face: pose_face (default), canny, or none. Set it to none and the node becomes a plain depth/edge preprocessor with the face pass skipped entirely - one node covers the simple guide recipe too.
  • mask_grow - how many pixels the detected face region is dilated (default 16). Too small and the treatment misses the hairline and jaw; too big and it bleeds onto the neck.
  • resolution (512) and batch_size (8, frames per stacked CNN forward) - resolution trades speed for control detail; batch size is your VRAM knob on long clips.
  • depth_ckpt - Depth Anything V2 size, vitl by default. canny_low/canny_high only matter if either control is canny.

Installing it

This is one of eleven preprocessors in the pack, so you get them all. ComfyUI Manager (search "ComfyUI-ControlNet-Nodes") is the easy path; manually:

cd ComfyUI/custom_nodes
git clone https://github.com/ChrisColeTech/ComfyUI-ControlNet-Nodes
# then restart ComfyUI

Dependencies are light for this node: huggingface_hub and opencv-python from the requirements file (timm is only needed for the two Normal Map nodes, not this one). No weights ship with the pack - everything auto-downloads from HuggingFace on first use into your real models/depthanything/ and pose folders. That means your first run is slow and needs internet; the second is instant.

Where people get burned

The first-run download catches everyone. Also: Depth Anything V2 runs frame-by-frame, and frame-by-frame depth can flicker on video - usually fine here because the guide is downscaled before encode, but if you see depth shimmering in the result, don't chase this node; that's the estimator, and it's why the node defaults to vitl rather than the slower Giant. And if you're doing commercial work, read the README's license notes before leaning on the face pass - the pack itself calls out PiDiNet and OpenPose restrictions, and the Depth Anything V2 Large weights carry their own non-commercial terms worth checking.

Category🤖 CCTech/Preprocessors

Inputs (9)

NameTypeDefaultDescription
imageIMAGE
body_controlCOMBOdepthControl map rendered over the WHOLE frame. depth (Depth Anything V2) carries scene geometry and camera motion - the verified default for the LTX v2v guide.
face_controlCOMBOpose_faceControl treatment composited INSIDE the detected face region. pose_face = OpenPose facial keypoints (survives the guide's downscaled encode best); canny = edges inside the face region only; none = body control alone, no face pass.
mask_growINT160–256Pixels the detected face region is dilated by - margin so the overlay covers hairline/jaw edges.
resolutionINT51264–2048
depth_ckptCOMBOdepth_anything_v2_vitl.pthDepth Anything V2 size, used when body_control is depth. vitl is the A/B-verified guide setting.
canny_lowFLOAT0.200–1Canny low threshold (0..1), used when either control is canny.
canny_highFLOAT0.600–1
batch_sizeoptINT81–64Frames per stacked CNN forward for the pose/depth detectors.

Outputs (1)

NameTypeDescription
IMAGEIMAGE