Fashn VTON Inference
Put a garment on a person photo — no prompt, no mask, no drama
- pipeline
- person_image
- garment_image
- person_pose_keypoints
- garment_pose_keypoints
- person_segmentation_image
- garment_segmentation_image
- IMAGE
This is the node you actually came for. Fashn VTON Inference takes a photo of a person and a photo of a garment, and renders the garment onto the person. No prompt, no negative prompt, no ControlNet stack to tune. It's a purpose-built diffusion model doing one job, and that single-mindedness is why it beats generic img2img at this specific task. If you've fought the older open-source try-on stacks - Flux-fill wrappers that wanted 24GB of VRAM and a segmentation mask you had to draw by hand - the whole pitch here is "not that."
How it works
Under the hood is FASHN VTON v1.5, an mMDiT transformer adapted from FLUX that generates directly in pixel space, so there's no VAE encode/decode in the loop. The "maskless" bit is real: with segmentation_free on (the default), it skips the clothing-agnostic masking of the person that used to be the fragile step in every VTON pipeline. It still detects the person's pose using the bundled DWPose (the two ONNX files the loader downloaded), encodes the garment, and denoises with a low, FLUX-style guidance scale. The one weird knob is skip_cfg_last_n_steps (default 1), which turns CFG off for the final sampling steps specifically to stop colors from saturating - leave it alone until you see a reason not to.
The inputs that matter
- pipeline - from
(Down)load Fashn VTON. Non-negotiable. - person_image / garment_image - any
IMAGE, straight from a Load Image node. - garment_photo_type -
model(worn by a person) orflat-lay(product shot on a plain background). This is the one people get wrong, and it's the one that changes the pipeline's behavior most. A flat-lay shot can't be pose-detected, so the pipeline uses a built-in dummy garment pose instead. - category -
tops,bottoms, orone-pieces. The model is trained per-garment-class; this isn't cosmetic. - steps - 20 fast, 30 balanced, 50 quality (per the tooltip and the README's 30–50 range).
- cfg - 1.5–3.0 recommended. Crank it and you'll get saturated, plastic-looking fabric.
- seed - for reproducibility; same seed + same inputs = same output.
- keep_model_loaded -
truekeeps the model on the GPU between runs (fast, VRAM-hungry);falseshuttles it to CPU and clears cache after each inference.
The output is a single IMAGE - the try-on composite. Wire it to a Preview Image or Save Image node and you're done.
The optional stuff (pose and segmentation)
Four optional inputs unlock the power-user path, and all of them are "connect nothing and it still works":
- person_pose_keypoints / garment_pose_keypoints - external keypoints produced by Fashn Pose Keypoints Adapter. With
pose_sourceset toauto(default) they're used when connected, otherwise the pipeline falls back to internal DWPose. - person_segmentation_image / garment_segmentation_image - external labelmaps, paired with
parser_backend=external_fashn_labelmap, produced by Fashn Mask to Labelmap. Invalid or missing data quietly falls back to the internal parser, so you can't break it by half-connecting things - you just won't get the override.
Install and issues
Same story as the rest of the pack: ComfyUI Manager → search "ComfyUI-FASHN-VTON", or git clone into custom_nodes and pip install -r requirements.txt. Two things actually bite people here. First, the fashn_human_parser ModuleNotFoundError on startup - run pip install fashn-human-parser in ComfyUI's own python (portable installs especially). Second, the first inference after install is slow: the loader's auto-download plus ONNX runtime warm-up, so give it a minute before you assume it's stuck.
On results: if you see a faint aura around the person, that's the optional background-restoration pass, not the try-on model misbehaving - FASHN's own team confirmed that on the release thread. And if a worn-by-a-model garment comes out wrong, it's usually because the internal parser didn't cleanly isolate the garment; that's exactly the case where the segmentation adapter route earns its keep.
Inputs (17)
| Name | Type | Default | Description |
|---|---|---|---|
| pipeline | FASHN_VTON_PIPELINE | — | |
| person_image | IMAGE | — | |
| garment_image | IMAGE | — | |
| garment_photo_type | COMBO | model | 'model' if garment is worn by a person, 'flat-lay' for product shots on plain backgrounds |
| category | COMBO | tops | Garment category - 'tops', 'bottoms', or 'one-pieces' |
| skip_cfg_last_n_steps | INT | 1 | Skip CFG for final N steps to prevent color saturation |
| segmentation_free | BOOLEAN | true | If True, skip person clothing-agnostic masking. Set to False to use person segmentation for person mask control. |
| steps | INT | 301–100 | Recommended: 20 (fast), 30 (balanced), 50 (quality) |
| cfg | FLOAT | 1.51–10 | — |
| seed | INT | 00–18446744073709550000 | — |
| keep_model_loaded | BOOLEAN | true | — |
| pose_source | COMBO | auto | auto: use external keypoints when connected, otherwise internal DWPose fallback. |
| parser_backend | COMBO | fashn_human_parser | Use external_fashn_labelmap only when providing segmentation images encoded with FASHN label IDs (0-17). |
| person_pose_keypointsopt | FASHN_DWPOSE_KEYPOINTS | Optional external keypoints for person pose. Used when pose_source is auto/external_pose_keypoints. | |
| garment_pose_keypointsopt | FASHN_DWPOSE_KEYPOINTS | Optional external keypoints for garment pose. Used when pose_source is auto/external_pose_keypoints. | |
| person_segmentation_imageopt | IMAGE | Optional external person labelmap. Only affects output when segmentation_free is False and parser_backend is external_fashn_labelmap. | |
| garment_segmentation_imageopt | IMAGE | Optional external garment labelmap. Used when parser_backend is external_fashn_labelmap. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |