Spaces:
vcollos
/
Runtime error

vcollos commited on
Commit
605c374
·
verified ·
1 Parent(s): 1089574

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +98 -41
app.py CHANGED
@@ -41,17 +41,21 @@ pipe = DiffusionPipeline.from_pretrained(
41
  # Move o modelo para GPU
42
  pipe.to("cuda")
43
 
44
- # Definição dos LoRA e Trigger Words
45
  lora_models = {
46
  "Paula": {
47
  "repo": "vcollos/Paula2",
48
  "weights": "Paula P.safetensors",
49
- "trigger_word": "paula, woman with long blonde hair" # Trigger word para Paula (mulher)
 
 
50
  },
51
  "Vivi": {
52
  "repo": "vcollos/Vivi",
53
  "weights": "Vivi.safetensors",
54
- "trigger_word": "vivi, man with dark hair" # Trigger word para Vivi (homem)
 
 
55
  }
56
  }
57
 
@@ -92,22 +96,38 @@ def optimize_with_openai(text, character_option):
92
  try:
93
  # Determina o prompt de sistema com base na seleção de personagem
94
  if character_option == "Paula":
95
- system_prompt = """Você é um especialista em criar prompts para o modelo de imagem FLUX.1-dev.
96
  Traduza e otimize este prompt em português para um prompt em inglês que irá gerar
97
- uma imagem de uma mulher loira chamada Paula. Seu prompt deve ser detalhado, claro e
98
- enfatizar características de uma mulher loira.
 
 
 
 
 
99
  Responda APENAS com o prompt otimizado em inglês, sem explicações ou introduções."""
100
  elif character_option == "Vivi":
101
- system_prompt = """Você é um especialista em criar prompts para o modelo de imagem FLUX.1-dev.
102
  Traduza e otimize este prompt em português para um prompt em inglês que irá gerar
103
- uma imagem de um homem de cabelo escuro chamado Vivi. Seu prompt deve ser detalhado, claro e
104
- enfatizar características de um homem moreno.
 
 
 
 
 
105
  Responda APENAS com o prompt otimizado em inglês, sem explicações ou introduções."""
106
  else: # both
107
- system_prompt = """Você é um especialista em criar prompts para o modelo de imagem FLUX.1-dev.
108
  Traduza e otimize este prompt em português para um prompt em inglês que irá gerar
109
  uma imagem de duas pessoas juntas: uma mulher loira chamada Paula e um homem de cabelo escuro chamado Vivi.
 
 
 
 
110
  Seu prompt deve ser detalhado, claro e deve enfatizar a presença dos DOIS personagens na mesma cena.
 
 
111
  Responda APENAS com o prompt otimizado em inglês, sem explicações ou introduções."""
112
 
113
  # Configuração do cabeçalho e corpo da requisição
@@ -152,22 +172,38 @@ def optimize_with_google_ai(text, character_option):
152
  try:
153
  # Determina o prompt com base na seleção de personagem
154
  if character_option == "Paula":
155
- instruction = """Você é um especialista em criar prompts para modelos de imagem AI.
156
  Traduza e otimize este prompt em português para um prompt em inglês que irá gerar
157
- uma imagem de uma mulher loira chamada Paula. Seu prompt deve ser detalhado, claro e
158
- enfatizar características de uma mulher loira.
 
 
 
 
 
159
  Responda APENAS com o prompt otimizado em inglês, sem explicações ou introduções."""
160
  elif character_option == "Vivi":
161
- instruction = """Você é um especialista em criar prompts para modelos de imagem AI.
162
  Traduza e otimize este prompt em português para um prompt em inglês que irá gerar
163
- uma imagem de um homem de cabelo escuro chamado Vivi. Seu prompt deve ser detalhado, claro e
164
- enfatizar características de um homem moreno.
 
 
 
 
 
165
  Responda APENAS com o prompt otimizado em inglês, sem explicações ou introduções."""
166
  else: # both
167
- instruction = """Você é um especialista em criar prompts para modelos de imagem AI.
168
  Traduza e otimize este prompt em português para um prompt em inglês que irá gerar
169
  uma imagem de duas pessoas juntas: uma mulher loira chamada Paula e um homem de cabelo escuro chamado Vivi.
 
 
 
 
170
  Seu prompt deve ser detalhado, claro e deve enfatizar a presença dos DOIS personagens na mesma cena.
 
 
171
  Responda APENAS com o prompt otimizado em inglês, sem explicações ou introduções."""
172
 
173
  # Prepara a requisição para a API do Google Gemini
@@ -212,7 +248,7 @@ def optimize_with_google_ai(text, character_option):
212
  return optimize_with_openai(text, character_option)
213
 
214
  @spaces.GPU(duration=80)
215
- def run_lora(prompt, cfg_scale, steps, randomize_seed, seed, width, height, lora_option, lora_scale_1, lora_scale_2, lora_balance, ai_option, progress=gr.Progress(track_tqdm=True)):
216
  if randomize_seed:
217
  seed = random.randint(0, MAX_SEED)
218
  generator = torch.Generator(device="cuda").manual_seed(seed)
@@ -243,17 +279,24 @@ def run_lora(prompt, cfg_scale, steps, randomize_seed, seed, width, height, lora
243
  # Define qual LoRA usar com base na seleção do usuário
244
  selected_loras = []
245
  adapter_weights = []
 
246
 
247
- # Modificado para melhorar a mescla de personagens
248
  if lora_option == "Paula":
249
  selected_loras.append("Paula")
250
  adapter_weights.append(lora_scale_1)
251
- prompt = f"{lora_models['Paula']['trigger_word']} {prompt}"
 
 
 
252
 
253
  elif lora_option == "Vivi":
254
  selected_loras.append("Vivi")
255
  adapter_weights.append(lora_scale_2)
256
- prompt = f"{lora_models['Vivi']['trigger_word']} {prompt}"
 
 
 
257
 
258
  elif lora_option == "Ambos":
259
  # Usa o balance slider para ajustar a proporção entre os dois LoRAs
@@ -263,16 +306,21 @@ def run_lora(prompt, cfg_scale, steps, randomize_seed, seed, width, height, lora
263
  selected_loras = ["Paula", "Vivi"]
264
  adapter_weights = [p_weight, v_weight]
265
 
266
- # Quando usando ambos, adiciona trigger words específicas para cada personagem
267
- # e ajusta o prompt para indicar que ambos devem aparecer na mesma cena
268
- prompt = f"{lora_models['Paula']['trigger_word']} and {lora_models['Vivi']['trigger_word']} together, a woman and a man, {prompt}"
269
 
270
  pipe.set_adapters(selected_loras, adapter_weights)
 
 
 
 
 
271
 
272
  # Gera a imagem com precisão de 16 bits
273
  with torch.autocast("cuda"):
274
  image = pipe(
275
  prompt=prompt,
 
276
  num_inference_steps=steps,
277
  guidance_scale=cfg_scale,
278
  width=width,
@@ -300,6 +348,7 @@ def run_lora(prompt, cfg_scale, steps, randomize_seed, seed, width, height, lora
300
  "prompt": original_prompt, # Salva o prompt original
301
  "processed_prompt": processed_prompt, # Salva o prompt processado pela IA
302
  "full_prompt": prompt, # Salva o prompt completo com trigger words
 
303
  "ai_option": ai_option,
304
  "cfg_scale": cfg_scale,
305
  "steps": steps,
@@ -333,8 +382,8 @@ with gr.Blocks(theme=gr_theme) as app:
333
  generate_button = gr.Button("Gerar")
334
 
335
  with gr.Accordion("Configurações Básicas", open=True):
336
- cfg_scale = gr.Slider(label="CFG Scale", minimum=1, maximum=20, step=0.5, value=3.5)
337
- steps = gr.Slider(label="Steps", minimum=1, maximum=100, step=1, value=32)
338
  width = gr.Slider(label="Width", minimum=256, maximum=1024, step=64, value=768)
339
  height = gr.Slider(label="Height", minimum=256, maximum=1024, step=64, value=1024)
340
  randomize_seed = gr.Checkbox(False, label="Randomize seed")
@@ -342,10 +391,11 @@ with gr.Blocks(theme=gr_theme) as app:
342
 
343
  with gr.Accordion("Configurações de LoRA", open=True):
344
  lora_option = gr.Radio(["Nenhum", "Paula", "Vivi", "Ambos"], label="Escolha o LoRA", value="Ambos")
345
- lora_scale_1 = gr.Slider(label="LoRA Scale (Paula)", minimum=0, maximum=1, step=0.01, value=0.8)
346
- lora_scale_2 = gr.Slider(label="LoRA Scale (Vivi)", minimum=0, maximum=1, step=0.01, value=0.8)
347
  lora_balance = gr.Slider(label="Balanço entre personagens", minimum=0.5, maximum=1.5, step=0.05, value=1.0,
348
  info="Valores acima de 1.0 favorecem Paula, abaixo de 1.0 favorecem Vivi")
 
349
 
350
  with gr.Accordion("Processamento de Prompt", open=True):
351
  ai_option = gr.Radio(
@@ -358,24 +408,31 @@ with gr.Blocks(theme=gr_theme) as app:
358
  result = gr.Image(label="Generated Image")
359
  final_prompt = gr.Textbox(label="Prompt Final (usado para gerar a imagem)", lines=3)
360
  gr.Markdown("""
361
- ### Como funciona:
362
- 1. Escreva seu prompt em português
363
- 2. Escolha entre Google AI (recomendado) ou OpenAI para traduzir e otimizar seu prompt
364
- 3. O sistema irá transformar sua descrição em português em um prompt profissional em inglês
365
- 4. O prompt será específico para o(s) personagem(ns) selecionado(s)
 
 
 
 
 
 
 
 
366
 
367
- ### Dicas para gerar imagens com ambos personagens:
368
- 1. Use o modo "Ambos" com valores balanceados (ex: 0.8 para ambos os LoRAs)
369
- 2. Inclua no prompt termos como "um homem e uma mulher juntos", "um casal", etc.
370
- 3. Lembre-se: Paula é uma mulher loira e Vivi é um homem de cabelo escuro
371
- 4. Ajuste o Balanço para favorecer um personagem ou outro se necessário
372
- 5. A otimização via IA produzirá melhores resultados do que prompts diretos
373
- 6. Experimente com seeds diferentes até encontrar uma que funcione bem
374
  """)
375
 
376
  generate_button.click(
377
  run_lora,
378
- inputs=[prompt, cfg_scale, steps, randomize_seed, seed, width, height, lora_option, lora_scale_1, lora_scale_2, lora_balance, ai_option],
379
  outputs=[result, seed, final_prompt],
380
  )
381
 
 
41
  # Move o modelo para GPU
42
  pipe.to("cuda")
43
 
44
+ # Definição dos LoRA e Trigger Words - Melhoradas para caracterização mais forte
45
  lora_models = {
46
  "Paula": {
47
  "repo": "vcollos/Paula2",
48
  "weights": "Paula P.safetensors",
49
+ "trigger_word": "woman with long blonde hair named Paula",
50
+ "negative_word": "men, male, man, masculine features, dark hair",
51
+ "character_desc": "a beautiful woman with long blonde hair, feminine features, soft facial features"
52
  },
53
  "Vivi": {
54
  "repo": "vcollos/Vivi",
55
  "weights": "Vivi.safetensors",
56
+ "trigger_word": "man with dark hair named Vivi",
57
+ "negative_word": "women, female, woman, feminine features, blonde hair",
58
+ "character_desc": "a handsome man with dark hair, masculine features, defined jawline"
59
  }
60
  }
61
 
 
96
  try:
97
  # Determina o prompt de sistema com base na seleção de personagem
98
  if character_option == "Paula":
99
+ system_prompt = f"""Você é um especialista em criar prompts para o modelo de imagem FLUX.1-dev.
100
  Traduza e otimize este prompt em português para um prompt em inglês que irá gerar
101
+ uma imagem de uma mulher loira chamada Paula.
102
+
103
+ Descrição de Paula: {lora_models['Paula']['character_desc']}
104
+
105
+ Seu prompt deve ser detalhado, claro e enfatizar características de uma mulher loira.
106
+ Inclua aspectos como: cabelo loiro, características femininas, expressão facial.
107
+
108
  Responda APENAS com o prompt otimizado em inglês, sem explicações ou introduções."""
109
  elif character_option == "Vivi":
110
+ system_prompt = f"""Você é um especialista em criar prompts para o modelo de imagem FLUX.1-dev.
111
  Traduza e otimize este prompt em português para um prompt em inglês que irá gerar
112
+ uma imagem de um homem de cabelo escuro chamado Vivi.
113
+
114
+ Descrição de Vivi: {lora_models['Vivi']['character_desc']}
115
+
116
+ Seu prompt deve ser detalhado, claro e enfatizar características masculinas e cabelo escuro.
117
+ Inclua aspectos como: cabelo escuro, características masculinas, expressão facial.
118
+
119
  Responda APENAS com o prompt otimizado em inglês, sem explicações ou introduções."""
120
  else: # both
121
+ system_prompt = f"""Você é um especialista em criar prompts para o modelo de imagem FLUX.1-dev.
122
  Traduza e otimize este prompt em português para um prompt em inglês que irá gerar
123
  uma imagem de duas pessoas juntas: uma mulher loira chamada Paula e um homem de cabelo escuro chamado Vivi.
124
+
125
+ Descrição de Paula: {lora_models['Paula']['character_desc']}
126
+ Descrição de Vivi: {lora_models['Vivi']['character_desc']}
127
+
128
  Seu prompt deve ser detalhado, claro e deve enfatizar a presença dos DOIS personagens na mesma cena.
129
+ IMPORTANTE: Mencione AMBOS os personagens de forma clara e distinta, enfatizando suas diferenças (homem/mulher, cabelo escuro/loiro).
130
+
131
  Responda APENAS com o prompt otimizado em inglês, sem explicações ou introduções."""
132
 
133
  # Configuração do cabeçalho e corpo da requisição
 
172
  try:
173
  # Determina o prompt com base na seleção de personagem
174
  if character_option == "Paula":
175
+ instruction = f"""Você é um especialista em criar prompts para modelos de imagem AI.
176
  Traduza e otimize este prompt em português para um prompt em inglês que irá gerar
177
+ uma imagem de uma mulher loira chamada Paula.
178
+
179
+ Descrição de Paula: {lora_models['Paula']['character_desc']}
180
+
181
+ Seu prompt deve ser detalhado, claro e enfatizar características de uma mulher loira.
182
+ Inclua aspectos como: cabelo loiro, características femininas, expressão facial.
183
+
184
  Responda APENAS com o prompt otimizado em inglês, sem explicações ou introduções."""
185
  elif character_option == "Vivi":
186
+ instruction = f"""Você é um especialista em criar prompts para modelos de imagem AI.
187
  Traduza e otimize este prompt em português para um prompt em inglês que irá gerar
188
+ uma imagem de um homem de cabelo escuro chamado Vivi.
189
+
190
+ Descrição de Vivi: {lora_models['Vivi']['character_desc']}
191
+
192
+ Seu prompt deve ser detalhado, claro e enfatizar características masculinas e cabelo escuro.
193
+ Inclua aspectos como: cabelo escuro, características masculinas, expressão facial.
194
+
195
  Responda APENAS com o prompt otimizado em inglês, sem explicações ou introduções."""
196
  else: # both
197
+ instruction = f"""Você é um especialista em criar prompts para modelos de imagem AI.
198
  Traduza e otimize este prompt em português para um prompt em inglês que irá gerar
199
  uma imagem de duas pessoas juntas: uma mulher loira chamada Paula e um homem de cabelo escuro chamado Vivi.
200
+
201
+ Descrição de Paula: {lora_models['Paula']['character_desc']}
202
+ Descrição de Vivi: {lora_models['Vivi']['character_desc']}
203
+
204
  Seu prompt deve ser detalhado, claro e deve enfatizar a presença dos DOIS personagens na mesma cena.
205
+ IMPORTANTE: Mencione AMBOS os personagens de forma clara e distinta, enfatizando suas diferenças (homem/mulher, cabelo escuro/loiro).
206
+
207
  Responda APENAS com o prompt otimizado em inglês, sem explicações ou introduções."""
208
 
209
  # Prepara a requisição para a API do Google Gemini
 
248
  return optimize_with_openai(text, character_option)
249
 
250
  @spaces.GPU(duration=80)
251
+ def run_lora(prompt, cfg_scale, steps, randomize_seed, seed, width, height, lora_option, lora_scale_1, lora_scale_2, lora_balance, ai_option, use_negative_prompt, progress=gr.Progress(track_tqdm=True)):
252
  if randomize_seed:
253
  seed = random.randint(0, MAX_SEED)
254
  generator = torch.Generator(device="cuda").manual_seed(seed)
 
279
  # Define qual LoRA usar com base na seleção do usuário
280
  selected_loras = []
281
  adapter_weights = []
282
+ negative_prompt = ""
283
 
284
+ # Modificado para melhorar a caracterização de personagens
285
  if lora_option == "Paula":
286
  selected_loras.append("Paula")
287
  adapter_weights.append(lora_scale_1)
288
+ # Adiciona mais ênfase no personagem e suas características
289
+ prompt = f"{lora_models['Paula']['trigger_word']}, {lora_models['Paula']['character_desc']}, {prompt}"
290
+ if use_negative_prompt:
291
+ negative_prompt = lora_models['Paula']['negative_word']
292
 
293
  elif lora_option == "Vivi":
294
  selected_loras.append("Vivi")
295
  adapter_weights.append(lora_scale_2)
296
+ # Adiciona mais ênfase no personagem e suas características
297
+ prompt = f"{lora_models['Vivi']['trigger_word']}, {lora_models['Vivi']['character_desc']}, {prompt}"
298
+ if use_negative_prompt:
299
+ negative_prompt = lora_models['Vivi']['negative_word']
300
 
301
  elif lora_option == "Ambos":
302
  # Usa o balance slider para ajustar a proporção entre os dois LoRAs
 
306
  selected_loras = ["Paula", "Vivi"]
307
  adapter_weights = [p_weight, v_weight]
308
 
309
+ # Quando usando ambos, adiciona descrições mais explícitas para cada personagem
310
+ prompt = f"{lora_models['Paula']['trigger_word']} and {lora_models['Vivi']['trigger_word']} together, side by side, a blonde woman and a dark-haired man, {prompt}"
 
311
 
312
  pipe.set_adapters(selected_loras, adapter_weights)
313
+
314
+ # Adiciona log para depuração
315
+ logger.info(f"Prompt Final: {prompt}")
316
+ logger.info(f"Negative Prompt: {negative_prompt}")
317
+ logger.info(f"LoRA selecionado: {lora_option}, Pesos: {adapter_weights}")
318
 
319
  # Gera a imagem com precisão de 16 bits
320
  with torch.autocast("cuda"):
321
  image = pipe(
322
  prompt=prompt,
323
+ negative_prompt=negative_prompt,
324
  num_inference_steps=steps,
325
  guidance_scale=cfg_scale,
326
  width=width,
 
348
  "prompt": original_prompt, # Salva o prompt original
349
  "processed_prompt": processed_prompt, # Salva o prompt processado pela IA
350
  "full_prompt": prompt, # Salva o prompt completo com trigger words
351
+ "negative_prompt": negative_prompt,
352
  "ai_option": ai_option,
353
  "cfg_scale": cfg_scale,
354
  "steps": steps,
 
382
  generate_button = gr.Button("Gerar")
383
 
384
  with gr.Accordion("Configurações Básicas", open=True):
385
+ cfg_scale = gr.Slider(label="CFG Scale", minimum=1, maximum=20, step=0.5, value=7.5)
386
+ steps = gr.Slider(label="Steps", minimum=1, maximum=100, step=1, value=30)
387
  width = gr.Slider(label="Width", minimum=256, maximum=1024, step=64, value=768)
388
  height = gr.Slider(label="Height", minimum=256, maximum=1024, step=64, value=1024)
389
  randomize_seed = gr.Checkbox(False, label="Randomize seed")
 
391
 
392
  with gr.Accordion("Configurações de LoRA", open=True):
393
  lora_option = gr.Radio(["Nenhum", "Paula", "Vivi", "Ambos"], label="Escolha o LoRA", value="Ambos")
394
+ lora_scale_1 = gr.Slider(label="LoRA Scale (Paula)", minimum=0, maximum=1, step=0.01, value=0.85)
395
+ lora_scale_2 = gr.Slider(label="LoRA Scale (Vivi)", minimum=0, maximum=1, step=0.01, value=0.85)
396
  lora_balance = gr.Slider(label="Balanço entre personagens", minimum=0.5, maximum=1.5, step=0.05, value=1.0,
397
  info="Valores acima de 1.0 favorecem Paula, abaixo de 1.0 favorecem Vivi")
398
+ use_negative_prompt = gr.Checkbox(True, label="Usar negative prompt", info="Ajuda a evitar mistura de características")
399
 
400
  with gr.Accordion("Processamento de Prompt", open=True):
401
  ai_option = gr.Radio(
 
408
  result = gr.Image(label="Generated Image")
409
  final_prompt = gr.Textbox(label="Prompt Final (usado para gerar a imagem)", lines=3)
410
  gr.Markdown("""
411
+ ### Como melhorar a identidade de cada personagem:
412
+
413
+ 1. **Para apenas Paula (mulher loira)**:
414
+ - Use CFG Scale mais alto (7-9)
415
+ - LoRA Scale para Paula em 0.85-0.95
416
+ - Mantenha o "Usar negative prompt" ativado
417
+ - Mencione explicitamente "mulher loira" no prompt
418
+
419
+ 2. **Para apenas Vivi (homem de cabelo escuro)**:
420
+ - Use CFG Scale mais alto (7-9)
421
+ - LoRA Scale para Vivi em 0.85-0.95
422
+ - Mantenha o "Usar negative prompt" ativado
423
+ - Mencione explicitamente "homem de cabelo escuro" no prompt
424
 
425
+ 3. **Para ambos juntos**:
426
+ - Use o modo "Ambos" com valores iguais para os dois LoRAs
427
+ - Descreva claramente uma "mulher loira e um homem de cabelo escuro" no prompt
428
+ - Use uma seed que funcione bem (teste várias)
429
+ - Um CFG Scale entre 7-8 costuma dar bons resultados
430
+ - Especifique que eles estão "lado a lado" ou "juntos na mesma cena"
 
431
  """)
432
 
433
  generate_button.click(
434
  run_lora,
435
+ inputs=[prompt, cfg_scale, steps, randomize_seed, seed, width, height, lora_option, lora_scale_1, lora_scale_2, lora_balance, ai_option, use_negative_prompt],
436
  outputs=[result, seed, final_prompt],
437
  )
438