Random Person: Face
Give your crowd actual faces, not the default one.
- full_face_description
- sex
- face
- expression
- seed
The face is where "everyone looks the same" actually shows up. Prompt "a crowd of people" and the model renders the same few default faces over and over - the strongest human-identity signal in the image is the one you left vague. Random Person: Face is the segment node from the ComfyUI_RandomPerson pack that solves just this slice: face shape, eyes, eye shape, eyebrows, nose, mouth, distinctive features, and expression, all drawn per-seed into one clean comma-separated fragment.
It's one of five segment nodes sharing the same engine as the big AIO node. Use Face on its own when all you need is variety in the face, or wire it alongside Identity, Hair, Body, and Style and concatenate their fragments for a full person - set the same sex on each and the pieces compose cleanly.
What it generates
On each run it resolves sex (or rolls it) and picks from the sex-appropriate JSON lists for:
- face shape - angular, heart, oval, square… 10 options
- eyes - a colour list written as grounded phrases, "muted natural green eyes" rather than a bare tag
- eye shape - almond, monolid, hooded, upturned, and friends
- eyebrows - defaults
off; opt in - nose shape - button, aquiline, roman, broad…
- mouth shape - full lips, thin lips, bow-shaped…
- distinctive features - freckles, dimples, high cheekbones, cleft chin, the details that make a face memorable (defaults
off) - expression - neutral, soft smile, serious, pensive… (defaults
off)
The defaults are worth understanding: the structural categories (shape, eyes, nose, mouth) roll random by default, while the "flair" ones (eyebrows, distinctive features, expression) start off so the face stays clean until you switch them on. A fragment can look like angular face, natural grey eyes, button nose, wide-set lips, a faint scar through one eyebrow or just heart face, hazel eyes, soft smile depending on what you've opted in.
The inputs that matter
Same three-widget pattern as the rest of the pack: _mode (random/allow_list/fixed/off), _allow_list (comma-separated subset - unknown values are kept as literal descriptors), and _fixed (a dropdown value for fixed mode). So eyes_allow_list: hazel, blue biases eye colour while everything else rolls, or expression_fixed: warm smile locks the mood. extra_attributes appends free text verbatim, which is handy for a scar or a dimple the data files don't cover.
seed plus randomize is the pack standard: randomize on (default) means a fresh face every run and the seed is ignored; flip it off and the same seed reproduces the same face.
Outputs and wiring
full_face_description- the assembled face fragment, ready for a CLIP Text Encode or a string concat nodesex- so you can keep the resolved sex in sync across segment nodesface- the combined face fragment on its own pin, if you want to reuse just that stringexpression- the expression alone, useful for routingseed- INT
If you're building a background crowd, the play is randomize: on, batch a bunch of runs, and let every person get a different face. The face pin makes it easy to feed the same generated face into a character-consistency workflow later.
Install and gotchas
ComfyUI Manager: search ComfyUI_RandomPerson, install, restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/bradsec/ComfyUI_RandomPerson
Find it under Add Node → Random Person. No pip dependencies, Python 3.10+, works on old and new ComfyUI (it registers both V1 and V3 APIs).
One trap: expression and the distinctive features default to off, so if your faces come out oddly blank, that's the first place to look. Another: sex: random on a Face node doesn't communicate with the other segment nodes - if you're composing a full person from several nodes, set the same sex on each or you'll get a male face on a female body more often than you'd like.
Inputs (28)
| Name | Type | Default | Description |
|---|---|---|---|
| seed | INT | 00–18446744073709550000 | Seed for reproducibility. With randomize off, the same seed reproduces the same person. |
| randomize | BOOLEAN | true | On: pick a new random person every run, ignoring the seed widget. Off: use the seed. |
| sex | COMBO | random | random, male, or female. male/female filter the sex-specific dropdowns in the UI. |
| eyes_mode | COMBO | random | How this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it). |
| eyes_allow_list | STRING | Comma-separated values used when mode=allow_list. Unknown values are added as literal descriptors. | |
| eyes_fixed | COMBO | (none) | Exact value used when mode=fixed. (none) falls back to random. |
| eye_shape_mode | COMBO | random | How this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it). |
| eye_shape_allow_list | STRING | Comma-separated values used when mode=allow_list. Unknown values are added as literal descriptors. | |
| eye_shape_fixed | COMBO | (none) | Exact value used when mode=fixed. (none) falls back to random. |
| eyebrows_mode | COMBO | off | How this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it). |
| eyebrows_allow_list | STRING | Comma-separated values used when mode=allow_list. Unknown values are added as literal descriptors. | |
| eyebrows_fixed | COMBO | (none) | Exact value used when mode=fixed. (none) falls back to random. |
| face_shape_mode | COMBO | random | How this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it). |
| face_shape_allow_list | STRING | Comma-separated values used when mode=allow_list. Unknown values are added as literal descriptors. | |
| face_shape_fixed | COMBO | (none) | Exact value used when mode=fixed. (none) falls back to random. |
| nose_shape_mode | COMBO | random | How this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it). |
| nose_shape_allow_list | STRING | Comma-separated values used when mode=allow_list. Unknown values are added as literal descriptors. | |
| nose_shape_fixed | COMBO | (none) | Exact value used when mode=fixed. (none) falls back to random. |
| mouth_shape_mode | COMBO | random | How this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it). |
| mouth_shape_allow_list | STRING | Comma-separated values used when mode=allow_list. Unknown values are added as literal descriptors. | |
| mouth_shape_fixed | COMBO | (none) | Exact value used when mode=fixed. (none) falls back to random. |
| face_feature_mode | COMBO | off | How this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it). |
| face_feature_allow_list | STRING | Comma-separated values used when mode=allow_list. Unknown values are added as literal descriptors. | |
| face_feature_fixed | COMBO | (none) | Exact value used when mode=fixed. (none) falls back to random. |
| expression_mode | COMBO | off | How this attribute is chosen: random (any), allow_list (subset you list), fixed (the dropdown value), off (omit it). |
| expression_allow_list | STRING | Comma-separated values used when mode=allow_list. Unknown values are added as literal descriptors. | |
| expression_fixed | COMBO | (none) | Exact value used when mode=fixed. (none) falls back to random. |
| extra_attributes | STRING | Free text appended to the description as-is, comma-separated. Pose, setting, props, extra detail, etc. |
Outputs (5)
| Name | Type | Description |
|---|---|---|
| full_face_description | STRING | — |
| sex | STRING | — |
| face | STRING | — |
| expression | STRING | — |
| seed | INT | — |