Merge branch 'master' into gradient-clipping

This commit is contained in:
Muhammad Rizqi Nur 2022-11-07 22:43:38 +07:00
commit cabd4e3b3b
26 changed files with 844 additions and 248 deletions

View File

@ -1,13 +1,12 @@
* @AUTOMATIC1111
/localizations/ar_AR.json @xmodar @blackneoo
/localizations/de_DE.json @LunixWasTaken
/localizations/es_ES.json @innovaciones
/localizations/fr_FR.json @tumbly
/localizations/it_IT.json @EugenioBuffo
/localizations/ja_JP.json @yuuki76
/localizations/ko_KR.json @36DB
/localizations/pt_BR.json @M-art-ucci
/localizations/ru_RU.json @kabachuha
/localizations/tr_TR.json @camenduru
/localizations/zh_CN.json @dtlnor @bgluminous
/localizations/zh_TW.json @benlisquare
# if you were managing a localization and were removed from this file, this is because
# the intended way to do localizations now is via extensions. See:
# https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Developing-extensions
# Make a repo with your localization and since you are still listed as a collaborator
# you can add it to the wiki page yourself. This change is because some people complained
# the git commit log is cluttered with things unrelated to almost everyone and
# because I believe this is the best overall for the project to handle localizations almost
# entirely without my oversight.

View File

