rossiaSDASFASa commited on
Commit
0c6331e
·
verified ·
1 Parent(s): 143804e

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +324 -0
app.py ADDED
@@ -0,0 +1,324 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ importare il sistema operativo
2
+ importa casuale
3
+ importa sys
4
+ dalla digitazione import Sequenza , Mappatura, Qualsiasi , Unione
5
+ torcia di importazione
6
+ importa gradio come gr
7
+ da PIL importa Immagine
8
+ importa numpy come np
9
+ da huggingface_hub importa hf_hub_download
10
+ spazi di importazione
11
+ da comfy import model_management
12
+
13
+ CHROMA_VERSION = "chroma-unlocked-v34.safetensors"
14
+
15
+ # Scarica i modelli richiesti
16
+ t5_path = hf_hub_download(repo_id= "comfyanonymous/flux_text_encoders" , filename= "t5xxl_fp8_e4m3fn.safetensors" , local_dir= "modelli/text_encoders/" )
17
+ vae_path = hf_hub_download(repo_id= "lodestones/Chroma" , filename= "ae.safetensors" , local_dir= "modelli/vae" )
18
+ unet_path = hf_hub_download(repo_id= "lodestones/Chroma" , filename=CHROMA_VERSION, local_dir= "modelli/unet" )
19
+
20
+ # Esempi di prompt con i relativi parametri
21
+ ESEMPI = [
22
+ [
23
+ Un ritratto ravvicinato di alta moda di una donna bionda con occhiali da sole trasparenti. L'immagine utilizza una decisa combinazione di verde acqua e rosso per un'illuminazione spettacolare. Lo sfondo è un semplice verde acqua. La foto è nitida e ben composta, ed è progettata per la visualizzazione con occhiali 3D anaglifici per un effetto ottimale. Sembra realizzata da un professionista .
24
+ "bassa qualità, brutto, incompiuto, sfocato, deformato, sfigurato, sfocato, macchiato, tavolozza limitata, colori piatti" ,
25
+ 1024 , 1024 , 36 , 3.0 , 229
26
+ ],
27
+ [
28
+ Un giovane sorride ampiamente mentre indossa un cappello da capitano blu e occhiali da sole aviator blu a specchio. L'uomo è il fulcro dell'immagine, su uno sfondo di lungomare piacevolmente sfocato con barche ed edifici. Lo scatto è allegro, giocoso e dall'aspetto amatoriale.
29
+ "bassa qualità, brutto, incompiuto, sfocato, deformato, sfigurato, sfocato, macchiato, tavolozza limitata, colori piatti" ,
30
+ 1024 , 1024 , 40 , 2.1 , 424
31
+ ],
32
+ [
33
+ Uno Shiba Inu sorride ampiamente mentre indossa un cappello da capitano blu e occhiali da sole aviatore blu a specchio. Il cane è il fulcro dell'immagine, su uno sfondo di lungomare piacevolmente sfocato con barche ed edifici. Lo scatto è allegro, giocoso e dall'aspetto amatoriale.
34
+ "bassa qualità, brutto, incompiuto, sfocato, deformato, sfigurato, sfocato, macchiato, tavolozza limitata, colori piatti" ,
35
+ 1024 , 1024 , 28 , 2.9 , 413
36
+ ],
37
+ [
38
+ Un dipinto raffigura un uomo barbuto con una camicia beige che stringe una cima su una barca a vela, mentre affronta mari agitati sotto un tramonto spettacolare. Un'altra figura appare sullo sfondo in lontananza, e lo stile è impressionista, con pennellate nitide e grande maestria. L'effetto complessivo è di avventura e libertà .
39
+ "bassa qualità, brutto, incompiuto, sfocato, deformato, sfigurato, sfocato, macchiato, tavolozza limitata, colori piatti" ,
40
+ 1024 , 1024 , 33 , 4.6 , 281
41
+ ],
42
+ [
43
+ Un dipinto mostra un lupo maschio antropomorfo seduto su una roccia in una foresta, antropomorfo, maschio, solitario, canino, canide, lupo mannaro, antropomorfo muscoloso, corpo nero, pelliccia nera, che allunga le zampe verso l'osservatore, sfondo dettagliato, esterno. La scena è dettagliata, con una ridotta profondità di campo che si concentra sul lupo antropomorfo. L'effetto generale è fantasy e cinematografico .
44
+ "bassa qualità, brutto, incompiuto, sfocato, deformato, sfigurato, sfocato, macchiato, tavolozza limitata, colori piatti" ,
45
+ 1024 , 1024 , 26 , 3,8 , 326
46
+ ],
47
+ [
48
+ "Una simpatica illustrazione in stile cartoon di un enorme drago nero con ali che riproducono galassie cosmiche, seduto in cima a un castello che domina una città portuale medievale al tramonto. Lo stile è luminoso e dai toni pastello, con linee morbide. L'opera è pulita e piuttosto ben realizzata. "
49
+ "bassa qualità, brutto, incompiuto, sfocato, deformato, sfigurato, sfocato, macchiato, tavolozza limitata, colori piatti" ,
50
+ 1024 , 1024 , 41 , 5.7 , 244
51
+ ],
52
+ [
53
+ Un cane maschio antropomorfo a pelo lungo, con una macchia bianca sul petto e brillanti occhi giallo-verdi, è seduto su un'isola grigio chiaro della cucina in un appartamento di New York inondato di sole. La vista della città è sfocata, mostrando una ridotta profondità di campo . Il gatto ha un collare scuro con un piccolo campanellino. L'estetica della foto è pulita, moderna e leggermente drammatica grazie all'illuminazione.
54
+ "bassa qualità, brutto, incompiuto, sfocato, deformato, sfigurato, sfocato, macchiato, tavolozza limitata, colori piatti" ,
55
+ 1024 , 1024 , 26 , 4.7 , 242
56
+ ],
57
+ [
58
+ Un allegro collage mostra 4 gechi leopardo, ognuno in un riquadro separato. I gechi variano per colore e motivo, ma sono tutti ritratti in primo piano e con lo sguardo rivolto direttamente alla fotocamera. Gli sfondi sono diversi, illustrando vari elementi del terrario e superfici semplici. Scatti di alta qualità, illuminazione brillante, qualità fotografica amatoriale. L'estetica generale è semplice e commovente .
59
+ "bassa qualità, brutto, incompiuto, sfocato, deformato, sfigurato, sfocato, macchiato, tavolozza limitata, colori piatti" ,
60
+ 1024 , 1024 , 26 , 4.7 , 249
61
+ ],
62
+ [
63
+ Un allegro collage presenta 4 simpatici peluche di Nick Wilde, raffiguranti il ​​lupo antropomorfo, ognuno in un quadrato separato. Gli sfondi sono diversi, raffigurando vari letti e superfici semplici. Scatti di alta qualità, illuminazione brillante, qualità fotografica amatoriale. L'estetica generale è semplice e commovente .
64
+ "bassa qualità, brutto, incompiuto, sfocato, deformato, sfigurato, sfocato, macchiato, tavolozza limitata, colori piatti" ,
65
+ 1024 , 1024 , 26 , 5.4 , 263
66
+ ],
67
+ [
68
+ "questa immagine raffigura un adesivo di un telegramma con spessi contorni bianchi di una volpe antropomorfa maschio" ,
69
+ "bassa qualità, brutto, incompiuto, sfocato, deformato, sfigurato, sfocato, macchiato, tavolozza limitata, colori piatti" ,
70
+ 1024 , 1024 , 28 , 3.9 , 399
71
+ ],
72
+ [
73
+ "Estremamente ravvicinato di un singolo occhio di tigre, vista frontale diretta. Iride e pupilla dettagliate. Messa a fuoco nitida sulla texture e sul colore dell'occhio. Illuminazione naturale per catturare la brillantezza e la profondità autentiche degli occhi. La parola "Chroma" è dipinta sopra con grandi pennellate bianche con texture visibile. "
74
+ "bassa qualità, brutto, incompiuto, sfocato, deformato, sfigurato, sfocato, macchiato, tavolozza limitata, colori piatti" ,
75
+ 1024 , 1024 , 26 , 4.0 , 9
76
+ ]
77
+ ]
78
+
79
+ # Funzioni di utilità
80
+ def get_value_at_index ( obj: Unione [ Sequenza , Mappatura], indice: int ) -> Qualsiasi :
81
+ Tentativo :
82
+ restituisci obj[indice]
83
+ eccetto KeyError:
84
+ restituisci obj[ "risultato" ][indice]
85
+
86
+ def find_path ( nome: str , percorso: str = Nessuno ) -> str :
87
+ se il percorso è Nessuno :
88
+ percorso = os.getcwd()
89
+ se il nome è in os.listdir(percorso):
90
+ path_name = os.path.join(percorso, nome)
91
+ stampa ( f" {nome} trovato: {nome_percorso} " )
92
+ restituisci il percorso
93
+ directory_genitore = os.path.dirname(percorso)
94
+ se parent_directory == percorso:
95
+ restituisci Nessuno
96
+ restituisci find_path(nome, directory_padre)
97
+
98
+ def add_comfyui_directory_to_sys_path () -> Nessuno :
99
+ comfyui_path = find_path( "ComfyUI" )
100
+ se comfyui_path non è None e os.path.isdir(comfyui_path):
101
+ sys.path.append(comfyui_path)
102
+ stampa ( f"' {comfyui_path} ' aggiunto a sys.path" )
103
+
104
+ def add_extra_model_paths () -> Nessuno :
105
+ Tentativo :
106
+ dall'importazione principale load_extra_path_config​
107
+ eccetto ImportError:
108
+ da utils.extra_config importa load_extra_path_config
109
+ percorsi_modello_extra = trova_percorso( "percorsi_modello_extra.yaml" )
110
+ se extra_model_paths non è None :
111
+ carica_configurazione_percorso_extra(percorsi_modello_extra)
112
+ altro :
113
+ print ( "Impossibile trovare il file di configurazione extra_model_paths." )
114
+
115
+ def import_custom_nodes () -> Nessuno :
116
+ importa asyncio
117
+ esecuzione dell'importazione
118
+ da nodi importa init_extra_nodes
119
+ server di importazione
120
+ ciclo = asyncio.new_event_loop()
121
+ asyncio.set_event_loop(ciclo)
122
+ istanza_server = server.PromptServer(ciclo)
123
+ esecuzione.PromptQueue(istanza_server)
124
+ init_extra_nodes()
125
+
126
+ # Inizializza i percorsi
127
+ aggiungi_directory_comfyui_al_percorso_di_sistema()
128
+ aggiungi_percorsi_modello_extra()
129
+ importa_nodi_personalizzati()
130
+
131
+ # Importa tutti i nodi necessari
132
+ da nodi importa (
133
+ NODE_CLASS_MAPPINGS,
134
+ CLIPTextEncode,
135
+ CLIPLader,
136
+ VAEDecode,
137
+ Caricatore UNET,
138
+ VAELoader,
139
+ SalvaImmagine,
140
+ )
141
+
142
+ # Inizializza tutti i caricatori di modelli al di fuori della funzione
143
+ rumore casuale = NODE_CLASS_MAPPINGS[ "Rumore casuale" ]()
144
+ emptysd3latentimage = NODE_CLASS_MAPPINGS[ "EmptySD3LatentImage" ]()
145
+ ksamplerselect = NODE_CLASS_MAPPINGS[ "KSamplerSelect" ]()
146
+ caricatore di clip = CLIPLoader()
147
+ t5tokenizeroptions = NODE_CLASS_MAPPINGS[ "T5TokenizerOptions" ]()
148
+ cliptextencode = CLIPTextEncode()
149
+ unetloader = UNETLoader()
150
+ vaeloader = VAELoader()
151
+ cfgguider = NODE_CLASS_MAPPINGS[ "CFGGuider" ]()
152
+ basicscheduler = NODE_CLASS_MAPPINGS[ "BasicScheduler" ]()
153
+ samplercustomadvanced = NODE_CLASS_MAPPINGS[ "SamplerCustomAdvanced" ]()
154
+ vaedecode = VAEDecode()
155
+ salvaimmagine = SalvaImmagine()
156
+
157
+ # Modelli di carico
158
+ cliploader_78 = cliploader.load_clip(
159
+ clip_name= "t5xxl_fp8_e4m3fn.safetensors" , tipo = "chroma" , dispositivo = "predefinito"
160
+ )
161
+ t5tokenizeroptions_82 = t5tokenizeroptions.set_options(
162
+ min_padding= 1 , min_length= 0 , clip=get_value_at_index(cliploader_78, 0 )
163
+ )
164
+ unetloader_76 = unetloader.load_unet(
165
+ unet_name=VERSIONE_CROMATICA, weight_dtype= "fp8_e4m3fn"
166
+ )
167
+ vaeloader_80 = vaeloader.load_vae(vae_name= "ae.safetensors" )
168
+
169
+ # Aggiungi tutti i modelli che caricano un file safetensors
170
+ caricatori_modello = [cliploader_78, unetloader_76, vaeloader_80]
171
+
172
+ # Controlla quali modelli sono validi e come caricarli al meglio
173
+ modelli_validi = [
174
+ getattr (caricatore[ 0 ], 'patcher' , caricatore[ 0 ])
175
+ per il caricatore in model_loaders
176
+ se non è isinstance (loader[ 0 ], dict ) e non è isinstance ( getattr (loader[ 0 ], 'patcher' , None ), dict )
177
+ ]
178
+
179
+ # Infine carica i modelli
180
+ gestione_modello.carica_modelli_gpu(modelli_validi)
181
+
182
+ @spazi.GPU
183
+ def generate_image ( prompt, negative_prompt, larghezza, altezza, passaggi, cfg, seed ):
184
+ con torch.inference_mode():
185
+ # Imposta un seme casuale se fornito
186
+ se seme == - 1 :
187
+ seme = random.randint( 1 , 2 ** 64 )
188
+ random.seed(seme)
189
+
190
+ randomnoise_68 = randomnoise.get_noise(noise_seed=seme)
191
+ emptysd3latentimage_69 = emptysd3latentimage.generate(
192
+ larghezza=larghezza, altezza=altezza, dimensione_lotto= 1
193
+ )
194
+ ksamplerselect_72 = ksamplerselect.get_sampler(sampler_name= "euler" )
195
+
196
+ cliptextencode_74 = cliptextencode.encode(
197
+ testo=richiesta,
198
+ clip=ottieni_valore_all'indice(t5tokenizeroptions_82, 0 ),
199
+ )
200
+
201
+ cliptextencode_75 = cliptextencode.encode(
202
+ testo=prompt_negativo,
203
+ clip=ottieni_valore_all'indice(t5tokenizeroptions_82, 0 ),
204
+ )
205
+
206
+ cfgguider_73 = cfgguider.get_guider(
207
+ cfg=cfg,
208
+ modello=ottieni_valore_all'indice(unetloader_76, 0 ),
209
+ positivo=ottieni_valore_all'indice(cliptextencode_74, 0 ),
210
+ negativo=get_value_at_index(cliptextencode_75, 0 ),
211
+ )
212
+
213
+ basicscheduler_84 = basicscheduler.get_sigmas(
214
+ scheduler= "beta" ,
215
+ passi=passi,
216
+ riduzione del rumore = 1 ,
217
+ modello=ottieni_valore_all'indice(unetloader_76, 0 ),
218
+ )
219
+
220
+ samplercustomadvanced_67 = samplercustomadvanced.sample(
221
+ rumore=ottieni_valore_all'indice(rumore_casuale_68, 0 ),
222
+ guider=get_value_at_index(cfgguider_73, 0 ),
223
+ campionatore=ottieni_valore_all'indice(ksamplerselect_72, 0 ),
224
+ sigma=ottieni_valore_all'indice(basicscheduler_84, 0 ),
225
+ latent_image=ottieni_valore_all'indice(emptysd3latentimage_69, 0 ),
226
+ )
227
+
228
+ vaedecode_79 = vaedecode.decode(
229
+ campioni=ottieni_valore_all'indice(campionatorepersonalizzatoavanzato_67, 0 ),
230
+ vae=ottieni_valore_all'indice(vaeloader_80, 0 ),
231
+ )
232
+
233
+ # Salva l'immagine utilizzando il nodo SaveImage con un semplice prefisso di stringa
234
+ salvato = salvaimmagine.salva_immagini(
235
+ prefisso_filename= "Chroma_Generated" ,
236
+ immagini=ottieni_valore_all'indice(vaedecode_79, 0 ),
237
+ )
238
+
239
+ # Restituisce il percorso all'immagine salvata
240
+ saved_path = f"output/ {saved[ 'ui' ][ 'immagini' ][ 0 ][ 'nomefile' ]} "
241
+ restituisci saved_path
242
+
243
+ # Crea l'interfaccia Gradio
244
+ con gr.Blocks() come app:
245
+ gr.Markdown( """
246
+ # Croma
247
+ Modello: [Chroma](https://huggingface.co/lodestones/Chroma) di [lodestones](https://huggingface.co/lodestones)
248
+ Esegui qualsiasi flusso di lavoro ComfyUI su Spaces: [Flussi di lavoro ComfyUI](https://huggingface.co/blog/run-comfyui-workflows-on-spaces)
249
+ Spazio Autore: [GitHub](https://github.com/gokayfem) | [X.com](https://x.com/gokayfem)
250
+ """ )
251
+
252
+ con gr.Row():
253
+ con gr.Column():
254
+ prompt = gr.Textbox(
255
+ etichetta= "Richiesta" ,
256
+ placeholder= "Inserisci qui il tuo messaggio..." ,
257
+ linee= 3
258
+ )
259
+ negative_prompt = gr.Textbox(
260
+ etichetta= "Prompt negativo" ,
261
+ placeholder= "Inserisci qui il prompt negativo..." ,
262
+ valore = "bassa qualità, brutto, incompiuto, sfocato, deformato, sfigurato, sfocato, macchiato, tavolozza limitata, colori piatti" ,
263
+ linee= 2
264
+ )
265
+
266
+ con gr.Row():
267
+ larghezza = gr.Slider(
268
+ minimo= 512 ,
269
+ massimo= 2048 ,
270
+ valore= 1024 ,
271
+ passo= 64 ,
272
+ etichetta= "Larghezza"
273
+ )
274
+ altezza = gr.Slider(
275
+ minimo= 512 ,
276
+ massimo= 2048 ,
277
+ valore= 1024 ,
278
+ passo= 64 ,
279
+ etichetta= "Altezza"
280
+ )
281
+
282
+ con gr.Row():
283
+ passi = gr.Slider(
284
+ minimo= 1 ,
285
+ massimo= 50 ,
286
+ valore= 26 ,
287
+ passo= 1 ,
288
+ etichetta= "Passaggi"
289
+ )
290
+ cfg = gr.Slider(
291
+ minimo= 1 ,
292
+ massimo= 20 ,
293
+ valore= 4 ,
294
+ passo = 0,5 ,
295
+ etichetta= "Scala CFG"
296
+ )
297
+ seme = gr.Numero(
298
+ valore=- 1 ,
299
+ etichetta= "Seme (-1 per casuale)"
300
+ )
301
+
302
+ generate_btn = gr.Button( "Genera" )
303
+
304
+ con gr.Column():
305
+ output_image = gr.Image(label= "Immagine generata" )
306
+
307
+ generate_btn.click(
308
+ fn=genera_immagine,
309
+ input=[prompt, negative_prompt, larghezza, altezza, passaggi, cfg, seed],
310
+ output=[immagine_output]
311
+ )
312
+
313
+ # Aggiungi sezione esempi
314
+ gr.Esempi(
315
+ esempi=ESEMPI,
316
+ input=[prompt, negative_prompt, larghezza, altezza, passaggi, cfg, seed],
317
+ output=[immagine_output],
318
+ fn=genera_immagine,
319
+ esempi_cache= Vero ,
320
+ label= "Esempi di prompt: fai clic per provare!"
321
+ )
322
+
323
+ se __nome__ == "__principale__" :
324
+ app.launch(share= True )