# Portrait pipeline: generate base character → emotion variants → remove bg → upscale. # # Usage: # vnasset pipeline --config examples/portrait.yaml # vnasset pipeline --config examples/portrait.yaml --force # re-run everything # # Output structure: # output/portrait_pipeline/ # pipeline.json ← pipeline summary # base/ ← stage 1: generated portraits # heroine.png # heroine.json # expressions/ ← stage 2: emotion edits (cross-product) # heroine_smile.png # heroine_smile.json # heroine_angry.png # ... # nobg/ ← stage 3: background removed (RGBA) # heroine_smile_nobg.png # ... # final/ ← stage 4: upscaled 2× # heroine_smile_nobg_x2.png # ... session: sdxl_checkpoint: models/novaAnimeXL_ilV190.safetensors edit_model: models/qwen_image_edit_2509_fp8_e4m3fn.safetensors edit_lora: models/Qwen-Image-Edit-2509-Lightning-4steps-V1.0-bf16.safetensors output_dir: output/portrait_pipeline defaults: generate: steps: 20 cfg: 4.5 negative_prompt: "deformed, ugly, bad quality, lowres" edit: steps: 4 cfg: 1.0 stages: # ── Stage 1: Generate base character portrait ── - id: base generate: - id: heroine prompt: "1girl, solo, red hair, glasses, blue eyes, white crop top, standing, portrait" seed: 42 # ── Stage 2: Edit expression variants (fan-out cross-product) ── - id: expressions edit: input: base prompts: - id: smile text: "make her smile happily with a warm genuine smile" - id: angry text: "make her look angry and furious, furrowed brow" - id: sad text: "make her look sad and crying, tears in her eyes" - id: surprised text: "make her look surprised, wide eyes, mouth slightly open" - id: blushing text: "make her blush intensely, embarrassed expression, pink cheeks" # ── Stage 3: Remove backgrounds (batch 1:1 passthrough) ── - id: nobg remove_bg: input: expressions # ── Stage 4: Upscale to 2× resolution ── - id: final upscale: input: nobg scale: 2