@ -208,4 +208,6 @@ function update_token_counter(button_id) {
function restart_reload(){
document.body.innerHTML='<h1 style="font-family:monospace;margin-top:20%;color:lightgray;text-align:center;">Reloading...</h1>';
setTimeout(function(){location.reload()},2000)
return []
}

View File

@ -142,7 +142,7 @@ def prepare_enviroment():
stable_diffusion_commit_hash = os.environ.get('STABLE_DIFFUSION_COMMIT_HASH', "69ae4b35e0a0f6ee1af8bb9a5d0016ccb27e36dc")
taming_transformers_commit_hash = os.environ.get('TAMING_TRANSFORMERS_COMMIT_HASH', "24268930bf1dce879235a7fddd0b2355b84d7ea6")
k_diffusion_commit_hash = os.environ.get('K_DIFFUSION_COMMIT_HASH', "f4e99857772fc3a126ba886aadf795a332774878")
k_diffusion_commit_hash = os.environ.get('K_DIFFUSION_COMMIT_HASH', "60e5042ca0da89c14d1dd59d73883280f8fce991")
codeformer_commit_hash = os.environ.get('CODEFORMER_COMMIT_HASH', "c5b4593074ba6214284d6acd5f1719b6c5d739af")
blip_commit_hash = os.environ.get('BLIP_COMMIT_HASH', "48211a1594f1321b00f14c9f7a5b4813144b2fb9")

View File

@ -17,11 +17,14 @@
"Checkpoint Merger": "Miscelatore di Checkpoint",
"Train": "Addestramento",
"Create aesthetic embedding": "Crea incorporamento estetico",
"auto-sd-paint-ext Guide/Panel": "KRITA Plugin Guida",
"Dataset Tag Editor": "Dataset Tag Editor",
"Deforum": "Deforum",
"Artists To Study": "Artisti per studiare",
"Image Browser": "Galleria immagini",
"Inspiration": "Ispirazione",
"Tokenizer": "Tokenizzatore",
"Training Picker": "Training Picker",
"Settings": "Impostazioni",
"Extensions": "Estensioni",
"Prompt": "Prompt",
@ -49,11 +52,15 @@
"Heun": "Heun",
"DPM2": "DPM2",
"DPM2 a": "DPM2 a",
"DPM++ 2S a": "DPM++ 2S a",
"DPM++ 2M": "DPM++ 2M",
"DPM fast": "DPM fast",
"DPM adaptive": "DPM adaptive",
"LMS Karras": "LMS Karras",
"DPM2 Karras": "DPM2 Karras",
"DPM2 a Karras": "DPM2 a Karras",
"DPM++ 2S a Karras": "DPM++ 2S a Karras",
"DPM++ 2M Karras": "DPM++ 2M Karras",
"DDIM": "DDIM",
"PLMS": "PLMS",
"Width": "Larghezza",
@ -84,18 +91,30 @@
"Aesthetic text for imgs": "Estetica - Testo per le immagini",
"Slerp angle": "Angolo Slerp",
"Is negative text": "È un testo negativo",
"Unprompted": "Unprompted",
"Dry Run": "Esecuzione a vuoto (Debug)",
"NEW!": "NUOVO!",
"Premium Fantasy Card Template": "Premium Fantasy Card Template",
"is now available.": "è ora disponibile.",
"Generate a wide variety of creatures and characters in the style of a fantasy card game. Perfect for heroes, animals, monsters, and even crazy hybrids.": "Genera un'ampia varietà di creature e personaggi nello stile di un gioco di carte fantasy. Perfetto per eroi, animali, mostri e persino ibridi incredibili.",
"Learn More ➜": "Per saperne di più ➜",
"Purchases help fund the continued development of Unprompted. Thank you for your support!": "Gli acquisti aiutano a finanziare il continuo sviluppo di Unprompted. Grazie per il vostro sostegno!",
"Dismiss": "Rimuovi",
"Script": "Script",
"Random grid": "Generaz. casuale (griglia)",
"Random": "Generaz. casuale (no griglia)",
"StylePile": "StylePile",
"Advanced prompt matrix": "Matrice di prompt avanzata",
"Advanced Seed Blending": "Miscelazione Semi Avanzata",
"Alternate Sampler Noise Schedules": "Metodi alternativi di campionamento del rumore",
"Animator v6": "Animator v6",
"Asymmetric tiling": "Piastrellatura asimmetrica",
"SD Chad - Stable Diffusion Aesthetic Scorer": "SD Chad - Assegna Punteggio Estetica",
"Custom code": "Codice personalizzato",
"Embedding to Shareable PNG": "Incorporamento convertito in PNG condivisibile",
"DepthMap v0.1.0": "DepthMap v0.1.0",
"Embedding to Shareable PNG": "Converte Incorporamento in PNG condivisibile",
"Force symmetry": "Forza la simmetria",
"Improved prompt matrix": "Improved prompt matrix",
"Latent Mirroring": "Rispecchia e capovolge l'immagine latente",
"Prompts interpolation": "Interpola Prompt",
"Prompt matrix": "Matrice dei prompt",
"Prompt morph": "Metamorfosi del prompt",
@ -104,7 +123,6 @@
"Seed travel": "Interpolazione semi",
"Shift attention": "Sposta l'attenzione",
"Text to Vector Graphics": "Da testo a grafica vettoriale",
"Unprompted": "Unprompted",
"X/Y plot": "Grafico X/Y",
"X/Y/Z plot": "Grafico X/Y/Z",
"Dynamic Prompting v0.13.6": "Prompt dinamici v0.13.6",
@ -120,70 +138,186 @@
"Keep -1 for seeds": "Mantieni sempre il seme a -1",
"x/y change": "Inverti ordine assi X/Y (Passi/CFG)",
"Loops": "Cicli",
"Focus on:": "Focus su:",
"No focus": "Nessun Focus",
"Portraits (tick Restore faces above for best results)": "Ritratti (selezionare 'Restaura volti' in alto per ottenere i migliori risultati)",
"Feminine and extra attractive (tick Restore faces above for best results)": "Femminile ed estremamente attraente (selezionare 'Restaura volti' per ottenere i migliori risultati)",
"Masculine and extra attractive (tick Restore faces above for best results)": "Maschile ed estremamente attraente (selezionare 'Restaura volti' per ottenere i migliori risultati)",
"Monsters": "Mostri",
"Robots": "Robot",
"Retrofuturistic": "Retrofuturistico",
"Propaganda": "Propaganda",
"Landscapes": "Paesaggi",
"Hints": "Suggerimenti",
"Set Batch count to Sequential prompt count": "Imposta il lotto di immagini sul numero di prompt sequenziali",
"Sequential prompts [X]": "Prompt sequenziali [X]",
"Random prompts [R]": "Prompt randomici [R]",
"Image type strength": "Intensità del tipo di immagine",
"Image type": "Tipo di immagine",
"Not set": "Non impostato",
"Photography": "Fotografia",
"Digital art": "Arte digitale",
"3D Rendering": "3D Rendering",
"3D Rendering": "Rendering 3D",
"Painting": "Dipinto",
"Sketch": "Schizzo",
"Classic Comics": "Fumetti classici",
"Modern Comics": "Fumetti moderni",
"Manga": "Manga",
"Vector art": "Arte vettoriale",
"Visual style": "Stile visivo",
"Realism": "Realismo",
"Photorealism": "Fotorealismo",
"Hyperrealism": "Iperrealismo",
"Surrealism": "Surrealismo",
"Modern Art": "Arte moderna",
"Fauvism": "Fauvismo",
"Futurism": "Futurismo",
"Painterly": "Pittorico",
"Pointillisme": "Puntinismo",
"Abstract": "Astratto",
"Pop Art": "Pop Art",
"Impressionist": "Impressionista",
"Cubism": "Cubismo",
"Linocut": "Linoleografia",
"Fantasy": "Fantasia",
"Vector Art": "Arte vettoriale",
"Mood": "Stato d'animo",
"Amusing": "Amusing",
"Angry": "Angry",
"Cosy": "Cosy",
"Depressing": "Depressing",
"Disgusting": "Disgusting",
"Embarrassing": "Embarrassing",
"Energetic": "Energetic",
"Evil": "Evil",
"Fearful": "Fearful",
"Frightening": "Frightening",
"Grim": "Grim",
"Guilty": "Guilty",
"Happy": "Happy",
"Hopeful": "Hopeful",
"Hopeless": "Hopeless",
"Lonely": "Lonely",
"Lustful": "Lustful",
"Peaceful": "Peaceful",
"Proud": "Proud",
"Relieving": "Relieving",
"Romantic": "Romantic",
"Sad": "Sad",
"Satisfying": "Satisfying",
"Shameful": "Shameful",
"Surprising": "Surprising",
"Colors": "Colori",
"Chaotic": "Caotico",
"Primary colors": "Colori primari",
"Colorful": "Colorato",
"Primary Colors": "Primary Colors",
"Vivid": "Vivido",
"Muted colors": "Colori tenui",
"Low contrast": "Basso contrasto",
"Desaturated": "Desaturato",
"Grayscale": "Scala di grigi",
"Black and white": "Bianco e nero",
"Infrared": "Infrarosso",
"Complementary": "Colori complementari",
"Non-complementary": "Colori non complementari",
"Pastel Colors": "Pastel Colors",
"Muted Colors": "Muted Colors",
"Grayscale": "Grayscale",
"Black and white": "Black and white",
"Infrared": "Infrared",
"View": "Visuale",
"Tilt shift": "Tilt shift",
"Wide-angle": "Angolo ampio",
"Symmetrical": "Symmetrical",
"Tilt-shift": "Tilt-shift",
"Long shot angle": "Long shot angle",
"Medium shot angle": "Medium shot angle",
"Wide shot angle": "Wide shot angle",
"Portrait": "Ritratto",
"Extreme close-up angle": "Extreme close-up angle",
"Macro": "Macro",
"Microscopic": "Microscopico",
"Isometric": "Isometrico",
"Panorama": "Panorama",
"Aerial photograph": "Fotografia aerea",
"Artist focus (not quite finished, not sure it helps)": "Focus sull'artista (non del tutto finito, non è sicuro che aiuti)",
"B/W Photograpy": "Fotografia B/N",
"Portrait photo": "Foto ritratto",
"Usage: a <corgi|cat> wearing <goggles|a hat>": "Utilizzo: a <corgi|cat> wearing <goggles|a hat>",
"Fisheye lens": "Fisheye lens",
"Overhead-angle": "Overhead-angle",
"Birds eye view": "Birds eye view",
"Focus on (unfinished)": "Focus su (incompleto)",
"No focus": "Nessun focus",
"Portraits": "Portraits",
"Feminine portrait": "Ritratto femminile",
"Masculine portrait": "Ritratto maschile",
"WaiFusion": "WaiFusion",
"Horrible Monsters": "Horrible Monsters",
"Robots": "Robot",
"Retrofuturism": "Retrofuturism",
"Propaganda": "Propaganda",
"Landscapes": "Paesaggi",
"Visual style strength": "Forza dello stile visivo",
"Visual style": "Stile visivo",
"Abstract": "Abstract",
"Acidwave": "Acidwave",
"Acrylic": "Acrylic",
"Aestheticism": "Aestheticism",
"Art Deco": "Art Deco",
"Nouveau": "Nouveau",
"Ashcan School Style": "Ashcan School Style",
"Avant-garde": "Avant-garde",
"Ballpoint Pen": "Ballpoint Pen",
"Baroque": "Baroque",
"Classicism": "Classicism",
"CoBrA": "CoBrA",
"Colored Pencil": "Colored Pencil",
"Constructivism": "Constructivism",
"Cubism": "Cubism",
"Dreamcore": "Dreamcore",
"Drip": "Drip",
"Encaustic": "Encaustic",
"Expressionism": "Expressionism",
"Fauvism": "Fauvism",
"Finger Painting": "Finger Painting",
"Futurism": "Futurism",
"Gouache": "Gouache",
"Hot Wax": "Hot Wax",
"Impressionism": "Impressionism",
"Ink Wash": "Ink Wash",
"Japanese": "Japanese",
"Korean": "Korean",
"Line Art": "Line Art",
"Linocut": "Linocut",
"Lowpoly": "Lowpoly",
"Manga": "Manga",
"Marker": "Marker",
"Modern Comics": "Fumetti moderni",
"Mural": "Mural",
"Neoclassicism": "Neoclassicism",
"Oil Painting": "Oil Painting",
"Pastel": "Pastel",
"Pencil": "Pencil",
"Photorealism": "Photorealism",
"Pixel Art": "Pixel Art",
"Pop Art": "Pop Art",
"Pop Surrealism": "Pop Surrealism",
"Psychedelic": "Psychedelic",
"Realism": "Realism",
"Renaissance": "Renaissance",
"Rococo": "Rococo",
"Sprite Artwork": "Sprite Artwork",
"Street Art": "Street Art",
"Suprematism": "Suprematism",
"Vaporwave": "Vaporwave",
"Vintage Comics": "Vintage Comics",
"Watercolor": "Watercolor",
"Artist influence": "Influenza dell'Artista",
"Artist": "Artista",
"Examples, Help and Tips": "Esempi, aiuto e suggerimenti",
"Style examples": "Esempi di Stile",
"Artist examples": "Esempi di Artisti",
"Mood examples": "Esempi di stato d'animo",
"Help": "Aiuto",
"Hello, StylePile here": "Ciao, questo è StylePile",
"Introduction": "Introduzione",
"is a mix and match system for adding elements to prompts that affect the style of the result. Hence the name. By default, these elements are placed in a specific order and given strength values. Which means the result sort-of evolves. I have generated thousands of images for each main": "è un sistema mescola e abbina per aggiungere elementi ai prompt che influiscono sullo stile del risultato. Da qui il nome. Per impostazione predefinita, questi elementi vengono inseriti in un ordine specifico e vengono assegnati valori di forza. Il che significa che il risultato si evolve. Ho generato migliaia di immagini per ogni principale",
"and tweaked the keywords to attempt giving expected results most of the time. Certainly, your suggestions for improvements are very welcome.": "e ottimizzato le parole chiave per tentare di fornire i risultati attesi per la maggior parte del tempo. Certamente, i tuoi suggerimenti per miglioramenti sono molto graditi.",
"Base workflow": "Flusso di lavoro di base",
"For example, if you select the": "Ad esempio, se si seleziona il",
"image type, then almost all results will look like Paintings. Selecting": "tipo di immagine, quindi quasi tutti i risultati sembreranno Dipinti. Selezione",
"will have a certain influence on the overall look in some way (if it's something humanoid it may show emotion, but also colors and overall feel may change). Setting": "avrà una certa influenza sull'aspetto generale in qualche modo (se è qualcosa di umanoide può mostrare emozioni, ma anche i colori e la sensazione generale possono cambiare). Ambientazione",
"will change the general tonality of the result. And setting": "cambierà la tonalità generale del risultato. E ambientazione",
"will attempt to change how the subject is viewed. Attempt, because view appears to be the least reliable keyword. These elements are placed in order of influence and supported by certain strength values. These basic settings produce very quick results close to the general look you want.": "tenterà di cambiare la modalità di visualizzazione dell'oggetto. Tentativo, perché view sembra essere la parola chiave meno affidabile. Questi elementi sono posti in ordine di influenza e supportati da determinati valori di forza. Queste impostazioni di base producono risultati molto rapidi vicini all'aspetto generale desiderato.",
"Moving on, adding a": "Andando avanti, aggiungendo a",
"will combine with": "si combinerà con",
"to influence how the result generally looks. These styles are based on classic and modern Painting/Art/design movements (which I picked after hours and thousands of samples of testing) and can have a strong influence on the end result. Either it will be more realistic or artistic, or look like a comic book etc. In general, this is a really strong element for getting the look you want. Its influence can be adjusted with the slider above. Experiment with the values, keeping in mind that anything above 1.5 will start becoming a mess. In a similar way, but more focused, you can select an": "per influenzare l'aspetto generale del risultato. Questi stili si basano su movimenti Pittura/Arte/design classici e moderni (che ho scelto dopo ore e migliaia di campioni di test) e possono avere una forte influenza sul risultato finale. O sarà più realistico o artistico, o assomiglierà a un fumetto, ecc. In generale, questo è un elemento davvero forte per ottenere l'aspetto che desideri. La sua influenza può essere regolata con il cursore in alto. Sperimenta con i valori, tenendo presente che qualsiasi cosa al di sopra di 1,5 inizierà a diventare un pasticcio. In modo simile, ma più mirato, puoi selezionare un",
"and, of course, that will have a very visible effect on the result as well. Currently there are 135 artists, 55 art styles and 25 emotions available for selection and represented with preview images.": "e, naturalmente, anche questo avrà un effetto molto visibile sul risultato. Attualmente ci sono 135 artisti, 55 stili artistici e 25 emozioni disponibili per la selezione e rappresentate con immagini di anteprima.",
"Strength of these settings has been preset at 1.3, as that appears to be the golden ratio for getting good results. Sometimes very low settings have an interesting result as well. You can, and should, freely mix and match these settings to get different results. Classic Painting styles affected or affecting 3D look quite interesting. Photography can look cool with some of the brighter, more artistic styles etc. Sometimes raising CFG scale to 15,20 or more also helps to REALLY push the style onto the image.": "La forza di queste impostazioni è stata preimpostata a 1,3, poiché sembra essere il rapporto aureo per ottenere buoni risultati. A volte anche impostazioni molto basse hanno un risultato interessante. Puoi, e dovresti, mescolare e abbinare liberamente queste impostazioni per ottenere risultati diversi. Gli stili di pittura classica influenzati o influenzati dal 3D sembrano piuttosto interessanti. La fotografia può sembrare interessante con alcuni degli stili più luminosi, più artistici, ecc. A volte aumentare la scala CFG a 15,20 o più aiuta anche a spingere VERAMENTE lo stile sull'immagine.",
"Advanced workflow": "Flusso di lavoro avanzato",
"StylePile can overtake the generation process, allowing you to generate a large amount of different results with very little extra work. There are two types of variables you can use: [X] and [R]. When you add an [X] to your prompt, it sequentially takes values from the": "StylePile può prendere il controllo del processo di generazione, consentendoti di generare una grande quantità di risultati diversi con pochissimo lavoro extra. Ci sono due tipi di variabili che puoi usare: [X] e [R]. Quando aggiungi una [X] al tuo prompt, prende in sequenza i valori da",
"Sequential prompts": "Prompt sequenziali",
"text area. You can have dozens of lines there and they will be processed in sequence. When you add [R] to the prompt a value from the": "area di testo. Puoi avere dozzine di righe lì e verranno elaborate in sequenza. Quando si aggiunge [R] al prompt un valore da",
"Random prompts": "Prompt casuali",
"text area will be inserted in its place. By combining these a huge variety in prompts is very easy to do.": "l'area di testo verrà inserita al suo posto. Combinando questi un'enorme varietà di prompt è molto facile da fare.",
"When using this,": "Quando si utilizza questo,",
"will move through the prompts and": "si sposterà attraverso i prompt e",
"will set how many copies with the given prompt to make. If the seed is not random, it will increase with each batch size step. Any random elements will still be picked randomly.": "imposterà quante copie fare con il prompt dato. Se il seme non è casuale, aumenterà ad ogni passaggio della dimensione del batch. Eventuali elementi casuali verranno comunque selezionati casualmente.",
"Tips and tricks": "Suggerimenti e trucchi",
"If you add your own Artist, I would recommend having \"by Artist\" in front of their name. Depending on Artist's popularity (or lack thereof) this appears to have a very tangible influence on the result.": "Se aggiungi il tuo artista, ti consiglio di avere \"per artista\" davanti al suo nome. A seconda della popolarità dell'artista (o della sua mancanza) questo sembra avere un'influenza molto tangibile sul risultato.",
"Parenthesis can be added to make pArts of the prompt stronger. So": "È possibile aggiungere parentesi per rendere più forti parti del prompt. Così",
"((cute kitten))": "((cute kitten))",
"will make it extra cute (try it out). This is also important if a style is affecting your original prompt too much. Make that prompt stronger by adding parenthesis around it, like this:": "lo renderà molto carino (provalo). Questo è importante anche se uno stile influisce troppo sul prompt originale. Rendi più forte quel prompt aggiungendo parentesi attorno ad esso, in questo modo:",
"((promt))": "((promt))",
". A strength modifier value can also be used, like this": ". È anche possibile utilizzare un valore modificatore di forza, in questo modo",
"(prompt:1.1)": "(prompt:1.1)",
". To save some typing you can select the line you want to make stronger and use": ". Per salvare un po' di digitazione puoi selezionare la linea che vuoi rendere più forte e utilizzare",
"Ctrl+Shift+Arrow keys up": "Ctrl+Shift+Freccia su",
"to add these parenthesis and change the value. As you can see by default values on most sliders, 1.3 seems like a good stArting point if you want to see some impact.": "per aggiungere queste parentesi e modificare il valore. Come puoi vedere per i valori predefiniti sulla maggior parte dei cursori, 1.3 sembra un buon punto di partenza se vuoi vedere un certo impatto.",
"Prompts can be split like": "I prompt possono essere divisi come",
"[A|B]": "[A|B]",
"to sequentially use terms, one after another on each step. For example": "per utilizzare in sequenza i termini, uno dopo l'altro in ogni passaggio. Per esempio",
"[cat|dog]": "[cat|dog]",
"will produce a hybrid catdog.": "produrrà un cane-gatto ibrido.",
"Using": "Usando",
"[A:B:0.4]": "[A:B:0.4]",
"will switch to other terms after the first one has been active for a certain percentage of steps. So": "passerà ad altri termini dopo che il primo è stato attivo per una certa percentuale di passaggi. Così",
"[cat:dog:0.4]": "[cat:dog:0.4]",
"will build a cat 40% of the time and then stArt turning it into a dog. Usually this needs more steps to work properly.": "costruirà un gatto il 40% delle volte e poi inizierà a trasformarlo in un cane. Di solito questo richiede più passaggi per funzionare correttamente.",
"In conclusion": "In conclusione",
"I made this because manually changing keywords, looking up possible styles, etc was a pain. It is meant as a fun tool to explore possibilities and make learning Stable Diffusion easier. If you have some ideas or, better yet, would like to contribute in some way*, just visit https://github.com/some9000/StylePile\n*Hey, if you have a 12Gb graphics card just laying around I'm happy to take it (:": "L'ho fatto perché cambiare manualmente le parole chiave, cercare possibili stili, ecc. era una seccatura. È inteso come uno strumento divertente per esplorare le possibilità e rendere più facile l'apprendimento della Diffusione stabile. Se hai qualche idea o, meglio ancora, vorresti contribuire in qualche modo*, visita pure https://github.com/some9000/StylePile\n*Hey, se hai una scheda grafica da 12 Gb in giro, sono felice di prenderla (:",
"Seeds": "Semi",
"Noise Scheduler": "Pianificazione del rumore",
"Default": "Predefinito",
@ -217,7 +351,7 @@
"Prompt Template, applied to each keyframe below": "Modello di prompt, applicato a ciascun fotogramma chiave qui di seguito",
"Positive Prompts": "Prompt positivi",
"Negative Prompts": "Prompt negativi",
"Props, Stamps": "Immagini Clipart da diffondere (prop), o da applicare in post elaborazione e non essere diffuse (stamp).",
"Props, Stamps": "Immagini Clipart da diffondere (prop), o da applicare in post elaborazione e non essere diffuse (stamp)",
"Poper_Folder:": "Cartella Immagini Clipart (PNG trasparenti):",
"Supported Keyframes:": "Fotogrammi chiave supportati:",
"time_s | source | video, images, img2img | path": "time_s | source | video, images, img2img | path",
@ -239,7 +373,22 @@
"Keyframes:": "Fotogrammi chiave:",
"Tile X": "Piastrella asse X",
"Tile Y": "Piastrella asse Y",
"Number of images to generate": "Numero di immagini da generare",
"Python code": "Codice Python",
"Model": "Modello",
"dpt_large": "Depth large",
"dpt_hybrid": "Depth hybrid",
"midas_v21": "MIDAS v21",
"midas_v21_small": "MIDAS v21 small",
"Compute on": "Calcola",
"GPU": "GPU",
"CPU": "CPU",
"Save DepthMap": "Salva DepthMap",
"Show DepthMap": "Mostra DepthMap",
"Combine into one image.": "Combina in un'unica immagine.",
"Combine axis": "Combina gli assi",
"Vertical": "Verticale",
"Horizontal": "Orizzontale",
"Source embedding to convert": "Incorporamento sorgente da convertire",
"Embedding token": "Token Incorporamento",
"Output directory": "Cartella di output",
@ -248,6 +397,16 @@
"Alt. symmetry method (blending)": "Metodo di simmetria alternativo (miscelazione)",
"Apply every n steps": "Applica ogni n passi",
"Skip last n steps": "Salta gli ultimi n passi",
"Usage: a <corgi|cat> wearing <goggles|a hat>": "Utilizzo: a <corgi|cat> wearing <goggles|a hat>",
"Mirror application mode": "modalità di applicazione specchiatura",
"Alternate Steps": "Passaggi alternati",
"Blend Average": "Miscelazione media",
"Mirror style": "Stile specchiatura",
"Vertical Mirroring": "Specchiatura verticale",
"Horizontal Mirroring": "Specchiatura orizzontale",
"90 Degree Rotation": "Rotazione 90 gradi",
"180 Degree Rotation": "Rotazione 180 gradi",
"Maximum steps fraction to mirror at": "Frazione di passi massima su cui eseguire la specchiatura",
"Interpolation prompt": "Prompt di interpolazione",
"Number of images": "Numero di immagini",
"Make a gif": "Crea GIF",
@ -263,7 +422,7 @@
"Use same random seed for all lines": "Usa lo stesso seme casuale per tutte le righe",
"List of prompt inputs": "Elenco di prompt di input",
"Upload prompt inputs": "Carica un file contenente i prompt di input",
"n": "Esegui n volte",
"n": "n",
"Destination seed(s) (Comma separated)": "Seme/i di destinazione (separati da virgola)",
"Only use Random seeds (Unless comparing paths)": "Usa solo semi casuali (a meno che non si confrontino i percorsi)",
"Number of random seed(s)": "Numero di semi casuali",
@ -296,13 +455,6 @@
"Transparent PNG": "PNG trasparente",
"Noise Tolerance": "Tolleranza al rumore",
"Quantize": "Quantizzare",
"Dry Run": "Esecuzione a vuoto (Debug)",
"NEW!": "NUOVO!",
"Premium Fantasy Card Template": "Premium Fantasy Card Template",
"is now available.": "è ora disponibile.",
"Generate a wide variety of creatures and characters in the style of a fantasy card game. Perfect for heroes, animals, monsters, and even crazy hybrids.": "Genera un'ampia varietà di creature e personaggi nello stile di un gioco di carte fantasy. Perfetto per eroi, animali, mostri e persino ibridi incredibili.",
"Learn More ➜": "Per saperne di più ➜",
"Purchases help fund the continued development of Unprompted. Thank you for your support!": "Gli acquisti aiutano a finanziare il continuo sviluppo di Unprompted. Grazie per il vostro sostegno!",
"X type": "Parametro asse X",
"Nothing": "Niente",
"Var. seed": "Seme della variazione",
@ -347,8 +499,8 @@
"Prompt words after artist or style name": "Parole chiave dopo il nome dell'artista o dello stile",
"Negative Prompt": "Prompt negativo",
"Save": "Salva",
"Send to img2img": "Invia a img2img",
"Send to inpaint": "Invia a Inpaint",
"Send to img2img": "Invia a\nimg2img",
"Send to inpaint": "Invia a\nInpaint",
"Send to extras": "Invia a Extra",
"Make Zip when Save?": "Crea un file ZIP quando si usa 'Salva'",
"Textbox": "Casella di testo",
@ -381,7 +533,7 @@
"Just resize": "Ridimensiona solamente",
"Crop and resize": "Ritaglia e ridimensiona",
"Resize and fill": "Ridimensiona e riempie",
"Advanced loopback": "Advanced loopback",
"Advanced loopback": "Elaborazione ricorsiva avanzata",
"External Image Masking": "Immagine esterna per la mascheratura",
"img2img alternative test": "Test alternativo per img2img",
"img2tiles": "img2tiles",
@ -408,9 +560,9 @@
"Saturation enhancement per image": "Miglioramento della saturazione per ciascuna immagine",
"Use sine denoising strength variation": "Utilizzare la variazione sinusoidale dell'intensità di riduzione del rumore",
"Phase difference": "Differenza di Fase",
"Denoising strength exponentiation": "Esponenziazione dell'intensità di riduzione del rumore",
"Denoising strength exponentiation": "Esponente intensità denoising",
"Use sine zoom variation": "Usa la variazione sinusoidale dello zoom",
"Zoom exponentiation": "Esponeniazione dello Zoom",
"Zoom exponentiation": "Esponente Zoom",
"Use multiple prompts": "Usa prompt multipli",
"Same seed per prompt": "Stesso seme per ogni prompt",
"Same seed for everything": "Stesso seme per tutto",
@ -460,7 +612,7 @@
"right": "destra",
"up": "sopra",
"down": "sotto",
"Fall-off exponent (lower=higher detail)": "Esponente di decremento (più basso=maggior dettaglio)",
"Fall-off exponent (lower=higher detail)": "Esponente di decremento (più basso = maggior dettaglio)",
"Color variation": "Variazione di colore",
"Will upscale the image to twice the dimensions; use width and height sliders to set tile size": "Aumenterà l'immagine al doppio delle dimensioni; utilizzare i cursori di larghezza e altezza per impostare la dimensione della piastrella",
"Upscaler": "Ampliamento immagine",
@ -523,7 +675,7 @@
"CodeFormer visibility": "Visibilità CodeFormer",
"CodeFormer weight (0 = maximum effect, 1 = minimum effect)": "Peso di CodeFormer (0 = effetto massimo, 1 = effetto minimo)",
"Upscale Before Restoring Faces": "Amplia prima di restaurare i volti",
"Send to txt2img": "Invia a txt2img",
"Send to txt2img": "Invia a\ntxt2img",
"A merger of the two checkpoints will be generated in your": "I due checkpoint verranno fusi nella cartella dei",
"checkpoint": "checkpoint",
"directory.": ".",
@ -623,20 +775,75 @@
"Train Embedding": "Addestra Incorporamento",
"Create an aesthetic embedding out of any number of images": "Crea un'incorporamento estetico da qualsiasi numero di immagini",
"Create images embedding": "Crea incorporamento di immagini",
"Generate Krita Plugin Symlink Command": "Genera comando per creare collegamento simbolico del plugin Krita",
"Launch Krita.": "Avvia Krita.",
"On the menubar, go to": "Sulla barra dei menu, vai a",
"Settings > Manage Resources...": "Settings > Manage Resources...",
"In the window that appears, click": "Nella finestra che appare, fai clic su",
"Open Resource Folder": "Open Resource Folder",
"In the file explorer that appears, look for a folder called": "In Esplora file, una volta aperto, cerca una cartella chiamata",
"pykrita": "pykrita",
"or create it.": "o creala.",
"Enter the": "Entra nella",
"folder and copy the folder location from the address bar.": "cartella e copia il percorso della cartella dalla barra degli indirizzi.",
"Paste the folder location below.": "Incolla il percorso della cartella qui di seguito.",
"Pykrita Folder Location": "Posizione della cartella Pykrita",
"Search for \"Command Prompt\" in the Start Menu, right-click and click \"Run as Administrator...\", paste the follow commands and hit Enter:": "Cerca \"Prompt dei comandi\" nel menu Start, fai clic con il pulsante destro del mouse e fai clic su \"Esegui come amministratore...\", incolla i seguenti comandi e premi Invio:",
"mklink /j \"<path_to_pykrita>\\krita_diff\" \"C:\\stable-diffusion-webui\\extensions\\auto-sd-paint-ext\\frontends\\krita\\krita_diff\"\nmklink \"<path_to_pykrita>\\krita_diff.desktop\" \"C:\\stable-diffusion-webui\\extensions\\auto-sd-paint-ext\\frontends\\krita\\krita_diff.desktop\"": "mklink /j \"<path_to_pykrita>\\krita_diff\" \"C:\\stable-diffusion-webui\\extensions\\auto-sd-paint-ext\\frontends\\krita\\krita_diff\"\nmklink \"<path_to_pykrita>\\krita_diff.desktop\" \"C:\\stable-diffusion-webui\\extensions\\auto-sd-paint-ext\\frontends\\krita\\krita_diff.desktop\"",
"Linux command:": "comando Linux:",
"ln -s \"C:\\stable-diffusion-webui\\extensions\\auto-sd-paint-ext\\frontends\\krita\\krita_diff\" \"<path_to_pykrita>/krita_diff\"\nln -s \"C:\\stable-diffusion-webui\\extensions\\auto-sd-paint-ext\\frontends\\krita\\krita_diff.desktop\" \"<path_to_pykrita>/krita_diff.desktop\"": "ln -s \"C:\\stable-diffusion-webui\\extensions\\auto-sd-paint-ext\\frontends\\krita\\krita_diff\" \"<path_to_pykrita>/krita_diff\"\nln -s \"C:\\stable-diffusion-webui\\extensions\\auto-sd-paint-ext\\frontends\\krita\\krita_diff.desktop\" \"<path_to_pykrita>/krita_diff.desktop\"",
"NOTE": "NOTE",
": Symlinks will break if you move or rename the repository or any\nof its parent folders or otherwise change the path such that the symlink\nbecomes invalid. In which case, repeat the above steps with the new": ": I collegamenti simbolici si interrompono se si sposta o si rinomina il repository o una qualsiasi\n delle sue cartelle principali o si modifica in altro modo il percorso in modo tale che il collegamento simbolico\ndiventi non valido. In tal caso, ripetere i passaggi precedenti con il nuovo ",
"folder location and (auto-detected) repository location.": "percorso della cartella e percorso del repository (rilevato automaticamente).",
": Ensure": ": Assicurarsi che",
"webui-user.bat": "webui-user.bat",
"/": "/",
"webui-user.sh": "webui-user.sh",
"contains": "contenga",
"--api": "--api",
"in": "in",
"COMMANDLINE_ARGS": "COMMANDLINE_ARGS",
"!": "!",
"Enabling the Krita Plugin": "Abilitazione del plugin Krita",
"Restart Krita.": "Riavvia Krita.",
"Settings > Configure Krita...": "Settings > Configure Krita...",
"On the left sidebar, go to": "Nella barra laterale sinistra, vai a",
"Python Plugin Manager": "Python Plugin Manager",
"Look for": "Cerca",
"Stable Diffusion Plugin": "Stable Diffusion Plugin",
"and tick the checkbox.": "e spunta la casella.",
"Restart Krita again for changes to take effect.": "Riavvia Krita per rendere effettive le modifiche.",
"The": "Il",
"SD Plugin": "SD Plugin",
"docked window should appear on the left of the Krita window. If it does not, look on the menubar under": "dovrebbe apparire come finestra ancorata a sinistra della finestra di Krita. In caso contrario, guarda nella barra dei menu sotto",
"Settings > Dockers": "Settings > Dockers",
"for": "per",
"Next Steps": "Prossimi passi",
"Troubleshooting": "Risoluzione dei problemi",
"Update Guide": "Guida all'aggiornamento",
"Usage Guide": "Guida all'uso",
"TODO: Control/status panel": "TODO: pannello di controllo/stato",
"-1": "-1",
"This extension works well with text captions in comma-separated style (such as the tags generated by DeepBooru interrogator).": "Questa estensione funziona bene con i sottotitoli di testo in stile separato da virgole (come i tag generati dall'interrogatore DeepBooru).",
"Save all changes": "Salva tutte le modifiche",
"Backup original text file (original file will be renamed like filename.000, .001, .002, ...)": "Backup del file di testo originale (il file originale verrà rinominato come nomefile.000, .001, .002, ...)",
"Note:": "Note:",
"New text file will be created if you are using filename as captions.": "Verrà creato un nuovo file di testo se si utilizza il nome del file come didascalia.",
"New text file will be created if you are using filename as captions.": " Verrà creato un nuovo file di testo se si utilizza il nome del file come didascalia.",
"Results": "Risultati",
"Load": "Carica",
"Load from subdirectories": "Carica da sotto cartella",
"Dataset Images": "Immagini del Dataset",
"Displayed Images : 0 / 0 total": "Immagini mostrate : 0 / 0 totali",
"Current Tag Filter :": "Filtro Tag corrente :",
"Current Selection Filter : 0 images": "Filtro di selezione corrente : 0 immagini",
"Selected Image :": "Immagine selezionata :",
"Filter and Edit Tags": "Filtra e modifica i tag",
"Filter by Selection": "Filtra per selezione",
"Edit Caption of Selected Image": "Modifica la didascalia dell'immagine selezionata",
"Search tags / Filter images by tags": "Cerca tag / Filtra le immagini per tag",
"Search Tags": "Cerca tag",
"Clear all filters": "Rimuovi tutti i filtri",
"Clear tag filters": "Cancella i filtri dei tag",
"Clear ALL filters": "Rimuovi tutti i filtri",
"Sort by": "Ordina per",
"Alphabetical Order": "Ordine alfabetico",
"Frequency": "Frequenza",
@ -664,6 +871,13 @@
"ex C.": "esempio C.",
"Original Text = \"A, B, C, D, E\"Selected Tags = \"A, B, D\"Edit Tags = \", X, \"": "Testo originale = \"A, B, C, D, E\"Tag selezionati = \"A, B, D\"Modifica tag = \", X, \"",
"Result = \"X, C, E\"(A->\"\", B->X, D->\"\")": "Risultato = \"X, C, E\"(A->\"\", B->X, D->\"\")",
"Select images from the left gallery.": "Seleziona le immagini dalla galleria di sinistra.",
"Add selection [Enter]": "Aggiungi selezione [Invio]",
"Filter Images": "Filtra le immagini",
"Remove selection [Delete]": "Rimuovi selezione [Canc]",
"Invert selection": "Inverti selezione",
"Clear selection": "Cancella selezione",
"Apply selection filter": "Applica il filtro di selezione",
"Caption of Selected Image": "Didascalia dell'immagine selezionata",
"Copy caption": "Copia didascalia",
"Edit Caption": "Modifica didascalia",
@ -768,7 +982,7 @@
"bilinear": "bilinear",
"nearest": "nearest",
"save_depth_maps": "Salva le mappe di profondità",
"`animation_mode: None` batches on list of *prompts*. (Batch mode disabled atm, only animation_prompts are working)": "`modalità animazione: Nessuno` si inserisce nell'elenco di *prompt*. (Modalità batch disabilitata atm, funzionano solo i prompt di animazione)",
"`animation_mode: None` batches on list of *prompts*. (Batch mode disabled atm, only animation_prompts are working)": "`modalità animazione: Nessuno` si inserisce nell'elenco di *prompt*. (Modalità batch al momento disabilitata, funzionano solo i prompt di animazione)",
"*Important change from vanilla Deforum!*": "*Importante cambiamento rispetto alla versione originale di Deforum!*",
"This script uses the built-in webui weighting settings.": "Questo script utilizza le impostazioni di pesatura webui integrate.",
"So if you want to use math functions as prompt weights,": "Quindi, se vuoi usare le funzioni matematiche come pesi dei prompt,",
@ -783,12 +997,16 @@
"strength": "Intensità",
"init_image": "Immagine di inizializzazione",
"use_mask": "Usa maschera",
"use_alpha_as_mask": "Usa alpha come maschera",
"use_alpha_as_mask": "Usa Alpha come maschera",
"invert_mask": "Inverti la maschera",
"overlay_mask": "Sovrapponi la maschera",
"mask_file": "File della maschera",
"mask_contrast_adjust": "regolazione contrasto maschera",
"mask_brightness_adjust": "Regola la luminosità della maschera",
"mask_overlay_blur": "Sfocatura della sovrapposizione della maschera",
"mask_fill": "riempimento maschera",
"full_res_mask": "maschera a piena risoluzione",
"full_res_mask_padding": "riempimento maschera a piena risoluzione",
"Video Input:": "Ingresso video:",
"video_init_path": "Percorso del video di inizializzazione",
"extract_nth_frame": "Estrai ogni ennesimo fotogramma",
@ -819,6 +1037,7 @@
"image_path": "Percorso immagine",
"mp4_path": "Percorso MP4",
"Click here after the generation to show the video": "Clicca qui dopo la generazione per mostrare il video",
"Close the video": "Chiudi il video",
"NOTE: If the 'Generate' button doesn't work, go in Settings and click 'Restart Gradio and Refresh...'.": "NOTA: se il pulsante 'Genera' non funziona, vai in Impostazioni e fai clic su 'Riavvia Gradio e Aggiorna...'.",
"Save Settings": "Salva le impostazioni",
"Load Settings": "Carica le impostazioni",
@ -829,7 +1048,6 @@
"house": "casa",
"portrait": "ritratto",
"spaceship": "nave spaziale",
"anime": "anime",
"cartoon": "cartoon",
"digipa-high-impact": "digipa-high-impact",
"digipa-med-impact": "digipa-med-impact",
@ -936,8 +1154,8 @@
"set_index": "Imposta indice",
"load_switch": "Carica",
"turn_page_switch": "Volta pagina",
"Checkbox": "Casella di controllo",
"Checkbox Group": "Seleziona immagini per",
"Checkbox": "Selezione",
"Checkbox Group": "Seleziona per",
"artists": "Artisti",
"flavors": "Stili",
"mediums": "Tecniche",
@ -947,12 +1165,24 @@
"Abandoned": "Scartati",
"Key word": "Parola chiave",
"Get inspiration": "Ispirami",
"to txt2img": "Invia a txt2img",
"to img2img": "Invia a img2img",
"to txt2img": "Invia a\ntxt2img",
"to img2img": "Invia a\nimg2img",
"Collect": "Salva nei preferiti",
"Don't show again": "Scarta",
"Move out": "Rimuovi",
"set button": "Pulsante imposta",
"set button": "Pulsante imposta",
"Before your text is sent to the neural network, it gets turned into numbers in a process called tokenization. These tokens are how the neural network reads and interprets text. Thanks to our great friends at Shousetsu愛 for inspiration for this feature.": "Prima che il tuo testo venga inviato alla rete neurale, verrà trasformato in numeri in un processo chiamato tokenizzazione. Questi token sono il modo in cui la rete neurale legge e interpreta il testo. Grazie ai nostri grandi amici di Shousetsu愛 per l'ispirazione per questa funzione.",
"Tokenize": "Tokenizzare",
"Text": "Testo",
"Tokens": "Token",
"Video to extract frames from:": "Video da cui estrarre fotogrammi:",
"Only extract keyframes (recommended)": "Estrae solo fotogrammi chiave (consigliato)",
"Extract Frames": "Estrai fotogrammi",
"Extracted Frame Set": "Set di fotogrammi estratti",
"Resize crops to 512x512": "Ridimensiona i ritagli a 512x512",
"Save crops to:": "Salva ritagli in:",
"<": "<",
">": ">",
"Apply settings": "Applica le impostazioni",
"Saving images/grids": "Salva immagini/griglie",
"Always save all generated images": "Salva sempre tutte le immagini generate",
@ -1007,6 +1237,7 @@
"Add a second progress bar to the console that shows progress for an entire job.": "Aggiungi una seconda barra di avanzamento alla console che mostra l'avanzamento complessivo del lavoro.",
"Training": "Addestramento",
"Move VAE and CLIP to RAM when training hypernetwork. Saves VRAM.": "Sposta VAE e CLIP nella RAM durante l'addestramento di Iperreti. Risparmia VRAM.",
"Saves Optimizer state as separate *.optim file. Training can be resumed with HN itself and matching optim file.": "Salva lo stato dell'ottimizzatore come file *.optim separato. L'addestramento può essere ripreso con lo stesso HN e il file optim corrispondente.",
"Filename word regex": "Espressione regolare per estrarre parole dal nome del file",
"Filename join string": "Stringa per unire le parole estratte dal nome del file",
"Number of repeats for a single input image per epoch; used only for displaying epoch number": "Numero di ripetizioni per una singola immagine di input per epoca; utilizzato solo per visualizzare il numero di epoca",
@ -1111,10 +1342,14 @@
"aesthetic-gradients": "Gradienti Estetici (CLIP)",
"https://github.com/AUTOMATIC1111/stable-diffusion-webui-aesthetic-gradients": "https://github.com/AUTOMATIC1111/stable-diffusion-webui-aesthetic-gradients",
"unknown": "sconosciuto",
"auto-sd-paint-ext": "KRITA Plugin",
"https://github.com/Interpause/auto-sd-paint-ext": "https://github.com/Interpause/auto-sd-paint-ext",
"dataset-tag-editor": "Dataset Tag Editor",
"https://github.com/toshiaki1729/stable-diffusion-webui-dataset-tag-editor.git": "https://github.com/toshiaki1729/stable-diffusion-webui-dataset-tag-editor.git",
"deforum-for-automatic1111-webui": "Deforum",
"https://github.com/deforum-art/deforum-for-automatic1111-webui": "https://github.com/deforum-art/deforum-for-automatic1111-webui",
"novelai-2-local-prompt": "Converti NovelAI",
"https://github.com/animerl/novelai-2-local-prompt": "https://github.com/animerl/novelai-2-local-prompt",
"sd-dynamic-prompts": "Prompt dinamici",
"https://github.com/adieyal/sd-dynamic-prompts": "https://github.com/adieyal/sd-dynamic-prompts",
"stable-diffusion-webui-aesthetic-image-scorer": "Punteggio immagini estetiche",
@ -1125,8 +1360,14 @@
"https://github.com/yfszzx/stable-diffusion-webui-images-browser": "https://github.com/yfszzx/stable-diffusion-webui-images-browser",
"stable-diffusion-webui-inspiration": "Ispirazione",
"https://github.com/yfszzx/stable-diffusion-webui-inspiration": "https://github.com/yfszzx/stable-diffusion-webui-inspiration",
"stable-diffusion-webui-tokenizer": "Tokenizzatore",
"https://github.com/AUTOMATIC1111/stable-diffusion-webui-tokenizer.git": "https://github.com/AUTOMATIC1111/stable-diffusion-webui-tokenizer.git",
"tag-autocomplete": "Autocompletamento etichette",
"https://github.com/DominikDoom/a1111-sd-webui-tagcomplete.git": "https://github.com/DominikDoom/a1111-sd-webui-tagcomplete.git",
"training-picker": "Selezionatore per l'addestramento",
"https://github.com/Maurdekye/training-picker.git": "https://github.com/Maurdekye/training-picker.git",
"unprompted": "Unprompted",
"https://github.com/ThereforeGames/unprompted": "https://github.com/ThereforeGames/unprompted",
"wildcards": "Termini Jolly",
"https://github.com/AUTOMATIC1111/stable-diffusion-webui-wildcards.git": "https://github.com/AUTOMATIC1111/stable-diffusion-webui-wildcards.git",
"Load from:": "Carica da:",
@ -1161,7 +1402,8 @@
"Make an attempt to produce a picture similar to what would have been produced with same seed at specified resolution": "Prova a produrre un'immagine simile a quella che sarebbe stata prodotta con lo stesso seme alla risoluzione specificata",
"This text is used to rotate the feature space of the imgs embs": "Questo testo viene utilizzato per ruotare lo spazio delle funzioni delle immagini incorporate",
"How many times to repeat processing an image and using it as input for the next iteration": "Quante volte ripetere l'elaborazione di un'immagine e utilizzarla come input per l'iterazione successiva",
"Hello, StylePile here.\nUntil some weird bug gets fixed you will see this even if the script itself is not active. Meanwhile, some hints to take your artwork to new heights:\nUse the 'Focus on' dropdown to select complex presets. Toggle selections below (with or without Focus) to affect your results. Mix and match to get some interesting results. \nAnd some general Stable Diffusion tips that will take your designs to next level:\nYou can add parenthesis to make parts of the prompt stronger. So (((cute))) kitten will make it extra cute (try it out). This is alsow important if a style is affecting your original prompt too much. Make that prompt stronger by adding parenthesis around it, like this: ((promt)).\nYou can type promts like [A|B] to sequentially use terms one after another on each step. So, like [cat|dog] will produce a hybrid catdog. And [A:B:0.4] to switch to other terms after the first one has been active for a certain percentage of steps. So [cat:dog:0.4] will build a cat 40% of the time and then start turning it into a dog. This needs more steps to work properly.": "Salve, qui è StylePile.\nFinché qualche strano bug non verrà risolto, vedrai questo testo anche se lo script non è attivo. Nel frattempo, alcuni suggerimenti per portare la tua grafica a nuovi livelli:\nUtilizza il menu a discesa 'Focus on' per selezionare valori predefiniti complessi. Attiva o disattiva le selezioni seguenti (con o senza Focus) per influire sui risultati. Mescola e abbina per ottenere risultati interessanti. \nE alcuni suggerimenti generali su Stable Diffusion che porteranno i tuoi risultati a un livello superiore:\nPuoi aggiungere parentesi per aumentare l'influenza di certe parti del prompt. Quindi '(((cute))) kitten' lo renderà molto carino (fai delle prove). Questo è importante quando uno stile influisce troppo sul prompt originale. Rendi più forte quel prompt aggiungendo delle parentesi intorno ad esso, così: ((promt)).\nPuoi digitare prompt nel formato [A|B] per usare in sequenza i termini uno dopo l'altro in ogni passaggio. Quindi, come [cat|dog] produrrà un 'canegatto' ibrido. E [A:B:0.4] per passare ad altri termini dopo che il primo è stato attivo per una certa percentuale di passaggi. Quindi [cat:dog:0.4] genererà un gatto il 40% dei passaggi e poi inizierà a trasformarlo in un cane. Sono richiesti più passaggi perchè funzioni correttamente.",
"Insert [X] anywhere in main prompt to sequentially insert values from here.": "Inserisci [X] ovunque nel prompt principale per inserire in sequenza i valori da qui.",
"Insert [R] anywhere in main prompt to randomly insert values from here.": "Inserisci [R] ovunque nel prompt principale per inserire i valori in modo casuale da qui.",
"Enter one prompt per line. Blank lines will be ignored.": "Immettere un prompt per riga. Le righe vuote verranno ignorate.",
"Separate values for X axis using commas.": "Separare i valori per l'asse X usando le virgole.",
"Separate values for Y axis using commas.": "Separare i valori per l'asse Y usando le virgole.",
@ -1188,8 +1430,10 @@
"1st and last digit must be 1. ex:'1, 2, 1'": "La prima e l'ultima cifra devono essere 1. Es.:'1, 2, 1'",
"Path to directory with input images": "Percorso della cartella con immagini di input",
"Path to directory where to write outputs": "Percorso della cartella in cui scrivere i risultati",
"C:\\\\...\\pykrita": "C:\\\\...\\pykrita",
"C:\\directory\\of\\datasets": "C:\\cartella\\del\\dataset",
"Input images directory": "Cartella di input delle immagini",
"Prompt for tokenization": "Prompt for tokenization",
"Use following tags to define how filenames for images are chosen: [steps], [cfg], [prompt], [prompt_no_styles], [prompt_spaces], [width], [height], [styles], [sampler], [seed], [model_hash], [prompt_words], [date], [datetime], [job_timestamp]; leave empty for default.": "Usa i seguenti tag per definire come vengono scelti i nomi dei file per le immagini: [steps], [cfg], [prompt], [prompt_no_styles], [prompt_spaces], [width], [height], [styles], [sampler], [seed ], [model_hash], [prompt_words], [date], [datetime], [job_timestamp]; lasciare vuoto per usare l'impostazione predefinita.",
"If this option is enabled, watermark will not be added to created images. Warning: if you do not add watermark, you may be behaving in an unethical manner.": "Se questa opzione è abilitata, la filigrana non verrà aggiunta alle immagini create. Attenzione: se non aggiungi la filigrana, potresti comportarti in modo non etico.",
"Use following tags to define how subdirectories for images and grids are chosen: [steps], [cfg], [prompt], [prompt_no_styles], [prompt_spaces], [width], [height], [styles], [sampler], [seed], [model_hash], [prompt_words], [date], [datetime], [job_timestamp]; leave empty for default.": "Utilizzare i seguenti tag per definire come vengono scelte le sottodirectory per le immagini e le griglie: [steps], [cfg], [prompt], [prompt_no_styles], [prompt_spaces], [width], [height], [styles], [sampler], [seed], [model_hash], [prompt_words], [date], [datetime], [job_timestamp]; lasciare vuoto per usare l'impostazione predefinita.",
@ -1200,24 +1444,103 @@
"List of setting names, separated by commas, for settings that should go to the quick access bar at the top, rather than the usual setting tab. See modules/shared.py for setting names. Requires restarting to apply.": "Elenco dei nomi delle impostazioni, separati da virgole, per le impostazioni che dovrebbero essere visualizzate nella barra di accesso rapido in alto, anziché nella normale scheda delle impostazioni. Vedi modules/shared.py per impostare i nomi. Richiede il riavvio per applicare.",
"If this values is non-zero, it will be added to seed and used to initialize RNG for noises when using samplers with Eta. You can use this to produce even more variation of images, or you can use this to match images of other software if you know what you are doing.": "Se questo valore è diverso da zero, verrà aggiunto al seed e utilizzato per inizializzare il generatore di numeri casuali per il rumore quando si utilizzano campionatori con ETA. Puoi usarlo per produrre ancora più variazioni di immagini, oppure puoi usarlo per abbinare le immagini di altri software se sai cosa stai facendo.",
"Leave empty for auto": "Lasciare vuoto per automatico",
"NAIConvert": "Converti\nNovelAI",
"History": "Crononolgia",
"specify a custom settings file and ignore settings displayed in the interface": "specificare un file di impostazioni personalizzate e ignorare le impostazioni visualizzate nell'interfaccia",
"the path to a custom settings file": "il percorso di un file delle impostazioni personalizzate",
"The width of the output images, in pixels (must be a multiple of 64)": "La larghezza delle immagini di output, in pixel (deve essere un multiplo di 64)",
"The height of the output images, in pixels (must be a multiple of 64)": "L'altezza delle immagini di output, in pixel (deve essere un multiplo di 64)",
"enable additional seed settings": "abilitare impostazioni seme aggiuntive",
"How many times to improve the generated image iteratively; higher values take longer; very low values can produce bad results": "Quante volte migliorare l'immagine generata in modo iterativo; valori più alti richiedono più tempo; valori molto bassi possono produrre risultati negativi",
"output images will be placed in a folder with this name, inside of the img2img output folder": "le immagini di output verranno collocate in una cartella con questo nome, all'interno della cartella di output img2img",
"specify the format of the filename for output images": "specificare il formato del nome file per le immagini di output",
"defines the seed behavior that is used for animations": "definisce il comportamento del seme utilizzato per le animazioni",
"the seed value will increment by 1 for each subsequent frame of the animation": "il valore del seme aumenterà di 1 per ogni fotogramma successivo dell'animazione",
"selects the type of animation": "seleziona il tipo di animazione",
"only 2D motion parameters will be used, but this mode uses the least amount of VRAM. You can optionally enable flip_2d_perspective to enable some psuedo-3d animation parameters while in 2D mode.": "verranno utilizzati solo i parametri di movimento 2D, ma questa modalità utilizza la quantità minima di VRAM. Puoi facoltativamente abilitare flip_2d_perspective per abilitare alcuni parametri di animazione psuedo-3d mentre sei in modalità 2D.",
"the maximum number of output images to be created": "il numero massimo di immagini di output da creare",
"controls handling method of pixels to be generated when the image is smaller than the frame.": "controlla il metodo di gestione dei pixel da generare quando l'immagine è più piccola del fotogramma.",
"repeats the edge of the pixels, and extends them. Animations with quick motion may yield lines where this border function was attempting to populate pixels into the empty space created.": "ripete il bordo dei pixel e li estende. Le animazioni con movimento rapido possono produrre linee in cui questa funzione di bordo stava tentando di popolare i pixel nello spazio vuoto creato.",
"2D operator to rotate canvas clockwise/anticlockwise in degrees per frame": "Operatore 2D per ruotare la tela in senso orario/antiorario in gradi per fotogramma",
"2D operator that scales the canvas size, multiplicatively. [static = 1.0]": "Operatore 2D che ridimensiona le dimensioni della tela, in modo moltiplicativo. [statico = 1.0]",
"2D & 3D operator to move canvas left/right in pixels per frame": "Operatore 2D e 3D per spostare la tela a sinistra/destra in pixel per fotogramma",
"2D & 3D operator to move canvas up/down in pixels per frame": "Operatore 2D e 3D per spostare la tela su/giù in pixel per fotogramma",
"3D operator to move canvas towards/away from view [speed set by FOV]": "Operatore 3D per spostare la tela da/verso la visuale [velocità impostata da FOV]",
"3D operator to tilt canvas up/down in degrees per frame": "Operatore 3D per inclinare la tela su/giù in gradi per fotogramma",
"3D operator to pan canvas left/right in degrees per frame": "Operatore 3D per eseguire una panoramica della tela a sinistra/destra in gradi per fotogramma",
"3D operator to roll canvas clockwise/anticlockwise": "Operatore 3D per ruotare la tela in senso orario/antiorario",
"enables 2D mode functions to simulate faux 3D movement": "abilita le funzioni della modalità 2D per simulare falsi movimenti 3D",
"the roll effect angle": "l'angolo dell'effetto di rollio",
"the tilt effect angle": "l'angolo dell'effetto di inclinazione",
"the pan effect angle": "l'angolo dell'effetto panoramica",
"the 2D vanishing point of perspective (recommended range 30-160)": "il punto di fuga prospettico 2D (intervallo consigliato 30-160)",
"amount of graininess to add per frame for diffusion diversity": "quantità di granulosità da aggiungere per fotogramma per la diversità di diffusione",
"amount of presence of previous frame to influence next frame, also controls steps in the following formula [steps - (strength_schedule * steps)]": "quantità di presenza del fotogramma precedente per influenzare il fotogramma successivo, controlla anche i passaggi nella seguente formula [passi - (forza pianificazione * steps)]",
"adjusts the overall contrast per frame [default neutral at 1.0]": "regola il contrasto generale per fotogramma [neutro predefinito a 1.0]",
"how closely the image should conform to the prompt. Lower values produce more creative results. (recommended range 5-15)": "quanto l'immagine deve essere conforme al prompt. Valori più bassi producono risultati più creativi. (intervallo consigliato 5-15)",
"adjusts the scale at which the canvas is moved in 3D by the translation_z value. [maximum range -180 to +180, with 0 being undefined. Values closer to 180 will make the image have less depth, while values closer to 0 will allow more depth]": "regola la scala alla quale la tela viene spostata in 3D in base al valore traslazione_z. [intervallo massimo da -180 a +180, con 0 non definito. Valori più vicini a 180 renderanno l'immagine meno profonda, mentre valori più vicini a 0 consentiranno una maggiore profondità]",
"allows you to specify seeds at a specific schedule, if seed_behavior is set to schedule.": "ti consente di specificare i semi in base a una pianificazione specifica, se seed_behavior è impostato su pianificazione.",
"The color coherence will attempt to sample the overall pixel color information, and trend those values analyzed in the first frame to be applied to future frames.": "La coerenza del colore tenterà di campionare le informazioni complessive sul colore dei pixel e tendere quei valori analizzati nel primo fotogramma da applicare ai fotogrammi futuri.",
"LAB is a more linear approach to mimic human perception of color space - a good default setting for most users.": "LAB è un approccio più lineare per imitare la percezione umana dello spazio colore, una buona impostazione predefinita per la maggior parte degli utenti.",
"The default setting of 1 will cause every frame to receive diffusion in the sequence of image outputs. A setting of 2 will only diffuse on every other frame, yet motion will still be in effect. The output of images during the cadence sequence will be automatically blended, additively and saved to the specified drive. This may improve the illusion of coherence in some workflows as the content and context of an image will not change or diffuse during frames that were skipped. Higher values of 4-8 cadence will skip over a larger amount of frames and only diffuse the “Nth” frame as set by the diffusion_cadence value. This may produce more continuity in an animation, at the cost of little opportunity to add more diffused content. In extreme examples, motion within a frame will fail to produce diverse prompt context, and the space will be filled with lines or approximations of content - resulting in unexpected animation patterns and artifacts. Video Input & Interpolation modes are not affected by diffusion_cadence.": "L'impostazione predefinita di 1 farà sì che ogni fotogramma riceva la diffusione nella sequenza di output delle immagini. Un'impostazione di 2 si diffonderà solo su ogni altro fotogramma, ma il movimento sarà comunque attivo. L'output delle immagini durante la sequenza di cadenza verrà automaticamente miscelato, additivato e salvato nell'unità specificata. Ciò può migliorare l'illusione di coerenza in alcuni flussi di lavoro poiché il contenuto e il contesto di un'immagine non cambiano o si diffondono durante i fotogrammi che sono stati ignorati. Valori più alti di 4-8 cadenza salteranno una quantità maggiore di fotogrammi e diffonderanno solo il fotogramma 'Nth' come impostato dal valore di diffusione_cadenza. Ciò può produrre più continuità in un'animazione, a costo di poche opportunità di aggiungere contenuti più diffusi. In esempi estremi, il movimento all'interno di un fotogramma non riuscirà a produrre un contesto di richiesta diverso e lo spazio sarà riempito con linee o approssimazioni di contenuto, risultando in modelli di animazione e artefatti inaspettati. Le modalità di ingresso video e interpolazione non sono influenzate da diffusion_cadence.",
"enables instructions to warp an image dynamically in 3D mode only.": "abilita le istruzioni per deformare un'immagine dinamicamente solo in modalità 3D.",
"sets a midpoint at which a depthmap is to be drawn: range [-1 to +1]": "imposta un punto medio in cui deve essere disegnata una mappa di profondità: range [da -1 a +1]",
"instructs the handling of pixels outside the field of view as they come into the scene.": "indica la gestione dei pixel al di fuori del campo visivo quando entrano nella scena.",
"choose from Bicubic, Bilinear or Nearest modes. (Recommended: Bicubic)": "scegliere tra le modalità Bicubico, Bilineare o Più vicino. (Consigliato: Bicubico)",
"will output a greyscale depth map image alongside the output images.": "produrrà un'immagine della mappa di profondità in scala di grigi insieme alle immagini di output.",
"Diffuse the first frame based on an image, similar to img2img.": "Diffondi il primo fotogramma in base a un'immagine, simile a img2img.",
"Set the strength to 0 automatically when no init image is used": "Imposta automaticamente l'intensità su 0 quando non viene utilizzata alcuna immagine iniziale",
"Controls the strength of the diffusion on the init image. 0 = disabled": "Controlla l'intensità della diffusione sull'immagine iniziale 0 = disabilitato",
"the path to your init image": "il percorso alla tua immagine iniziale",
"Use a grayscale image as a mask on your init image. Whiter areas of the mask are areas that change more.": "Usa un'immagine in scala di grigi come maschera sull'immagine iniziale. Le aree più bianche della maschera sono aree che cambiano di più.",
"use the alpha channel of the init image as the mask": "usa il canale alfa dell'immagine iniziale come maschera",
"Inverts the colors of the mask": "Inverte i colori della maschera",
"Overlay the masked image at the end of the generation so it does not get degraded by encoding and decoding": "Sovrapponi l'immagine mascherata alla fine della generazione in modo che non venga degradata dalla codifica e dalla decodifica",
"the path to your mask image": "il percorso per l'immagine della maschera",
"adjust the brightness of the mask. Should be a positive number, with 1.0 meaning no adjustment.": "regola la luminosità della maschera. Dovrebbe essere un numero positivo, con 1.0 che significa nessuna correzione.",
"Blur edges of final overlay mask, if used. Minimum = 0 (no blur)": "Sfoca i bordi della maschera di sovrapposizione finale, se utilizzata. Minimo = 0 (nessuna sfocatura)",
"the directory at which your video file is located for Video Input mode only.": "la cartella in cui si trova il file video per la modalità solo Ingresso video.",
"during the run sequence, only frames specified by this value will be extracted, saved, and diffused upon. A value of 1 indicates that every frame is to be accounted for. Values of 2 will use every other frame for the sequence. Higher values will skip that number of frames respectively.": "durante la sequenza di esecuzione, verranno estratti, salvati e diffusi solo i frame specificati da questo valore. Un valore di 1 indica che deve essere contabilizzato ogni frame. I valori di 2 utilizzeranno ogni altro fotogramma per la sequenza. Valori più alti salteranno rispettivamente quel numero di fotogrammi.",
"when enabled, will re-extract video frames each run. When using video_input mode, the run will be instructed to write video frames to the drive. If youve already populated the frames needed, uncheck this box to skip past redundant extraction, and immediately start the render. If you have not extracted frames, you must run at least once with this box checked to write the necessary frames.": "quando abilitato, estrarrà nuovamente i fotogrammi video ad ogni esecuzione. Quando si utilizza la modalità Ingresso video, all'esecuzione verrà richiesto di scrivere fotogrammi video sull'unità. Se avete già popolato i fotogrammi necessari, deselezionate questa casella per saltare l'estrazione ridondante e avviare immediatamente il rendering. Se non sono stati estratti i frame, è necessario eseguire almeno una volta l'operazione con questa casella selezionata per scrivere i fotogrammi necessari.",
"video_input mode only, enables the extraction and use of a separate video file intended for use as a mask. White areas of the extracted video frames will not be affected by diffusion, while black areas will be fully effected. Lighter/darker areas are affected dynamically.": "in modalità solo video Input, consente l'estrazione e l'utilizzo di un file video separato destinato all'uso come maschera. Le aree bianche dei fotogrammi video estratti non saranno interessate dalla diffusione, mentre le aree nere saranno interamente interessate. Le aree più chiare/scure sono interessate in modo dinamico.",
"the directory in which your mask video is located.": "la cartella in cui si trova il video della maschera.",
"selects whether to ignore prompt schedule or _x_frames.": "seleziona se ignorare la pianificazione dei prompt o _x_frames.",
"the number of frames to transition thru between prompts (when interpolate_key_frames = true, then the numbers in front of the animation prompts will dynamically guide the images based on their value. If set to false, will ignore the prompt numbers and force interpole_x_frames value regardless of prompt number)": "il numero di fotogrammi per la transizione tra i prompt (quando interpola fotogrammi chiave = true, i numeri davanti ai prompt dell'animazione guideranno dinamicamente le immagini in base al loro valore. Se impostato su false, ignorerà i numeri dei prompt e forzerà il valore di interpola x fotogrammi indipendentemente da numero di richiesta)",
"instructs the run to start from a specified point": "avvia l'esecuzione da un punto specificato",
"the required timestamp to reference when resuming. Currently only available in 2D & 3D mode, the timestamp is saved as the settings .txt file name as well as images produced during your previous run. The format follows: yyyymmddhhmmss - a timestamp of when the run was started to diffuse.": "l'orario a cui fare riferimento quando si riprende. Attualmente disponibile solo in modalità 2D e 3D, l'orario viene salvato come nome del file .txt delle impostazioni e come immagini prodotte durante la corsa precedente. Il formato segue: yyyymmddhhmmss - l'orario di quando è stata avviata la diffusione dell'esecuzione.",
"when checked, do not output a video": "se selezionato, non produce un video",
"The frames per second that the video will run at": "I fotogrammi al secondo a cui verrà eseguito il video",
"select the type of video file to output": "selezionare il tipo di file video da produrre",
"create an animated GIF": "crea una GIF animata",
"the path to where ffmpeg is located": "il percorso in cui si trova ffmpeg",
"when this box is checked, and FFMPEG mp4 is selected as the output format, an audio file will be multiplexed with the video.": "quando questa casella è selezionata e FFMPEG mp4 è selezionato come formato di output, un file audio verrà multiplexato con il video.",
"the path to an audio file to accompany the video": "tIl percorso di un file audio per accompagnare il video",
"when this is unchecked, the video will automatically be created in the same output folder as the images. Check this box to specify different settings for the creation of the video, specified by the following options": "quando questo è deselezionato, il video verrà creato automaticamente nella stessa cartella di output delle immagini. Selezionare questa casella per specificare impostazioni diverse per la creazione del video, specificate dalle seguenti opzioni",
"render each step of diffusion as a separate frame": "renderizzare ogni fase di diffusione come fotogramma separato",
"the maximum number of frames to include in the video, when use_manual_settings is checked": "il numero massimo di fotogrammi da includere nel video, quando è selezionato 'Usa impostazioni manuali'",
"the location of images to create the video from, when use_manual_settings is checked": "la posizione delle immagini da cui creare il video, quando è selezionato 'Usa impostazioni manuali'",
"the output location of the mp4 file, when use_manual_settings is checked": "il percorso di output del file mp4, quando è selezionato 'Usa impostazioni manuali'",
"Autocomplete options": "Opzioni di autocompletamento",
"Enable Autocomplete": "Abilita autocompletamento",
"Append commas": "Aggiungi virgole",
"Error": "Errore",
"F": "F",
"Time taken:": "Tempo impiegato:",
"latest": "aggiornato",
"behind": "da aggiornare",
"AlphaCanvas": "AlphaCanvas",
"Close": "Chiudi",
"Grab Results": "Ottieni risultati",
"Apply Patch": "Applica Patch",
"Hue:0": "Hue:0",
"S:0": "S:0",
"L:0": "L:0",
"Load Canvas": "Carica Canvas",
"Save Canvas": "Salva Canvas",
"latest": "aggiornato",
"behind": "da aggiornare",
"Close": "Chiudi",
"Grab Results": "Ottieni risultati",
"Apply Patch": "Applica Patch",
"Description": "Descrizione",
"Action": "Azione",
"Aesthetic Gradients": "Gradienti estetici",
"Create an embedding from one or few pictures and use it to apply their style to generated images.": "Crea un incorporamento da una o poche immagini e usalo per applicare il loro stile alle immagini generate.",
"Create an embedding from one or few pictures and use it to apply their style to generated images.": "Crea un incorporamento da una o poche immagini e lo usa per applicare il loro stile alle immagini generate.",
"Sample extension. Allows you to use __name__ syntax in your prompt to get a random line from a file named name.txt in the wildcards directory. Also see Dynamic Prompts for similar functionality.": "Estensione del campione. Consente di utilizzare la sintassi __name__ nel prompt per ottenere una riga casuale da un file denominato name.txt nella cartella dei termini jolly. Vedi anche 'Prompt dinamici' per funzionalità simili.",
"Dynamic Prompts": "Prompt dinamici",
"Implements an expressive template language for random or combinatorial prompt generation along with features to support deep wildcard directory structures.": "Implementa un modello di linguaggio espressivo per la generazione di prompt casuale o combinatoria insieme a funzionalità per supportare cartelle strutturate contenenti termini jolly.",
@ -1226,8 +1549,17 @@
"Randomly display the pictures of the artist's or artistic genres typical style, more pictures of this artist or genre is displayed after selecting. So you don't have to worry about how hard it is to choose the right style of art when you create.": "Visualizza in modo casuale le immagini dello stile tipico dell'artista o dei generi artistici, dopo la selezione vengono visualizzate più immagini di questo artista o genere. Così non dovete preoccuparvi della difficoltà di scegliere lo stile artistico giusto quando create.",
"The official port of Deforum, an extensive script for 2D and 3D animations, supporting keyframable sequences, dynamic math parameters (even inside the prompts), dynamic masking, depth estimation and warping.": "Il porting ufficiale di Deforum, uno script completo per animazioni 2D e 3D, che supporta sequenze di fotogrammi chiave, parametri matematici dinamici (anche all'interno dei prompt), mascheramento dinamico, stima della profondità e warping.",
"Artists to study": "Artisti per studiare",
"Shows a gallery of generated pictures by artists separated into categories.": "Mostra una galleria di immagini generate dagli artisti suddivise in categorie.",
"Shows a gallery of generated pictures by artists separated into categories.": "Mostra una galleria di immagini generate in base agli artisti e suddivise in categorie.",
"Calculates aesthetic score for generated images using CLIP+MLP Aesthetic Score Predictor based on Chad Scorer": "Calcola il punteggio estetico per le immagini generate utilizzando il predittore del punteggio estetico CLIP+MLP basato su Chad Scorer",
"Lets you edit captions in training datasets.": "Consente di modificare i sottotitoli nei set di dati di addestramento.",
"Time taken:": "Tempo impiegato:"
}
"Lets you edit captions in training datasets.": "Consente di modificare le didascalie nei set di dati di addestramento.",
"Krita Plugin.": "Krita Plugin.",
"Adds a tab to the webui that allows the user to automatically extract keyframes from video, and manually extract 512x512 crops of those frames for use in model training.": "Aggiunge una scheda all'interfaccia Web che consente all'utente di estrarre automaticamente i fotogrammi chiave dal video ed estrarre manualmente ritagli 512x512 di quei fotogrammi da utilizzare nell'addestramento del modello.",
"Allows you to include various shortcodes in your prompts. You can pull text from files, set up your own variables, process text through conditional functions, and so much more - it's like wildcards on steroids..": "Consente di includere vari codici brevi nei prompt. Puoi estrarre il testo dai file, impostare le tue variabili, elaborare il testo tramite funzioni condizionali e molto altro ancora: è come i termini jolly ma potenziato.",
"Booru tag autocompletion": "Completamento automatico del tag Booru",
"Displays autocompletion hints for tags from image booru boards such as Danbooru. Uses local tag CSV files and includes a config for customization.": "Visualizza suggerimenti per il completamento automatico dei tag dalle schede di immagini Booru, come Danbooru. Utilizza file CSV di tag locali e include una configurazione per la personalizzazione.",
"Add a button to convert the prompts used in NovelAI for use in the WebUI. In addition, add a button that allows you to recall a previously used prompt.": "Aggiunge un pulsante per convertire i prompt utilizzati in NovelAI per l'uso in Stable Diffusion Web UI. Inoltre, aggiunge un pulsante che permette di richiamare un prompt utilizzato in precedenza.",
"tokenizer": "Tokenizzatore",
"Adds a tab that lets you preview how CLIP model would tokenize your text.": "Aggiunge una scheda che consente di visualizzare in anteprima il modo in cui il modello CLIP tokenizzerebbe il vostro testo.",
"parameters": "Parametri",
"The directory does not exist": "La cartella non esiste"
}

