vcollos commited on
Commit
3571587
·
verified ·
1 Parent(s): 837cd8a

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +39 -36
app.py CHANGED
@@ -52,35 +52,40 @@ for name, details in lora_models.items():
52
  MAX_SEED = 2**32 - 1
53
 
54
  def upload_image_to_supabase(image, filename):
55
- """ Faz upload da imagem gerada para o Supabase Storage e retorna a URL pública. """
56
  img_bytes = io.BytesIO()
57
  image.save(img_bytes, format="PNG")
58
- img_bytes.seek(0)
59
 
60
  storage_path = f"images/{filename}"
61
- response = supabase.storage.from_("images").upload(storage_path, img_bytes, {"content-type": "image/png"})
62
 
63
- if response.get("error"):
64
- raise Exception(f"Erro ao salvar no Supabase: {response['error']}")
65
-
66
- base_url = f"{url}/storage/v1/object/public/images"
67
- return f"{base_url}/{filename}"
 
 
 
 
 
 
 
68
 
69
  @spaces.GPU(duration=80)
70
- def run_lora(prompt, cfg_scale, steps, randomize_seed, seed, width, height, lora_scale_1, lora_scale_2, selected_lora, progress=gr.Progress(track_tqdm=True)):
71
- # Define uma seed aleatória se necessário
72
  if randomize_seed:
73
  seed = random.randint(0, MAX_SEED)
74
  generator = torch.Generator(device="cuda").manual_seed(seed)
75
 
76
- # Aplica os adaptadores LoRA corretamente
77
- pipe.set_adapters([selected_lora], adapter_weights=[1.0])
78
 
79
- # Adiciona o trigger word automaticamente se necessário
80
- if selected_lora in lora_models and lora_models[selected_lora]["trigger_word"]:
81
- prompt = f"{lora_models[selected_lora]['trigger_word']} {prompt}"
82
 
