MiniMax H3 Skin Finish Per-Person / 逐人物逐镜头肤质收尾 (Advanced EXP)
The node that executes the cast sheet, track by track
- frames
- track_plan
- semantic_skin_mask
- profiles
- identity_assignment
- audio
- candidate
- source
- selected
- audio
- used_skin_mask
- rejected_skin_mask
- ownership_preview
- skin_finish_state
- report_json
The Per-Person node is the executor half of the pack's multi-person skin system. The Person Profile nodes write the plan; this one actually applies it - reassigning a source-bound semantic skin mask to exact SAM3.1 person tracks, then treating each tracked person with their reviewed parameters. If two people cross paths on screen, or one person is in the shot with the other, this is the node that decides who gets what, and - just as important - who gets nothing.
How it works
Inputs: frames, a track_plan (H3_T8_SAM31_MULTIFACE_TRACK_PLAN, produced upstream by a SAM3.1 tracking node), the semantic_skin_mask and its semantic_report_json (both from the same Multi-Person Semantic Mask node - the report binds source, track plan and mask together), plus an optional profiles stack (H3_T8_SKIN_FINISH_PERSON_PROFILES) and identity_assignment.
The routing precedence, straight from the node: exact shot:track profiles override character profiles, then the default policy, then bit-exact source. What that means in practice:
default_policy = source_unmatched(the default) - only explicitly profiled people get touched; everyone else stays bit-exact source. That's the safe lane.default_policy = default_profile- thedefault_preset/default_amount/default_texture_keep/default_shine_control/default_tone_adjustblock applies to every remaining track.
Two guarantees worth knowing: cross-person overlap (two masks overlapping in the same pixels) and unmatched people stay bit-exact source. No pixel gets treated by committee.
Outputs: candidate, source, selected (source until accept_candidate flips), audio, used_skin_mask, rejected_skin_mask, ownership_preview (the visualization of who owns which mask region), skin_finish_state, and report_json - which now includes, per resolved route, an SDR Rec.709 luma proxy, mean/max RGB treatment magnitude, and the fraction of treated pixels near clipping. Those are review aids, not beauty scores.
Why you'd reach for it
Any multi-person scene where a global pass would be wrong - or where you want different treatment per actor. The execution_mode (default candidate_only) and accept_candidate (false) keep everything in review-land until you're ready. chunk_frames (2), proxy_long_side (640), and preview_count (6) tune the CPU-side memory and preview load, since the actual treatment runs on proxies.
Installing it and gotchas
Standard pack install: ComfyUI Manager search "MiniMax H3 Audio T8", or clone https://github.com/T8mars/comfyui-minimax-h3-audio-T8.git into custom_nodes, update ComfyUI core first, restart. Heavy optional dependency: SAM3.1 for the track plan, and FaceXLib (pinned ParseNet checkpoint in models/facedetection/parsing_parsenet.pth) for the semantic mask - those come from upstream, not the pack.
The classic mistakes: feeding a semantic_report_json from a different source batch (the hash binding breaks and masks go empty), and expecting per-person profiles to magically re-identify people across cuts - identity labels come from a separate, human-reviewed identity_assignment, and re-identification across shots is explicitly out of scope. Start with source_unmatched, review the ownership_preview, and only then consider default_profile.
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| frames | IMAGE | — | |
| track_plan | H3_T8_SAM31_MULTIFACE_TRACK_PLAN | — | |
| semantic_skin_mask | MASK | — | |
| semantic_report_json | STRING | Connect report_json from the same Multi-Person Semantic Mask node. The report binds source, track plan and mask. | |
| default_policy | COMBO | source_unmatched | source_unmatched changes only explicitly profiled people. default_profile applies the default controls to every remaining track. |
| default_preset | COMBO | subtle | 5 options: subtle, oil_control, tone_even, soft_portrait, custom |
| default_amount | FLOAT | 0.350–1 | — |
| default_texture_keep | FLOAT | 0.900–1 | — |
| default_shine_control | FLOAT | 0.350–1 | — |
| default_tone_adjust | FLOAT | 0.00-1–1 | — |
| execution_mode | COMBO | candidate_only | 3 options: candidate_only, review_only, bypass |
| accept_candidate | BOOLEAN | false | False preserves source on selected output; acceptance is never automatic. |
| chunk_frames | INT | 21–32 | — |
| proxy_long_side | INT | 640128–1280 | — |
| preview_count | INT | 61–8 | — |
| profilesopt | H3_T8_SKIN_FINISH_PERSON_PROFILES | — | |
| identity_assignmentopt | H3_T8_MULTIFACE_IDENTITY_ASSIGNMENT | — | |
| audioopt | AUDIO | — |
Outputs (9)
| Name | Type | Description |
|---|---|---|
| candidate | IMAGE | — |
| source | IMAGE | — |
| selected | IMAGE | — |
| audio | AUDIO | — |
| used_skin_mask | MASK | — |
| rejected_skin_mask | MASK | — |
| ownership_preview | IMAGE | — |
| skin_finish_state | H3_T8_SKIN_FINISH_STATE | — |
| report_json | STRING | — |