BS-VTON β€” Outfit Transfer LoRA for FLUX.2 Klein 9B

Demo

Person-to-person outfit transfer. Give anyone's outfit to anyone else.

BS-VTON is a high-rank LoRA (r=128) fine-tuned on FLUX.2 Klein 9B for outfit-to-outfit transfer between people. Pass an anchor (base person) and a target (outfit donor), and the model dresses the anchor in the target's outfit β€” transferring garments, textures, and layering while preserving the anchor's identity, pose, and background.

Trained on a 100k synthetic dataset: 50k female-to-female and 50k male-to-male pairs with FLUX.1 Fill [dev], FLUX.1 Redux [dev], and the CatVTON LoRA (xiaozaa/catvton-flux-beta) for outfit transfer supervision.


Results

Example 1 Example 2 Example 3 Example 4 Example 5


Input Requirements

⚠️ Both anchor (base person) and target (outfit donor) must be full-body, frontal-facing photos. The model was trained exclusively on full-body frontal poses. Cropped, side, or angled shots will produce degraded results.

  • Resolution: 512Γ—1024 (width Γ— height)
  • Output: 512Γ—1024
  • Use central_crop_resize() from the quickstart code to preprocess any image automatically

Files

File Format Use
bs_vton_diffusers.safetensors Diffusers-native Python / diffusers pipeline
bs_vton_comfyui.safetensors ComfyUI-native ComfyUI workflow

Quickstart (Diffusers)

import torch
from diffusers import Flux2KleinPipeline
from huggingface_hub import snapshot_download, login
from PIL import Image

def central_crop_resize(path, size=(512, 1024)):
    img = Image.open(path).convert("RGB")
    w, h = img.size
    target_ratio = size[0] / size[1]
    current_ratio = w / h
    if current_ratio > target_ratio:
        new_w = int(h * target_ratio)
        left = (w - new_w) // 2
        img = img.crop((left, 0, left + new_w, h))
    else:
        new_h = int(w / target_ratio)
        top = (h - new_h) // 2
        img = img.crop((0, top, w, top + new_h))
    return img.resize(size, Image.LANCZOS)

login(token="YOUR_HF_TOKEN")

bs_vton_dir = snapshot_download(
    repo_id="canberkkkkk/bs-vton-outfit-klein-9b",
    repo_type="model",
    allow_patterns=["bs_vton_diffusers.safetensors"],
)

device = "cuda"
pipe = Flux2KleinPipeline.from_pretrained(
    "black-forest-labs/FLUX.2-klein-9B",
    torch_dtype=torch.bfloat16,
)
pipe.vae.to(device="cuda", dtype=torch.bfloat16, memory_format=torch.channels_last)
pipe = pipe.to(device)

pipe.load_lora_weights(f"{bs_vton_dir}/bs_vton_diffusers.safetensors", adapter_name="bs_vton")
pipe.set_adapters(["bs_vton"], adapter_weights=[1.25])
pipe.fuse_lora()

# Both images must be full-body, frontal. Input and output resolution: 512x1024.
anchor = central_crop_resize("anchor.png")  # base person β€” full body, frontal
target = central_crop_resize("target.png")  # outfit donor β€” full body, frontal

result = pipe(
    prompt="bs_vton: The exact person from image 1 wearing the outfit from image 2. Maintain the facial features and identity of image 1 precisely.",
    image=[anchor, target],
    num_inference_steps=4,
    height=1024,
    width=512,
    guidance_scale=1.0,
).images[0]

result.save("output.png")  # output resolution: 512x1024

LoRA weight: Default is 1.25. Tune between 0.8–1.25 depending on transfer strength.

Prompt: Always use "bs_vton: The exact person from image 1 wearing the outfit from image 2. Maintain the facial features and identity of image 1 precisely." β€” the model was trained with this trigger prefix.


Quickstart (ComfyUI)

Workflow

1. Download the workflow

bs_vton_klein_9b_workflow.json

2. Download the LoRA and place it in your models/loras/ folder

bs_vton_comfyui.safetensors

3. Make sure you have FLUX.2 Klein 9B downloaded

The workflow requires the Klein 9B FP8 diffusion model. Download from black-forest-labs/FLUX.2-klein-9b-fp8).

4. Load the workflow in ComfyUI, set your anchor and target images, and run.

Prompt: Always use "bs_vton: The exact person from image 1 wearing the outfit from image 2. Maintain the facial features and identity of image 1 precisely." β€” already set in the workflow. LoRA strength: Default 1.0. Tune between 0.8–1.25. Resolution: Both input images must be 512Γ—1024, full-body frontal.


Inference Speed

Benchmarked with torch.compile enabled, 4 steps, 512Γ—1024.

Hardware Inference Time
NVIDIA B200 ~0.4s
NVIDIA RTX Pro 6000 ~0.7s
NVIDIA RTX 5090 ~1.1s

Training Details

Detail Value
Base model FLUX.2 Klein 9B
LoRA rank 128
Dataset size 100k pairs
Split 50k female-to-female, 50k male-to-male
Transfer supervision FLUX.1 Fill [dev] + FLUX.1 Redux [dev] + CatVTON LoRA
Input/output resolution 512Γ—1024

Limitations

  • Skirt / fitted bottom bias: The model exhibits a leaner body shape bias on skirts and fitted bottoms, inherited from the training data distribution. Structured and oversized garments (coats, jackets, blazers) transfer more consistently across body types.
  • Hair: The anchor person's hair can occasionally bleed into the output. Works best when anchor and target have similar hair lengths.
  • Cross-gender: Not supported β€” the dataset is same-gender pairs only. Cross-gender transfer will produce artifacts.
  • Pose: Trained exclusively on full-body frontal poses. Seated, side-on, or heavily occluded poses will degrade quality.
  • Resolution: Trained at 512Γ—1024. Other aspect ratios may produce inconsistent results.

License

This LoRA is released under the FLUX Non-Commercial License.

The base model (FLUX.2 Klein 9B), FLUX.1 Fill [dev], and FLUX.1 Redux [dev] are all under BFL's non-commercial license. The training pipeline also builds on the CatVTON LoRA (xiaozaa/catvton-flux-beta, CC-BY-NC-2.0).

Non-commercial use only. For commercial licensing, contact Black Forest Labs at bfl.ai/licensing.

This model is intended for virtual try-on, fashion visualization, and creative applications. Users are responsible for ensuring their use complies with applicable laws and respects the rights and consent of individuals depicted.


Author

Citation

@misc{bsvton2026,
  author = {Canberk},
  title  = {BS-VTON: Outfit Transfer LoRA for FLUX.2 Klein 9B},
  year   = {2026},
  url    = {https://huggingface.co/canberkkkkk/bs-vton-outfit-klein-9b}
}

@inproceedings{chong2024catvton,
  title     = {CatVTON: Concatenation Is All You Need for Virtual Try-On with Diffusion Models},
  author    = {Zheng Chong and Xiao Dong and Haoxiang Li and Shiyue Zhang and Wenqing Zhang and Xujie Zhang and Hanqing Zhao and Xiaodan Liang},
  booktitle = {Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)},
  year      = {2025}
}
Downloads last month
347
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support

Model tree for canberkkkkk/bs-vton-outfit-klein-9b

Adapter
(71)
this model