83
- # Gera a imagem com o modelo
84
  image = pipe(
85
  prompt=prompt,
86
  num_inference_steps=steps,
@@ -93,7 +98,6 @@ def run_lora(prompt, cfg_scale, steps, randomize_seed, seed, width, height, lora
93
  # Define um nome único para a imagem
94
  filename = f"image_{seed}_{datetime.utcnow().strftime('%Y%m%d%H%M%S')}.png"
95
 
96
- # Faz upload da imagem para o Supabase Storage
97
  try:
98
  image_url = upload_image_to_supabase(image, filename)
99
  print(f"✅ Imagem salva no Supabase: {image_url}")
@@ -101,16 +105,17 @@ def run_lora(prompt, cfg_scale, steps, randomize_seed, seed, width, height, lora
101
  print(f"❌ Erro ao fazer upload da imagem: {e}")
102
  image_url = None
103
 
104
- # Salva os metadados no banco de dados Supabase
105
- supabase.table("images").insert({
106
- "prompt": prompt,
107
- "cfg_scale": cfg_scale,
108
- "steps": steps,
109
- "seed": seed,
110
- "lora_scale_1": lora_scale_1,
111
- "lora_scale_2": lora_scale_2,
112
- "image_url": image_url
113
- }).execute()
 
114
 
115
  return image, seed
116
 
@@ -120,30 +125,28 @@ with gr.Blocks(theme=gr_theme) as app:
120
  gr.Markdown("# Androflux Image Generator")
121
 
122
  with gr.Row():
123
- with gr.Column(scale=2):
124
  prompt = gr.TextArea(label="Prompt", placeholder="Digite um prompt (máx 77 caracteres)", lines=3)
125
  generate_button = gr.Button("Gerar")
126
  cfg_scale = gr.Slider(label="CFG Scale", minimum=1, maximum=20, step=0.5, value=3.5)
127
  steps = gr.Slider(label="Steps", minimum=1, maximum=100, step=1, value=25)
128
  width = gr.Slider(label="Width", minimum=256, maximum=1024, step=64, value=768)
129
- height = gr.Slider(label="Height", minimum=256, maximum=1024, step=64, value=1024)
130
  randomize_seed = gr.Checkbox(False, label="Randomize seed")
131
  seed = gr.Slider(label="Seed", minimum=0, maximum=MAX_SEED, step=1, value=556215326)
132
 
133
- # 🔥 Certificando que os sliders estão dentro do bloco correto
134
- lora_scale_1 = gr.Slider(label="LoRA Scale (AndroFlux)", minimum=0, maximum=1, step=0.01, value=0.5)
135
  lora_scale_2 = gr.Slider(label="LoRA Scale (VitorCollos)", minimum=0, maximum=1, step=0.01, value=1)
136
 
137
- selected_lora = gr.Dropdown(label="Selecionar LoRA", choices=["AndroFlux", "VitorCollos"], value="AndroFlux")
138
-
139
- with gr.Column(scale=2):
140
  result = gr.Image(label="Generated Image")
141
  gr.Markdown("Gere imagens usando Androflux LoRA e um prompt de texto.")
142
 
143
- # 🔥 Agora os sliders são usados corretamente
144
  generate_button.click(
145
  run_lora,
146
- inputs=[prompt, cfg_scale, steps, randomize_seed, seed, width, height, lora_scale_1, lora_scale_2, selected_lora],
147
  outputs=[result, seed],
148
  )
149
 
 
52
  MAX_SEED = 2**32 - 1
53
 
54
  def upload_image_to_supabase(image, filename):
55
+ """ Faz upload da imagem para o Supabase Storage e retorna a URL pública. """
56
  img_bytes = io.BytesIO()
57
  image.save(img_bytes, format="PNG")
58
+ img_bytes.seek(0) # Move para o início do arquivo
59
 
60
  storage_path = f"images/{filename}"
 
61
 
62
+ try:
63
+ # Agora passando os bytes corretamente para o upload
64
+ response = supabase.storage.from_("images").upload(storage_path, img_bytes.getvalue(), {"content-type": "image/png"})
65
+
66
+ if response.get("error"):
67
+ raise Exception(f"Erro ao salvar no Supabase: {response['error']}")
68
+
69
+ base_url = f"{url}/storage/v1/object/public/images"
70
+ return f"{base_url}/{filename}"
71
+ except Exception as e:
72
+ print(f"❌ Erro no upload da imagem: {e}")
73
+ return None
74
 
75
  @spaces.GPU(duration=80)
76
+ def run_lora(prompt, cfg_scale, steps, randomize_seed, seed, width, height, lora_scale_1, lora_scale_2, progress=gr.Progress(track_tqdm=True)):
 
77
  if randomize_seed:
78
  seed = random.randint(0, MAX_SEED)
79
  generator = torch.Generator(device="cuda").manual_seed(seed)
80
 
81
+ # Aplica os dois LoRAs combinados
82
+ pipe.set_adapters(["AndroFlux", "VitorCollos"], adapter_weights=[lora_scale_1, lora_scale_2])
83
 
84
+ # Adiciona trigger words apenas se VitorCollos estiver ativado
85
+ if lora_scale_2 > 0:
86
+ prompt = f"{lora_models['VitorCollos']['trigger_word']} {prompt}"
87
 
88
+ # Gera a imagem
89
  image = pipe(
90
  prompt=prompt,
91
  num_inference_steps=steps,
 
98
  # Define um nome único para a imagem
99
  filename = f"image_{seed}_{datetime.utcnow().strftime('%Y%m%d%H%M%S')}.png"
100
 
 
101
  try:
102
  image_url = upload_image_to_supabase(image, filename)
103
  print(f"✅ Imagem salva no Supabase: {image_url}")
 
105
  print(f"❌ Erro ao fazer upload da imagem: {e}")
106
  image_url = None
107
 
108
+ # Salva os metadados no banco de dados Supabase apenas se `image_url` for válido
109
+ if image_url:
110
+ supabase.table("images").insert({
111
+ "prompt": prompt,
112
+ "cfg_scale": cfg_scale,
113
+ "steps": steps,
114
+ "seed": seed,
115
+ "lora_scale_1": lora_scale_1,
116
+ "lora_scale_2": lora_scale_2,
117
+ "image_url": image_url
118
+ }).execute()
119
 
120
  return image, seed
121
 
 
125
  gr.Markdown("# Androflux Image Generator")
126
 
127
  with gr.Row():
128
+ with gr.Column(scale=3):
129
  prompt = gr.TextArea(label="Prompt", placeholder="Digite um prompt (máx 77 caracteres)", lines=3)
130
  generate_button = gr.Button("Gerar")
131
  cfg_scale = gr.Slider(label="CFG Scale", minimum=1, maximum=20, step=0.5, value=3.5)
132
  steps = gr.Slider(label="Steps", minimum=1, maximum=100, step=1, value=25)
133
  width = gr.Slider(label="Width", minimum=256, maximum=1024, step=64, value=768)
134
+ height = gr.Slider(label="Height", minimum=256, maximum=1024, step=64, value=768)
135
  randomize_seed = gr.Checkbox(False, label="Randomize seed")
136
  seed = gr.Slider(label="Seed", minimum=0, maximum=MAX_SEED, step=1, value=556215326)
137
 
138
+ # Sliders para os pesos dos LoRAs
139
+ lora_scale_1 = gr.Slider(label="LoRA Scale (AndroFlux)", minimum=0, maximum=1, step=0.01, value=0.7)
140
  lora_scale_2 = gr.Slider(label="LoRA Scale (VitorCollos)", minimum=0, maximum=1, step=0.01, value=1)
141
 
142
+ with gr.Column(scale=1):
 
 
143
  result = gr.Image(label="Generated Image")
144
  gr.Markdown("Gere imagens usando Androflux LoRA e um prompt de texto.")
145
 
146
+ # Botão para gerar imagem combinando os LoRAs
147
  generate_button.click(
148
  run_lora,
149
+ inputs=[prompt, cfg_scale, steps, randomize_seed, seed, width, height, lora_scale_1, lora_scale_2],
150
  outputs=[result, seed],
151
  )
152