Update app.py
Browse files
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": "
|
|
|
|
|
50 |
},
|
51 |
"Vivi": {
|
52 |
"repo": "vcollos/Vivi",
|
53 |
"weights": "Vivi.safetensors",
|
54 |
-
"trigger_word": "
|
|
|
|
|
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.
|
98 |
-
|
|
|
|
|
|
|
|
|
|
|
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.
|
104 |
-
|
|
|
|
|
|
|
|
|
|
|
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.
|
158 |
-
|
|
|
|
|
|
|
|
|
|
|
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.
|
164 |
-
|
|
|
|
|
|
|
|
|
|
|
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
|
248 |
if lora_option == "Paula":
|
249 |
selected_loras.append("Paula")
|
250 |
adapter_weights.append(lora_scale_1)
|
251 |
-
|
|
|
|
|
|
|
252 |
|
253 |
elif lora_option == "Vivi":
|
254 |
selected_loras.append("Vivi")
|
255 |
adapter_weights.append(lora_scale_2)
|
256 |
-
|
|
|
|
|
|
|
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
|
267 |
-
|
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=
|
337 |
-
steps = gr.Slider(label="Steps", minimum=1, maximum=100, step=1, value=
|
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.
|
346 |
-
lora_scale_2 = gr.Slider(label="LoRA Scale (Vivi)", minimum=0, maximum=1, step=0.01, value=0.
|
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
|
362 |
-
|
363 |
-
|
364 |
-
|
365 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
366 |
|
367 |
-
|
368 |
-
|
369 |
-
|
370 |
-
|
371 |
-
|
372 |
-
|
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 |
|