View File

@ -16,6 +16,7 @@
"A merger of the two checkpoints will be generated in your": "체크포인트들이 병합된 결과물이 당신의",
"A value that determines the output of random number generator - if you create an image with same parameters and seed as another image, you'll get the same result": "난수 생성기의 결과물을 지정하는 값 - 동일한 설정값과 동일한 시드를 적용 시, 완전히 똑같은 결과물을 얻게 됩니다.",
"Action": "작업",
"Add a button to convert the prompts used in NovelAI for use in the WebUI. In addition, add a button that allows you to recall a previously used prompt.": "NovelAI에서 사용되는 프롬프트를 WebUI에서 사용할 수 있게 변환하는 버튼을 추가합니다. 덤으로 이전에 사용한 프롬프트를 불러오는 버튼도 추가됩니다.",
"Add a random artist to the prompt.": "프롬프트에 랜덤한 작가 추가",
"Add a second progress bar to the console that shows progress for an entire job.": "콘솔에 전체 작업의 진행도를 보여주는 2번째 프로그레스 바 추가하기",
"Add difference": "차이점 추가",
@ -24,6 +25,7 @@
"Add model hash to generation information": "생성 정보에 모델 해시 추가",
"Add model name to generation information": "생성 정보에 모델 이름 추가",
"Add number to filename when saving": "이미지를 저장할 때 파일명에 숫자 추가하기",
"Adds a tab that lets you preview how CLIP model would tokenize your text.": "CLIP 모델이 텍스트를 어떻게 토큰화할지 미리 보여주는 탭을 추가합니다.",
"Adds a tab to the webui that allows the user to automatically extract keyframes from video, and manually extract 512x512 crops of those frames for use in model training.": "WebUI에 비디오로부터 자동으로 키프레임을 추출하고, 그 키프레임으로부터 모델 훈련에 사용될 512x512 이미지를 잘라낼 수 있는 탭을 추가합니다.",
"Aesthetic Gradients": "스타일 그라디언트",
"Aesthetic Image Scorer": "스타일 이미지 스코어러",
@ -33,6 +35,7 @@
"Aesthetic text for imgs": "스타일 텍스트",
"Aesthetic weight": "스타일 가중치",
"Allowed categories for random artists selection when using the Roll button": "랜덤 버튼을 눌러 무작위 작가를 선택할 때 허용된 카테고리",
"Allows you to include various shortcodes in your prompts. You can pull text from files, set up your own variables, process text through conditional functions, and so much more - it's like wildcards on steroids.": "프롬프트에 다양한 숏코드를 추가할 수 있게 해줍니다. 파일로부터 텍스트 추출, 변수 설정, 조건 함수로 텍스트 처리 등등 - 스테로이드를 맞은 와일드카드라 할 수 있죠.",
"Always print all generation info to standard output": "기본 아웃풋에 모든 생성 정보 항상 출력하기",
"Always save all generated image grids": "생성된 이미지 그리드 항상 저장하기",
"Always save all generated images": "생성된 이미지 항상 저장하기",
@ -54,6 +57,7 @@
"Batch Process": "이미지 여러장 처리",
"Batch size": "배치 크기",
"behind": "최신 아님",
"Booru tag autocompletion": "Booru 태그 자동완성",
"BSRGAN 4x": "BSRGAN 4x",
"built with gradio": "gradio로 제작되었습니다",
"Calculates aesthetic score for generated images using CLIP+MLP Aesthetic Score Predictor based on Chad Scorer": "Chad 스코어러를 기반으로 한 CLIP+MLP 스타일 점수 예측기를 이용해 생성된 이미지의 스타일 점수를 계산합니다.",
@ -114,6 +118,7 @@
"Directory for saving images using the Save button": "저장 버튼을 이용해 저장하는 이미지들의 저장 경로",
"Directory name pattern": "디렉토리명 패턴",
"directory.": "저장 경로에 저장됩니다.",
"Displays autocompletion hints for tags from image booru boards such as Danbooru. Uses local tag CSV files and includes a config for customization.": "Danbooru 같은 이미지 booru 보드의 태그에 대한 자동완성 힌트를 보여줍니다. 로컬 환경에 저장된 CSV 파일을 사용하고 조정 가능한 설정 파일이 포함되어 있습니다.",
"Do not add watermark to images": "이미지에 워터마크 추가하지 않기",
"Do not do anything special": "아무것도 하지 않기",
"Do not save grids consisting of one picture": "이미지가 1개뿐인 그리드는 저장하지 않기",
@ -317,6 +322,7 @@
"None": "없음",
"Nothing": "없음",
"Nothing found in the image.": "Nothing found in the image.",
"novelai-2-local-prompt": "NovelAI 프롬프트 변환기",
"Number of columns on the page": "각 페이지마다 표시할 가로줄 수",
"Number of grids in each row": "각 세로줄마다 표시될 그리드 수",
"number of images to delete consecutively next": "연속적으로 삭제할 이미지 수",
@ -431,6 +437,7 @@
"Save images with embedding in PNG chunks": "PNG 청크로 이미지에 임베딩을 포함시켜 저장",
"Save style": "스타일 저장",
"Save text information about generation parameters as chunks to png files": "이미지 생성 설정값을 PNG 청크에 텍스트로 저장",
"Saves Optimizer state as separate *.optim file. Training can be resumed with HN itself and matching optim file.": "옵티마이저 상태를 별개의 *.optim 파일로 저장하기. 하이퍼네트워크 파일과 일치하는 optim 파일로부터 훈련을 재개할 수 있습니다.",
"Saving images/grids": "이미지/그리드 저장",
"Saving to a directory": "디렉토리에 저장",
"Scale by": "스케일링 배수 지정",
@ -515,6 +522,7 @@
"Tile size for ESRGAN upscalers. 0 = no tiling.": "ESRGAN 업스케일러들의 타일 사이즈. 0 = 타일링 없음.",
"Tiling": "타일링",
"Time taken:": "소요 시간 : ",
"tokenizer": "토크나이저",
"Torch active/reserved:": "활성화/예약된 Torch 양 : ",
"Torch active: Peak amount of VRAM used by Torch during generation, excluding cached data.\nTorch reserved: Peak amount of VRAM allocated by Torch, including all active and cached data.\nSys VRAM: Peak amount of VRAM allocation across all applications / total GPU VRAM (peak utilization%).": "활성화된 Torch : 생성 도중 캐시된 데이터를 포함해 사용된 VRAM의 최대량\n예약된 Torch : 활성화되고 캐시된 모든 데이터를 포함해 Torch에게 할당된 VRAM의 최대량\n시스템 VRAM : 모든 어플리케이션에 할당된 VRAM 최대량 / 총 GPU VRAM (최고 이용도%)",
"Train": "훈련",

