Nodes/ComfyUI Body Decal/Face Region Mask
ComfyUI Node

Face Region Mask

Face paint, eye bands and mouth masks from DWPose face landmarks, in one node

By verias·Created 3 months ago·Updated 3 months ago· 1
Face Region Mask
  • image
  • pose_keypoint
  • limit_mask
  • mask
  • debug_image
face_region
expand0.12
feather8
invertfalse
debugtrue

Face Region Mask builds facial masks from detected face landmarks - full face, left/right half, forehead, an eye band, or the mouth area - without you drawing a single thing. The README's use cases are face paint, makeup, cybernetic markings, scars, and facial tattoos, and that list is the honest pitch: this is the node you reach for when the decal is going on a face and the placement region needs to follow the actual face geometry, not a guess.

It's different from the other mask nodes in one important way: pose_keypoint is a required input, not optional. There's no manual-mask fallback here. You need DWPose output - wire in a DWPreprocessor from ComfyUI ControlNet Aux Preprocessors, the same pose preprocessor the rest of this pack leans on.

How it works

The node pulls the face keypoints from the pose data (face_keypoints_2d - DWPose gives you a dense set, unlike the 70-point estimate of classic OpenPose), computes their bounding box, and expands it by expand (0.12 by default, as a fraction of box width/height; negative values shrink). Then the face_region choice shapes the mask inside that box:

  • face_full - an ellipse over the whole box.
  • face_left / face_right - the same ellipse split along the vertical center, so you can decal one cheek.
  • forehead - the top portion of the face box, for forehead markings.
  • eye_band - a rounded rectangle across the eye area, for cybernetic visor bands or warpaint stripes.
  • mouth_area - a lower ellipse around the mouth, for face paint that traces the lower face.

If no face keypoints are present, it falls back to estimating a face box from the nose/ears/neck body keypoints - so a profile shot where face landmarks are sparse still produces a usable mask, just a cruder one.

After the region shape, limit_mask multiplies in, invert flips, and feather (0–80 px) softens the edges. Outputs are mask and debug_image - the debug shows the mask tinted magenta with the face box outlined, and you should trust it over your eyes.

Where it fits

The mask is generic, so it can feed Body Decal Apply as clip_mask or user_region_mask, or Body Decal Composite as clip_mask - clip usage is the natural fit, confining a decal to the face while the region geometry handles placement. It also works standalone: a face mask is a useful ingredient for non-decal work like selective editing.

Gotchas

Two things bite. First, it always uses the first person found in the pose data - if the frame has multiple faces and the largest isn't first, you may get the wrong face, so crop to your subject. Second, side profiles lean on the fallback box and the face regions get cruder; don't expect surgical eye-band masks on a 90-degree profile. And as with the whole pack, no pose data means an empty black mask with no error - check the debug image before assuming the node is broken. Install via Manager ("ComfyUI Body Decal") or git clone https://github.com/verias/comfyui-body-decal.git into ComfyUI/custom_nodes and restart.

Categoryimage/masking/body decal

Inputs (8)

NameTypeDefaultDescription
imageIMAGE
pose_keypointPOSE_KEYPOINT
face_regionCOMBO6 options: face_full, face_left, face_right, forehead, eye_band, mouth_area
expandFLOAT0.12-0.5–1
featherINT80–80
invertBOOLEANfalse
debugBOOLEANtrue
limit_maskoptMASK

Outputs (2)

NameTypeDescription
maskMASK
debug_imageIMAGE