Extensions/lip_mask_from_pose
ComfyUI Extension

lip_mask_from_pose

A ComfyUI custom node that generates precise mouth and lip masks from DWPose output with multiple mask modes for inpainting teeth, lips, or mouth regions.

By Jalen-Brunson·Created 4 months ago·Updated 3 months ago· 1
Jalen-Brunson/lip_mask_from_pose
Nodes5
On cloudLocal install
Categorymask/pose
Stars1
Updated3 months ago
Readme

Lip Mask from Pose Keypoints

A ComfyUI custom node that generates precise mouth and lip masks from DWPose POSE_KEYPOINT output.

Installation

Copy this folder into your ComfyUI/custom_nodes/ directory:

ComfyUI/custom_nodes/lip_mask_from_pose/
├── __init__.py
├── lip_mask_node.py
└── README.md

Restart ComfyUI. The node appears under mask/poseLip Mask from Pose Keypoints.

Requirements

No additional dependencies — uses only numpy, cv2, and torch (already in ComfyUI).

Inputs

| Input | Type | Description | |-------|------|-------------| | pose_keypoint | POSE_KEYPOINT | Connect from DWPreprocessor's POSE_KEYPOINT output | | mask_mode | Dropdown | Which mouth region to mask (see below) | | blur_radius | INT (0-100) | Gaussian feathering radius. 0 = hard edge | | grow_pixels | INT (0-200) | Dilate mask outward by N pixels | | person_index | INT (0-99) | Which detected person (0 = first) | | confidence_threshold | FLOAT (0-1) | Skip frames with low keypoint confidence |

Mask Modes

  • inner_mouth — Only the mouth cavity (teeth, tongue, dark interior). Leaves lips completely untouched during inpainting. Best for replacing teeth/smile without changing lip shape.

  • outer_lips — Full lip region including lip skin. Use when you want to regenerate both lips and mouth.

  • lips_only — Just the lip flesh (outer contour minus inner mouth). Regenerates lip shape/color while preserving the mouth interior.

  • outer_expanded — Same as outer_lips but designed to be used with grow_pixels for a wider mask with soft falloff.

Typical Workflow

[Load Video] → [DWPreprocessor (detect_face=enable)]
                        ↓
                  POSE_KEYPOINT
                        ↓
              [Lip Mask from Pose Keypoints]
                        ↓
                      MASK → [WAN 2.2 VACE Inpaint / KSampler]

Face Landmark Reference (iBUG 300-W 68-point)

Outer lip contour:  indices 48-59  (12 points)
Inner lip contour:  indices 60-67  (8 points)

        48                         54
         49                       53
          50    51    52    53   52
    
    60                                 64
       61                           63
          62          63          62
             (inner mouth opening)
    
        67                         65
           66                   66

Tips

  • For teeth-only inpainting: use inner_mouth + grow_pixels=3 + blur_radius=5
  • For lip reshaping: use outer_lips + blur_radius=8 for soft blend
  • Combine with SAM-2 for even more precise boundaries: use this mask as a coarse region, then refine with SAM point prompts placed at the mask centroid