View File

@ -109,7 +109,7 @@
"Sigma noise": "Sigma noise",
"Eta": "Eta",
"Clip skip": "Clip 跳过",
"Denoising": "去噪",
"Denoising": "重绘幅度",
"Cond. Image Mask Weight": "图像调节屏蔽度",
"X values": "X轴数值",
"Y type": "Y轴类型",

View File

@ -7,7 +7,7 @@
"Loading...": "載入中…",
"view": "檢視",
"api": "api",
"•": "•",
"•": " ",
"built with gradio": "基於 Gradio 構建",
"Stable Diffusion checkpoint": "Stable Diffusion 模型權重存檔點",
"txt2img": "文生圖",
@ -70,12 +70,12 @@
"Variation strength": "差異強度",
"Resize seed from width": "自寬度縮放隨機種子",
"Resize seed from height": "自高度縮放隨機種子",
"Open for Clip Aesthetic!": "打開美術風格 Clip!",
"Open for Clip Aesthetic!": "打開以調整 Clip 的美術風格!",
"▼": "▼",
"Aesthetic weight": "美術風格權重",
"Aesthetic steps": "美術風格疊代步數",
"Aesthetic learning rate": "美術風格學習率",
"Slerp interpolation": "Slerp 插值",
"Slerp interpolation": "球面線性插值角度",
"Aesthetic imgs embedding": "美術風格圖集 embedding",
"None": "無",
"Aesthetic text for imgs": "該圖集的美術風格描述",
@ -105,15 +105,15 @@
"Prompt order": "提示詞順序",
"Sampler": "採樣器",
"Checkpoint name": "模型權重存檔點的名稱",
"Hypernetwork": "超網路",
"Hypernet str.": "超網路強度",
"Hypernetwork": "超網路Hypernetwork",
"Hypernet str.": "超網路Hypernetwork強度",
"Sigma Churn": "Sigma Churn",
"Sigma min": "最小 Sigma",
"Sigma max": "最大 Sigma",
"Sigma noise": "Sigma noise",
"Eta": "Eta",
"Clip skip": "Clip 跳過",
"Denoising": "去噪",
"Denoising": "重繪幅度",
"Cond. Image Mask Weight": "圖像調節屏蔽度",
"X values": "X軸數值",
"Y type": "Y軸類型",
@ -189,6 +189,7 @@
"Tile overlap": "圖塊重疊的畫素",
"Upscaler": "放大演算法",
"Lanczos": "Lanczos",
"Nearest": "最鄰近(整數縮放)",
"LDSR": "LDSR",
"BSRGAN 4x": "BSRGAN 4x",
"ESRGAN_4x": "ESRGAN_4x",
@ -230,15 +231,15 @@
"for detailed explanation.": "以了解詳細說明",
"Create embedding": "生成 embedding",
"Create aesthetic images embedding": "生成美術風格圖集 embedding",
"Create hypernetwork": "生成 hypernetwork",
"Create hypernetwork": "生成超網路Hypernetwork",
"Preprocess images": "圖像預處理",
"Name": "名稱",
"Initialization text": "初始化文字",
"Number of vectors per token": "每個 token 的向量數",
"Overwrite Old Embedding": "覆寫舊的 Embedding",
"Modules": "模組",
"Enter hypernetwork layer structure": "輸入 hypernetwork 層結構",
"Select activation function of hypernetwork": "選擇 hypernetwork 的激活函數",
"Enter hypernetwork layer structure": "輸入超網路Hypernetwork層結構",
"Select activation function of hypernetwork": "選擇超網路Hypernetwork的激活函數",
"linear": "linear",
"relu": "relu",
"leakyrelu": "leakyrelu",
@ -276,7 +277,7 @@
"XavierNormal": "Xavier 正態",
"Add layer normalization": "加入層標準化",
"Use dropout": "採用 dropout 防止過擬合",
"Overwrite Old Hypernetwork": "覆寫舊的 Hypernetwork",
"Overwrite Old Hypernetwork": "覆寫舊的超網路Hypernetwork",
"Source directory": "來源目錄",
"Destination directory": "目標目錄",
"Existing Caption txt Action": "對已有的TXT說明文字的行為",
@ -298,11 +299,11 @@
"Create debug image": "生成除錯圖片",
"Preprocess": "預處理",
"Train an embedding; must specify a directory with a set of 1:1 ratio images": "訓練 embedding 必須指定一組具有 1:1 比例圖像的目錄",
"Train an embedding or Hypernetwork; you must specify a directory with a set of 1:1 ratio images": "訓練 embedding 或者 hypernetwork 必須指定一組具有 1:1 比例圖像的目錄",
"[wiki]": "[wiki]",
"Train an embedding or Hypernetwork; you must specify a directory with a set of 1:1 ratio images": "訓練 embedding 或者超網路Hypernetwork 必須指定一組具有 1:1 比例圖像的目錄",
"[wiki]": "[wiki文件]",
"Embedding": "Embedding",
"Embedding Learning rate": "Embedding 學習率",
"Hypernetwork Learning rate": "Hypernetwork 學習率",
"Hypernetwork Learning rate": "超網路Hypernetwork學習率",
"Learning rate": "學習率",
"Dataset directory": "資料集目錄",
"Log directory": "日誌目錄",
@ -312,7 +313,7 @@
"Save a copy of embedding to log directory every N steps, 0 to disable": "每 N 步將 embedding 的副本儲存到日誌目錄0 表示禁用",
"Save images with embedding in PNG chunks": "儲存圖像,並在 PNG 圖片檔案中嵌入 embedding 檔案",
"Read parameters (prompt, etc...) from txt2img tab when making previews": "進行預覽時,從文生圖頁籤中讀取參數(提示詞等)",
"Train Hypernetwork": "訓練 Hypernetwork",
"Train Hypernetwork": "訓練超網路Hypernetwork",
"Train Embedding": "訓練 Embedding",
"Create an aesthetic embedding out of any number of images": "從任意數量的圖像中建立美術風格 embedding",
"Create images embedding": "生成圖集 embedding",
@ -418,7 +419,7 @@
"Checkpoints to cache in RAM": "快取在內存RAM中的模型權重存檔點",
"SD VAE": "模型的VAE",
"auto": "自動",
"Hypernetwork strength": "Hypernetwork 強度",
"Hypernetwork strength": "超網路Hypernetwork強度",
"Inpainting conditioning mask strength": "局部重繪時圖像調節的蒙版屏蔽強度",
"Apply color correction to img2img results to match original colors.": "對圖生圖結果套用顏色校正以匹配原始顏色",
"With img2img, do exactly the amount of steps the slider specifies (normally you'd do less with less denoising).": "在進行圖生圖的時候,確切地執行滑塊指定的疊代步數(正常情況下更弱的重繪幅度需要更少的疊代步數)",
@ -488,7 +489,17 @@
"Extension": "擴充",
"URL": "網址",
"Update": "更新",
"a1111-sd-webui-tagcomplete": "標記自動補全",
"unknown": "未知",
"deforum-for-automatic1111-webui": "Deforum",
"sd-dynamic-prompting": "動態提示詞",
"stable-diffusion-webui-aesthetic-gradients": "美術風格梯度",
"stable-diffusion-webui-aesthetic-image-scorer": "美術風格評等",
"stable-diffusion-webui-artists-to-study": "藝術家圖庫",
"stable-diffusion-webui-dataset-tag-editor": "資料集標記編輯器",
"stable-diffusion-webui-images-browser": "圖庫瀏覽器",
"stable-diffusion-webui-inspiration": "靈感",
"stable-diffusion-webui-wildcards": "萬用字元",
"Load from:": "載入自",
"Extension index URL": "擴充清單連結",
"URL for extension's git repository": "擴充的 git 倉庫連結",
@ -527,8 +538,8 @@
"What to put inside the masked area before processing it with Stable Diffusion.": "在使用 Stable Diffusion 處理蒙版區域之前要在蒙版區域內放置什麼",
"fill it with colors of the image": "用圖像的顏色(高強度模糊)填充它",
"keep whatever was there originally": "保留原來的圖像,不進行預處理",
"fill it with latent space noise": "用潛空間的噪聲填充它",
"fill it with latent space zeroes": "用潛空間的零填充它",
"fill it with latent space noise": "於潛空間填充噪聲",
"fill it with latent space zeroes": "於潛空間填零",
"Upscale masked region to target resolution, do inpainting, downscale back and paste into original image": "將蒙版區域(包括預留畫素長度的緩衝區域)放大到目標解析度,進行局部重繪。\n然後縮小並粘貼回原始圖像中",
"Resize image to target resolution. Unless height and width match, you will get incorrect aspect ratio.": "將圖像大小調整為目標解析度。除非高度和寬度匹配,否則你將獲得不正確的縱橫比",
"Resize the image so that entirety of target resolution is filled with the image. Crop parts that stick out.": "調整圖像大小,使整個目標解析度都被圖像填充。裁剪多出來的部分",
@ -560,6 +571,8 @@
"Select which Real-ESRGAN models to show in the web UI. (Requires restart)": "選擇哪些 Real-ESRGAN 模型顯示在網頁使用者介面。(需要重新啟動)",
"Allowed categories for random artists selection when using the Roll button": "使用抽選藝術家按鈕時將會隨機的藝術家類別",
"Append commas": "附加逗號",
"latest": "最新",
"behind": "落後",
"Roll three": "抽三位出來",
"Generate forever": "無限生成",
"Cancel generate forever": "停止無限生成",
@ -581,10 +594,9 @@
"Start drawing": "開始繪製",
"Description": "描述",
"Action": "行動",
"Aesthetic Gradients": "美術風格",
"aesthetic-gradients": "美術風格",
"stable-diffusion-webui-wildcards": "萬用字元",
"Dynamic Prompts": "動態提示",
"Aesthetic Gradients": "美術風格梯度",
"aesthetic-gradients": "美術風格梯度",
"Dynamic Prompts": "動態提示詞",
"images-browser": "圖庫瀏覽器",
"Inspiration": "靈感",
"Deforum": "Deforum",

