Merge branch 'AUTOMATIC1111:master' into js
This commit is contained in:
commit
d0d74e459d
|
@ -22,3 +22,14 @@ function extensions_check(){
|
|||
|
||||
return []
|
||||
}
|
||||
|
||||
function install_extension_from_index(button, url){
|
||||
button.disabled = "disabled"
|
||||
button.value = "Installing..."
|
||||
|
||||
textarea = gradioApp().querySelector('#extension_to_install textarea')
|
||||
textarea.value = url
|
||||
textarea.dispatchEvent(new Event("input", { bubbles: true }))
|
||||
|
||||
gradioApp().querySelector('#install_extension_button').click()
|
||||
}
|
||||
|
|
27
launch.py
27
launch.py
|
@ -7,6 +7,7 @@ import shlex
|
|||
import platform
|
||||
|
||||
dir_repos = "repositories"
|
||||
dir_extensions = "extensions"
|
||||
python = sys.executable
|
||||
git = os.environ.get('GIT', "git")
|
||||
index_url = os.environ.get('INDEX_URL', "")
|
||||
|
@ -16,11 +17,11 @@ def extract_arg(args, name):
|
|||
return [x for x in args if x != name], name in args
|
||||
|
||||
|
||||
def run(command, desc=None, errdesc=None):
|
||||
def run(command, desc=None, errdesc=None, custom_env=None):
|
||||
if desc is not None:
|
||||
print(desc)
|
||||
|
||||
result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
|
||||
result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True, env=os.environ if custom_env is None else custom_env)
|
||||
|
||||
if result.returncode != 0:
|
||||
|
||||
|
@ -101,7 +102,25 @@ def version_check(commit):
|
|||
else:
|
||||
print("Not a git clone, can't perform version check.")
|
||||
except Exception as e:
|
||||
print("versipm check failed",e)
|
||||
print("version check failed", e)
|
||||
|
||||
|
||||
def run_extensions_installers():
|
||||
if not os.path.isdir(dir_extensions):
|
||||
return
|
||||
|
||||
for dirname_extension in os.listdir(dir_extensions):
|
||||
path_installer = os.path.join(dir_extensions, dirname_extension, "install.py")
|
||||
if not os.path.isfile(path_installer):
|
||||
continue
|
||||
|
||||
try:
|
||||
env = os.environ.copy()
|
||||
env['PYTHONPATH'] = os.path.abspath(".")
|
||||
|
||||
print(run(f'"{python}" "{path_installer}"', errdesc=f"Error running install.py for extension {dirname_extension}", custom_env=env))
|
||||
except Exception as e:
|
||||
print(e, file=sys.stderr)
|
||||
|
||||
|
||||
def prepare_enviroment():
|
||||
|
@ -189,6 +208,8 @@ def prepare_enviroment():
|
|||
|
||||
run_pip(f"install -r {requirements_file}", "requirements for Web UI")
|
||||
|
||||
run_extensions_installers()
|
||||
|
||||
if update_check:
|
||||
version_check(commit)
|
||||
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
"Image Browser": "Galleria immagini",
|
||||
"Inspiration": "Ispirazione",
|
||||
"Settings": "Impostazioni",
|
||||
"Extensions": "Estensioni",
|
||||
"Prompt": "Prompt",
|
||||
"Negative prompt": "Prompt negativo",
|
||||
"Run": "Esegui",
|
||||
|
@ -72,23 +73,27 @@
|
|||
"Variation strength": "Forza della variazione",
|
||||
"Resize seed from width": "Ridimensiona il seme dalla larghezza",
|
||||
"Resize seed from height": "Ridimensiona il seme dall'altezza",
|
||||
"Open for Clip Aesthetic!": "Apri per Estetica CLIP!",
|
||||
"Open for Clip Aesthetic!": "Apri per Gradienti Estetici (CLIP)",
|
||||
"▼": "▼",
|
||||
"Aesthetic weight": "Estetica - Peso",
|
||||
"Aesthetic steps": "Estetica - Passi",
|
||||
"Aesthetic learning rate": "Estetica - Tasso di apprendimento",
|
||||
"Slerp interpolation": "Interpolazione Slerp",
|
||||
"Aesthetic imgs embedding": "Estetica - Incorporamento di immagini",
|
||||
"None": "Nessuno",
|
||||
"None": "Niente",
|
||||
"Aesthetic text for imgs": "Estetica - Testo per le immagini",
|
||||
"Slerp angle": "Angolo Slerp",
|
||||
"Is negative text": "È un testo negativo",
|
||||
"Script": "Script",
|
||||
"Random": "Random",
|
||||
"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",
|
||||
"Custom code": "Custom code",
|
||||
"Custom code": "Codice personalizzato",
|
||||
"Dynamic Prompting v0.2": "Prompt dinamici v0.2",
|
||||
"Embedding to Shareable PNG": "Incorporamento convertito in PNG condivisibile",
|
||||
"Force symmetry": "Forza la simmetria",
|
||||
|
@ -97,20 +102,89 @@
|
|||
"Prompt morph": "Metamorfosi del prompt",
|
||||
"Prompts from file or textbox": "Prompt da file o da casella di testo",
|
||||
"To Infinity and Beyond": "Verso l'infinito e oltre",
|
||||
"Seed travel": "Seed travel",
|
||||
"Seed travel": "Interpolazione semi",
|
||||
"Shift attention": "Sposta l'attenzione",
|
||||
"Text to Vector Graphics": "Da testo a grafica vettoriale",
|
||||
"X/Y plot": "Grafico X/Y",
|
||||
"X/Y/Z plot": "Grafico X/Y/Z",
|
||||
"Create inspiration images": "Crea immagini di ispirazione",
|
||||
"Loops": "Loops",
|
||||
"step1 min/max": "step1 min/max",
|
||||
"step2 min/max": "step2 min/max",
|
||||
"cfg1 min/max": "cfg1 min/max",
|
||||
"cfg2 min/max": "cfg2 min/max",
|
||||
"Keep -1 for seeds": "Keep -1 for seeds",
|
||||
"step1 min/max": "Passi min(o max)",
|
||||
"step2 min/max": "Passi max (o min)",
|
||||
"step cnt": "Q.tà di Passi",
|
||||
"cfg1 min/max": "CFG min (o max)",
|
||||
"cfg2 min/max": "CFG max (o min)",
|
||||
"cfg cnt": "Q.tà di CFG",
|
||||
"Draw legend": "Disegna legenda",
|
||||
"Include Separate Images": "Includi immagini separate",
|
||||
"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",
|
||||
"Image type": "Tipo di immagine",
|
||||
"Not set": "Non impostato",
|
||||
"Photography": "Fotografia",
|
||||
"Digital art": "Arte digitale",
|
||||
"3D Rendering": "3D Rendering",
|
||||
"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",
|
||||
"Colors": "Colori",
|
||||
"Chaotic": "Caotico",
|
||||
"Primary colors": "Colori primari",
|
||||
"Colorful": "Colorato",
|
||||
"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",
|
||||
"View": "Visuale",
|
||||
"Tilt shift": "Tilt shift",
|
||||
"Wide-angle": "Angolo ampio",
|
||||
"Portrait": "Ritratto",
|
||||
"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>",
|
||||
"Noise Scheduler": "Programmatore del rumore",
|
||||
"Seeds": "Semi",
|
||||
"Noise Scheduler": "Pianificazione del rumore",
|
||||
"Default": "Predefinito",
|
||||
"Karras": "Karras",
|
||||
"Exponential": "Esponenziale",
|
||||
|
@ -121,6 +195,47 @@
|
|||
"Beta distribution (VP only)": "Distribuzione Beta (Solo CV)",
|
||||
"Beta min (VP only)": "Beta min (Solo CV)",
|
||||
"Epsilon (VP only)": "Epsilon (Solo CV)",
|
||||
"Running in txt2img mode:": "Running in txt2img mode:",
|
||||
"Render these video formats:": "Renderizza in questi formati:",
|
||||
"GIF": "GIF",
|
||||
"MP4": "MP4",
|
||||
"WEBM": "WEBM",
|
||||
"Animation Parameters": "Parametri animazione",
|
||||
"Total Animation Length (s)": "Durata totale dell'animazione (s)",
|
||||
"Framerate": "Frequenza dei fotogrammi",
|
||||
"Smoothing_Frames": "Smoothing_Frames",
|
||||
"Add_Noise": "Aggiungi rumore",
|
||||
"Noise Strength": "Intensità del rumore",
|
||||
"Initial Parameters": "Parametri iniziali",
|
||||
"Denoising Strength (overrides img2img slider)": "Intensità di riduzione del rumore (sovrascrive il cursore img2img)",
|
||||
"Seed_March": "Seed_March",
|
||||
"Zoom Factor (scale/s)": "Fattore di ingrandimento (scala/s)",
|
||||
"X Pixel Shift (pixels/s)": "Sposta i Pixel sull'asse X (pixel/s)",
|
||||
"Y Pixel Shift (pixels/s)": "Sposta i Pixel sull'asse Y (pixel/s)",
|
||||
"Rotation (deg/s)": "Rotazione (gradi/s)",
|
||||
"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": "Props, Stamps",
|
||||
"Poper_Folder:": "Cartella Poper:",
|
||||
"Supported Keyframes:": "Fotogrammi chiave supportati:",
|
||||
"time_s | source | video, images, img2img | path": "time_s | source | video, images, img2img | path",
|
||||
"time_s | prompt | positive_prompts | negative_prompts": "time_s | prompt | positive_prompts | negative_prompts",
|
||||
"time_s | template | positive_prompts | negative_prompts": "time_s | template | positive_prompts | negative_prompts",
|
||||
"time_s | transform | zoom | x_shift | y_shift | rotation": "time_s | transform | zoom | x_shift | y_shift | rotation",
|
||||
"time_s | seed | new_seed_int": "time_s | seed | new_seed_int",
|
||||
"time_s | noise | added_noise_strength": "time_s | noise | added_noise_strength",
|
||||
"time_s | denoise | denoise_value": "time_s | denoise | denoise_value",
|
||||
"time_s | set_text | textblock_name | text_prompt | x | y | w | h | fore_color | back_color | font_name": "time_s | set_text | textblock_name | text_prompt | x | y | w | h | fore_color | back_color | font_name",
|
||||
"time_s | clear_text | textblock_name": "time_s | clear_text | textblock_name",
|
||||
"time_s | prop | prop_name | prop_filename | x pos | y pos | scale | rotation": "time_s | prop | prop_name | prop_filename | x pos | y pos | scale | rotation",
|
||||
"time_s | set_stamp | stamp_name | stamp_filename | x pos | y pos | scale | rotation": "time_s | set_stamp | stamp_name | stamp_filename | x pos | y pos | scale | rotation",
|
||||
"time_s | clear_stamp | stamp_name": "time_s | clear_stamp | stamp_name",
|
||||
"time_s | col_set": "time_s | col_set",
|
||||
"time_s | col_clear": "time_s | col_clear",
|
||||
"time_s | model | model": "time_s | model | model",
|
||||
"img2img_mode": "img2img_mode",
|
||||
"Keyframes:": "Fotogrammi chiave:",
|
||||
"Tile X": "Piastrella asse X",
|
||||
"Tile Y": "Piastrella asse Y",
|
||||
"Python code": "Codice Python",
|
||||
|
@ -128,7 +243,7 @@
|
|||
"Combinations": "Combinazioni",
|
||||
"Choose a number of terms from a list, in this case we choose two artists": "Scegli un numero di termini da un elenco, in questo caso scegliamo due artisti",
|
||||
"{2$$artist1|artist2|artist3}": "{2$$artist1|artist2|artist3}",
|
||||
"If $$ is not provided, then 1$$ is assumed.": "Se $$ non viene fornito, si presume 1$$.",
|
||||
"If $$ is not provided, then 1$$ is assumed.\n\n A range can be provided:": "Se $$ non viene fornito, si presume 1$$.\n\n È possibile fornire un intervallo di valori:",
|
||||
"{1-3$$artist1|artist2|artist3}": "{1-3$$artist1|artist2|artist3}",
|
||||
"In this case, a random number of artists between 1 and 3 is chosen.": "In questo caso viene scelto un numero casuale di artisti compreso tra 1 e 3.",
|
||||
"Wildcards": "Termini jolly",
|
||||
|
@ -144,7 +259,7 @@
|
|||
"Output directory": "Cartella di output",
|
||||
"Horizontal symmetry": "Simmetria orizzontale",
|
||||
"Vertical symmetry": "Simmetria verticale",
|
||||
"Alt. symmetry method (blending)": "Alt. symmetry method (blending)",
|
||||
"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",
|
||||
"Interpolation prompt": "Prompt di interpolazione",
|
||||
|
@ -161,18 +276,17 @@
|
|||
"Iterate seed every line": "Iterare il seme per ogni riga",
|
||||
"List of prompt inputs": "Elenco di prompt di input",
|
||||
"Upload prompt inputs": "Carica un file contenente i prompt di input",
|
||||
"n": "n",
|
||||
"n": "Esegui n volte",
|
||||
"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",
|
||||
"Compare paths (Separate travels from 1st seed to each destination)": "Confronta percorsi (transizioni separate dal primo seme a ciascuna destinazione)",
|
||||
"Steps": "Passi",
|
||||
"Loop back to initial seed": "Ritorna al seme iniziale",
|
||||
"Bump seed (If > 0 do a Compare Paths but only one image. No video)": "Bump seed (If > 0 do a Compare Paths but only one image. No video)",
|
||||
"Bump seed (If > 0 do a Compare Paths but only one image. No video)": "Modula seme (se > 0 mescola il seme iniziale con quelli di destinazione ma solo un'immagine. Nessun video)",
|
||||
"Show generated images in ui": "Mostra le immagini generate nell'interfaccia utente",
|
||||
"\"Hug the middle\" during interpolation": "\"Hug the middle\" durante l'interpolazione",
|
||||
"\"Hug the middle\" during interpolation": "\"Hug the middle\" durante l'interpolazione. Rende l'interpolazione un po' più veloce all'inizio e alla fine. A volte può produrre video più fluidi, il più delle volte no.",
|
||||
"Allow the default Euler a Sampling method. (Does not produce good results)": "Consenti Euler_a come metodo di campionamento predefinito. (Non produce buoni risultati)",
|
||||
"Visual style": "Stile visivo",
|
||||
"Illustration": "Illustrazione",
|
||||
"Logo": "Logo",
|
||||
"Drawing": "Disegno",
|
||||
|
@ -214,8 +328,6 @@
|
|||
"X values": "Valori per X",
|
||||
"Y type": "Parametro asse Y",
|
||||
"Y values": "Valori per Y",
|
||||
"Draw legend": "Disegna legenda",
|
||||
"Include Separate Images": "Includi immagini separate",
|
||||
"Z type": "Parametro asse Z",
|
||||
"Z values": "Valori per Z",
|
||||
"Artist or styles name list. '.txt' files with one name per line": "Elenco nomi di artisti o stili. File '.txt' con un nome per riga",
|
||||
|
@ -224,14 +336,14 @@
|
|||
"Negative Prompt": "Prompt negativo",
|
||||
"Save": "Salva",
|
||||
"Send to img2img": "Invia a img2img",
|
||||
"Send to inpaint": "Invia a inpaint",
|
||||
"Send to extras": "Invia a extra",
|
||||
"Send to inpaint": "Invia a Inpaint",
|
||||
"Send to extras": "Invia a Extra",
|
||||
"Make Zip when Save?": "Crea un file ZIP quando si usa 'Salva'",
|
||||
"Textbox": "Casella di testo",
|
||||
"Interrogate\nCLIP": "Interroga\nCLIP",
|
||||
"Interrogate\nDeepBooru": "Interroga\nDeepBooru",
|
||||
"Inpaint": "Inpaint",
|
||||
"Batch img2img": "Lotti img2img",
|
||||
"Batch img2img": "img2img in lotti",
|
||||
"Image for img2img": "Immagine per img2img",
|
||||
"Drop Image Here": "Trascina l'immagine qui",
|
||||
"Image for inpainting with mask": "Immagine per inpainting con maschera",
|
||||
|
@ -246,8 +358,8 @@
|
|||
"Masked content": "Contenuto mascherato",
|
||||
"fill": "riempi",
|
||||
"original": "originale",
|
||||
"latent noise": "rumore latente",
|
||||
"latent nothing": "latenza nulla",
|
||||
"latent noise": "rumore nello spazio latente",
|
||||
"latent nothing": "nulla nello spazio latente",
|
||||
"Inpaint at full resolution": "Inpaint alla massima risoluzione",
|
||||
"Inpaint at full resolution padding, pixels": "Inpaint con riempimento a piena risoluzione, pixel",
|
||||
"Process images in a directory on the same machine where the server is running.": "Elabora le immagini in una cartella sulla stessa macchina su cui è in esecuzione il server.",
|
||||
|
@ -258,14 +370,13 @@
|
|||
"Crop and resize": "Ritaglia e ridimensiona",
|
||||
"Resize and fill": "Ridimensiona e riempie",
|
||||
"Advanced loopback": "Advanced loopback",
|
||||
"Animator v5": "Animator v5",
|
||||
"External Image Masking": "Immagine esterna per la mascheratura",
|
||||
"img2img alternative test": "Test alternativo per img2img",
|
||||
"img2tiles": "img2tiles",
|
||||
"Interpolate": "Interpolare",
|
||||
"Interpolate": "Interpola immagini",
|
||||
"Loopback": "Rielaborazione ricorsiva",
|
||||
"Loopback and Superimpose": "Rielabora ricorsivamente e sovraimponi",
|
||||
"Outpaint Canvas Region": "Regione della tela di Outpaint",
|
||||
"Alpha Canvas": "Alpha Canvas",
|
||||
"Outpainting mk2": "Outpainting mk2",
|
||||
"Poor man's outpainting": "Poor man's outpainting",
|
||||
"SD upscale": "Ampliamento SD",
|
||||
|
@ -273,67 +384,32 @@
|
|||
"[C] Video to video": "[C] Video to video",
|
||||
"Videos": "Filmati",
|
||||
"Deforum-webui (use tab extension instead!)": "Deforum-webui (usa piuttosto la scheda Deforum delle estensioni!)",
|
||||
"Use first image colors (custom color correction)": "Use first image colors (custom color correction)",
|
||||
"Denoising strength change factor (overridden if proportional used)": "Denoising strength change factor (overridden if proportional used)",
|
||||
"Zoom level": "Zoom level",
|
||||
"Direction X": "Direction X",
|
||||
"Direction Y": "Direction Y",
|
||||
"Denoising strength start": "Denoising strength start",
|
||||
"Denoising strength end": "Denoising strength end",
|
||||
"Denoising strength proportional change starting value": "Denoising strength proportional change starting value",
|
||||
"Denoising strength proportional change ending value (0.1 = disabled)": "Denoising strength proportional change ending value (0.1 = disabled)",
|
||||
"Saturation enhancement per image": "Saturation enhancement per image",
|
||||
"Use sine denoising strength variation": "Use sine denoising strength variation",
|
||||
"Phase difference": "Phase difference",
|
||||
"Denoising strength exponentiation": "Denoising strength exponentiation",
|
||||
"Use sine zoom variation": "Use sine zoom variation",
|
||||
"Zoom exponentiation": "Zoom exponentiation",
|
||||
"Use multiple prompts": "Use multiple prompts",
|
||||
"Same seed per prompt": "Same seed per prompt",
|
||||
"Same seed for everything": "Same seed for everything",
|
||||
"Original init image for everything": "Original init image for everything",
|
||||
"Multiple prompts : 1 line positive, 1 line negative, leave a blank line for no negative": "Multiple prompts : 1 line positive, 1 line negative, leave a blank line for no negative",
|
||||
"Render these video formats:": "Renderizza in questi formati:",
|
||||
"GIF": "GIF",
|
||||
"MP4": "MP4",
|
||||
"WEBM": "WEBM",
|
||||
"Animation Parameters": "Parametri animazione",
|
||||
"Total Animation Length (s)": "Durata totale dell'animazione (s)",
|
||||
"Framerate": "Frequenza dei fotogrammi",
|
||||
"Initial Parameters": "Parametri iniziali",
|
||||
"Denoising Strength (overrides img2img slider)": "Intensità di riduzione del rumore (sovrascrive il cursore img2img)",
|
||||
"Seed_March": "Seed_March",
|
||||
"Smoothing_Frames": "Smoothing_Frames",
|
||||
"Zoom Factor (scale/s)": "Fattore di ingrandimento (scala/s)",
|
||||
"X Pixel Shift (pixels/s)": "X Pixel Shift (pixels/s)",
|
||||
"Y Pixel Shift (pixels/s)": "Y Pixel Shift (pixels/s)",
|
||||
"Rotation (deg/s)": "Rotazione (gradi/s)",
|
||||
"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": "Props",
|
||||
"Folder:": "Cartella:",
|
||||
"Supported Keyframes:": "Fotogrammi chiave supportati:",
|
||||
"time_s | source | video, images, img2img | path": "time_s | source | video, images, img2img | path",
|
||||
"time_s | prompt | positive_prompts | negative_prompts": "time_s | prompt | positive_prompts | negative_prompts",
|
||||
"time_s | template | positive_prompts | negative_prompts": "time_s | template | positive_prompts | negative_prompts",
|
||||
"time_s | transform | zoom | x_shift | y_shift | rotation": "time_s | transform | zoom | x_shift | y_shift | rotation",
|
||||
"time_s | seed | new_seed_int": "time_s | seed | new_seed_int",
|
||||
"time_s | denoise | denoise_value": "time_s | denoise | denoise_value",
|
||||
"time_s | set_text | textblock_name | text_prompt | x | y | w | h | fore_color | back_color | font_name": "time_s | set_text | textblock_name | text_prompt | x | y | w | h | fore_color | back_color | font_name",
|
||||
"time_s | clear_text | textblock_name": "time_s | clear_text | textblock_name",
|
||||
"time_s | prop | prop_name | prop_filename | x pos | y pos | scale | rotation": "time_s | prop | prop_name | prop_filename | x pos | y pos | scale | rotation",
|
||||
"time_s | set_stamp | stamp_name | stamp_filename | x pos | y pos | scale | rotation": "time_s | set_stamp | stamp_name | stamp_filename | x pos | y pos | scale | rotation",
|
||||
"time_s | clear_stamp | stamp_name": "time_s | clear_stamp | stamp_name",
|
||||
"time_s | col_set": "time_s | col_set",
|
||||
"time_s | col_clear": "time_s | col_clear",
|
||||
"time_s | model | sd-v1-4_f16, sd-v1-5-inpainting, sd-v1-5-pruned-emaonly_fp16, wd-v1-3-float16": "time_s | model | sd-v1-4_f16, sd-v1-5-inpainting, sd-v1-5-pruned-emaonly_fp16, wd-v1-3-float16",
|
||||
"Keyframes:": "Fotogrammi chiave:",
|
||||
"Use first image colors (custom color correction)": "Usa i colori della prima immagine (correzione del colore personalizzata)",
|
||||
"Denoising strength change factor (overridden if proportional used)": "Fattore di variazione dell'intensità di riduzione del rumore (sovrascritto se si usa proporzionale)",
|
||||
"Zoom level": "Livello di Zoom",
|
||||
"Direction X": "Direzione X",
|
||||
"Direction Y": "Direzione Y",
|
||||
"Denoising strength start": "Intensità di riduzione del rumore - Inizio",
|
||||
"Denoising strength end": "Intensità di riduzione del rumore - Fine",
|
||||
"Denoising strength proportional change starting value": "Intensità di riduzione del rumore - Valore iniziale della variazione proporzionale",
|
||||
"Denoising strength proportional change ending value (0.1 = disabled)": "Intensità di riduzione del rumore - Valore finale della variazione proporzionale (0.1 = disabilitato)",
|
||||
"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",
|
||||
"Use sine zoom variation": "Usa la variazione sinusoidale dello zoom",
|
||||
"Zoom exponentiation": "Esponeniazione dello Zoom",
|
||||
"Use multiple prompts": "Usa prompt multipli",
|
||||
"Same seed per prompt": "Stesso seme per ogni prompt",
|
||||
"Same seed for everything": "Stesso seme per tutto",
|
||||
"Original init image for everything": "Immagine originale di inizializzazione per tutto",
|
||||
"Multiple prompts : 1 line positive, 1 line negative, leave a blank line for no negative": "Prompt multipli: 1 riga positivo, 1 riga negativo, lasciare una riga vuota per nessun negativo",
|
||||
"Running in img2img mode:": "Esecuzione in modalità img2img:",
|
||||
"Masking preview size": "Dimensione dell'anteprima della mascheratura",
|
||||
"Draw new mask on every run": "Disegna una nuova maschera ad ogni esecuzione",
|
||||
"Process non-contigious masks separately": "Elaborare le maschere non contigue separatamente",
|
||||
"should be 2 or lower.": "dovrebbe essere 2 o inferiore.",
|
||||
"Override `Sampling method` to Euler?(this method is built for it)": "Sovrascrivi il `Metodo di campionamento` con Eulero? (questo metodo è stato creato per questo)",
|
||||
"Override `Sampling method` to Euler?(this method is built for it)": "Sovrascrivi il 'Metodo di campionamento' con Eulero? (questo metodo è stato creato per questo)",
|
||||
"Override `prompt` to the same value as `original prompt`?(and `negative prompt`)": "Sovrascrivi `prompt` con lo stesso valore del `prompt originale`? (e `prompt negativo`)",
|
||||
"Original prompt": "Prompt originale",
|
||||
"Original negative prompt": "Prompt negativo originale",
|
||||
|
@ -345,7 +421,7 @@
|
|||
"Sigma adjustment for finding noise for image": "Regolazione Sigma per trovare il rumore per l'immagine",
|
||||
"Tile size": "Dimensione piastrella",
|
||||
"Tile overlap": "Sovrapposizione piastrella",
|
||||
"alternate img2img imgage": "alternate img2img imgage",
|
||||
"alternate img2img imgage": "Immagine alternativa per img2img",
|
||||
"interpolation values": "Valori di interpolazione",
|
||||
"Refinement loops": "Cicli di affinamento",
|
||||
"Loopback alpha": "Trasparenza rielaborazione ricorsiva",
|
||||
|
@ -353,10 +429,10 @@
|
|||
"Blending strides": "Passi di fusione",
|
||||
"Reuse Seed": "Riusa il seme",
|
||||
"One grid": "Singola griglia",
|
||||
"Interpolate VarSeed": "Interpola il seme di variazione",
|
||||
"Interpolate VarSeed": "Interpola il seme della variazione",
|
||||
"Paste on mask": "Incolla sulla maschera",
|
||||
"Inpaint all": "Inpaint tutto",
|
||||
"Interpolate in latent": "Interpola in latenza",
|
||||
"Interpolate in latent": "Interpola nello spazio latente",
|
||||
"Denoising strength change factor": "Fattore di variazione dell'intensità di denoising",
|
||||
"Superimpose alpha": "Sovrapporre Alpha",
|
||||
"Show extra settings": "Mostra impostazioni aggiuntive",
|
||||
|
@ -364,9 +440,6 @@
|
|||
"CFG decay factor": "Fattore di decadimento CFG",
|
||||
"CFG target": "CFG di destinazione",
|
||||
"Show/Hide Canvas": "Mostra/Nascondi Tela",
|
||||
"Left start coord": "Coordinate iniziali - Sinistra",
|
||||
"top start coord": "Coordinate iniziali - Sopra",
|
||||
"unused": "non usato",
|
||||
"Recommended settings: Sampling Steps: 80-100, Sampler: Euler a, Denoising strength: 0.8": "Impostazioni consigliate: Passi di campionamento: 80-100, Campionatore: Euler a, Intensità denoising: 0.8",
|
||||
"Pixels to expand": "Pixel da espandere",
|
||||
"Outpainting direction": "Direzione di Outpainting",
|
||||
|
@ -516,7 +589,7 @@
|
|||
"Split image overlap ratio": "Rapporto di sovrapposizione dell'immagine",
|
||||
"Focal point face weight": "Peso della faccia del punto focale",
|
||||
"Focal point entropy weight": "Peso dell'entropia del punto focale",
|
||||
"Focal point edges weight": "Peso dei bordi del punto focalePeso dei bordi del punto focale",
|
||||
"Focal point edges weight": "Peso dei bordi del punto focale",
|
||||
"Create debug image": "Crea immagine di debug",
|
||||
"Preprocess": "Preprocessa",
|
||||
"Train an embedding or Hypernetwork; you must specify a directory with a set of 1:1 ratio images": "Addestra un Incorporamento o Iperrete; è necessario specificare una directory con un set di immagini con rapporto 1:1",
|
||||
|
@ -573,7 +646,7 @@
|
|||
"ex B.": "esempio B.",
|
||||
"Original Text = \"A, B, C\" Selected Tags = \"(nothing)\" Edit Tags = \"X, Y\"": "Testo originale = \"A, B, C\" Tag selezionati = \"(nothing)\" Modifica tag = \"X, Y\"",
|
||||
"Result = \"A, B, C, X, Y\" (add X and Y to the end (default))": "Risultato = \"A, B, C, X, Y\" (aggiunge X e Y alla fine (predefinito))",
|
||||
"Risultato = \"X, Y, A, B, C\" (aggiunge X e Y all'inizio (\"Aggiungi tag addizionali all'inizio\" selezionato))": "Risultato = \"X, Y, A, B, C\" (aggiunge X e Y all'inizio (\"Aggiungi tag addizionali all'inizio\" selezionato))",
|
||||
"Result = \"X, Y, A, B, C\" (add X and Y to the beginning (\"Append additional tags to the beginning\" checked))": "Risultato = \"X, Y, A, B, C\" (aggiunge X e Y all'inizio (\"Aggiungi tag addizionali all'inizio\" selezionato))",
|
||||
"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->\"\")",
|
||||
|
@ -603,10 +676,10 @@
|
|||
"H": "A",
|
||||
"seed": "Seme",
|
||||
"sampler": "Campionatore",
|
||||
"Enable extras": "Abilita Extra",
|
||||
"subseed": "sub seme",
|
||||
"Enable extras": "Abilita 'Extra'",
|
||||
"subseed": "Sub seme",
|
||||
"subseed_strength": "Intensità subseme",
|
||||
"steps": "passi",
|
||||
"steps": "Passi",
|
||||
"ddim_eta": "ETA DDIM",
|
||||
"n_batch": "Numero lotto",
|
||||
"make_grid": "Crea griglia",
|
||||
|
@ -623,7 +696,7 @@
|
|||
"iter": "Iterativo",
|
||||
"fixed": "Fisso",
|
||||
"random": "Casuale",
|
||||
"schedule": "Programmato",
|
||||
"schedule": "Pianificato",
|
||||
"Animation settings": "Impostazioni animazione",
|
||||
"animation_mode": "Modalità animazione",
|
||||
"2D": "2D",
|
||||
|
@ -659,7 +732,7 @@
|
|||
"fov_schedule": "Pianificazione del campo visivo",
|
||||
"near_schedule": "Pianificazione da vicino",
|
||||
"far_schedule": "Pianificazione da lontano",
|
||||
"To enable seed schedule select seed behavior — 'schedule'": "Per abilitare la pianificazione del seme, seleziona il comportamento del seme — 'programma'",
|
||||
"To enable seed schedule select seed behavior — 'schedule'": "Per abilitare la pianificazione del seme, seleziona il comportamento del seme — 'pianifica'",
|
||||
"seed_schedule": "Pianificazione del seme",
|
||||
"Coherence:": "Coerenza:",
|
||||
"color_coherence": "Coerenza del colore",
|
||||
|
@ -715,7 +788,7 @@
|
|||
"resume_from_timestring": "Riprendi da stringa temporale",
|
||||
"resume_timestring": "Stringa temporale",
|
||||
"Video output settings": "Impostazioni uscita video",
|
||||
"skip_video_for_run_all": "skip_video_for_run_all",
|
||||
"skip_video_for_run_all": "Salta il video per eseguire tutto",
|
||||
"fps": "FPS",
|
||||
"output_format": "Formato di uscita",
|
||||
"PIL gif": "PIL gif",
|
||||
|
@ -825,9 +898,8 @@
|
|||
"All images generated with CompVis/stable-diffusion-v1-4 +": "Tutte le immagini sono state generate con CompVis/stable-diffusion-v1-4 +",
|
||||
"artists.csv": "artists.csv",
|
||||
"| License: Attribution 4.0 International (CC BY 4.0)": "| Licenza: Attribution 4.0 International (CC BY 4.0)",
|
||||
"extras": "Extra",
|
||||
"favorites": "Preferiti",
|
||||
"others": "Altre immagini",
|
||||
"Favorites": "Preferiti",
|
||||
"Others": "Altre immagini",
|
||||
"Images directory": "Cartella immagini",
|
||||
"Dropdown": "Elenco cartelle",
|
||||
"First Page": "Prima pagina",
|
||||
|
@ -843,7 +915,7 @@
|
|||
"keyword": "Parola chiave",
|
||||
"Generate Info": "Genera Info",
|
||||
"File Name": "Nome del file",
|
||||
"Collect": "Aggiungi ai preferiti",
|
||||
"Move to favorites": "Aggiungi ai preferiti",
|
||||
"Renew page": "Aggiorna la pagina",
|
||||
"Number": "Numero",
|
||||
"set_index": "Imposta indice",
|
||||
|
@ -856,13 +928,13 @@
|
|||
"mediums": "Tecniche",
|
||||
"movements": "Movimenti artistici",
|
||||
"All": "Tutto",
|
||||
"Favorites": "Preferiti",
|
||||
"Exclude abandoned": "Escludi scartati",
|
||||
"Abandoned": "Scartati",
|
||||
"Key word": "Parola chiave",
|
||||
"Get inspiration": "Ispirami",
|
||||
"to txt2img": "Invia a txt2img",
|
||||
"to img2img": "Invia a img2img",
|
||||
"Collect": "Salva nei preferiti",
|
||||
"Don't show again": "Scarta",
|
||||
"Move out": "Rimuovi",
|
||||
"set button": "Pulsante imposta",
|
||||
|
@ -967,7 +1039,7 @@
|
|||
"ar_AR": "ar_AR",
|
||||
"de_DE": "de_DE",
|
||||
"es_ES": "es_ES",
|
||||
"fr-FR": "fr-FR",
|
||||
"fr_FR": "fr_FR",
|
||||
"it_IT": "it_IT",
|
||||
"ja_JP": "ja_JP",
|
||||
"ko_KR": "ko_KR",
|
||||
|
@ -1003,6 +1075,35 @@
|
|||
"Download localization template": "Scarica il modello per la localizzazione",
|
||||
"Reload custom script bodies (No ui updates, No restart)": "Ricarica gli script personalizzati (nessun aggiornamento dell'interfaccia utente, nessun riavvio)",
|
||||
"Restart Gradio and Refresh components (Custom Scripts, ui.py, js and css only)": "Riavvia Gradio e aggiorna i componenti (solo script personalizzati, ui.py, js e css)",
|
||||
"Installed": "Installato",
|
||||
"Install from URL": "Installa da URL",
|
||||
"Apply and restart UI": "Applica e riavvia l'interfaccia utente",
|
||||
"Check for updates": "Controlla aggiornamenti",
|
||||
"Extension": "Estensione",
|
||||
"URL": "URL",
|
||||
"Update": "Aggiorna",
|
||||
"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",
|
||||
"aesthetic-image-scorer": "Punteggio delle immagini estetiche",
|
||||
"https://github.com/tsngo/stable-diffusion-webui-aesthetic-image-scorer": "https://github.com/tsngo/stable-diffusion-webui-aesthetic-image-scorer",
|
||||
"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": "Deforum",
|
||||
"https://github.com/deforum-art/deforum-for-automatic1111-webui/": "https://github.com/deforum-art/deforum-for-automatic1111-webui/",
|
||||
"stable-diffusion-webui-artists-to-study": "Artisti per studiare",
|
||||
"https://github.com/camenduru/stable-diffusion-webui-artists-to-study": "https://github.com/camenduru/stable-diffusion-webui-artists-to-study",
|
||||
"stable-diffusion-webui-images-browser": "Galleria immagini",
|
||||
"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",
|
||||
"tag-autocomplete": "Autocompletamento etichette",
|
||||
"https://github.com/DominikDoom/a1111-sd-webui-tagcomplete.git": "https://github.com/DominikDoom/a1111-sd-webui-tagcomplete.git",
|
||||
"wildcards": "Termini Jolly",
|
||||
"https://github.com/AUTOMATIC1111/stable-diffusion-webui-wildcards.git": "https://github.com/AUTOMATIC1111/stable-diffusion-webui-wildcards.git",
|
||||
"URL for extension's git repository": "URL del repository GIT dell'estensione",
|
||||
"Local directory name": "Nome cartella locale",
|
||||
"Install": "Installa",
|
||||
"Prompt (press Ctrl+Enter or Alt+Enter to generate)": "Prompt (premi Ctrl+Invio o Alt+Invio per generare)",
|
||||
"Negative prompt (press Ctrl+Enter or Alt+Enter to generate)": "Prompt negativo (premere Ctrl+Invio o Alt+Invio per generare)",
|
||||
"Add a random artist to the prompt.": "Aggiungi un artista casuale al prompt.",
|
||||
|
@ -1030,6 +1131,7 @@
|
|||
"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.",
|
||||
"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.",
|
||||
|
@ -1066,5 +1168,6 @@
|
|||
"This string will be used to join split words into a single line if the option above is enabled.": "Questa stringa verrà utilizzata per unire le parole divise in un'unica riga se l'opzione sopra è abilitata.",
|
||||
"Only applies to inpainting models. Determines how strongly to mask off the original image for inpainting and img2img. 1.0 means fully masked, which is the default behaviour. 0.0 means a fully unmasked conditioning. Lower values will help preserve the overall composition of the image, but will struggle with large changes.": "Si applica solo ai modelli di pittura. Determina con quale forza mascherare l'immagine originale per inpainting e img2img. 1.0 significa completamente mascherato, che è il comportamento predefinito. 0.0 significa un condizionamento completamente non mascherato. Valori più bassi aiuteranno a preservare la composizione generale dell'immagine, ma avranno difficoltà con grandi cambiamenti.",
|
||||
"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."
|
||||
"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"
|
||||
}
|
|
@ -15,6 +15,7 @@
|
|||
"A directory on the same machine where the server is running.": "WebUI 서버가 돌아가고 있는 디바이스에 존재하는 디렉토리를 선택해 주세요.",
|
||||
"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 random artist to the prompt.": "프롬프트에 랜덤한 작가 추가",
|
||||
"Add a second progress bar to the console that shows progress for an entire job.": "콘솔에 전체 작업의 진행도를 보여주는 2번째 프로그레스 바 추가하기",
|
||||
"Add difference": "차이점 추가",
|
||||
|
@ -23,6 +24,8 @@
|
|||
"Add model hash to generation information": "생성 정보에 모델 해시 추가",
|
||||
"Add model name to generation information": "생성 정보에 모델 이름 추가",
|
||||
"Add number to filename when saving": "이미지를 저장할 때 파일명에 숫자 추가하기",
|
||||
"Aesthetic Gradients": "스타일 그라디언트",
|
||||
"Aesthetic Image Scorer": "스타일 이미지 스코어러",
|
||||
"Aesthetic imgs embedding": "스타일 이미지 임베딩",
|
||||
"Aesthetic learning rate": "스타일 학습 수",
|
||||
"Aesthetic steps": "스타일 스텝 수",
|
||||
|
@ -39,8 +42,10 @@
|
|||
"Apply color correction to img2img results to match original colors.": "이미지→이미지 결과물이 기존 색상과 일치하도록 색상 보정 적용하기",
|
||||
"Apply selected styles to current prompt": "현재 프롬프트에 선택된 스타일 적용",
|
||||
"Apply settings": "설정 적용하기",
|
||||
"Artists to study": "연구할만한 작가들",
|
||||
"Auto focal point crop": "초점 기준 크롭(자동 감지)",
|
||||
"Autocomplete options": "자동완성 설정",
|
||||
"Available": "지원되는 확장기능 목록",
|
||||
"Batch count": "배치 수",
|
||||
"Batch from Directory": "저장 경로로부터 여러장 처리",
|
||||
"Batch img2img": "이미지→이미지 배치",
|
||||
|
@ -49,6 +54,7 @@
|
|||
"behind": "최신 아님",
|
||||
"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 스타일 점수 예측기를 이용해 생성된 이미지의 스타일 점수를 계산합니다.",
|
||||
"Cancel generate forever": "반복 생성 취소",
|
||||
"cfg cnt": "CFG 변화 횟수",
|
||||
"cfg count": "CFG 변화 횟수",
|
||||
|
@ -78,6 +84,7 @@
|
|||
"Create a grid where images will have different parameters. Use inputs below to specify which parameters will be shared by columns and rows": "서로 다른 설정값으로 생성된 이미지의 그리드를 만듭니다. 아래의 설정으로 가로/세로에 어떤 설정값을 적용할지 선택하세요.",
|
||||
"Create a text file next to every image with generation parameters.": "생성된 이미지마다 생성 설정값을 담은 텍스트 파일 생성하기",
|
||||
"Create aesthetic images embedding": "스타일 이미지 임베딩 생성하기",
|
||||
"Create an embedding from one or few pictures and use it to apply their style to generated images.": "하나 혹은 그 이상의 이미지들로부터 임베딩을 생성해, 그 이미지들의 스타일을 다른 이미지 생성 시 적용할 수 있게 해줍니다.",
|
||||
"Create debug image": "디버그 이미지 생성",
|
||||
"Create embedding": "임베딩 생성",
|
||||
"Create flipped copies": "좌우로 뒤집은 복사본 생성",
|
||||
|
@ -88,6 +95,7 @@
|
|||
"custom fold": "커스텀 경로",
|
||||
"Custom Name (Optional)": "병합 모델 이름 (선택사항)",
|
||||
"Dataset directory": "데이터셋 경로",
|
||||
"Dataset Tag Editor": "데이터셋 태그 편집기",
|
||||
"date": "생성 일자",
|
||||
"DDIM": "DDIM",
|
||||
"Decode CFG scale": "디코딩 CFG 스케일",
|
||||
|
@ -98,6 +106,7 @@
|
|||
"Denoising Diffusion Implicit Models - best at inpainting": "Denoising Diffusion Implicit Models - 인페이팅에 뛰어남",
|
||||
"Denoising strength": "디노이즈 강도",
|
||||
"Denoising strength change factor": "디노이즈 강도 변경 배수",
|
||||
"Description": "설명",
|
||||
"Destination directory": "결과물 저장 경로",
|
||||
"Determines how little respect the algorithm should have for image's content. At 0, nothing will change, and at 1 you'll get an unrelated image. With values below 1.0, processing will take less steps than the Sampling Steps slider specifies.": "알고리즘이 얼마나 원본 이미지를 반영할지를 결정하는 수치입니다. 0일 경우 아무것도 바뀌지 않고, 1일 경우 원본 이미지와 전혀 관련없는 결과물을 얻게 됩니다. 1.0 아래의 값일 경우, 설정된 샘플링 스텝 수보다 적은 스텝 수를 거치게 됩니다.",
|
||||
"Directory for saving images using the Save button": "저장 버튼을 이용해 저장하는 이미지들의 저장 경로",
|
||||
|
@ -121,6 +130,7 @@
|
|||
"Drop File Here": "파일을 끌어 놓으세요",
|
||||
"Drop Image Here": "이미지를 끌어 놓으세요",
|
||||
"Dropdown": "드롭다운",
|
||||
"Dynamic Prompts": "다이나믹 프롬프트",
|
||||
"Embedding": "임베딩",
|
||||
"Embedding Learning rate": "임베딩 학습률",
|
||||
"Emphasis: use (text) to make model pay more attention to text and [text] to make it pay less attention": "강조 : (텍스트)를 이용해 모델의 텍스트에 대한 가중치를 더 강하게 주고 [텍스트]를 이용해 더 약하게 줍니다.",
|
||||
|
@ -141,6 +151,7 @@
|
|||
"Euler Ancestral - very creative, each can get a completely different picture depending on step count, setting steps to higher than 30-40 does not help": "Euler Ancestral - 매우 창의적, 스텝 수에 따라 완전히 다른 결과물이 나올 수 있음. 30~40보다 높은 스텝 수는 효과가 미미함",
|
||||
"Existing Caption txt Action": "이미 존재하는 캡션 텍스트 처리",
|
||||
"Extension": "확장기능",
|
||||
"Extension index URL": "확장기능 목록 URL",
|
||||
"Extensions": "확장기능",
|
||||
"Extra": "고급",
|
||||
"Extras": "부가기능",
|
||||
|
@ -200,6 +211,7 @@
|
|||
"ignore": "무시",
|
||||
"Image": "이미지",
|
||||
"Image Browser": "이미지 브라우저",
|
||||
"Image browser": "이미지 브라우저",
|
||||
"Image for img2img": "Image for img2img",
|
||||
"Image for inpainting with mask": "마스크로 인페인팅할 이미지",
|
||||
"Image not found (may have been already moved)": "이미지를 찾을 수 없습니다 (이미 옮겨졌을 수 있음)",
|
||||
|
@ -210,6 +222,7 @@
|
|||
"img2img alternative test": "이미지→이미지 대체버전 테스트",
|
||||
"img2img DDIM discretize": "이미지→이미지 DDIM 이산화",
|
||||
"img2img history": "이미지→이미지 기록",
|
||||
"Implements an expressive template language for random or combinatorial prompt generation along with features to support deep wildcard directory structures.": "무작위/조합 프롬프트 생성을 위한 문법과 복잡한 와일드카드 구조를 지원합니다.",
|
||||
"In loopback mode, on each loop the denoising strength is multiplied by this value. <1 means decreasing variety so your sequence will converge on a fixed picture. >1 means increasing variety so your sequence will become more and more chaotic.": "루프백 모드에서는 매 루프마다 디노이즈 강도에 이 값이 곱해집니다. 1보다 작을 경우 다양성이 낮아져 결과 이미지들이 고정된 형태로 모일 겁니다. 1보다 클 경우 다양성이 높아져 결과 이미지들이 갈수록 혼란스러워지겠죠.",
|
||||
"Include Separate Images": "분리된 이미지 포함하기",
|
||||
"Increase coherency by padding from the last comma within n tokens when using more than 75 tokens": "75개보다 많은 토큰을 사용시 마지막 쉼표로부터 N개의 토큰 이내에 패딩을 추가해 통일성 증가시키기",
|
||||
|
@ -222,6 +235,7 @@
|
|||
"Inpainting conditioning mask strength": "인페인팅 조절 마스크 강도",
|
||||
"Input directory": "인풋 이미지 경로",
|
||||
"Input images directory": "이미지 경로 입력",
|
||||
"Inspiration": "\"영감\"",
|
||||
"Install": "설치",
|
||||
"Install from URL": "URL로부터 확장기능 설치",
|
||||
"Installed": "설치된 확장기능",
|
||||
|
@ -259,12 +273,14 @@
|
|||
"Leave blank to save images to the default path.": "기존 저장 경로에 이미지들을 저장하려면 비워두세요.",
|
||||
"Leave empty for auto": "자동 설정하려면 비워두십시오",
|
||||
"left": "왼쪽",
|
||||
"Lets you edit captions in training datasets.": "훈련에 사용되는 데이터셋의 캡션을 수정할 수 있게 해줍니다.",
|
||||
"linear": "linear",
|
||||
"List of prompt inputs": "프롬프트 입력 리스트",
|
||||
"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.": "설정 탭이 아니라 상단의 빠른 설정 바에 위치시킬 설정 이름을 쉼표로 분리해서 입력하십시오. 설정 이름은 modules/shared.py에서 찾을 수 있습니다. 재시작이 필요합니다.",
|
||||
"LMS": "LMS",
|
||||
"LMS Karras": "LMS Karras",
|
||||
"Load": "불러오기",
|
||||
"Load from:": "URL로부터 불러오기",
|
||||
"Loading...": "로딩 중...",
|
||||
"Local directory name": "로컬 경로 이름",
|
||||
"Localization (requires restart)": "현지화 (재시작 필요)",
|
||||
|
@ -360,6 +376,7 @@
|
|||
"Prompt template file": "프롬프트 템플릿 파일 경로",
|
||||
"Prompts": "프롬프트",
|
||||
"Prompts from file or textbox": "파일이나 텍스트박스로부터 프롬프트 불러오기",
|
||||
"Provides an interface to browse created images in the web browser.": "생성된 이미지를 브라우저 내에서 볼 수 있는 인터페이스를 추가합니다.",
|
||||
"Put variable parts at start of prompt": "변경되는 프롬프트를 앞에 위치시키기",
|
||||
"quad": "quad",
|
||||
"Quality for saved jpeg images": "저장된 jpeg 이미지들의 품질",
|
||||
|
@ -367,11 +384,13 @@
|
|||
"R-ESRGAN 4x+ Anime6B": "R-ESRGAN 4x+ Anime6B",
|
||||
"Random": "랜덤",
|
||||
"Random grid": "랜덤 그리드",
|
||||
"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.": "특정 작가 또는 스타일의 이미지들 중 하나를 무작위로 보여줍니다. 선택 후 선택한 작가 또는 스타일의 이미지들이 더 나타나게 됩니다. 고르기 어려워도 걱정하실 필요 없어요!",
|
||||
"Randomness": "랜덤성",
|
||||
"Read generation parameters from prompt or last generation if prompt is empty into user interface.": "클립보드에 복사된 정보로부터 설정값 읽어오기/프롬프트창이 비어있을경우 제일 최근 설정값 불러오기",
|
||||
"Read parameters (prompt, etc...) from txt2img tab when making previews": "프리뷰 이미지 생성 시 텍스트→이미지 탭에서 설정값(프롬프트 등) 읽어오기",
|
||||
"Recommended settings: Sampling Steps: 80-100, Sampler: Euler a, Denoising strength: 0.8": "추천 설정값 - 샘플링 스텝 수 : 80-100 , 샘플러 : Euler a, 디노이즈 강도 : 0.8",
|
||||
"Reload custom script bodies (No ui updates, No restart)": "커스텀 스크립트 리로드하기(UI 업데이트 없음, 재시작 없음)",
|
||||
"Reloading...": "재시작 중...",
|
||||
"relu": "relu",
|
||||
"Renew Page": "Renew Page",
|
||||
"Request browser notifications": "브라우저 알림 권한 요청",
|
||||
|
@ -391,6 +410,7 @@
|
|||
"Reuse seed from last generation, mostly useful if it was randomed": "이전 생성에서 사용된 시드를 불러옵니다. 랜덤하게 생성했을 시 도움됨",
|
||||
"right": "오른쪽",
|
||||
"Run": "가동",
|
||||
"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.": "샘플 확장기능입니다. __이름__형식의 문법을 사용해 와일드카드 경로 내의 이름.txt파일로부터 무작위 프롬프트를 적용할 수 있게 해줍니다. 유사한 확장기능으로 다이나믹 프롬프트가 있습니다.",
|
||||
"Sampler": "샘플러",
|
||||
"Sampler parameters": "샘플러 설정값",
|
||||
"Sampling method": "샘플링 방법",
|
||||
|
@ -442,6 +462,7 @@
|
|||
"Show progressbar": "프로그레스 바 보이기",
|
||||
"Show result images": "이미지 결과 보이기",
|
||||
"Show Textbox": "텍스트박스 보이기",
|
||||
"Shows a gallery of generated pictures by artists separated into categories.": "생성된 이미지들을 작가별로 분류해 보여줍니다. 원본 - https://artiststostudy.pages.dev",
|
||||
"Sigma adjustment for finding noise for image": "이미지 노이즈를 찾기 위해 시그마 조정",
|
||||
"Sigma Churn": "시그마 섞기",
|
||||
"sigma churn": "시그마 섞기",
|
||||
|
@ -479,6 +500,7 @@
|
|||
"System": "시스템",
|
||||
"Tertiary model (C)": "3차 모델 (C)",
|
||||
"Textbox": "텍스트박스",
|
||||
"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.": "Deforum의 공식 포팅 버전입니다. 2D와 3D 애니메이션, 키프레임 시퀀스, 수학적 매개변수, 다이나믹 마스킹 등을 지원합니다.",
|
||||
"This regular expression will be used extract words from filename, and they will be joined using the option below into label text used for training. Leave empty to keep filename text as it is.": "이 정규표현식은 파일명으로부터 단어를 추출하는 데 사용됩니다. 추출된 단어들은 하단의 설정을 이용해 라벨 텍스트로 변환되어 훈련에 사용됩니다. 파일명 텍스트를 유지하려면 비워두십시오.",
|
||||
"This string will be used to join split words into a single line if the option above is enabled.": "이 문자열은 상단 설정이 활성화되어있을 때 분리된 단어들을 한 줄로 합치는 데 사용됩니다.",
|
||||
"This text is used to rotate the feature space of the imgs embs": "이 텍스트는 이미지 임베딩의 특징 공간을 회전하는 데 사용됩니다.",
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
import base64
|
||||
import io
|
||||
import time
|
||||
import uvicorn
|
||||
from gradio.processing_utils import encode_pil_to_base64, decode_base64_to_file, decode_base64_to_image
|
||||
from gradio.processing_utils import decode_base64_to_file, decode_base64_to_image
|
||||
from fastapi import APIRouter, Depends, HTTPException
|
||||
import modules.shared as shared
|
||||
from modules import devices
|
||||
|
@ -29,6 +31,12 @@ def setUpscalers(req: dict):
|
|||
return reqDict
|
||||
|
||||
|
||||
def encode_pil_to_base64(image):
|
||||
buffer = io.BytesIO()
|
||||
image.save(buffer, format="png")
|
||||
return base64.b64encode(buffer.getvalue())
|
||||
|
||||
|
||||
class Api:
|
||||
def __init__(self, app, queue_lock):
|
||||
self.router = APIRouter()
|
||||
|
@ -40,6 +48,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/interrupt", self.interruptapi, methods=["POST"])
|
||||
|
||||
def text2imgapi(self, txt2imgreq: StableDiffusionTxt2ImgProcessingAPI):
|
||||
sampler_index = sampler_to_index(txt2imgreq.sampler_index)
|
||||
|
@ -176,6 +185,11 @@ class Api:
|
|||
|
||||
return ProgressResponse(progress=progress, eta_relative=eta_relative, state=shared.state.dict(), current_image=current_image)
|
||||
|
||||
def interruptapi(self):
|
||||
shared.state.interrupt()
|
||||
|
||||
return {}
|
||||
|
||||
def launch(self, server_name, port):
|
||||
self.app.include_router(self.router)
|
||||
uvicorn.run(self.app, host=server_name, port=port)
|
||||
|
|
|
@ -141,7 +141,7 @@ def run_extras(extras_mode, resize_mode, image, image_folder, input_dir, output_
|
|||
upscaling_resize_w, upscaling_resize_h, upscaling_crop)
|
||||
cache_key = LruCache.Key(image_hash=hash(np.array(image.getdata()).tobytes()),
|
||||
info_hash=hash(info),
|
||||
args_hash=hash(upscale_args))
|
||||
args_hash=hash((upscale_args, upscale_first)))
|
||||
cached_entry = cached_images.get(cache_key)
|
||||
if cached_entry is None:
|
||||
res = upscale(image, *upscale_args)
|
||||
|
|
|
@ -510,6 +510,7 @@ def save_image(image, path, basename, seed=None, prompt=None, extension='png', i
|
|||
|
||||
if extension.lower() == '.png':
|
||||
pnginfo_data = PngImagePlugin.PngInfo()
|
||||
if opts.enable_pnginfo:
|
||||
for k, v in params.pnginfo.items():
|
||||
pnginfo_data.add_text(k, str(v))
|
||||
|
||||
|
|
|
@ -55,6 +55,7 @@ def process_batch(p, input_dir, output_dir, args):
|
|||
filename = f"{left}-{n}{right}"
|
||||
|
||||
if not save_normally:
|
||||
os.makedirs(output_dir, exist_ok=True)
|
||||
processed_image.save(os.path.join(output_dir, filename))
|
||||
|
||||
|
||||
|
|
|
@ -56,9 +56,9 @@ class InterrogateModels:
|
|||
import clip
|
||||
|
||||
if self.running_on_cpu:
|
||||
model, preprocess = clip.load(clip_model_name, device="cpu")
|
||||
model, preprocess = clip.load(clip_model_name, device="cpu", download_root=shared.cmd_opts.clip_models_path)
|
||||
else:
|
||||
model, preprocess = clip.load(clip_model_name)
|
||||
model, preprocess = clip.load(clip_model_name, download_root=shared.cmd_opts.clip_models_path)
|
||||
|
||||
model.eval()
|
||||
model = model.to(devices.device_interrogate)
|
||||
|
|
|
@ -38,13 +38,18 @@ def setup_for_low_vram(sd_model, use_medvram):
|
|||
# see below for register_forward_pre_hook;
|
||||
# first_stage_model does not use forward(), it uses encode/decode, so register_forward_pre_hook is
|
||||
# useless here, and we just replace those methods
|
||||
def first_stage_model_encode_wrap(self, encoder, x):
|
||||
send_me_to_gpu(self, None)
|
||||
return encoder(x)
|
||||
|
||||
def first_stage_model_decode_wrap(self, decoder, z):
|
||||
send_me_to_gpu(self, None)
|
||||
return decoder(z)
|
||||
first_stage_model = sd_model.first_stage_model
|
||||
first_stage_model_encode = sd_model.first_stage_model.encode
|
||||
first_stage_model_decode = sd_model.first_stage_model.decode
|
||||
|
||||
def first_stage_model_encode_wrap(x):
|
||||
send_me_to_gpu(first_stage_model, None)
|
||||
return first_stage_model_encode(x)
|
||||
|
||||
def first_stage_model_decode_wrap(z):
|
||||
send_me_to_gpu(first_stage_model, None)
|
||||
return first_stage_model_decode(z)
|
||||
|
||||
# remove three big modules, cond, first_stage, and unet from the model and then
|
||||
# send the model to GPU. Then put modules back. the modules will be in CPU.
|
||||
|
@ -56,8 +61,8 @@ def setup_for_low_vram(sd_model, use_medvram):
|
|||
# register hooks for those the first two models
|
||||
sd_model.cond_stage_model.transformer.register_forward_pre_hook(send_me_to_gpu)
|
||||
sd_model.first_stage_model.register_forward_pre_hook(send_me_to_gpu)
|
||||
sd_model.first_stage_model.encode = lambda x, en=sd_model.first_stage_model.encode: first_stage_model_encode_wrap(sd_model.first_stage_model, en, x)
|
||||
sd_model.first_stage_model.decode = lambda z, de=sd_model.first_stage_model.decode: first_stage_model_decode_wrap(sd_model.first_stage_model, de, z)
|
||||
sd_model.first_stage_model.encode = first_stage_model_encode_wrap
|
||||
sd_model.first_stage_model.decode = first_stage_model_decode_wrap
|
||||
parents[sd_model.cond_stage_model.transformer] = sd_model.cond_stage_model
|
||||
|
||||
if use_medvram:
|
||||
|
|
|
@ -597,6 +597,9 @@ def process_images_inner(p: StableDiffusionProcessing) -> Processed:
|
|||
if p.scripts is not None:
|
||||
p.scripts.postprocess(p, res)
|
||||
|
||||
p.sd_model = None
|
||||
p.sampler = None
|
||||
|
||||
return res
|
||||
|
||||
|
||||
|
|
|
@ -32,7 +32,7 @@ class RestrictedUnpickler(pickle.Unpickler):
|
|||
return getattr(collections, name)
|
||||
if module == 'torch._utils' and name in ['_rebuild_tensor_v2', '_rebuild_parameter']:
|
||||
return getattr(torch._utils, name)
|
||||
if module == 'torch' and name in ['FloatStorage', 'HalfStorage', 'IntStorage', 'LongStorage', 'DoubleStorage']:
|
||||
if module == 'torch' and name in ['FloatStorage', 'HalfStorage', 'IntStorage', 'LongStorage', 'DoubleStorage', 'ByteStorage']:
|
||||
return getattr(torch, name)
|
||||
if module == 'torch.nn.modules.container' and name in ['ParameterDict']:
|
||||
return getattr(torch.nn.modules.container, name)
|
||||
|
|
|
@ -3,6 +3,8 @@ import traceback
|
|||
from collections import namedtuple
|
||||
import inspect
|
||||
|
||||
from fastapi import FastAPI
|
||||
from gradio import Blocks
|
||||
|
||||
def report_exception(c, job):
|
||||
print(f"Error executing callback {job} for {c.script}", file=sys.stderr)
|
||||
|
@ -25,6 +27,7 @@ class ImageSaveParams:
|
|||
|
||||
|
||||
ScriptCallback = namedtuple("ScriptCallback", ["script", "callback"])
|
||||
callbacks_app_started = []
|
||||
callbacks_model_loaded = []
|
||||
callbacks_ui_tabs = []
|
||||
callbacks_ui_settings = []
|
||||
|
@ -40,6 +43,14 @@ def clear_callbacks():
|
|||
callbacks_image_saved.clear()
|
||||
|
||||
|
||||
def app_started_callback(demo: Blocks, app: FastAPI):
|
||||
for c in callbacks_app_started:
|
||||
try:
|
||||
c.callback(demo, app)
|
||||
except Exception:
|
||||
report_exception(c, 'app_started_callback')
|
||||
|
||||
|
||||
def model_loaded_callback(sd_model):
|
||||
for c in callbacks_model_loaded:
|
||||
try:
|
||||
|
@ -69,7 +80,7 @@ def ui_settings_callback():
|
|||
|
||||
|
||||
def before_image_saved_callback(params: ImageSaveParams):
|
||||
for c in callbacks_image_saved:
|
||||
for c in callbacks_before_image_saved:
|
||||
try:
|
||||
c.callback(params)
|
||||
except Exception:
|
||||
|
@ -91,6 +102,12 @@ def add_callback(callbacks, fun):
|
|||
callbacks.append(ScriptCallback(filename, fun))
|
||||
|
||||
|
||||
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)
|
||||
|
||||
|
||||
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"""
|
||||
|
|
|
@ -94,6 +94,10 @@ class StableDiffusionModelHijack:
|
|||
if type(model_embeddings.token_embedding) == EmbeddingsWithFixes:
|
||||
model_embeddings.token_embedding = model_embeddings.token_embedding.wrapped
|
||||
|
||||
self.layers = None
|
||||
self.circular_enabled = False
|
||||
self.clip = None
|
||||
|
||||
def apply_circular(self, enable):
|
||||
if self.circular_enabled == enable:
|
||||
return
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import collections
|
||||
import os.path
|
||||
import sys
|
||||
import gc
|
||||
from collections import namedtuple
|
||||
import torch
|
||||
import re
|
||||
|
@ -220,6 +221,12 @@ def load_model(checkpoint_info=None):
|
|||
if checkpoint_info.config != shared.cmd_opts.config:
|
||||
print(f"Loading config from: {checkpoint_info.config}")
|
||||
|
||||
if shared.sd_model:
|
||||
sd_hijack.model_hijack.undo_hijack(shared.sd_model)
|
||||
shared.sd_model = None
|
||||
gc.collect()
|
||||
devices.torch_gc()
|
||||
|
||||
sd_config = OmegaConf.load(checkpoint_info.config)
|
||||
|
||||
if should_hijack_inpainting(checkpoint_info):
|
||||
|
@ -233,6 +240,7 @@ def load_model(checkpoint_info=None):
|
|||
checkpoint_info = checkpoint_info._replace(config=checkpoint_info.config.replace(".yaml", "-inpainting.yaml"))
|
||||
|
||||
do_inpainting_hijack()
|
||||
|
||||
sd_model = instantiate_from_config(sd_config.model)
|
||||
load_model_weights(sd_model, checkpoint_info)
|
||||
|
||||
|
@ -252,14 +260,18 @@ def load_model(checkpoint_info=None):
|
|||
return sd_model
|
||||
|
||||
|
||||
def reload_model_weights(sd_model, info=None):
|
||||
def reload_model_weights(sd_model=None, info=None):
|
||||
from modules import lowvram, devices, sd_hijack
|
||||
checkpoint_info = info or select_checkpoint()
|
||||
|
||||
if not sd_model:
|
||||
sd_model = shared.sd_model
|
||||
|
||||
if sd_model.sd_model_checkpoint == checkpoint_info.filename:
|
||||
return
|
||||
|
||||
if sd_model.sd_checkpoint_info.config != checkpoint_info.config or should_hijack_inpainting(checkpoint_info) != should_hijack_inpainting(sd_model.sd_checkpoint_info):
|
||||
del sd_model
|
||||
checkpoints_loaded.clear()
|
||||
load_model(checkpoint_info)
|
||||
return shared.sd_model
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
from collections import namedtuple
|
||||
import numpy as np
|
||||
from math import floor
|
||||
import torch
|
||||
import tqdm
|
||||
from PIL import Image
|
||||
|
@ -205,17 +206,22 @@ class VanillaStableDiffusionSampler:
|
|||
self.mask = p.mask if hasattr(p, 'mask') else None
|
||||
self.nmask = p.nmask if hasattr(p, 'nmask') else None
|
||||
|
||||
|
||||
def adjust_steps_if_invalid(self, p, num_steps):
|
||||
if (self.config.name == 'DDIM' and p.ddim_discretize == 'uniform') or (self.config.name == 'PLMS'):
|
||||
valid_step = 999 / (1000 // num_steps)
|
||||
if valid_step == floor(valid_step):
|
||||
return int(valid_step) + 1
|
||||
|
||||
return num_steps
|
||||
|
||||
|
||||
def sample_img2img(self, p, x, noise, conditioning, unconditional_conditioning, steps=None, image_conditioning=None):
|
||||
steps, t_enc = setup_img2img_steps(p, steps)
|
||||
|
||||
steps = self.adjust_steps_if_invalid(p, steps)
|
||||
self.initialize(p)
|
||||
|
||||
# existing code fails with certain step counts, like 9
|
||||
try:
|
||||
self.sampler.make_schedule(ddim_num_steps=steps, ddim_eta=self.eta, ddim_discretize=p.ddim_discretize, verbose=False)
|
||||
except Exception:
|
||||
self.sampler.make_schedule(ddim_num_steps=steps+1, ddim_eta=self.eta, ddim_discretize=p.ddim_discretize, verbose=False)
|
||||
|
||||
x1 = self.sampler.stochastic_encode(x, torch.tensor([t_enc] * int(x.shape[0])).to(shared.device), noise=noise)
|
||||
|
||||
self.init_latent = x
|
||||
|
@ -239,18 +245,14 @@ class VanillaStableDiffusionSampler:
|
|||
self.last_latent = x
|
||||
self.step = 0
|
||||
|
||||
steps = steps or p.steps
|
||||
steps = self.adjust_steps_if_invalid(p, steps or p.steps)
|
||||
|
||||
# Wrap the conditioning models with additional image conditioning for inpainting model
|
||||
if image_conditioning is not None:
|
||||
conditioning = {"c_concat": [image_conditioning], "c_crossattn": [conditioning]}
|
||||
unconditional_conditioning = {"c_concat": [image_conditioning], "c_crossattn": [unconditional_conditioning]}
|
||||
|
||||
# existing code fails with certain step counts, like 9
|
||||
try:
|
||||
samples_ddim = self.launch_sampling(steps, lambda: self.sampler.sample(S=steps, conditioning=conditioning, batch_size=int(x.shape[0]), shape=x[0].shape, verbose=False, unconditional_guidance_scale=p.cfg_scale, unconditional_conditioning=unconditional_conditioning, x_T=x, eta=self.eta)[0])
|
||||
except Exception:
|
||||
samples_ddim = self.launch_sampling(steps, lambda: self.sampler.sample(S=steps+1, conditioning=conditioning, batch_size=int(x.shape[0]), shape=x[0].shape, verbose=False, unconditional_guidance_scale=p.cfg_scale, unconditional_conditioning=unconditional_conditioning, x_T=x, eta=self.eta)[0])
|
||||
|
||||
return samples_ddim
|
||||
|
||||
|
|
|
@ -51,6 +51,7 @@ parser.add_argument("--realesrgan-models-path", type=str, help="Path to director
|
|||
parser.add_argument("--scunet-models-path", type=str, help="Path to directory with ScuNET model file(s).", default=os.path.join(models_path, 'ScuNET'))
|
||||
parser.add_argument("--swinir-models-path", type=str, help="Path to directory with SwinIR model file(s).", default=os.path.join(models_path, 'SwinIR'))
|
||||
parser.add_argument("--ldsr-models-path", type=str, help="Path to directory with LDSR model file(s).", default=os.path.join(models_path, 'LDSR'))
|
||||
parser.add_argument("--clip-models-path", type=str, help="Path to directory with CLIP model file(s).", default=None)
|
||||
parser.add_argument("--xformers", action='store_true', help="enable xformers for cross attention layers")
|
||||
parser.add_argument("--force-enable-xformers", action='store_true', help="enable xformers for cross attention layers regardless of whether the checking code thinks you can run it; do not make bug reports if this fails to work")
|
||||
parser.add_argument("--deepdanbooru", action='store_true', help="enable deepdanbooru interrogator")
|
||||
|
@ -288,11 +289,12 @@ 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 hypernetwork. Saves VRAM."),
|
||||
"unload_models_when_training": OptionInfo(False, "Move VAE and CLIP to RAM when training if possible. Saves VRAM."),
|
||||
"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}),
|
||||
"training_write_csv_every": OptionInfo(500, "Save an csv containing the loss to log directory every N steps, 0 to disable"),
|
||||
"training_xattention_optimizations": OptionInfo(False, "Use cross attention optimizations while training"),
|
||||
}))
|
||||
|
||||
options_templates.update(options_section(('sd', "Stable Diffusion"), {
|
||||
|
|
|
@ -235,6 +235,7 @@ def train_embedding(embedding_name, learn_rate, batch_size, data_root, log_direc
|
|||
filename = os.path.join(shared.cmd_opts.embeddings_dir, f'{embedding_name}.pt')
|
||||
|
||||
log_directory = os.path.join(log_directory, datetime.datetime.now().strftime("%Y-%m-%d"), embedding_name)
|
||||
unload = shared.opts.unload_models_when_training
|
||||
|
||||
if save_embedding_every > 0:
|
||||
embedding_dir = os.path.join(log_directory, "embeddings")
|
||||
|
@ -272,6 +273,8 @@ def train_embedding(embedding_name, learn_rate, batch_size, data_root, log_direc
|
|||
shared.state.textinfo = f"Preparing dataset from {html.escape(data_root)}..."
|
||||
with torch.autocast("cuda"):
|
||||
ds = modules.textual_inversion.dataset.PersonalizedBase(data_root=data_root, width=training_width, height=training_height, repeats=shared.opts.training_image_repeats_per_epoch, placeholder_token=embedding_name, model=shared.sd_model, device=devices.device, template_file=template_file, batch_size=batch_size)
|
||||
if unload:
|
||||
shared.sd_model.first_stage_model.to(devices.cpu)
|
||||
|
||||
embedding.vec.requires_grad = True
|
||||
optimizer = torch.optim.AdamW([embedding.vec], lr=scheduler.learn_rate)
|
||||
|
@ -328,6 +331,9 @@ def train_embedding(embedding_name, learn_rate, batch_size, data_root, log_direc
|
|||
if images_dir is not None and steps_done % create_image_every == 0:
|
||||
forced_filename = f'{embedding_name}-{steps_done}'
|
||||
last_saved_image = os.path.join(images_dir, forced_filename)
|
||||
|
||||
shared.sd_model.first_stage_model.to(devices.device)
|
||||
|
||||
p = processing.StableDiffusionProcessingTxt2Img(
|
||||
sd_model=shared.sd_model,
|
||||
do_not_save_grid=True,
|
||||
|
@ -355,6 +361,9 @@ def train_embedding(embedding_name, learn_rate, batch_size, data_root, log_direc
|
|||
processed = processing.process_images(p)
|
||||
image = processed.images[0]
|
||||
|
||||
if unload:
|
||||
shared.sd_model.first_stage_model.to(devices.cpu)
|
||||
|
||||
shared.state.current_image = image
|
||||
|
||||
if save_image_with_stored_embedding and os.path.exists(last_saved_file) and embedding_yet_to_be_embedded:
|
||||
|
@ -400,6 +409,7 @@ Last saved image: {html.escape(last_saved_image)}<br/>
|
|||
|
||||
filename = os.path.join(shared.cmd_opts.embeddings_dir, f'{embedding_name}.pt')
|
||||
save_embedding(embedding, checkpoint, embedding_name, filename, remove_cached_checksum=True)
|
||||
shared.sd_model.first_stage_model.to(devices.device)
|
||||
|
||||
return embedding, filename
|
||||
|
||||
|
|
|
@ -25,7 +25,9 @@ def train_embedding(*args):
|
|||
|
||||
assert not shared.cmd_opts.lowvram, 'Training models with lowvram not possible'
|
||||
|
||||
apply_optimizations = shared.opts.training_xattention_optimizations
|
||||
try:
|
||||
if not apply_optimizations:
|
||||
sd_hijack.undo_optimizations()
|
||||
|
||||
embedding, filename = modules.textual_inversion.textual_inversion.train_embedding(*args)
|
||||
|
@ -38,5 +40,6 @@ Embedding saved to {html.escape(filename)}
|
|||
except Exception:
|
||||
raise
|
||||
finally:
|
||||
if not apply_optimizations:
|
||||
sd_hijack.apply_optimizations()
|
||||
|
||||
|
|
|
@ -13,6 +13,9 @@ import html
|
|||
from modules import extensions, shared, paths
|
||||
|
||||
|
||||
available_extensions = {"extensions": []}
|
||||
|
||||
|
||||
def check_access():
|
||||
assert not shared.cmd_opts.disable_extension_access, "extension access disabed because of commandline flags"
|
||||
|
||||
|
@ -96,6 +99,14 @@ def extension_table():
|
|||
return code
|
||||
|
||||
|
||||
def normalize_git_url(url):
|
||||
if url is None:
|
||||
return ""
|
||||
|
||||
url = url.replace(".git", "")
|
||||
return url
|
||||
|
||||
|
||||
def install_extension_from_url(dirname, url):
|
||||
check_access()
|
||||
|
||||
|
@ -103,14 +114,15 @@ def install_extension_from_url(dirname, url):
|
|||
|
||||
if dirname is None or dirname == "":
|
||||
*parts, last_part = url.split('/')
|
||||
last_part = last_part.replace(".git", "")
|
||||
last_part = normalize_git_url(last_part)
|
||||
|
||||
dirname = last_part
|
||||
|
||||
target_dir = os.path.join(extensions.extensions_dir, dirname)
|
||||
assert not os.path.exists(target_dir), f'Extension directory already exists: {target_dir}'
|
||||
|
||||
assert len([x for x in extensions.extensions if x.remote == url]) == 0, 'Extension with this URL is already installed'
|
||||
normalized_url = normalize_git_url(url)
|
||||
assert len([x for x in extensions.extensions if normalize_git_url(x.remote) == normalized_url]) == 0, 'Extension with this URL is already installed'
|
||||
|
||||
tmpdir = os.path.join(paths.script_path, "tmp", dirname)
|
||||
|
||||
|
@ -128,18 +140,80 @@ def install_extension_from_url(dirname, url):
|
|||
shutil.rmtree(tmpdir, True)
|
||||
|
||||
|
||||
def install_extension_from_index(url):
|
||||
ext_table, message = install_extension_from_url(None, url)
|
||||
|
||||
return refresh_available_extensions_from_data(), ext_table, message
|
||||
|
||||
|
||||
def refresh_available_extensions(url):
|
||||
global available_extensions
|
||||
|
||||
import urllib.request
|
||||
with urllib.request.urlopen(url) as response:
|
||||
text = response.read()
|
||||
|
||||
available_extensions = json.loads(text)
|
||||
|
||||
return url, refresh_available_extensions_from_data(), ''
|
||||
|
||||
|
||||
def refresh_available_extensions_from_data():
|
||||
extlist = available_extensions["extensions"]
|
||||
installed_extension_urls = {normalize_git_url(extension.remote): extension.name for extension in extensions.extensions}
|
||||
|
||||
code = f"""<!-- {time.time()} -->
|
||||
<table id="available_extensions">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Extension</th>
|
||||
<th>Description</th>
|
||||
<th>Action</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
"""
|
||||
|
||||
for ext in extlist:
|
||||
name = ext.get("name", "noname")
|
||||
url = ext.get("url", None)
|
||||
description = ext.get("description", "")
|
||||
|
||||
if url is None:
|
||||
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">"""
|
||||
|
||||
code += f"""
|
||||
<tr>
|
||||
<td><a href="{html.escape(url)}">{html.escape(name)}</a></td>
|
||||
<td>{html.escape(description)}</td>
|
||||
<td>{install_code}</td>
|
||||
</tr>
|
||||
"""
|
||||
|
||||
code += """
|
||||
</tbody>
|
||||
</table>
|
||||
"""
|
||||
|
||||
return code
|
||||
|
||||
|
||||
def create_ui():
|
||||
import modules.ui
|
||||
|
||||
with gr.Blocks(analytics_enabled=False) as ui:
|
||||
with gr.Tabs(elem_id="tabs_extensions") as tabs:
|
||||
with gr.TabItem("Installed"):
|
||||
extensions_disabled_list = gr.Text(elem_id="extensions_disabled_list", visible=False)
|
||||
extensions_update_list = gr.Text(elem_id="extensions_update_list", visible=False)
|
||||
|
||||
with gr.Row():
|
||||
apply = gr.Button(value="Apply and restart UI", variant="primary")
|
||||
check = gr.Button(value="Check for updates")
|
||||
extensions_disabled_list = gr.Text(elem_id="extensions_disabled_list", visible=False).style(container=False)
|
||||
extensions_update_list = gr.Text(elem_id="extensions_update_list", visible=False).style(container=False)
|
||||
|
||||
extensions_table = gr.HTML(lambda: extension_table())
|
||||
|
||||
|
@ -157,16 +231,38 @@ def create_ui():
|
|||
outputs=[extensions_table],
|
||||
)
|
||||
|
||||
with gr.TabItem("Available"):
|
||||
with gr.Row():
|
||||
refresh_available_extensions_button = gr.Button(value="Load from:", variant="primary")
|
||||
available_extensions_index = gr.Text(value="https://raw.githubusercontent.com/wiki/AUTOMATIC1111/stable-diffusion-webui/Extensions-index.md", label="Extension index URL").style(container=False)
|
||||
extension_to_install = gr.Text(elem_id="extension_to_install", visible=False)
|
||||
install_extension_button = gr.Button(elem_id="install_extension_button", visible=False)
|
||||
|
||||
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],
|
||||
)
|
||||
|
||||
install_extension_button.click(
|
||||
fn=modules.ui.wrap_gradio_call(install_extension_from_index, extra_outputs=[gr.update(), gr.update()]),
|
||||
inputs=[extension_to_install],
|
||||
outputs=[available_extensions_table, 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")
|
||||
intall_button = gr.Button(value="Install", variant="primary")
|
||||
intall_result = gr.HTML(elem_id="extension_install_result")
|
||||
install_button = gr.Button(value="Install", variant="primary")
|
||||
install_result = gr.HTML(elem_id="extension_install_result")
|
||||
|
||||
intall_button.click(
|
||||
install_button.click(
|
||||
fn=modules.ui.wrap_gradio_call(install_extension_from_url, extra_outputs=[gr.update()]),
|
||||
inputs=[install_dirname, install_url],
|
||||
outputs=[extensions_table, intall_result],
|
||||
outputs=[extensions_table, install_result],
|
||||
)
|
||||
|
||||
return ui
|
||||
|
|
|
@ -12,7 +12,7 @@ opencv-python
|
|||
requests
|
||||
piexif
|
||||
Pillow
|
||||
pytorch_lightning
|
||||
pytorch_lightning==1.7.7
|
||||
realesrgan
|
||||
scikit-image>=0.19
|
||||
timm==0.4.12
|
||||
|
|
|
@ -532,16 +532,16 @@ img2maskimg, #img2maskimg > .h-60, #img2maskimg > .h-60 > div, #img2maskimg > .h
|
|||
|
||||
/* Extensions */
|
||||
|
||||
#extensions{
|
||||
#tab_extensions table{
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
#extensions td, #extensions th{
|
||||
#tab_extensions table td, #tab_extensions table th{
|
||||
border: 1px solid #ccc;
|
||||
padding: 0.25em 0.5em;
|
||||
}
|
||||
|
||||
#extensions input[type="checkbox"]{
|
||||
#tab_extensions table input[type="checkbox"]{
|
||||
margin-right: 0.5em;
|
||||
}
|
||||
|
||||
|
@ -549,6 +549,9 @@ img2maskimg, #img2maskimg > .h-60, #img2maskimg > .h-60 > div, #img2maskimg > .h
|
|||
max-width: 16em;
|
||||
}
|
||||
|
||||
#tab_extensions input[disabled="disabled"]{
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
/* 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.
|
||||
|
|
5
webui.py
5
webui.py
|
@ -23,6 +23,7 @@ import modules.sd_hijack
|
|||
import modules.sd_models
|
||||
import modules.shared as shared
|
||||
import modules.txt2img
|
||||
import modules.script_callbacks
|
||||
|
||||
import modules.ui
|
||||
from modules import devices
|
||||
|
@ -77,7 +78,7 @@ def initialize():
|
|||
modules.scripts.load_scripts()
|
||||
|
||||
modules.sd_models.load_model()
|
||||
shared.opts.onchange("sd_model_checkpoint", wrap_queued_call(lambda: modules.sd_models.reload_model_weights(shared.sd_model)))
|
||||
shared.opts.onchange("sd_model_checkpoint", wrap_queued_call(lambda: modules.sd_models.reload_model_weights()))
|
||||
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)
|
||||
|
||||
|
@ -140,6 +141,8 @@ def webui():
|
|||
if launch_api:
|
||||
create_api(app)
|
||||
|
||||
modules.script_callbacks.app_started_callback(demo, app)
|
||||
|
||||
wait_on_server(demo)
|
||||
|
||||
sd_samplers.set_samplers()
|
||||
|
|
Loading…
Reference in New Issue