CMK Pipe Peek Face Process
The Face Pipe, Opened Up
- face_pipe
- basic_pipe
- image
- seed
- steps
- cfg
- sampler
- scheduler
- boolean_face_enable
- sam_model
Face processing is where ComfyUI's ecosystem is simultaneously most powerful and most fragmented. Detectors, restorers, swappers and detailers all want slightly different inputs, and every pack bundles them differently. CMK Pipe Peek Face Process is CMK's un-bundling step: it takes a CMK_FACE_PIPE and hands you nine separate wires.
Inputs and outputs
One required input, face_pipe (CMK_FACE_PIPE). No widgets.
Nine outputs, and the parity with the detailer peek is deliberate:
basic_pipe(BASIC_PIPE) -(face_model, face_clip, face_vae, face_conditioning_pos, face_conditioning_neg)image(IMAGE)seed(INT)steps(INT)cfg(FLOAT)sampler- core sampler enumscheduler- core scheduler enumboolean_face_enable(BOOLEAN)sam_model(SAM_MODEL)
Structurally identical to CMK Pipe Peek Detailer, which is a good sign - it means the two pipe families are one abstraction with two prefixes, not two designs that happen to look alike.
Why BASIC_PIPE matters here specifically
BASIC_PIPE is Impact Pack's model-stack tuple, and Impact Pack is where FaceDetailer lives - the node that made "detect face, crop, re-render, paste" a checkbox-adjacent operation in ComfyUI. Handing it a BASIC_PIPE built by CMK's loader and prompt handling is the fastest mixed-stack route there is: CMK controls what the model sees, Impact Pack runs the loop.
The reverse direction works too. Build a face pipe with CMK Pipe Create Face Process, peek it, and feed the pieces into whatever face node you actually trust. The picky part is always the prompts - a face pass with a mismatched prompt is how you get a beautifully rendered face that belongs to someone else.
Worth separating two problems that get muddled constantly: fixing a face (sharper, cleaner, better lit) is a detail pass, and keeping the same face is identity preservation - IP-Adapter, InstantID, PuLID, or a trained LoRA. A face pipe carries the machinery for the first. If what you want is the second, CMK has separate InstantID modules on the SDXL path, and the pack's ContentGuard applies there rather than here.
What the pipe carries that the outputs don't show
Worth knowing, because it explains some surprising behaviour. When you create a face pipe, the Create node bakes in a whole set of detection and restore defaults it never exposes as widgets: an Ultralytics face detector chosen from your installed models, bbox threshold 0.5, crop factor 3.0, retinaface_resnet50 for restore face detection, restore visibility 1.0, codeformer weight 0.5, face selection all sorted by area, guide size 512, max size 768, detail denoise 0.5, paste feather 20.
Those settings are what the CMK FaceProcess module reads at runtime. But if you peek the pipe and hand its outputs to a different consumer, that consumer gets the model stack and the sampling numbers - not the detection parameters. So the same pipe can produce different results in CMK's module versus someone else's node, and neither is wrong.
There's also boolean_face_enable, which CMK hardcodes to True at pipe-creation time, with a source comment explaining that runtime enable belongs to the FaceProcess module and that keeping the pipe-level flag true "avoids dirtying upstream pipe branches when Face is toggled." If you're reading this output expecting it to reflect whether your face pass is on, it won't. It's a cache-stability flag.
Install
Part of CMKFlow/cmk_nodes. ComfyUI Manager → search CMK Flow → install the CMKFlow entry → restart. Manual, ComfyUI fully shut down first:
git clone https://github.com/CMKFlow/cmk_nodes.git custom_nodes/cmk_nodes
python3 custom_nodes/cmk_nodes/scripts/install_cmk_requirements.py
Wait for CMK dependency check: OK. Face work needs weights: scripts/check_cmk_resources.py --models-root /your/shared/models audits the specific Ultralytics, InsightFace and face-restore filenames the shipped workflows use, and can download the ones with a verified public source. It's precise on purpose - a merely non-empty model folder doesn't count as a hit.
Traps
No validation. Feed it a non-face pipe and you get Nones rather than an error. The preprocess peeks raise; this one doesn't.
sam_model is frequently None when you didn't wire one. The SAM path is optional throughout the pack, and a detail pass without SAM still works - it just uses coarser segment boundaries.
Don't confuse the two face peeks. This one reads a CMK_FACE_PIPE built by CMK Pipe Create Face Process and describes the whole face job. CMK Pipe Peek Preprocess Face reads a CMK_PIPE and pulls out the raw components a face pass would need - image, model, clip, vae, seed, prompts, LoRAs. Different input type, different job, similar-looking outputs. Check the socket before you wire.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| face_pipe | CMK_FACE_PIPE | — |
Outputs (9)
| Name | Type | Description |
|---|---|---|
| basic_pipe | BASIC_PIPE | — |
| image | IMAGE | — |
| seed | INT | — |
| steps | INT | — |
| cfg | FLOAT | — |
| sampler | euler,euler_cfg_pp,euler_ancestral,euler_ancestral_cfg_pp,heun,heunpp2,exp_heun_2_x0,exp_heun_2_x0_sde,dpm_2,dpm_2_ancestral,lms,dpm_fast,dpm_adaptive,dpmpp_2s_ancestral,dpmpp_2s_ancestral_cfg_pp,dpmpp_sde,dpmpp_sde_gpu,dpmpp_2m,dpmpp_2m_cfg_pp,dpmpp_2m_sde,dpmpp_2m_sde_gpu,dpmpp_2m_sde_heun,dpmpp_2m_sde_heun_gpu,dpmpp_3m_sde,dpmpp_3m_sde_gpu,ddpm,lcm,ipndm,ipndm_v,deis,res_multistep,res_multistep_cfg_pp,res_multistep_ancestral,res_multistep_ancestral_cfg_pp,gradient_estimation,gradient_estimation_cfg_pp,er_sde,seeds_2,seeds_3,sa_solver,sa_solver_pece,ddim,uni_pc,uni_pc_bh2 | — |
| scheduler | simple,sgm_uniform,karras,exponential,ddim_uniform,beta,normal,linear_quadratic,kl_optimal | — |
| boolean_face_enable | BOOLEAN | — |
| sam_model | SAM_MODEL | — |