View File

@ -10,6 +10,7 @@ from modules.api.models import *
from modules.processing import StableDiffusionProcessingTxt2Img, StableDiffusionProcessingImg2Img, process_images
from modules.sd_samplers import all_samplers
from modules.extras import run_extras, run_pnginfo
from PIL import PngImagePlugin
from modules.sd_models import checkpoints_list
from modules.realesrgan_model import get_realesrgan_models
from typing import List
@ -34,9 +35,21 @@ def setUpscalers(req: dict):
def encode_pil_to_base64(image):
buffer = io.BytesIO()
image.save(buffer, format="png")
return base64.b64encode(buffer.getvalue())
with io.BytesIO() as output_bytes:
# Copy any text-only metadata
use_metadata = False
metadata = PngImagePlugin.PngInfo()
for key, value in image.info.items():
if isinstance(key, str) and isinstance(value, str):
metadata.add_text(key, value)
use_metadata = True
image.save(
output_bytes, "PNG", pnginfo=(metadata if use_metadata else None)
)
bytes_data = output_bytes.getvalue()
return base64.b64encode(bytes_data)
class Api:
@ -50,6 +63,7 @@ class Api:
self.app.add_api_route("/sdapi/v1/extra-batch-images", self.extras_batch_images_api, methods=["POST"], response_model=ExtrasBatchImagesResponse)
self.app.add_api_route("/sdapi/v1/png-info", self.pnginfoapi, methods=["POST"], response_model=PNGInfoResponse)
self.app.add_api_route("/sdapi/v1/progress", self.progressapi, methods=["GET"], response_model=ProgressResponse)
self.app.add_api_route("/sdapi/v1/interrogate", self.interrogateapi, methods=["POST"])
self.app.add_api_route("/sdapi/v1/interrupt", self.interruptapi, methods=["POST"])
self.app.add_api_route("/sdapi/v1/options", self.get_config, methods=["GET"], response_model=OptionsModel)
self.app.add_api_route("/sdapi/v1/options", self.set_config, methods=["POST"])
@ -201,11 +215,24 @@ class Api:
return ProgressResponse(progress=progress, eta_relative=eta_relative, state=shared.state.dict(), current_image=current_image)
def interrogateapi(self, interrogatereq: InterrogateRequest):
image_b64 = interrogatereq.image
if image_b64 is None:
raise HTTPException(status_code=404, detail="Image not found")
img = self.__base64_to_image(image_b64)
# Override object param
with self.queue_lock:
processed = shared.interrogator.interrogate(img)
return InterrogateResponse(caption=processed)
def interruptapi(self):
shared.state.interrupt()
return {}
def get_config(self):
options = {}
for key in shared.opts.data.keys():
@ -214,10 +241,14 @@ class Api:
options.update({key: shared.opts.data.get(key, shared.opts.data_labels.get(key).default)})
else:
options.update({key: shared.opts.data.get(key, None)})
return options
def set_config(self, req: OptionsModel):
# currently req has all options fields even if you send a dict like { "send_seed": false }, which means it will
# overwrite all options with default values.
raise RuntimeError('Setting options via API is not supported')
reqDict = vars(req)
for o in reqDict:
setattr(shared.opts, o, reqDict[o])
@ -233,13 +264,13 @@ class Api:
def get_upscalers(self):
upscalers = []
for upscaler in shared.sd_upscalers:
u = upscaler.scaler
upscalers.append({"name":u.name, "model_name":u.model_name, "model_path":u.model_path, "model_url":u.model_url})
return upscalers
def get_sd_models(self):
return [{"title":x.title, "model_name":x.model_name, "hash":x.hash, "filename": x.filename, "config": x.config} for x in checkpoints_list.values()]
@ -251,11 +282,11 @@ class Api:
def get_realesrgan_models(self):
return [{"name":x.name,"path":x.data_path, "scale":x.scale} for x in get_realesrgan_models(None)]
def get_promp_styles(self):
styleList = []
for k in shared.prompt_styles.styles:
style = shared.prompt_styles.styles[k]
style = shared.prompt_styles.styles[k]
styleList.append({"name":style[0], "prompt": style[1], "negative_prompr": style[2]})
return styleList

