Spaces:
vcollos
/
Runtime error

vcollos commited on
Commit
aa48c1d
·
verified ·
1 Parent(s): 41a58f3

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +4 -114
app.py CHANGED
@@ -1,80 +1,3 @@
1
- import spaces
2
- import gradio as gr
3
- import torch
4
- from PIL import Image
5
- from diffusers import DiffusionPipeline
6
- import random
7
- import os
8
- import json
9
- import io
10
- import uuid
11
- from gradio_client import Client as client_gradio
12
- from supabase import create_client, Client
13
- from datetime import datetime
14
-
15
- # Inicializa Supabase
16
- url: str = os.getenv('SUPABASE_URL')
17
- key: str = os.getenv('SUPABASE_KEY')
18
- supabase: Client = create_client(url, key)
19
-
20
- # Obtém token da Hugging Face
21
- hf_token = os.getenv("HF_TOKEN")
22
-
23
- # Inicializa o modelo base FLUX.1-dev
24
- base_model = "black-forest-labs/FLUX.1-dev"
25
- pipe = DiffusionPipeline.from_pretrained(
26
- base_model,
27
- torch_dtype=torch.float16, # Pode testar torch.float32 se a GPU permitir
28
- use_safetensors=True
29
- )
30
-
31
- # Move o modelo para GPU
32
- pipe.to("cuda")
33
-
34
- # Definição dos LoRA e Trigger Words
35
- lora_models = {
36
- "Paula": {
37
- "repo": "vcollos/Paula2",
38
- "weights": "Paula P.safetensors",
39
- "trigger_word": "" # Sem trigger word específica
40
- },
41
- "Vivi": {
42
- "repo": "vcollos/Vivi",
43
- "weights": "Vivi.safetensors",
44
- "trigger_word": ""
45
- }
46
- }
47
-
48
- # Carrega os LoRAs disponíveis
49
- for name, details in lora_models.items():
50
- try:
51
- pipe.load_lora_weights(details["repo"], weight_name=details["weights"], adapter_name=name)
52
- print(f"✅ LoRA {name} carregado")
53
- except Exception as e:
54
- print(f"❌ Erro ao carregar o LoRA {name}: {e}")
55
-
56
- # Define seed máximo
57
- MAX_SEED = 2**32 - 1
58
-
59
- def upload_image_to_supabase(image, filename):
60
- """ Faz upload da imagem para o Supabase Storage e retorna a URL pública. """
61
- img_bytes = io.BytesIO()
62
- image.save(img_bytes, format="PNG")
63
- img_bytes.seek(0) # Move para o início do arquivo
64
-
65
- storage_path = f"images/{filename}"
66
-
67
- try:
68
- # Faz upload da imagem para o Supabase
69
- supabase.storage.from_("images").upload(storage_path, img_bytes.getvalue(), {"content-type": "image/png"})
70
-
71
- # Retorna a URL pública da imagem
72
- base_url = f"{url}/storage/v1/object/public/images"
73
- return f"{base_url}/{filename}"
74
- except Exception as e:
75
- print(f"❌ Erro no upload da imagem: {e}")
76
- return None
77
-
78
  @spaces.GPU(duration=80)
79
  def run_lora(prompt, cfg_scale, steps, randomize_seed, seed, width, height, lora_option, lora_scale_1, lora_scale_2, progress=gr.Progress(track_tqdm=True)):
80
  if randomize_seed:
@@ -97,14 +20,12 @@ def run_lora(prompt, cfg_scale, steps, randomize_seed, seed, width, height, lora
97
  adapter_weights.append(lora_scale_2)
98
  elif lora_option == "Ambos":
99
  selected_loras = ["Paula", "Vivi"]
100
- adapter_weights = [lora_scale_1, lora_scale_2]
 
 
101
 
102
  pipe.set_adapters(selected_loras, adapter_weights)
103
 
104
- # Adiciona trigger words apenas se Vivi estiver ativado
105
- if "Vivi" in selected_loras:
106
- prompt = f"{lora_models['Vivi']['trigger_word']} {prompt}"
107
-
108
  # Gera a imagem com precisão de 16 bits para tentar melhorar a nitidez
109
  with torch.autocast("cuda"):
110
  image = pipe(
@@ -152,35 +73,4 @@ def run_lora(prompt, cfg_scale, steps, randomize_seed, seed, width, height, lora
152
  except Exception as e:
153
  print(f"❌ Erro ao salvar metadados no Supabase: {e}")
154
 
155
- return image, seed
156
-
157
- # Interface Gradio
158
- gr_theme = os.getenv("THEME")
159
- with gr.Blocks(theme=gr_theme) as app:
160
- gr.Markdown("# Paula Image Generator")
161
-
162
- with gr.Row():
163
- with gr.Column(scale=2):
164
- prompt = gr.TextArea(label="Prompt", placeholder="Digite um prompt (máx 77 caracteres)", lines=3)
165
- generate_button = gr.Button("Gerar")
166
- cfg_scale = gr.Slider(label="CFG Scale", minimum=1, maximum=20, step=0.5, value=3.5)
167
- steps = gr.Slider(label="Steps", minimum=1, maximum=100, step=1, value=32)
168
- width = gr.Slider(label="Width", minimum=256, maximum=1024, step=64, value=768)
169
- height = gr.Slider(label="Height", minimum=256, maximum=1024, step=64, value=1024)
170
- randomize_seed = gr.Checkbox(False, label="Randomize seed")
171
- seed = gr.Slider(label="Seed", minimum=0, maximum=MAX_SEED, step=1, value=556215326)
172
- lora_option = gr.Radio(["Nenhum", "Paula", "Vivi", "Ambos"], label="Escolha o LoRA", value="Ambos")
173
- lora_scale_1 = gr.Slider(label="LoRA Scale (Paula)", minimum=0, maximum=1, step=0.01, value=1)
174
- lora_scale_2 = gr.Slider(label="LoRA Scale (Vivi)", minimum=0, maximum=1, step=0.01, value=1)
175
-
176
- with gr.Column(scale=2):
177
- result = gr.Image(label="Generated Image")
178
-
179
- generate_button.click(
180
- run_lora,
181
- inputs=[prompt, cfg_scale, steps, randomize_seed, seed, width, height, lora_option, lora_scale_1, lora_scale_2],
182
- outputs=[result, seed],
183
- )
184
-
185
- app.queue()
186
- app.launch(share=True)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  @spaces.GPU(duration=80)
2
  def run_lora(prompt, cfg_scale, steps, randomize_seed, seed, width, height, lora_option, lora_scale_1, lora_scale_2, progress=gr.Progress(track_tqdm=True)):
3
  if randomize_seed:
 
20
  adapter_weights.append(lora_scale_2)
21
  elif lora_option == "Ambos":
22
  selected_loras = ["Paula", "Vivi"]
23
+ # Ajusta os pesos para garantir equilíbrio
24
+ total_scale = lora_scale_1 + lora_scale_2
25
+ adapter_weights = [lora_scale_1 / total_scale, lora_scale_2 / total_scale]
26
 
27
  pipe.set_adapters(selected_loras, adapter_weights)
28
 
 
 
 
 
29
  # Gera a imagem com precisão de 16 bits para tentar melhorar a nitidez
30
  with torch.autocast("cuda"):
31
  image = pipe(
 
73
  except Exception as e:
74
  print(f"❌ Erro ao salvar metadados no Supabase: {e}")
75
 
76
+ return image, seed