
Generated image with BHS Lora, Upscaled Latent, not a real actor or character
This image made in the workflow Olemara's High Quality 2pass Qwen 2.1 Image Workflow v.1.01 and
based on generated before image below

High Quality 2pass-Upscaling Qwen 2.1 Image Workflow v.1.01
Why this workflow
Most people still bolt old face-swap stacks onto Qwen (InstantID-style helpers, separate swap pipelines, extra detectors). On Qwen-Image 2.1 that is mostly unnecessary.
This graph is a Turbo DiT setup with an experimental but stable LoRA stack, a two-pass latent upscale, and one clear job in the default prompt path:
*<image1> = full base frame (body, light, background)**
*<image2> = donor head**
BHS (Best Head Swap) LoRA does the head replacement inside the same generate — no second tool.
On top of that:
- Lightning / turbo LoRA — native few-step sampling (about 4–8 steps)
- Multiple Angles LoRA — <mva> + azimuth / elevation labels (camera orbit without reshooting the ref)
- Detail enhancer LoRA — enhance this image / 1_enhance this image
- Natural Exposure LoRA — more believable light and skin response
- Optional NSFW / MysticXXX LoRAs when you need adult anatomy without fighting the base model
- Wildcard prompt node so one graph can randomize angle + shot height every run
- Texture-fix VAE + 2-pass latent upscale so the second pass tightens skin, edges, and micro-contrast instead of only blowing up pixels
Free to use. If something breaks on your machine, ask in the comments — happy to help.
---
Core idea (head swap done right)
1. Load base as <image1> (pose, wardrobe, room, lighting).
2. Load face/head donor as <image2>. Optionaly - background <image3>
3. Keep the head_swap block in the prompt (see below).
4. Run. BHS LoRA strength usually 1.0; if it copies the whole ref instead of swapping, drop to ~0.8.
You are not running a separate “face replace” app. The diffusion pass is the swap.
---
Models (what the graph expects)
DiT / UNET |
qwen-image-2.1-turbo-int8_convrot.safetensorsor…-fp8.safetensors- Turbo quant from Qwen-Image-2.1-Turbo-Quantized, Can be used with 8 steps without any lightning loras
Text encoder |qwen3vl_8b_nvfp4_heretic.safetensors| CLIP type:qwen_image(Abliterated / Heretic NVFP4) |VAE |
texture_fix_vae_for_qwen_image_2.1_bf16.safetensors| Prefer this over a random VAE |
LoRAs used in the workflow
Lightning (few-step) |
pytorch_lora_weights.safetensors| Optional Enables stable 4–8 step turbo sampling |BHS – Best Head Swap |
bfs_head_v1.1_alternative_qwen_2.1.safetensors|head_swap:block; strength 1.0 → 0.8 if needed |Detail enhancer |
elusarcas-qwen2-1-detailer-v1.safetensors|enhance this image/1_enhance this image|Multiple angles |
multiple_angles_step1000.safetensors| Start prompt with<mva>+ labeled angle |Natural Exposure |
Qwen-Image-2.1-Natural-Exposure-LoRA-4000.safetensors| Natural light / exposure response |MysticXXX (optional) |
Qwen-MysticXXX-v1.safetensors| Adult / denser detail when needed |NSFW 2.1 (optional) |
nsfw_lora_2.1_v2.safetensors| Adult anatomy helper |
---
Default wildcard-style prompt (as in the graph)
Uses [custom-willdcard-prompt](https://github.com/eliseipanov/custom-willdcard-prompt) so {a\|b\|c} picks one option per run:
<mva> {front view 0°|front-right view 30°|front-right quarter view 60°|right side view 90°|back-right quarter view 120°|back-right view 150°|back view 180°|back-left view 210°|back-left quarter view 240°|left side view 270°|front-left quarter view 300°|front-left view 330°}, {high-angle shot|top-down shot|eye-level shot}.
head_swap: start with <image1> as the base image, keeping its lighting, environment, and background. Remove completely the head of the Woman from <image1> and replace it with the head of the Woman from <image2>, strictly preserving the hair, eye color, nose structure from <image2>. Copy the direction of the eye, head rotation, micro expressions from <image1>, high quality, sharp details, 4k. Keep the colour scheme of <image1>
camera and lighting: Cinematic realistic lighting, soft even light, realistic skin texture, realistic skin highlights, high detail. No text, no logos, no watermark. Shot made by fullframe Nikon camera with prime lens 85mm f/1.8. film grain, Dramatic lighting, cold long shadows.
enhance this image: make all details of skin better, improve micro contrast, the point of black and point of white, sharp manual focus and white balance
*<mva> rules (Multiple Angles LoRA)**
- Put <mva> at the start of the prompt.
- Use labels only (not raw degrees like 47°).
- Azimuth examples: front view 0°, right side view 90°, back view 180°, …
- Elevation: eye-level shot, elevated shot 30°, high-angle shot, top-down shot.
- Optional: add close-up at the end of the angle line.
- LoRA strength ~**0.8–1.0** (lower if it pastes the ref instead of changing camera).
BHS tip: if the head “sticks” wrong, lower BHS toward 0.8 and keep the head_swap: sentence explicit about hair / eyes / nose from <image2> and pose / gaze from <image1>.
---
Sampler / quality (practical)
- Turbo model in workflow can be used as is with 8 steps.
- Turbo model + Lightning Lora: about 4-5 steps, low CFG (graph example ~**1.1**), euler + beta is a known-good combo on this stack. You also can use er_sde + sgm_uniform or Euler_ancestral / Beta *(or sgm_uniform)
- Always run the second pass / latent upscale if you care about skin pores, wet highlights, fabric, hair edges
- Output size: keep multiples of 32; ResolutionSelector-style ~1.5 MP 3:2 is a solid default before upscale
---
Nodes you need
- ComfyUI build that includes TextEncodeQwenImage21 (Qwen-Image 2.1 path)
- UNETLoader / CLIPLoader qwen_image) / VAELoader
- LoadImage ×2 minimum <image1> base, <image2> head)
- KSampler (+ second pass / latent upscaler node and model as in the graph)
- Wildcard / custom-willdcard-prompt (or paste a fixed angle line)
- Optional: LUT-from-reference (Just load the image you want you generated photo looks like by style) + light grade nodes if you keep the color group
---
Honest limitations
- Quantized Turbo is fast, not magic — garbage refs in → garbage swap out
- <mva> wants named angles; random degree numbers are unreliable
- Stacking every LoRA at 1.0 can muddy the image; if detail collapses, turn optional NSFW/Mystic down first, not BHS
- VRAM: INT8/FP8 Turbo is the point; the 2nd latent pass + texture VAE is what usually hurts small GPUs
---
License / tone
Workflow and notes are shared free for the community. Remix it, post results, tag the LoRA authors. Questions welcome in the comments — especially if BHS or <mva> misbehave on your exact quant.
---
### Workflow Notes (short install list)
Weights
1. DiT: qwen-image-2.1-turbo-int8_convrot.safetensors or FP8 twin → models/diffusion_models
2. TE: qwen3vl_8b_nvfp4_heretic.safetensors → models/text_encoders (type qwen_image)
3. VAE: texture_fix_vae_for_qwen_image_2.1_bf16.safetensors → models/vae
4. LoRAs → models/loras/:
- pytorch_lora_weights.safetensors (Lightning Lora from )
- bfs_head_v1.1_alternative_qwen_2.1.safetensors (BHS)
- elusarcas-qwen2-1-detailer-v1.safetensors
- multiple_angles_step1000.safetensors
- Qwen-Image-2.1-Natural-Exposure-LoRA-4000.safetensors
- optional: Qwen-MysticXXX-v1.safetensors, nsfw_lora_2.1_v2.safetensors
Custom nodes
- Qwen-Image 2.1 encoder support (stock recent Comfy or pack that ships TextEncodeQwenImage21)
- [custom-willdcard-prompt](https://github.com/eliseipanov/custom-willdcard-prompt) for {a|b|c}
- Whatever upscale/2pass nodes are already wired in the uploaded graph
Run order
1. <image1> base, <image2> head, also optional (disabled) <image3> for background
2. Confirm BHS + Lightning + (optional) angles/detail/exposure strengths
3. Generate few-step turbo → let 2pass latent upscale finish
4. Only then push grade/LUT
Support:
comment with GPU, quant (INT8/FP8), and which LoRA strengths you used if the head swap or <mva> drifts.
Description
Free and rady for use Workflow Olemara's High Quality 2pass Qwen 2.1 Image Workflow v.1.01, working without any bugs with VRAM 24 Gb + (For example on vast.ai instances here https://cloud.vast.ai/?ref_id=398237)







