primerz commited on
Commit
ef9c54d
·
verified ·
1 Parent(s): 270a823

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +113 -175
app.py CHANGED
@@ -1,6 +1,10 @@
1
  """
2
  Pixagram AI Pixel Art Generator - Gradio Interface
 
3
  """
 
 
 
4
  import spaces
5
  import gradio as gr
6
  import os
@@ -20,18 +24,19 @@ def apply_preset(preset_name):
20
  preset_name = "Balanced Portrait"
21
 
22
  preset = PRESETS[preset_name]
 
23
  return (
24
  preset["strength"],
25
  preset["guidance_scale"],
26
- preset["identity_preservation"],
27
  preset["lora_scale"],
28
  preset["depth_control_scale"],
29
- preset["identity_control_scale"],
30
  f"[APPLIED] {preset_name}\n{preset['description']}"
31
  )
32
 
33
 
34
- @spaces.GPU(duration=35)
35
  def process_image(
36
  image,
37
  prompt,
@@ -39,9 +44,9 @@ def process_image(
39
  steps,
40
  guidance_scale,
41
  depth_control_scale,
42
- identity_control_scale,
43
- lora_scale,
44
- identity_preservation,
45
  strength,
46
  enable_color_matching,
47
  consistency_mode,
@@ -53,24 +58,24 @@ def process_image(
53
  return None, None
54
 
55
  try:
56
- # Generate retro art
57
- result = converter.generate_retro_art(
58
- input_image=image,
59
  prompt=prompt,
60
  negative_prompt=negative_prompt,
61
  num_inference_steps=int(steps),
62
  guidance_scale=guidance_scale,
63
  depth_control_scale=depth_control_scale,
64
- identity_control_scale=identity_control_scale,
65
- lora_scale=lora_scale,
66
- identity_preservation=identity_preservation,
67
  strength=strength,
68
  enable_color_matching=enable_color_matching,
69
  consistency_mode=consistency_mode,
70
  seed=int(seed)
71
  )
72
 
73
- # Generate captions if requested
74
  caption_text = None
75
  if enable_captions:
76
  captions = []
@@ -81,15 +86,16 @@ def process_image(
81
  captions.append(f"Input: {input_caption}")
82
  print(f"[CAPTION] Input: {input_caption}")
83
 
84
- # Output caption
85
- output_caption = converter.generate_caption(result)
86
- if output_caption:
87
- captions.append(f"Output: {output_caption}")
88
- print(f"[CAPTION] Output: {output_caption}")
 
89
 
90
  caption_text = "\n".join(captions) if captions else None
91
 
92
- return result, caption_text
93
 
94
  except Exception as e:
95
  print(f"Error: {e}")
@@ -102,12 +108,13 @@ def process_image(
102
  def get_model_status():
103
  """Generate model status markdown"""
104
  if converter.models_loaded:
105
- status_text = "**[OK] Loaded Models:**\n"
106
  status_text += f"- Custom Checkpoint (Horizon): {'[OK] Loaded' if converter.models_loaded['custom_checkpoint'] else '[OK] Using SDXL base'}\n"
107
  status_text += f"- LORA (RetroArt): {'[OK] Loaded' if converter.models_loaded['lora'] else ' Disabled'}\n"
108
- status_text += f"- InstantID: {'[OK] Loaded' if converter.models_loaded['instantid'] else ' Disabled'}\n"
109
- status_text += f"- Zoe Depth: {'[OK] Loaded' if converter.models_loaded['zoe_depth'] else ' Fallback'}\n"
110
- status_text += f"- IP-Adapter (Face Embeddings): {'[OK] Loaded' if converter.models_loaded.get('ip_adapter', False) else ' Keypoints only'}\n"
 
111
  return status_text
112
  return "**Model status unavailable**"
113
 
@@ -162,8 +169,9 @@ with gr.Blocks(title="Pixagram - AI Pixel Art Generator", theme=gr.themes.Soft()
162
 
163
  # App description
164
  gr.Markdown(f"""
165
- <h2 class="app-title"> PIXAGRAM.IO | AI Pixel Art Generator (Img2Img + InstantID)</h2>
166
  Transform your photos into retro pixel art style with **strong face preservation!**
 
167
  """)
168
 
169
  # Model status
@@ -172,19 +180,14 @@ with gr.Blocks(title="Pixagram - AI Pixel Art Generator", theme=gr.themes.Soft()
172
  # Scheduler info
173
  scheduler_info = f"""
174
  **[CONFIG] Advanced Configuration:**
175
- - Pipeline: **Img2Img** (structure preservation)
176
- - Face System: **CLIP + InsightFace** (dual embeddings)
177
- - **[ADVANCED] Enhanced Resampler:** 10 layers, 20 heads (+3-5% quality)
178
- - **[ADVANCED] Adaptive Attention:** Context-aware scaling (+2-3% quality)
179
- - **[ADVANCED] Multi-Scale Processing:** 3-scale face analysis (+1-2% quality)
180
- - **[ADVANCED] Adaptive Parameters:** Auto-adjust for face quality (+2-3% consistency)
181
- - **[ADVANCED] Face-Aware Color Matching:** LAB space with saturation preservation (+1-2% quality)
182
  - Scheduler: **LCM** (12 steps, fast generation)
183
- - Recommended CFG: **1.15-1.5** (optimized for LCM)
184
- - Identity Boost: **1.15x** (for maximum face fidelity)
185
- - CLIP Skip: **2** (enhanced style control)
186
  - LORA Trigger: `{TRIGGER_WORD}` (auto-added)
187
- - **Total Improvement:** +10-15% over base = **96-99% face similarity**
188
  """
189
  gr.Markdown(scheduler_info)
190
 
@@ -193,15 +196,15 @@ with gr.Blocks(title="Pixagram - AI Pixel Art Generator", theme=gr.themes.Soft()
193
  input_image = gr.Image(label="Input Image", type="pil")
194
 
195
  prompt = gr.Textbox(
196
- label="Prompt (trigger word auto-added)",
197
- value=" ",
198
  lines=3,
199
- info=f"'{TRIGGER_WORD}' will be automatically added"
200
  )
201
 
202
  negative_prompt = gr.Textbox(
203
  label="Negative Prompt",
204
- value=" ",
205
  lines=2
206
  )
207
 
@@ -230,18 +233,18 @@ with gr.Blocks(title="Pixagram - AI Pixel Art Generator", theme=gr.themes.Soft()
230
  steps = gr.Slider(
231
  minimum=4,
232
  maximum=50,
233
- value=DEFAULT_PARAMS['num_inference_steps'],
234
  step=1,
235
- label=f" Inference Steps (LCM optimized for 12)"
236
  )
237
 
238
  with gr.Row():
239
  guidance_scale = gr.Slider(
240
  minimum=0.5,
241
- maximum=2.0,
242
- value=DEFAULT_PARAMS['guidance_scale'],
243
- step=0.05,
244
- label="Guidance Scale (CFG)\nHigher = stronger adherence to prompt"
245
  )
246
 
247
  strength = gr.Slider(
@@ -255,49 +258,53 @@ with gr.Blocks(title="Pixagram - AI Pixel Art Generator", theme=gr.themes.Soft()
255
  gr.Markdown("### Advanced Fine-Tuning")
256
 
257
  with gr.Row():
258
- depth_control_scale = gr.Slider(
259
- minimum=0.3,
260
- maximum=1.2,
261
- value=DEFAULT_PARAMS['depth_control_scale'],
262
- step=0.05,
263
- label="Depth ControlNet Scale"
264
- )
265
-
266
  lora_scale = gr.Slider(
267
- minimum=0.5,
268
- maximum=2.0,
269
  value=DEFAULT_PARAMS['lora_scale'],
270
  step=0.05,
271
  label="RetroArt LORA Scale\nLower = more realistic"
272
  )
 
 
 
 
 
 
 
 
273
 
274
- with gr.Accordion(" InstantID Settings (for portraits)", open=True):
275
- identity_control_scale = gr.Slider(
276
- minimum=0.3,
277
- maximum=1.5,
278
- value=DEFAULT_PARAMS['identity_control_scale'],
 
279
  step=0.05,
280
- label="InstantID ControlNet Scale (facial keypoints structure)"
281
  )
282
 
283
- identity_preservation = gr.Slider(
284
- minimum=0.3,
285
- maximum=2.0,
286
- value=DEFAULT_PARAMS['identity_preservation'],
287
  step=0.05,
288
- label="Identity Preservation (IP-Adapter scale)\nHigher = stronger face preservation"
289
  )
290
 
291
  enable_color_matching = gr.Checkbox(
292
  value=DEFAULT_PARAMS['enable_color_matching'],
293
- label="[OPTIONAL] Enable Color Matching (gentle skin tone adjustment)",
294
- info="Apply subtle color matching - disable if colors look faded"
 
295
  )
296
 
297
  consistency_mode = gr.Checkbox(
298
  value=DEFAULT_PARAMS['consistency_mode'],
299
- label="[CONSISTENCY] Auto-adjust parameters for predictable results",
300
- info="Validates and balances parameters to reduce variation"
 
301
  )
302
 
303
  seed_input = gr.Number(
@@ -308,15 +315,20 @@ with gr.Blocks(title="Pixagram - AI Pixel Art Generator", theme=gr.themes.Soft()
308
  )
309
 
310
  enable_captions = gr.Checkbox(
311
- value=False,
312
  label="[CAPTIONS] Generate descriptive captions",
313
- info="Generate short captions for input and output images"
314
  )
315
 
316
- generate_btn = gr.Button(">>> Generate Retro Art", variant="primary", size="lg")
317
 
318
  with gr.Column():
319
- output_image = gr.Image(label="Retro Art Output")
 
 
 
 
 
320
 
321
  caption_output = gr.Textbox(
322
  label="Generated Captions",
@@ -326,119 +338,45 @@ with gr.Blocks(title="Pixagram - AI Pixel Art Generator", theme=gr.themes.Soft()
326
  )
327
 
328
  gr.Markdown(f"""
329
- ### Tips for Maximum Quality Results:
330
-
331
- **[OPTIMIZATIONS] Advanced Optimizations Active:**
332
- - **Enhanced Resampler:** 10 layers, 20 heads (+3-5% quality)
333
- - **Adaptive Attention:** Context-aware scaling (+2-3% quality)
334
- - **Multi-Scale Processing:** 3-scale face analysis (+1-2% quality)
335
- - **Adaptive Parameters:** Auto-adjust based on face quality (+2-3% consistency)
336
- - **Enhanced Color Matching:** Face-aware LAB color space (+1-2% quality)
337
-
338
- **Expected Quality:**
339
- - Base system: 90-93% face similarity
340
- - With optimizations: 96-99% face similarity
341
- - Ultra Fidelity preset: 97-99%+ face similarity
342
-
343
- **[PRESETS] Optimized Preset Guide:**
344
- - **Ultra Fidelity:** 96-98% similarity, minimal transformation
345
- - **Premium Portrait:** 94-96% similarity, excellent balance (recommended)
346
- - **Balanced Portrait:** 90-93% similarity, good balance
347
- - **Artistic Excellence:** 88-91% similarity, creative with likeness
348
- - **Style Focus:** 83-87% similarity, maximum pixel art
349
- - **Subtle Enhancement:** 97-99% similarity, photo-realistic
350
-
351
- **[ADAPTIVE] Automatic Adjustments:**
352
- - Small faces (< 50K px): Boosts identity preservation to 1.8
353
- - Low confidence (< 80%): Increases identity control to 0.9
354
- - Profile views (> 20° yaw): Enhances preservation to 1.7
355
- - Good quality faces: Uses your selected parameters
356
 
357
- **[PARAMETERS] Parameter Relationships:**
358
- - **Strength** (most important): Controls transformation intensity
359
- - `0.38-0.45`: Maximum fidelity (Ultra/Subtle presets)
360
- - `0.48-0.55`: Balanced quality (Premium/Balanced presets)
361
- - `0.58-0.68`: Artistic freedom (Artistic/Style presets)
362
- - **Identity Preservation**: Face embedding strength (auto-boosted 1.15x)
363
- - **Guidance Scale (CFG)**: LCM-optimized range 1.1-1.5
364
- - **LORA Scale**: Pixel art intensity (inverse to identity)
365
 
366
- **[CONSISTENCY] Consistency Mode Benefits:**
367
- - Validates parameter combinations for predictability
368
- - Prevents identity-LORA conflicts
369
- - Keeps CFG in optimal LCM range
370
- - Balances ControlNet scales
371
- - Recommended: Always ON
372
-
373
- **[SEED] Reproducibility:**
374
- - **-1:** Random, explore variations
375
- - **Fixed (e.g., 42):** Identical results for testing
376
 
377
  **[WORKFLOW] Recommended Workflow:**
378
- 1. Upload high-res portrait (face > 30% of frame)
379
- 2. Select preset (start with Premium Portrait)
380
- 3. Enable Consistency Mode (ON by default)
381
- 4. First generation: See quality level
382
- 5. If adjusting: Change ONE parameter at a time
383
- 6. Fix seed for consistent testing
384
-
385
- **[TECHNICAL] System Details:**
386
- - Enhanced Resampler: 10 layers, 20 heads, 1280 dim
387
- - Attention: Adaptive per-layer scaling
388
- - Face Processing: Multi-scale (0.75x, 1x, 1.25x)
389
- - Color Matching: LAB space, face-aware masking
390
- - Resolution: Auto-optimized to 896x1152 or 832x1216
391
  """)
392
 
393
  # Preset button click events
394
- preset_btn_1.click(
395
- fn=lambda: apply_preset("Ultra Fidelity"),
396
- inputs=[],
397
- outputs=[strength, guidance_scale, identity_preservation, lora_scale,
398
- depth_control_scale, identity_control_scale, preset_status]
399
- )
400
-
401
- preset_btn_2.click(
402
- fn=lambda: apply_preset("Premium Portrait"),
403
- inputs=[],
404
- outputs=[strength, guidance_scale, identity_preservation, lora_scale,
405
- depth_control_scale, identity_control_scale, preset_status]
406
- )
407
 
408
- preset_btn_3.click(
409
- fn=lambda: apply_preset("Balanced Portrait"),
410
- inputs=[],
411
- outputs=[strength, guidance_scale, identity_preservation, lora_scale,
412
- depth_control_scale, identity_control_scale, preset_status]
413
- )
414
-
415
- preset_btn_4.click(
416
- fn=lambda: apply_preset("Artistic Excellence"),
417
- inputs=[],
418
- outputs=[strength, guidance_scale, identity_preservation, lora_scale,
419
- depth_control_scale, identity_control_scale, preset_status]
420
- )
421
-
422
- preset_btn_5.click(
423
- fn=lambda: apply_preset("Style Focus"),
424
- inputs=[],
425
- outputs=[strength, guidance_scale, identity_preservation, lora_scale,
426
- depth_control_scale, identity_control_scale, preset_status]
427
- )
428
-
429
- preset_btn_6.click(
430
- fn=lambda: apply_preset("Subtle Enhancement"),
431
- inputs=[],
432
- outputs=[strength, guidance_scale, identity_preservation, lora_scale,
433
- depth_control_scale, identity_control_scale, preset_status]
434
- )
435
 
436
  generate_btn.click(
437
  fn=process_image,
438
  inputs=[
439
  input_image, prompt, negative_prompt, steps, guidance_scale,
440
- depth_control_scale, identity_control_scale, lora_scale,
441
- identity_preservation, strength, enable_color_matching,
442
  consistency_mode, seed_input, enable_captions
443
  ],
444
  outputs=[output_image, caption_output]
@@ -452,4 +390,4 @@ if __name__ == "__main__":
452
  server_port=7860,
453
  share=True,
454
  show_api=True
455
- )
 
1
  """
2
  Pixagram AI Pixel Art Generator - Gradio Interface
3
+ MODIFIED for IP-Adapter-FaceIDXL (non-plus) and LCM
4
  """
5
+ import torch # <-- MUST BE FIRST
6
+ torch.jit.script = lambda f: f # <-- MUST BE SECOND
7
+
8
  import spaces
9
  import gradio as gr
10
  import os
 
24
  preset_name = "Balanced Portrait"
25
 
26
  preset = PRESETS[preset_name]
27
+ # Re-added lora_scale
28
  return (
29
  preset["strength"],
30
  preset["guidance_scale"],
31
+ preset.get("ip_adapter_scale", 1.0),
32
  preset["lora_scale"],
33
  preset["depth_control_scale"],
34
+ preset.get("canny_control_scale", 0.5),
35
  f"[APPLIED] {preset_name}\n{preset['description']}"
36
  )
37
 
38
 
39
+ @spaces.GPU(duration=35) # LCM is fast
40
  def process_image(
41
  image,
42
  prompt,
 
44
  steps,
45
  guidance_scale,
46
  depth_control_scale,
47
+ canny_control_scale,
48
+ lora_scale, # Re-added lora_scale
49
+ ip_adapter_scale,
50
  strength,
51
  enable_color_matching,
52
  consistency_mode,
 
58
  return None, None
59
 
60
  try:
61
+ # Generate retro art (returns a list of 4 images)
62
+ result_images = converter.generate(
63
+ image=image,
64
  prompt=prompt,
65
  negative_prompt=negative_prompt,
66
  num_inference_steps=int(steps),
67
  guidance_scale=guidance_scale,
68
  depth_control_scale=depth_control_scale,
69
+ canny_control_scale=canny_control_scale,
70
+ lora_scale=lora_scale, # Re-added lora_scale
71
+ ip_adapter_scale=ip_adapter_scale,
72
  strength=strength,
73
  enable_color_matching=enable_color_matching,
74
  consistency_mode=consistency_mode,
75
  seed=int(seed)
76
  )
77
 
78
+ # Generate captions if requested (from original image)
79
  caption_text = None
80
  if enable_captions:
81
  captions = []
 
86
  captions.append(f"Input: {input_caption}")
87
  print(f"[CAPTION] Input: {input_caption}")
88
 
89
+ # Output caption (from first generated image)
90
+ if result_images:
91
+ output_caption = converter.generate_caption(result_images[0])
92
+ if output_caption:
93
+ captions.append(f"Output (Image 1): {output_caption}")
94
+ print(f"[CAPTION] Output: {output_caption}")
95
 
96
  caption_text = "\n".join(captions) if captions else None
97
 
98
+ return result_images, caption_text
99
 
100
  except Exception as e:
101
  print(f"Error: {e}")
 
108
  def get_model_status():
109
  """Generate model status markdown"""
110
  if converter.models_loaded:
111
+ status_text = "**[OK] Loaded Models (FaceIDXL / LCM):**\n"
112
  status_text += f"- Custom Checkpoint (Horizon): {'[OK] Loaded' if converter.models_loaded['custom_checkpoint'] else '[OK] Using SDXL base'}\n"
113
  status_text += f"- LORA (RetroArt): {'[OK] Loaded' if converter.models_loaded['lora'] else ' Disabled'}\n"
114
+ status_text += f"- IP-Adapter (FaceIDXL): {'[OK] Loaded' if converter.models_loaded['ip_adapter'] else ' [ERROR] DISABLED'}\n"
115
+ status_text += f"- LeReS++ Depth: {'[OK] Loaded' if converter.models_loaded['leres_depth'] else ' [ERROR] DISABLED'}\n"
116
+ status_text += f"- Canny Detector: {'[OK] Loaded' if converter.models_loaded['canny'] else ' [ERROR] DISABLED'}\n"
117
+ status_text += f"- ControlNets: Depth + Canny\n"
118
  return status_text
119
  return "**Model status unavailable**"
120
 
 
169
 
170
  # App description
171
  gr.Markdown(f"""
172
+ <h2 class="app-title"> PIXAGRAM.IO | AI Pixel Art Generator (Img2Img + FaceIDXL + LCM)</h2>
173
  Transform your photos into retro pixel art style with **strong face preservation!**
174
+ This version uses **LCM**, IP-Adapter-FaceIDXL, LeReS++ Depth, and Canny ControlNets.
175
  """)
176
 
177
  # Model status
 
180
  # Scheduler info
181
  scheduler_info = f"""
182
  **[CONFIG] Advanced Configuration:**
183
+ - Pipeline: **IP-Adapter-FaceIDXL (Img2Img)**
184
+ - Face System: **InsightFace (buffalo_l)** (512D embeddings)
185
+ - **[FaceID] IP-Adapter:** `ip-adapter-faceid_sdxl.bin` (Optional, only if face is detected)
186
+ - **[CONTROL] Dual ControlNets:** LeReS++ Depth + Canny
187
+ - **[ADVANCED] Auto-Captioning:** Input image caption added to prompt
 
 
188
  - Scheduler: **LCM** (12 steps, fast generation)
189
+ - Recommended CFG: **1.0-2.0**
 
 
190
  - LORA Trigger: `{TRIGGER_WORD}` (auto-added)
 
191
  """
192
  gr.Markdown(scheduler_info)
193
 
 
196
  input_image = gr.Image(label="Input Image", type="pil")
197
 
198
  prompt = gr.Textbox(
199
+ label="Prompt (trigger word & caption auto-added)",
200
+ value="a person",
201
  lines=3,
202
+ info=f"'{TRIGGER_WORD}' and an auto-generated caption will be added"
203
  )
204
 
205
  negative_prompt = gr.Textbox(
206
  label="Negative Prompt",
207
+ value="blurry, low quality, ugly, distorted, monochrome, lowres, bad anatomy, worst quality",
208
  lines=2
209
  )
210
 
 
233
  steps = gr.Slider(
234
  minimum=4,
235
  maximum=50,
236
+ value=12, # LCM default
237
  step=1,
238
+ label=f" Inference Steps (LCM optimized for 8-12)"
239
  )
240
 
241
  with gr.Row():
242
  guidance_scale = gr.Slider(
243
  minimum=0.5,
244
+ maximum=3.0,
245
+ value=1.5, # LCM default
246
+ step=0.1,
247
+ label="Guidance Scale (CFG)"
248
  )
249
 
250
  strength = gr.Slider(
 
258
  gr.Markdown("### Advanced Fine-Tuning")
259
 
260
  with gr.Row():
261
+ # --- LORA SCALE SLIDER MODIFIED ---
 
 
 
 
 
 
 
262
  lora_scale = gr.Slider(
263
+ minimum=0.0,
264
+ maximum=4.0, # Changed from 2.0 to 4.0
265
  value=DEFAULT_PARAMS['lora_scale'],
266
  step=0.05,
267
  label="RetroArt LORA Scale\nLower = more realistic"
268
  )
269
+
270
+ depth_control_scale = gr.Slider(
271
+ minimum=0.0,
272
+ maximum=1.2,
273
+ value=DEFAULT_PARAMS['depth_control_scale'],
274
+ step=0.05,
275
+ label="Depth ControlNet Scale (LeReS++)"
276
+ )
277
 
278
+ with gr.Accordion(" Face & Structure Settings", open=True):
279
+
280
+ ip_adapter_scale = gr.Slider(
281
+ minimum=0.0,
282
+ maximum=2.0,
283
+ value=1.0,
284
  step=0.05,
285
+ label="Identity Scale (IP-Adapter FaceID)"
286
  )
287
 
288
+ canny_control_scale = gr.Slider(
289
+ minimum=0.0,
290
+ maximum=1.2,
291
+ value=0.5,
292
  step=0.05,
293
+ label="Canny ControlNet Scale (Structure)"
294
  )
295
 
296
  enable_color_matching = gr.Checkbox(
297
  value=DEFAULT_PARAMS['enable_color_matching'],
298
+ label="[DISABLED] Enable Color Matching",
299
+ info="Disabled for multi-image output",
300
+ interactive=False
301
  )
302
 
303
  consistency_mode = gr.Checkbox(
304
  value=DEFAULT_PARAMS['consistency_mode'],
305
+ label="[DISABLED] Auto-adjust parameters",
306
+ info="Disabled for this pipeline",
307
+ interactive=False
308
  )
309
 
310
  seed_input = gr.Number(
 
315
  )
316
 
317
  enable_captions = gr.Checkbox(
318
+ value=True,
319
  label="[CAPTIONS] Generate descriptive captions",
320
+ info="Generate captions for input and output images"
321
  )
322
 
323
+ generate_btn = gr.Button(">>> Generate 4 Retro Art Images", variant="primary", size="lg")
324
 
325
  with gr.Column():
326
+ output_image = gr.Gallery(
327
+ label="Retro Art Output (4 Images)",
328
+ columns=2,
329
+ object_fit="contain",
330
+ height="auto"
331
+ )
332
 
333
  caption_output = gr.Textbox(
334
  label="Generated Captions",
 
338
  )
339
 
340
  gr.Markdown(f"""
341
+ ### 💡 How to Get Full Style (The "Battle of Scales")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
342
 
343
+ Your problem is that **Identity** (realism) is fighting **LoRA** (style). To make the *whole scene* stylized, you MUST change the balance.
 
 
 
 
 
 
 
344
 
345
+ **[PARAMETERS] For "Max Style" (Try This!):**
346
+ - **`Img2Img Strength`:** **`0.8` - `0.85`**
347
+ (This is the *most important* slider. It gives the LoRA power over the whole scene.)
348
+ - **`Identity Scale`:** **`0.6` - `0.7`**
349
+ (You *must* lower this to let the LoRA pixelate the face.)
350
+ - **`RetroArt LORA Scale`:** **`1.2` - `1.4`**
351
+ (Now you can boost the LoRA's power.)
352
+ - **`Depth` / `Canny` Scales:** **`0.4` - `0.6`**
353
+ (Lower these to let the LoRA change the realistic structure.)
 
354
 
355
  **[WORKFLOW] Recommended Workflow:**
356
+ 1. Upload a clear portrait.
357
+ 2. Set the "Max Style" parameters above.
358
+ 3. Generate. This will be your new stylistic baseline.
359
+ 4. If the face is *too* stylized, slowly increase **`Identity Scale`** (e.g., to 0.75).
360
+ 5. If the background is *too* messy, slowly increase **`Depth Control`** (e.g., to 0.6).
 
 
 
 
 
 
 
 
361
  """)
362
 
363
  # Preset button click events
364
+ all_sliders = [strength, guidance_scale, ip_adapter_scale, lora_scale,
365
+ depth_control_scale, canny_control_scale, preset_status]
 
 
 
 
 
 
 
 
 
 
 
366
 
367
+ preset_btn_1.click(fn=lambda: apply_preset("Ultra Fidelity"), inputs=[], outputs=all_sliders)
368
+ preset_btn_2.click(fn=lambda: apply_preset("Premium Portrait"), inputs=[], outputs=all_sliders)
369
+ preset_btn_3.click(fn=lambda: apply_preset("Balanced Portrait"), inputs=[], outputs=all_sliders)
370
+ preset_btn_4.click(fn=lambda: apply_preset("Artistic Excellence"), inputs=[], outputs=all_sliders)
371
+ preset_btn_5.click(fn=lambda: apply_preset("Style Focus"), inputs=[], outputs=all_sliders)
372
+ preset_btn_6.click(fn=lambda: apply_preset("Subtle Enhancement"), inputs=[], outputs=all_sliders)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
373
 
374
  generate_btn.click(
375
  fn=process_image,
376
  inputs=[
377
  input_image, prompt, negative_prompt, steps, guidance_scale,
378
+ depth_control_scale, canny_control_scale, lora_scale,
379
+ ip_adapter_scale, strength, enable_color_matching,
380
  consistency_mode, seed_input, enable_captions
381
  ],
382
  outputs=[output_image, caption_output]
 
390
  server_port=7860,
391
  share=True,
392
  show_api=True
393
+ )