View File

@ -1,11 +1,11 @@
import inspect
from pydantic import BaseModel, Field, create_model
from typing import Any, Optional, Union
from typing import Any, Optional
from typing_extensions import Literal
from inflection import underscore
from modules.processing import StableDiffusionProcessingTxt2Img, StableDiffusionProcessingImg2Img
from modules.shared import sd_upscalers, opts, parser
from typing import List
from typing import Dict, List
API_NOT_ALLOWED = [
"self",
@ -65,6 +65,7 @@ class PydanticModelGenerator:
self._model_name = model_name
self._class_data = merge_class_params(class_instance)
self._model_def = [
ModelDef(
field=underscore(k),
@ -167,6 +168,12 @@ class ProgressResponse(BaseModel):
state: dict = Field(title="State", description="The current state snapshot")
current_image: str = Field(default=None, title="Current image", description="The current image in base64 format. opts.show_progress_every_n_steps is required for this to work.")
class InterrogateRequest(BaseModel):
image: str = Field(default="", title="Image", description="Image to work on, must be a Base64 string containing the image's data.")
class InterrogateResponse(BaseModel):
caption: str = Field(default=None, title="Caption", description="The generated caption for the image.")
fields = {}
for key, value in opts.data.items():
metadata = opts.data_labels.get(key)
@ -185,22 +192,22 @@ _options = vars(parser)['_option_string_actions']
for key in _options:
if(_options[key].dest != 'help'):
flag = _options[key]
_type = str
if(_options[key].default != None): _type = type(_options[key].default)
_type = str
if _options[key].default is not None: _type = type(_options[key].default)
flags.update({flag.dest: (_type,Field(default=flag.default, description=flag.help))})
FlagsModel = create_model("Flags", **flags)
class SamplerItem(BaseModel):
name: str = Field(title="Name")
aliases: list[str] = Field(title="Aliases")
options: dict[str, str] = Field(title="Options")
aliases: List[str] = Field(title="Aliases")
options: Dict[str, str] = Field(title="Options")
class UpscalerItem(BaseModel):
name: str = Field(title="Name")
model_name: str | None = Field(title="Model Name")
model_path: str | None = Field(title="Path")
model_url: str | None = Field(title="URL")
model_name: Optional[str] = Field(title="Model Name")
model_path: Optional[str] = Field(title="Path")
model_url: Optional[str] = Field(title="URL")
class SDModelItem(BaseModel):
title: str = Field(title="Title")
@ -211,23 +218,24 @@ class SDModelItem(BaseModel):
class HypernetworkItem(BaseModel):
name: str = Field(title="Name")
path: str | None = Field(title="Path")
path: Optional[str] = Field(title="Path")
class FaceRestorerItem(BaseModel):
name: str = Field(title="Name")
cmd_dir: str | None = Field(title="Path")
cmd_dir: Optional[str] = Field(title="Path")
class RealesrganItem(BaseModel):
name: str = Field(title="Name")
path: str | None = Field(title="Path")
scale: int | None = Field(title="Scale")
path: Optional[str] = Field(title="Path")
scale: Optional[int] = Field(title="Scale")
class PromptStyleItem(BaseModel):
name: str = Field(title="Name")
prompt: str | None = Field(title="Prompt")
negative_prompt: str | None = Field(title="Negative Prompt")
prompt: Optional[str] = Field(title="Prompt")
negative_prompt: Optional[str] = Field(title="Negative Prompt")
class ArtistItem(BaseModel):
name: str = Field(title="Name")
score: float = Field(title="Score")
category: str = Field(title="Category")
category: str = Field(title="Category")

View File

@ -34,8 +34,11 @@ class Extension:
if repo is None or repo.bare:
self.remote = None
else:
self.remote = next(repo.remote().urls, None)
self.status = 'unknown'
try:
self.remote = next(repo.remote().urls, None)
self.status = 'unknown'
except Exception:
self.remote = None
def list_files(self, subdir, extension):
from modules import scripts

View File

@ -22,6 +22,8 @@ from collections import defaultdict, deque
from statistics import stdev, mean
optimizer_dict = {optim_name : cls_obj for optim_name, cls_obj in inspect.getmembers(torch.optim, inspect.isclass) if optim_name != "Optimizer"}
class HypernetworkModule(torch.nn.Module):
multiplier = 1.0
activation_dict = {
@ -142,6 +144,8 @@ class Hypernetwork:
self.use_dropout = use_dropout
self.activate_output = activate_output
self.last_layer_dropout = kwargs['last_layer_dropout'] if 'last_layer_dropout' in kwargs else True
self.optimizer_name = None
self.optimizer_state_dict = None
for size in enable_sizes or []:
self.layers[size] = (
@ -163,6 +167,7 @@ class Hypernetwork:
def save(self, filename):
state_dict = {}
optimizer_saved_dict = {}
for k, v in self.layers.items():
state_dict[k] = (v[0].state_dict(), v[1].state_dict())
@ -178,8 +183,15 @@ class Hypernetwork:
state_dict['sd_checkpoint_name'] = self.sd_checkpoint_name
state_dict['activate_output'] = self.activate_output
state_dict['last_layer_dropout'] = self.last_layer_dropout
if self.optimizer_name is not None:
optimizer_saved_dict['optimizer_name'] = self.optimizer_name
torch.save(state_dict, filename)
if shared.opts.save_optimizer_state and self.optimizer_state_dict:
optimizer_saved_dict['hash'] = sd_models.model_hash(filename)
optimizer_saved_dict['optimizer_state_dict'] = self.optimizer_state_dict
torch.save(optimizer_saved_dict, filename + '.optim')
def load(self, filename):
self.filename = filename
@ -202,6 +214,18 @@ class Hypernetwork:
print(f"Activate last layer is set to {self.activate_output}")
self.last_layer_dropout = state_dict.get('last_layer_dropout', False)
optimizer_saved_dict = torch.load(self.filename + '.optim', map_location = 'cpu') if os.path.exists(self.filename + '.optim') else {}
self.optimizer_name = optimizer_saved_dict.get('optimizer_name', 'AdamW')
print(f"Optimizer name is {self.optimizer_name}")
if sd_models.model_hash(filename) == optimizer_saved_dict.get('hash', None):
self.optimizer_state_dict = optimizer_saved_dict.get('optimizer_state_dict', None)
else:
self.optimizer_state_dict = None
if self.optimizer_state_dict:
print("Loaded existing optimizer from checkpoint")
else:
print("No saved optimizer exists in checkpoint")
for size, sd in state_dict.items():
if type(size) == int:
self.layers[size] = (
@ -219,11 +243,11 @@ class Hypernetwork:
def list_hypernetworks(path):
res = {}
for filename in glob.iglob(os.path.join(path, '**/*.pt'), recursive=True):
for filename in sorted(glob.iglob(os.path.join(path, '**/*.pt'), recursive=True)):
name = os.path.splitext(os.path.basename(filename))[0]
# Prevent a hypothetical "None.pt" from being listed.
if name != "None":
res[name] = filename
res[name + f"({sd_models.model_hash(filename)})"] = filename
return res
@ -358,6 +382,7 @@ def train_hypernetwork(hypernetwork_name, learn_rate, batch_size, data_root, log
shared.state.textinfo = "Initializing hypernetwork training..."
shared.state.job_count = steps
hypernetwork_name = hypernetwork_name.rsplit('(', 1)[0]
filename = os.path.join(shared.cmd_opts.hypernetwork_dir, f'{hypernetwork_name}.pt')
log_directory = os.path.join(log_directory, datetime.datetime.now().strftime("%Y-%m-%d"), hypernetwork_name)
@ -410,8 +435,22 @@ def train_hypernetwork(hypernetwork_name, learn_rate, batch_size, data_root, log
weights = hypernetwork.weights()
for weight in weights:
weight.requires_grad = True
# if optimizer == "AdamW": or else Adam / AdamW / SGD, etc...
optimizer = torch.optim.AdamW(weights, lr=scheduler.learn_rate)
# Here we use optimizer from saved HN, or we can specify as UI option.
if hypernetwork.optimizer_name in optimizer_dict:
optimizer = optimizer_dict[hypernetwork.optimizer_name](params=weights, lr=scheduler.learn_rate)
optimizer_name = hypernetwork.optimizer_name
else:
print(f"Optimizer type {hypernetwork.optimizer_name} is not defined!")
optimizer = torch.optim.AdamW(params=weights, lr=scheduler.learn_rate)
optimizer_name = 'AdamW'
if hypernetwork.optimizer_state_dict: # This line must be changed if Optimizer type can be different from saved optimizer.
try:
optimizer.load_state_dict(hypernetwork.optimizer_state_dict)
except RuntimeError as e:
print("Cannot resume from saved optimizer!")
print(e)
steps_without_grad = 0
@ -479,7 +518,11 @@ def train_hypernetwork(hypernetwork_name, learn_rate, batch_size, data_root, log
# Before saving, change name to match current checkpoint.
hypernetwork_name_every = f'{hypernetwork_name}-{steps_done}'
last_saved_file = os.path.join(hypernetwork_dir, f'{hypernetwork_name_every}.pt')
hypernetwork.optimizer_name = optimizer_name
if shared.opts.save_optimizer_state:
hypernetwork.optimizer_state_dict = optimizer.state_dict()
save_hypernetwork(hypernetwork, checkpoint, hypernetwork_name, last_saved_file)
hypernetwork.optimizer_state_dict = None # dereference it after saving, to save memory.
textual_inversion.write_loss(log_directory, "hypernetwork_loss.csv", hypernetwork.step, len(ds), {
"loss": f"{previous_mean_loss:.7f}",
@ -542,8 +585,12 @@ Last saved image: {html.escape(last_saved_image)}<br/>
report_statistics(loss_dict)
filename = os.path.join(shared.cmd_opts.hypernetwork_dir, f'{hypernetwork_name}.pt')
hypernetwork.optimizer_name = optimizer_name
if shared.opts.save_optimizer_state:
hypernetwork.optimizer_state_dict = optimizer.state_dict()
save_hypernetwork(hypernetwork, checkpoint, hypernetwork_name, filename)
del optimizer
hypernetwork.optimizer_state_dict = None # dereference it after saving, to save memory.
return hypernetwork, filename
def save_hypernetwork(hypernetwork, checkpoint, hypernetwork_name, filename):

View File

@ -9,7 +9,7 @@ from modules import devices, sd_hijack, shared
from modules.hypernetworks import hypernetwork
not_available = ["hardswish", "multiheadattention"]
keys = ["linear"] + list(x for x in hypernetwork.HypernetworkModule.activation_dict.keys() if x not in not_available)
keys = list(x for x in hypernetwork.HypernetworkModule.activation_dict.keys() if x not in not_available)
def create_hypernetwork(name, enable_sizes, overwrite_old, layer_structure=None, activation_func=None, weight_init=None, add_layer_norm=False, use_dropout=False):
# Remove illegal characters from name.

View File

@ -101,8 +101,8 @@ class LDSR:
down_sample_rate = target_scale / 4
wd = width_og * down_sample_rate
hd = height_og * down_sample_rate
width_downsampled_pre = int(wd)
height_downsampled_pre = int(hd)
width_downsampled_pre = int(np.ceil(wd))
height_downsampled_pre = int(np.ceil(hd))
if down_sample_rate != 1:
print(
@ -110,7 +110,12 @@ class LDSR:
im_og = im_og.resize((width_downsampled_pre, height_downsampled_pre), Image.LANCZOS)
else:
print(f"Down sample rate is 1 from {target_scale} / 4 (Not downsampling)")
logs = self.run(model["model"], im_og, diffusion_steps, eta)
# pad width and height to multiples of 64, pads with the edge values of image to avoid artifacts
pad_w, pad_h = np.max(((2, 2), np.ceil(np.array(im_og.size) / 64).astype(int)), axis=0) * 64 - im_og.size
im_padded = Image.fromarray(np.pad(np.array(im_og), ((0, pad_h), (0, pad_w), (0, 0)), mode='edge'))
logs = self.run(model["model"], im_padded, diffusion_steps, eta)
sample = logs["sample"]
sample = sample.detach().cpu()
@ -120,6 +125,9 @@ class LDSR:
sample = np.transpose(sample, (0, 2, 3, 1))
a = Image.fromarray(sample[0])
# remove padding
a = a.crop((0, 0) + tuple(np.array(im_og.size) * 4))
del model
gc.collect()
torch.cuda.empty_cache()

View File

@ -3,6 +3,7 @@ import os
import sys
import traceback
localizations = {}
@ -16,6 +17,11 @@ def list_localizations(dirname):
localizations[fn] = os.path.join(dirname, file)
from modules import scripts
for file in scripts.list_scripts("localizations", ".json"):
fn, ext = os.path.splitext(file.filename)
localizations[fn] = file.path
def localization_js(current_localization_name):
fn = localizations.get(current_localization_name, None)

View File

@ -23,11 +23,18 @@ def encode(*args):
class RestrictedUnpickler(pickle.Unpickler):
extra_handler = None
def persistent_load(self, saved_id):
assert saved_id[0] == 'storage'
return TypedStorage()
def find_class(self, module, name):
if self.extra_handler is not None:
res = self.extra_handler(module, name)
if res is not None:
return res
if module == 'collections' and name == 'OrderedDict':
return getattr(collections, name)
if module == 'torch._utils' and name in ['_rebuild_tensor_v2', '_rebuild_parameter']:
@ -52,7 +59,7 @@ class RestrictedUnpickler(pickle.Unpickler):
return set
# Forbid everything else.
raise pickle.UnpicklingError(f"global '{module}/{name}' is forbidden")
raise Exception(f"global '{module}/{name}' is forbidden")
allowed_zip_names = ["archive/data.pkl", "archive/version"]
@ -69,7 +76,7 @@ def check_zip_filenames(filename, names):
raise Exception(f"bad file inside {filename}: {name}")
def check_pt(filename):
def check_pt(filename, extra_handler):
try:
# new pytorch format is a zip file
@ -78,6 +85,7 @@ def check_pt(filename):
with z.open('archive/data.pkl') as file:
unpickler = RestrictedUnpickler(file)
unpickler.extra_handler = extra_handler
unpickler.load()
except zipfile.BadZipfile:
@ -85,16 +93,42 @@ def check_pt(filename):
# if it's not a zip file, it's an olf pytorch format, with five objects written to pickle
with open(filename, "rb") as file:
unpickler = RestrictedUnpickler(file)
unpickler.extra_handler = extra_handler
for i in range(5):
unpickler.load()
def load(filename, *args, **kwargs):
return load_with_extra(filename, *args, **kwargs)
def load_with_extra(filename, extra_handler=None, *args, **kwargs):
"""
this functon is intended to be used by extensions that want to load models with
some extra classes in them that the usual unpickler would find suspicious.
Use the extra_handler argument to specify a function that takes module and field name as text,
and returns that field's value:
```python
def extra(module, name):
if module == 'collections' and name == 'OrderedDict':
return collections.OrderedDict
return None
safe.load_with_extra('model.pt', extra_handler=extra)
```
The alternative to this is just to use safe.unsafe_torch_load('model.pt'), which as the name implies is
definitely unsafe.
"""
from modules import shared
try:
if not shared.cmd_opts.disable_safe_unpickle:
check_pt(filename)
check_pt(filename, extra_handler)
except pickle.UnpicklingError:
print(f"Error verifying pickled file from {filename}:", file=sys.stderr)

View File

@ -46,25 +46,23 @@ class CFGDenoiserParams:
ScriptCallback = namedtuple("ScriptCallback", ["script", "callback"])
callbacks_app_started = []
callbacks_model_loaded = []
callbacks_ui_tabs = []
callbacks_ui_settings = []
callbacks_before_image_saved = []
callbacks_image_saved = []
callbacks_cfg_denoiser = []
callback_map = dict(
callbacks_app_started=[],
callbacks_model_loaded=[],
callbacks_ui_tabs=[],
callbacks_ui_settings=[],
callbacks_before_image_saved=[],
callbacks_image_saved=[],
callbacks_cfg_denoiser=[]
)
def clear_callbacks():
callbacks_model_loaded.clear()
callbacks_ui_tabs.clear()
callbacks_ui_settings.clear()
callbacks_before_image_saved.clear()
callbacks_image_saved.clear()
callbacks_cfg_denoiser.clear()
for callback_list in callback_map.values():
callback_list.clear()
def app_started_callback(demo: Optional[Blocks], app: FastAPI):
for c in callbacks_app_started:
for c in callback_map['callbacks_app_started']:
try:
c.callback(demo, app)
except Exception:
@ -72,7 +70,7 @@ def app_started_callback(demo: Optional[Blocks], app: FastAPI):
def model_loaded_callback(sd_model):
for c in callbacks_model_loaded:
for c in callback_map['callbacks_model_loaded']:
try:
c.callback(sd_model)
except Exception:
@ -82,7 +80,7 @@ def model_loaded_callback(sd_model):
def ui_tabs_callback():
res = []
for c in callbacks_ui_tabs:
for c in callback_map['callbacks_ui_tabs']:
try:
res += c.callback() or []
except Exception:
@ -92,7 +90,7 @@ def ui_tabs_callback():
def ui_settings_callback():
for c in callbacks_ui_settings:
for c in callback_map['callbacks_ui_settings']:
try:
c.callback()
except Exception:
@ -100,7 +98,7 @@ def ui_settings_callback():
def before_image_saved_callback(params: ImageSaveParams):
for c in callbacks_before_image_saved:
for c in callback_map['callbacks_before_image_saved']:
try:
c.callback(params)
except Exception:
@ -108,7 +106,7 @@ def before_image_saved_callback(params: ImageSaveParams):
def image_saved_callback(params: ImageSaveParams):
for c in callbacks_image_saved:
for c in callback_map['callbacks_image_saved']:
try:
c.callback(params)
except Exception:
@ -116,7 +114,7 @@ def image_saved_callback(params: ImageSaveParams):
def cfg_denoiser_callback(params: CFGDenoiserParams):
for c in callbacks_cfg_denoiser:
for c in callback_map['callbacks_cfg_denoiser']:
try:
c.callback(params)
except Exception:
@ -129,17 +127,33 @@ def add_callback(callbacks, fun):
callbacks.append(ScriptCallback(filename, fun))
def remove_current_script_callbacks():
stack = [x for x in inspect.stack() if x.filename != __file__]
filename = stack[0].filename if len(stack) > 0 else 'unknown file'
if filename == 'unknown file':
return
for callback_list in callback_map.values():
for callback_to_remove in [cb for cb in callback_list if cb.script == filename]:
callback_list.remove(callback_to_remove)
def remove_callbacks_for_function(callback_func):
for callback_list in callback_map.values():
for callback_to_remove in [cb for cb in callback_list if cb.callback == callback_func]:
callback_list.remove(callback_to_remove)
def on_app_started(callback):
"""register a function to be called when the webui started, the gradio `Block` component and
fastapi `FastAPI` object are passed as the arguments"""
add_callback(callbacks_app_started, callback)
add_callback(callback_map['callbacks_app_started'], callback)
def on_model_loaded(callback):
"""register a function to be called when the stable diffusion model is created; the model is
passed as an argument"""
add_callback(callbacks_model_loaded, callback)
add_callback(callback_map['callbacks_model_loaded'], callback)
def on_ui_tabs(callback):
@ -152,13 +166,13 @@ def on_ui_tabs(callback):
title is tab text displayed to user in the UI
elem_id is HTML id for the tab
"""
add_callback(callbacks_ui_tabs, callback)
add_callback(callback_map['callbacks_ui_tabs'], callback)
def on_ui_settings(callback):
"""register a function to be called before UI settings are populated; add your settings
by using shared.opts.add_option(shared.OptionInfo(...)) """
add_callback(callbacks_ui_settings, callback)
add_callback(callback_map['callbacks_ui_settings'], callback)
def on_before_image_saved(callback):
@ -166,7 +180,7 @@ def on_before_image_saved(callback):
The callback is called with one argument:
- params: ImageSaveParams - parameters the image is to be saved with. You can change fields in this object.
"""
add_callback(callbacks_before_image_saved, callback)
add_callback(callback_map['callbacks_before_image_saved'], callback)
def on_image_saved(callback):
@ -174,7 +188,7 @@ def on_image_saved(callback):
The callback is called with one argument:
- params: ImageSaveParams - parameters the image was saved with. Changing fields in this object does nothing.
"""
add_callback(callbacks_image_saved, callback)
add_callback(callback_map['callbacks_image_saved'], callback)
def on_cfg_denoiser(callback):
@ -182,5 +196,4 @@ def on_cfg_denoiser(callback):
The callback is called with one argument:
- params: CFGDenoiserParams - parameters to be passed to the inner model and sampling state details.
"""
add_callback(callbacks_cfg_denoiser, callback)
add_callback(callback_map['callbacks_cfg_denoiser'], callback)

View File

@ -3,7 +3,6 @@ import sys
import traceback
from collections import namedtuple
import modules.ui as ui
import gradio as gr
from modules.processing import StableDiffusionProcessing

View File

@ -24,11 +24,15 @@ samplers_k_diffusion = [
('Heun', 'sample_heun', ['k_heun'], {}),
('DPM2', 'sample_dpm_2', ['k_dpm_2'], {}),
('DPM2 a', 'sample_dpm_2_ancestral', ['k_dpm_2_a'], {}),
('DPM++ 2S a', 'sample_dpmpp_2s_ancestral', ['k_dpmpp_2s_a'], {}),
('DPM++ 2M', 'sample_dpmpp_2m', ['k_dpmpp_2m'], {}),
('DPM fast', 'sample_dpm_fast', ['k_dpm_fast'], {}),
('DPM adaptive', 'sample_dpm_adaptive', ['k_dpm_ad'], {}),
('LMS Karras', 'sample_lms', ['k_lms_ka'], {'scheduler': 'karras'}),
('DPM2 Karras', 'sample_dpm_2', ['k_dpm_2_ka'], {'scheduler': 'karras'}),
('DPM2 a Karras', 'sample_dpm_2_ancestral', ['k_dpm_2_a_ka'], {'scheduler': 'karras'}),
('DPM++ 2S a Karras', 'sample_dpmpp_2s_ancestral', ['k_dpmpp_2s_a_ka'], {'scheduler': 'karras'}),
('DPM++ 2M Karras', 'sample_dpmpp_2m', ['k_dpmpp_2m_ka'], {'scheduler': 'karras'}),
]
samplers_data_k_diffusion = [

View File

@ -86,6 +86,10 @@ parser.add_argument("--nowebui", action='store_true', help="use api=True to laun
parser.add_argument("--ui-debug-mode", action='store_true', help="Don't load model to quickly launch UI")
parser.add_argument("--device-id", type=str, help="Select the default CUDA device to use (export CUDA_VISIBLE_DEVICES=0,1,etc might be needed before)", default=None)
parser.add_argument("--administrator", action='store_true', help="Administrator rights", default=False)
parser.add_argument("--cors-allow-origins", type=str, help="Allowed CORS origins", default=None)
parser.add_argument("--tls-keyfile", type=str, help="Partially enables TLS, requires --tls-certfile to fully function", default=None)
parser.add_argument("--tls-certfile", type=str, help="Partially enables TLS, requires --tls-keyfile to fully function", default=None)
parser.add_argument("--server-name", type=str, help="Sets hostname of server", default=None)
cmd_opts = parser.parse_args()
restricted_opts = {
@ -147,9 +151,9 @@ class State:
self.interrupted = True
def nextjob(self):
if opts.show_progress_every_n_steps == -1:
if opts.show_progress_every_n_steps == -1:
self.do_set_current_image()
self.job_no += 1
self.sampling_step = 0
self.current_image_sampling_step = 0
@ -198,7 +202,7 @@ class State:
return
if self.current_latent is None:
return
if opts.show_progress_grid:
self.current_image = sd_samplers.samples_to_image_grid(self.current_latent)
else:
@ -217,8 +221,6 @@ interrogator = modules.interrogate.InterrogateModels("interrogate")
face_restorers = []
localization.list_localizations(cmd_opts.localizations_dir)
def realesrgan_models_names():
import modules.realesrgan_model
@ -317,6 +319,7 @@ options_templates.update(options_section(('system', "System"), {
options_templates.update(options_section(('training', "Training"), {
"unload_models_when_training": OptionInfo(False, "Move VAE and CLIP to RAM when training if possible. Saves VRAM."),
"save_optimizer_state": OptionInfo(False, "Saves Optimizer state as separate *.optim file. Training can be resumed with HN itself and matching optim file."),
"dataset_filename_word_regex": OptionInfo("", "Filename word regex"),
"dataset_filename_join_string": OptionInfo(" ", "Filename join string"),
"training_image_repeats_per_epoch": OptionInfo(1, "Number of repeats for a single input image per epoch; used only for displaying epoch number", gr.Number, {"precision": 0}),
@ -406,7 +409,8 @@ class Options:
if key in self.data or key in self.data_labels:
assert not cmd_opts.freeze_settings, "changing settings is disabled"
comp_args = opts.data_labels[key].component_args
info = opts.data_labels.get(key, None)
comp_args = info.component_args if info else None
if isinstance(comp_args, dict) and comp_args.get('visible', True) is False:
raise RuntimeError(f"not possible to set {key} because it is restricted")

View File

@ -174,9 +174,9 @@ def save_pil_to_file(pil_image, dir=None):
gr.processing_utils.save_pil_to_file = save_pil_to_file
def wrap_gradio_call(func, extra_outputs=None):
def wrap_gradio_call(func, extra_outputs=None, add_stats=False):
def f(*args, extra_outputs_array=extra_outputs, **kwargs):
run_memmon = opts.memmon_poll_rate > 0 and not shared.mem_mon.disabled
run_memmon = opts.memmon_poll_rate > 0 and not shared.mem_mon.disabled and add_stats
if run_memmon:
shared.mem_mon.monitor()
t = time.perf_counter()
@ -203,11 +203,18 @@ def wrap_gradio_call(func, extra_outputs=None):
res = extra_outputs_array + [f"<div class='error'>{plaintext_to_html(type(e).__name__+': '+str(e))}</div>"]
shared.state.skipped = False
shared.state.interrupted = False
shared.state.job_count = 0
if not add_stats:
return tuple(res)
elapsed = time.perf_counter() - t
elapsed_m = int(elapsed // 60)
elapsed_s = elapsed % 60
elapsed_text = f"{elapsed_s:.2f}s"
if (elapsed_m > 0):
if elapsed_m > 0:
elapsed_text = f"{elapsed_m}m "+elapsed_text
if run_memmon:
@ -225,10 +232,6 @@ def wrap_gradio_call(func, extra_outputs=None):
# last item is always HTML
res[-1] += f"<div class='performance'><p class='time'>Time taken: <wbr>{elapsed_text}</p>{vram_html}</div>"
shared.state.skipped = False
shared.state.interrupted = False
shared.state.job_count = 0
return tuple(res)
return f
@ -1138,7 +1141,7 @@ def create_ui(wrap_gradio_gpu_call):
outputs=[html, generation_info, html2],
)
with gr.Blocks() as modelmerger_interface:
with gr.Blocks(analytics_enabled=False) as modelmerger_interface:
with gr.Row().style(equal_height=False):
with gr.Column(variant='panel'):
gr.HTML(value="<p>A merger of the two checkpoints will be generated in your <b>checkpoint</b> directory.</p>")
@ -1158,7 +1161,7 @@ def create_ui(wrap_gradio_gpu_call):
sd_hijack.model_hijack.embedding_db.load_textual_inversion_embeddings()
with gr.Blocks() as train_interface:
with gr.Blocks(analytics_enabled=False) as train_interface:
with gr.Row().style(equal_height=False):
gr.HTML(value="<p style='margin-bottom: 0.7em'>See <b><a href=\"https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Textual-Inversion\">wiki</a></b> for detailed explanation.</p>")
@ -1423,15 +1426,14 @@ def create_ui(wrap_gradio_gpu_call):
if info.refresh is not None:
if is_quicksettings:
res = comp(label=info.label, value=fun, elem_id=elem_id, **(args or {}))
res = comp(label=info.label, value=fun(), elem_id=elem_id, **(args or {}))
create_refresh_button(res, info.refresh, info.component_args, "refresh_" + key)
else:
with gr.Row(variant="compact"):
res = comp(label=info.label, value=fun, elem_id=elem_id, **(args or {}))
res = comp(label=info.label, value=fun(), elem_id=elem_id, **(args or {}))
create_refresh_button(res, info.refresh, info.component_args, "refresh_" + key)
else:
res = comp(label=info.label, value=fun, elem_id=elem_id, **(args or {}))
res = comp(label=info.label, value=fun(), elem_id=elem_id, **(args or {}))
return res
@ -1442,7 +1444,7 @@ def create_ui(wrap_gradio_gpu_call):
opts.reorder()
def run_settings(*args):
changed = 0
changed = []
for key, value, comp in zip(opts.data_labels.keys(), args, components):
assert comp == dummy_component or opts.same_type(value, opts.data_labels[key].default), f"Bad value for setting {key}: {value}; expecting {type(opts.data_labels[key].default).__name__}"
@ -1452,18 +1454,20 @@ def create_ui(wrap_gradio_gpu_call):
continue
oldval = opts.data.get(key, None)
setattr(opts, key, value)
try:
setattr(opts, key, value)
except RuntimeError:
continue
if oldval != value:
if opts.data_labels[key].onchange is not None:
opts.data_labels[key].onchange()
changed += 1
opts.save(shared.config_filename)
return opts.dumpjson(), f'{changed} settings changed.'
changed.append(key)
try:
opts.save(shared.config_filename)
except RuntimeError:
return opts.dumpjson(), f'{len(changed)} settings changed without save: {", ".join(changed)}.'
return opts.dumpjson(), f'{len(changed)} settings changed: {", ".join(changed)}.'
def run_settings_single(value, key):
if not opts.same_type(value, opts.data_labels[key].default):
@ -1567,11 +1571,10 @@ def create_ui(wrap_gradio_gpu_call):
shared.state.need_restart = True
restart_gradio.click(
fn=request_restart,
_js='restart_reload',
inputs=[],
outputs=[],
_js='restart_reload'
)
if column is not None:
@ -1641,6 +1644,17 @@ def create_ui(wrap_gradio_gpu_call):
outputs=[component, text_settings],
)
component_keys = [k for k in opts.data_labels.keys() if k in component_dict]
def get_settings_values():
return [getattr(opts, key) for key in component_keys]
demo.load(
fn=get_settings_values,
inputs=[],
outputs=[component_dict[k] for k in component_keys],
)
def modelmerger(*args):
try:
results = modules.extras.run_modelmerger(*args)

View File

@ -140,13 +140,15 @@ def install_extension_from_url(dirname, url):
shutil.rmtree(tmpdir, True)
def install_extension_from_index(url):
def install_extension_from_index(url, hide_tags):
ext_table, message = install_extension_from_url(None, url)
return refresh_available_extensions_from_data(), ext_table, message
code, _ = refresh_available_extensions_from_data(hide_tags)
return code, ext_table, message
def refresh_available_extensions(url):
def refresh_available_extensions(url, hide_tags):
global available_extensions
import urllib.request
@ -155,13 +157,25 @@ def refresh_available_extensions(url):
available_extensions = json.loads(text)
return url, refresh_available_extensions_from_data(), ''
code, tags = refresh_available_extensions_from_data(hide_tags)
return url, code, gr.CheckboxGroup.update(choices=tags), ''
def refresh_available_extensions_from_data():
def refresh_available_extensions_for_tags(hide_tags):
code, _ = refresh_available_extensions_from_data(hide_tags)
return code, ''
def refresh_available_extensions_from_data(hide_tags):
extlist = available_extensions["extensions"]
installed_extension_urls = {normalize_git_url(extension.remote): extension.name for extension in extensions.extensions}
tags = available_extensions.get("tags", {})
tags_to_hide = set(hide_tags)
hidden = 0
code = f"""<!-- {time.time()} -->
<table id="available_extensions">
<thead>
@ -178,17 +192,24 @@ def refresh_available_extensions_from_data():
name = ext.get("name", "noname")
url = ext.get("url", None)
description = ext.get("description", "")
extension_tags = ext.get("tags", [])
if url is None:
continue
if len([x for x in extension_tags if x in tags_to_hide]) > 0:
hidden += 1
continue
existing = installed_extension_urls.get(normalize_git_url(url), None)
install_code = f"""<input onclick="install_extension_from_index(this, '{html.escape(url)}')" type="button" value="{"Install" if not existing else "Installed"}" {"disabled=disabled" if existing else ""} class="gr-button gr-button-lg gr-button-secondary">"""
tags_text = ", ".join([f"<span class='extension-tag' title='{tags.get(x, '')}'>{x}</span>" for x in extension_tags])
code += f"""
<tr>
<td><a href="{html.escape(url)}">{html.escape(name)}</a></td>
<td><a href="{html.escape(url)}" target="_blank">{html.escape(name)}</a><br />{tags_text}</td>
<td>{html.escape(description)}</td>
<td>{install_code}</td>
</tr>
@ -199,7 +220,10 @@ def refresh_available_extensions_from_data():
</table>
"""
return code
if hidden > 0:
code += f"<p>Extension hidden: {hidden}</p>"
return code, list(tags)
def create_ui():
@ -238,21 +262,30 @@ def create_ui():
extension_to_install = gr.Text(elem_id="extension_to_install", visible=False)
install_extension_button = gr.Button(elem_id="install_extension_button", visible=False)
with gr.Row():
hide_tags = gr.CheckboxGroup(value=["ads", "localization"], label="Hide extensions with tags", choices=["script", "ads", "localization"])
install_result = gr.HTML()
available_extensions_table = gr.HTML()
refresh_available_extensions_button.click(
fn=modules.ui.wrap_gradio_call(refresh_available_extensions, extra_outputs=[gr.update(), gr.update()]),
inputs=[available_extensions_index],
outputs=[available_extensions_index, available_extensions_table, install_result],
fn=modules.ui.wrap_gradio_call(refresh_available_extensions, extra_outputs=[gr.update(), gr.update(), gr.update()]),
inputs=[available_extensions_index, hide_tags],
outputs=[available_extensions_index, available_extensions_table, hide_tags, install_result],
)
install_extension_button.click(
fn=modules.ui.wrap_gradio_call(install_extension_from_index, extra_outputs=[gr.update(), gr.update()]),
inputs=[extension_to_install],
inputs=[extension_to_install, hide_tags],
outputs=[available_extensions_table, extensions_table, install_result],
)
hide_tags.change(
fn=modules.ui.wrap_gradio_call(refresh_available_extensions_for_tags, extra_outputs=[gr.update()]),
inputs=[hide_tags],
outputs=[available_extensions_table, install_result]
)
with gr.TabItem("Install from URL"):
install_url = gr.Text(label="URL for extension's git repository")
install_dirname = gr.Text(label="Local directory name", placeholder="Leave empty for auto")

View File

@ -57,10 +57,18 @@ class Upscaler:
self.scale = scale
dest_w = img.width * scale
dest_h = img.height * scale
for i in range(3):
if img.width > dest_w and img.height > dest_h:
break
shape = (img.width, img.height)
img = self.do_upscale(img, selected_model)
if shape == (img.width, img.height):
break
if img.width >= dest_w and img.height >= dest_h:
break
if img.width != dest_w or img.height != dest_h:
img = img.resize((int(dest_w), int(dest_h)), resample=LANCZOS)

View File

@ -4,7 +4,7 @@ fairscale==0.4.4
fonts
font-roboto
gfpgan
gradio==3.8
gradio==3.9
invisible-watermark
numpy
omegaconf

View File

@ -2,7 +2,7 @@ transformers==4.19.2
diffusers==0.3.0
basicsr==1.4.2
gfpgan==1.3.8
gradio==3.8
gradio==3.9
numpy==1.23.3
Pillow==9.2.0
realesrgan==0.3.0

View File

@ -563,6 +563,11 @@ img2maskimg, #img2maskimg > .h-60, #img2maskimg > .h-60 > div, #img2maskimg > .h
opacity: 0.5;
}
.extension-tag{
font-weight: bold;
font-size: 95%;
}
/* The following handles localization for right-to-left (RTL) languages like Arabic.
The rtl media type will only be activated by the logic in javascript/localization.js.
If you change anything above, you need to make sure it is RTL compliant by just running

View File

@ -5,11 +5,12 @@ import importlib
import signal
import threading
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.middleware.gzip import GZipMiddleware
from modules.paths import script_path
from modules import devices, sd_samplers, upscaler, extensions
from modules import devices, sd_samplers, upscaler, extensions, localization
import modules.codeformer_model as codeformer
import modules.extras
import modules.face_restoration
@ -27,14 +28,12 @@ import modules.txt2img
import modules.script_callbacks
import modules.ui
from modules import devices
from modules import modelloader
from modules.paths import script_path
from modules.shared import cmd_opts
import modules.hypernetworks.hypernetwork
queue_lock = threading.Lock()
server_name = "0.0.0.0" if cmd_opts.listen else cmd_opts.server_name
def wrap_queued_call(func):
def f(*args, **kwargs):
@ -58,11 +57,12 @@ def wrap_gradio_gpu_call(func, extra_outputs=None):
return res
return modules.ui.wrap_gradio_call(f, extra_outputs=extra_outputs)
return modules.ui.wrap_gradio_call(f, extra_outputs=extra_outputs, add_stats=True)
def initialize():
extensions.list_extensions()
localization.list_localizations(cmd_opts.localizations_dir)
if cmd_opts.ui_debug_mode:
shared.sd_upscalers = upscaler.UpscalerLanczos().scalers
@ -85,6 +85,19 @@ def initialize():
shared.opts.onchange("sd_hypernetwork", wrap_queued_call(lambda: modules.hypernetworks.hypernetwork.load_hypernetwork(shared.opts.sd_hypernetwork)))
shared.opts.onchange("sd_hypernetwork_strength", modules.hypernetworks.hypernetwork.apply_strength)
if cmd_opts.tls_keyfile is not None and cmd_opts.tls_keyfile is not None:
try:
if not os.path.exists(cmd_opts.tls_keyfile):
print("Invalid path to TLS keyfile given")
if not os.path.exists(cmd_opts.tls_certfile):
print(f"Invalid path to TLS certfile: '{cmd_opts.tls_certfile}'")
except TypeError:
cmd_opts.tls_keyfile = cmd_opts.tls_certfile = None
print("TLS setup invalid, running webui without TLS")
else:
print("Running with TLS")
# make the program just exit at ctrl+c without waiting for anything
def sigint_handler(sig, frame):
print(f'Interrupted with signal {sig} in {frame}')
@ -93,6 +106,11 @@ def initialize():
signal.signal(signal.SIGINT, sigint_handler)
def setup_cors(app):
if cmd_opts.cors_allow_origins:
app.add_middleware(CORSMiddleware, allow_origins=cmd_opts.cors_allow_origins.split(','), allow_methods=['*'])
def create_api(app):
from modules.api.api import Api
api = Api(app, queue_lock)
@ -114,6 +132,7 @@ def api_only():
initialize()
app = FastAPI()
setup_cors(app)
app.add_middleware(GZipMiddleware, minimum_size=1000)
api = create_api(app)
@ -131,8 +150,10 @@ def webui():
app, local_url, share_url = demo.launch(
share=cmd_opts.share,
server_name="0.0.0.0" if cmd_opts.listen else None,
server_name=server_name,
server_port=cmd_opts.port,
ssl_keyfile=cmd_opts.tls_keyfile,
ssl_certfile=cmd_opts.tls_certfile,
debug=cmd_opts.gradio_debug,
auth=[tuple(cred.split(':')) for cred in cmd_opts.gradio_auth.strip('"').split(',')] if cmd_opts.gradio_auth else None,
inbrowser=cmd_opts.autolaunch,
@ -147,6 +168,8 @@ def webui():
# runnnig its code. We disable this here. Suggested by RyotaK.
app.user_middleware = [x for x in app.user_middleware if x.cls.__name__ != 'CORSMiddleware']
setup_cors(app)
app.add_middleware(GZipMiddleware, minimum_size=1000)
if launch_api:
@ -160,6 +183,9 @@ def webui():
print('Reloading extensions')
extensions.list_extensions()
localization.list_localizations(cmd_opts.localizations_dir)
print('Reloading custom scripts')
modules.scripts.reload_scripts()
print('Reloading modules: modules.ui')