aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/ISSUE_TEMPLATE/bug_report.yml2
-rw-r--r--.gitignore1
-rw-r--r--javascript/hints.js1
-rw-r--r--javascript/ui.js24
-rw-r--r--localizations/fr-FR.json415
-rw-r--r--localizations/ko_KR.json18
-rw-r--r--localizations/pt_BR.json468
-rw-r--r--localizations/tr_TR.json423
-rw-r--r--localizations/zh_CN.json488
-rw-r--r--localizations/zh_TW.json488
-rw-r--r--modules/api/api.py107
-rw-r--r--modules/api/models.py63
-rw-r--r--modules/extras.py178
-rw-r--r--modules/generation_parameters_copypaste.py100
-rw-r--r--modules/hypernetworks/hypernetwork.py62
-rw-r--r--modules/hypernetworks/ui.py5
-rw-r--r--modules/images.py64
-rw-r--r--modules/img2img.py10
-rw-r--r--modules/processing.py150
-rw-r--r--modules/script_callbacks.py50
-rw-r--r--modules/sd_models.py7
-rw-r--r--modules/shared.py12
-rw-r--r--modules/textual_inversion/autocrop.py341
-rw-r--r--modules/textual_inversion/dataset.py4
-rw-r--r--modules/textual_inversion/learn_schedule.py2
-rw-r--r--modules/textual_inversion/preprocess.py38
-rw-r--r--modules/textual_inversion/textual_inversion.py42
-rw-r--r--modules/ui.py371
-rw-r--r--requirements.txt2
-rw-r--r--scripts/prompts_from_file.py54
-rw-r--r--scripts/xy_grid.py2
31 files changed, 3445 insertions, 547 deletions
diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
index 9c2ff313..ed372f22 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -44,7 +44,7 @@ body:
id: commit
attributes:
label: Commit where the problem happens
- description: Which commit are you running ? (copy the **Commit hash** shown in the cmd/terminal when you launch the UI)
+ description: Which commit are you running ? (Do not write *Latest version/repo/commit*, as this means nothing and will have changed by the time we read your issue. Rather, copy the **Commit hash** shown in the cmd/terminal when you launch the UI)
validations:
required: true
- type: dropdown
diff --git a/.gitignore b/.gitignore
index 70660c51..8fa05852 100644
--- a/.gitignore
+++ b/.gitignore
@@ -29,4 +29,3 @@ notification.mp3
/textual_inversion
.vscode
/extensions
-
diff --git a/javascript/hints.js b/javascript/hints.js
index 6ddd6aec..623bc25c 100644
--- a/javascript/hints.js
+++ b/javascript/hints.js
@@ -75,6 +75,7 @@ titles = {
"Create style": "Save current prompts as a style. If you add the token {prompt} to the text, the style use that as placeholder for your prompt when you use the style in the future.",
"Checkpoint name": "Loads weights from checkpoint before making images. You can either use hash or a part of filename (as seen in settings) for checkpoint name. Recommended to use with Y axis for less switching.",
+ "Inpainting conditioning mask strength": "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.",
"vram": "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%).",
diff --git a/javascript/ui.js b/javascript/ui.js
index cfd0dcd3..7e116465 100644
--- a/javascript/ui.js
+++ b/javascript/ui.js
@@ -45,14 +45,14 @@ function switch_to_txt2img(){
return args_to_array(arguments);
}
-function switch_to_img2img_img2img(){
+function switch_to_img2img(){
gradioApp().querySelector('#tabs').querySelectorAll('button')[1].click();
gradioApp().getElementById('mode_img2img').querySelectorAll('button')[0].click();
return args_to_array(arguments);
}
-function switch_to_img2img_inpaint(){
+function switch_to_inpaint(){
gradioApp().querySelector('#tabs').querySelectorAll('button')[1].click();
gradioApp().getElementById('mode_img2img').querySelectorAll('button')[1].click();
@@ -65,26 +65,6 @@ function switch_to_extras(){
return args_to_array(arguments);
}
-function extract_image_from_gallery_txt2img(gallery){
- switch_to_txt2img()
- return extract_image_from_gallery(gallery);
-}
-
-function extract_image_from_gallery_img2img(gallery){
- switch_to_img2img_img2img()
- return extract_image_from_gallery(gallery);
-}
-
-function extract_image_from_gallery_inpaint(gallery){
- switch_to_img2img_inpaint()
- return extract_image_from_gallery(gallery);
-}
-
-function extract_image_from_gallery_extras(gallery){
- switch_to_extras()
- return extract_image_from_gallery(gallery);
-}
-
function get_tab_index(tabId){
var res = 0
diff --git a/localizations/fr-FR.json b/localizations/fr-FR.json
new file mode 100644
index 00000000..b33d0838
--- /dev/null
+++ b/localizations/fr-FR.json
@@ -0,0 +1,415 @@
+{
+ "⤡": "⤡",
+ "⊞": "⊞",
+ "×": "×",
+ "❮": "❮",
+ "❯": "❯",
+ "Loading...": "Chargement...",
+ "view": "vue",
+ "api": "api",
+ "•": "•",
+ "built with gradio": "Construit avec Gradio",
+ "Stable Diffusion checkpoint": "checkpoint Stable Diffusion",
+ "txt2img": "txt2img",
+ "img2img": "img2img",
+ "Extras": "Extras",
+ "PNG Info": "Infos PNG",
+ "History": "Historique",
+ "Checkpoint Merger": "Fusion de checkpoints",
+ "Train": "Entrainer",
+ "Settings": "Paramètres",
+ "Prompt": "Requête",
+ "Negative prompt": "Requête négative",
+ "Run": "Lancer",
+ "Skip": "Passer",
+ "Interrupt": "Interrrompre",
+ "Generate": "Générer",
+ "Style 1": "Style 1",
+ "Style 2": "Style 2",
+ "Label": "Etiquette",
+ "File": "Fichier",
+ "Drop File Here": "Déposer votre fichier ici",
+ "-": "-",
+ "or": "ou",
+ "Click to Upload": "Cliquer pour uploader",
+ "Image": "Image",
+ "Check progress": "Voir l'avancement",
+ "Check progress (first)": "Voir l'avancement (1er)",
+ "Sampling Steps": "Étapes d'échantillonnage",
+ "Sampling method": "Méthode d'échantillonnage",
+ "Euler a": "Euler a",
+ "Euler": "Euler",
+ "LMS": "LMS",
+ "Heun": "Heun",
+ "DPM2": "DPM2",
+ "DPM2 a": "DPM2 a",
+ "DPM fast": "DPM fast",
+ "DPM adaptive": "DPM adaptive",
+ "LMS Karras": "LMS Karras",
+ "DPM2 Karras": "DPM2 Karras",
+ "DPM2 a Karras": "DPM2 a Karras",
+ "DDIM": "DDIM",
+ "PLMS": "PLMS",
+ "Width": "Largeur",
+ "Height": "Hauteur",
+ "Restore faces": "Restaurer les visages",
+ "Tiling": "Mode Tuile",
+ "Highres. fix": "Correction haute résolution",
+ "Firstpass width": "Largeur première passe",
+ "Firstpass height": "Hauteur seconde passe",
+ "Denoising strength": "Puissance de réduction du bruit",
+ "Batch count": "Nombre de lots",
+ "Batch size": "Taille de lots",
+ "CFG Scale": "Echelle CFG",
+ "Seed": "Valeur aléatoire",
+ "Extra": "Extra",
+ "Variation seed": "Variation de la valeur aléatoire",
+ "Variation strength": "Puissance de variation",
+ "Resize seed from width": "Largeur de redimensionnement de la valeur aléatoire",
+ "Resize seed from height": "Hauteur de redimensionnement de la valeur aléatoire",
+ "Script": "Script",
+ "None": "Aucun",
+ "Prompt matrix": "Matrice de requète",
+ "Prompts from file or textbox": "Requètes depuis un fichier ou une boite de dialogue",
+ "X/Y plot": "graphe X/Y",
+ "Put variable parts at start of prompt": "Mettre les mots clés variable au début de la requête",
+ "Show Textbox": "Afficher le champs texte",
+ "File with inputs": "Fichier d'entrée",
+ "Prompts": "Requêtes",
+ "X type": "Paramètre axe X",
+ "Nothing": "Rien",
+ "Var. seed": "Valeur aléatoire variable",
+ "Var. strength": "Puissance variable",
+ "Steps": "Étapes",
+ "Prompt S/R": "Cherche et remplace dans la requête",
+ "Prompt order": "Ordre de la requête",
+ "Sampler": "Echantilloneur",
+ "Checkpoint name": "Nom du checkpoint",
+ "Hypernetwork": "Hypernetwork",
+ "Hypernet str.": "Force de l'Hypernetwork",
+ "Sigma Churn": "Sigma Churn",
+ "Sigma min": "Sigma min.",
+ "Sigma max": "Sigma max.",
+ "Sigma noise": "Bruit Sigma",
+ "Eta": "Temps estimé",
+ "Clip skip": "Passer Clip",
+ "Denoising": "Réduction du bruit",
+ "X values": "Valeurs X",
+ "Y type": "Paramètre axe Y",
+ "Y values": "Valeurs Y",
+ "Draw legend": "Afficher la légende",
+ "Include Separate Images": "Inclure les images séparées",
+ "Keep -1 for seeds": "Conserver -1 pour la valeur aléatoire",
+ "Drop Image Here": "Déposer l'image ici",
+ "Save": "Enregistrer",
+ "Send to img2img": "Envoyer vers img2img",
+ "Send to inpaint": "Envoyer vers inpaint",
+ "Send to extras": "Envoyer vers extras",
+ "Make Zip when Save?": "Créer un zip lors de l'enregistrement?",
+ "Textbox": "Champ texte",
+ "Interrogate\nCLIP": "Interroger\nCLIP",
+ "Interrogate\nDeepBooru": "Interroger\nDeepBooru",
+ "Inpaint": "Inpaint",
+ "Batch img2img": "Lot img2img",
+ "Image for img2img": "Image pour img2img",
+ "Image for inpainting with mask": "Image pour inpainting avec masque",
+ "Mask": "Masque",
+ "Mask blur": "Flou masque",
+ "Mask mode": "Mode masque",
+ "Draw mask": "Dessiner masque",
+ "Upload mask": "Uploader masque",
+ "Masking mode": "Mode de masquage",
+ "Inpaint masked": "Inpaint masqué",
+ "Inpaint not masked": "Inpaint non masqué",
+ "Masked content": "Contenu masqué",
+ "fill": "remplir",
+ "original": "original",
+ "latent noise": "bruit latent",
+ "latent nothing": "latent vide",
+ "Inpaint at full resolution": "Inpaint en pleine résolution",
+ "Inpaint at full resolution padding, pixels": "Padding de l'inpaint en pleine résolution, en pixels",
+ "Process images in a directory on the same machine where the server is running.": "Traite les images dans un dossier sur la même machine où le serveur tourne",
+ "Use an empty output directory to save pictures normally instead of writing to the output directory.": "Utiliser un dossier de sortie vide pour enregistrer les images normalement plutôt que d'écrire dans le dossier de sortie",
+ "Input directory": "Dossier d'entrée",
+ "Output directory": "Dossier de sortie",
+ "Resize mode": "Mode redimensionnement",
+ "Just resize": "Redimensionner uniquement",
+ "Crop and resize": "Recadrer et redimensionner",
+ "Resize and fill": "Redimensionner et remplir",
+ "img2img alternative test": "Test alternatif img2img",
+ "Loopback": "Bouclage",
+ "Outpainting mk2": "Outpainting v2",
+ "Poor man's outpainting": "Outpainting du pauvre",
+ "SD upscale": "Agrandissement SD",
+ "should be 2 or lower.": "doit être inférieur ou égal à 2",
+ "Override `Sampling method` to Euler?(this method is built for it)": "Forcer `Méthode d'échantillonnage` à Euler ? (cette méthode est dédiée à cela)",
+ "Override `prompt` to the same value as `original prompt`?(and `negative prompt`)": "Forcer la `requête` au contenu de la `requête d'origine` ? (de même pour la `requête négative`)",
+ "Original prompt": "Requête d'origine",
+ "Original negative prompt": "Requête négative d'origine",
+ "Override `Sampling Steps` to the same value as `Decode steps`?": "Forcer le valeur d'`Étapes d'échantillonnage` à la même valeur qu'`Étapes de décodage` ?",
+ "Decode steps": "Étapes de décodage",
+ "Override `Denoising strength` to 1?": "Forcer `Puissance de réduction du bruit` à 1 ?",
+ "Decode CFG scale": "Echelle CFG de décodage",
+ "Randomness": "Aléatoire",
+ "Sigma adjustment for finding noise for image": "Ajustement Sigma lors de la recherche du bruit dans l'image",
+ "Loops": "Boucles",
+ "Denoising strength change factor": "Facteur de changement de la puissance de réduction du bruit",
+ "Recommended settings: Sampling Steps: 80-100, Sampler: Euler a, Denoising strength: 0.8": "Paramètres recommandés : Étapes d'échantillonnage : 80-100, Echantillonneur : Euler a, Puissance de réduction du bruit : 0.8",
+ "Pixels to expand": "Pixels à étendre",
+ "Outpainting direction": "Direction de l'outpainting",
+ "left": "gauche",
+ "right": "droite",
+ "up": "haut",
+ "down": "bas",
+ "Fall-off exponent (lower=higher detail)": "Exposant de diminution (plus petit = plus de détails)",
+ "Color variation": "Variation de couleur",
+ "Will upscale the image to twice the dimensions; use width and height sliders to set tile size": "Agrandira l'image à deux fois sa taille; utilisez les glissières largeur et hauteur afin de choisir la taille de tuile",
+ "Tile overlap": "Chevauchement de tuile",
+ "Upscaler": "Agrandisseur",
+ "Lanczos": "Lanczos",
+ "LDSR": "LDSR",
+ "BSRGAN 4x": "BSRGAN 4x",
+ "ESRGAN_4x": "ESRGAN_4x",
+ "R-ESRGAN 4x+ Anime6B": "R-ESRGAN 4x+ Anime6B",
+ "ScuNET GAN": "ScuNET GAN",
+ "ScuNET PSNR": "ScuNET PSNR",
+ "SwinIR 4x": "SwinIR 4x",
+ "Single Image": "Image unique",
+ "Batch Process": "Traitement par lot",
+ "Batch from Directory": "Lot depuis un dossier",
+ "Source": "Source",
+ "Show result images": "Montrez les images résultantes",
+ "Scale by": "Mise à l'échelle de",
+ "Scale to": "Mise à l'échelle à",
+ "Resize": "Redimensionner",
+ "Crop to fit": "Recadrer à la taille",
+ "Upscaler 2": "Agrandisseur 2",
+ "Upscaler 2 visibility": "Visibilité de l'agrandisseur 2",
+ "GFPGAN visibility": "Visibilité GFPGAN",
+ "CodeFormer visibility": "Visibilité CodeFormer",
+ "CodeFormer weight (0 = maximum effect, 1 = minimum effect)": "Poids CodeFormer (0 = effet maximum, 1 = effet minimum)",
+ "Open output directory": "Ouvrir le dossier de sortie",
+ "Send to txt2img": "Envoyer vers txt2img",
+ "txt2img history": "historique txt2img",
+ "img2img history": "historique img2img",
+ "extras history": "historique extras",
+ "Renew Page": "Rafraichr la page",
+ "First Page": "Première page",
+ "Prev Page": "Page précendente",
+ "Page Index": "Index des pages",
+ "Next Page": "Page suivante",
+ "End Page": "Page de fin",
+ "number of images to delete consecutively next": "nombre d'image à supprimer consécutivement ensuite",
+ "Delete": "Supprimer",
+ "Generate Info": "Générer les informations",
+ "File Name": "Nom de fichier",
+ "set_index": "set_index",
+ "A merger of the two checkpoints will be generated in your": "Une fusion des deux checkpoints sera générée dans votre",
+ "checkpoint": "checkpoint",
+ "directory.": "dossier",
+ "Primary model (A)": "Modèle primaire (A)",
+ "Secondary model (B)": "Modèle secondaire (B)",
+ "Tertiary model (C)": "Modèle tertiaire (C)",
+ "Custom Name (Optional)": "Nom personnalisé (Optionel)",
+ "Multiplier (M) - set to 0 to get model A": "Multiplieur (M) - utiliser 0 pour le modèle A",
+ "Interpolation Method": "Méthode d'interpolation",
+ "Weighted sum": "Somme pondérée",
+ "Add difference": "Ajouter différence",
+ "Save as float16": "Enregistrer en tant que float16",
+ "See": "Voir",
+ "wiki": "wiki",
+ "for detailed explanation.": "pour une explication détaillée.",
+ "Create embedding": "Créer un embedding",
+ "Create hypernetwork": "Créer un hypernetwork",
+ "Preprocess images": "Pré-traite les images",
+ "Name": "Nom",
+ "Initialization text": "Texte d'initialisation",
+ "Number of vectors per token": "Nombre de vecteurs par jeton",
+ "Modules": "Modules",
+ "Source directory": "Dossier source",
+ "Destination directory": "Dossier destination",
+ "Create flipped copies": "Créer des copies en mirroir",
+ "Split oversized images into two": "Couper les images trop grandes en deux",
+ "Use BLIP for caption": "Utiliser BLIP pour les descriptions",
+ "Use deepbooru for caption": "Utiliser deepbooru pour les descriptions",
+ "Preprocess": "Pré-traite",
+ "Train an embedding; must specify a directory with a set of 1:1 ratio images": "Entrainer un embedding ; spécifiez un dossier contenant un ensemble d'images avec un ratio de 1:1",
+ "Embedding": "Embedding",
+ "Learning rate": "Vitesse d'apprentissage",
+ "Dataset directory": "Dossier des images d'entrée",
+ "Log directory": "Dossier de journalisation",
+ "Prompt template file": "Fichier modèle de requêtes",
+ "Max steps": "Étapes max.",
+ "Save an image to log directory every N steps, 0 to disable": "Enregistrer une image dans le dossier de journalisation toutes les N étapes, 0 pour désactiver",
+ "Save a copy of embedding to log directory every N steps, 0 to disable": "Enregistrer une copie de l'embedding dans le dossier de journalisation toutes les N étapes, 0 pour désactiver",
+ "Save images with embedding in PNG chunks": "Sauvegarder les images incluant l'embedding dans leur blocs PNG",
+ "Read parameters (prompt, etc...) from txt2img tab when making previews": "Lire les paramètres (requête, etc.) depuis l'onglet txt2img lors de la génération des previews",
+ "Train Hypernetwork": "Entrainer un Hypernetwork",
+ "Train Embedding": "Entrainer un Embedding",
+ "Apply settings": "Appliquer les paramètres",
+ "Saving images/grids": "Enregistrer les images/grilles",
+ "Always save all generated images": "Toujours enregistrer toutes les images",
+ "File format for images": "Format de fichier pour les images",
+ "Images filename pattern": "Motif pour le nom de fichier des images",
+ "Always save all generated image grids": "Toujours enregistrer toutes les grilles d'images générées",
+ "File format for grids": "Format de fichier pour les grilles",
+ "Add extended info (seed, prompt) to filename when saving grid": "Ajouter les informations étendues (valeur aléatoire, requête) aux noms de fichiers lors de l'enregistrement d'une grille",
+ "Do not save grids consisting of one picture": "Ne pas enregistrer les grilles contenant une seule image",
+ "Prevent empty spots in grid (when set to autodetect)": "Eviter les vides dans la grille (quand autodétection est choisie)",
+ "Grid row count; use -1 for autodetect and 0 for it to be same as batch size": "Nombre de colonnes de la grille; utilisez -1 pour autodétection et 0 pour qu'il soit égal à la taille du lot",
+ "Save text information about generation parameters as chunks to png files": "Enregistrer l'information du text des paramètres de génération en tant que blocs dans les fichiers PNG",
+ "Create a text file next to every image with generation parameters.": "Créer un fichier texte contenant les paramètres de génération à côté de chaque image",
+ "Save a copy of image before doing face restoration.": "Enregistrer une copie de l'image avant de lancer la restauration de visage",
+ "Quality for saved jpeg images": "Qualité pour les images jpeg enregistrées",
+ "If PNG image is larger than 4MB or any dimension is larger than 4000, downscale and save copy as JPG": "Si l'image PNG est plus grande que 4MB or l'une des ses dimensions supérieure à 4000, réduire sa taille et enregistrer une copie en JPG",
+ "Use original name for output filename during batch process in extras tab": "Utiliser un nom de fichier original pour les fichiers de sortie durant le traitement par lot dans l'onglet Extras",
+ "When using 'Save' button, only save a single selected image": "A l'utilisation du bouton `Enregistrer`, n'enregistrer que l'image séléctionnée",
+ "Do not add watermark to images": "Ne pas ajouter de filigrane aux images",
+ "Paths for saving": "Chemins pour l'enregistrement",
+ "Output directory for images; if empty, defaults to three directories below": "Dossier de sortie pour les images; si non spécifié, le chemin par défaut sera trois niveau en dessous",
+ "Output directory for txt2img images": "Dossier de sortie pour les images txt2img",
+ "Output directory for img2img images": "Dossier de sortie pour les images img2img",
+ "Output directory for images from extras tab": "Dossier de sortie pour les images de l'onglet Extras",
+ "Output directory for grids; if empty, defaults to two directories below": "Dossier de sortie pour les grilles; si non spécifié, le chemin par défaut sera deux niveau en dessous",
+ "Output directory for txt2img grids": "Dossier de sortie pour les grilles txt2img",
+ "Output directory for img2img grids": "Dossier de sortie pour les grilles img2img",
+ "Directory for saving images using the Save button": "Dossier de sauvegarde des images pour le bouton `Enregistrer`",
+ "Saving to a directory": "Enregistrer dans un dossier",
+ "Save images to a subdirectory": "Enregistrer les images dans un sous dossier",
+ "Save grids to a subdirectory": "Enregistrer les grilles dans un sous dossier",
+ "When using \"Save\" button, save images to a subdirectory": "Lors de l'utilisation du bouton \"Enregistrer\", sauvegarder les images dans un sous dossier",
+ "Directory name pattern": "Motif pour le nom des dossiers",
+ "Max prompt words for [prompt_words] pattern": "Maximum de mot pour le motif [prompt_words]",
+ "Upscaling": "Agrandissement",
+ "Tile size for ESRGAN upscalers. 0 = no tiling.": "Taille des tuile for les agrandisseurs ESRGAN. 0 = mode tuile désactivé.",
+ "Tile overlap, in pixels for ESRGAN upscalers. Low values = visible seam.": "Chevauchement des tuiles, en pixel pour l'agrandisseur ESRGAN. Valeur faible = couture visible",
+ "Tile size for all SwinIR.": "Taille de la tuile pour tous les agrandisseur SwinIR.",
+ "Tile overlap, in pixels for SwinIR. Low values = visible seam.": "Chevauchement de tuile, en pixels pour SwinIR. Valeur faible = couture visible",
+ "LDSR processing steps. Lower = faster": "Echantillon du traitement LDSR. Valeur faible = plus rapide",
+ "Upscaler for img2img": "Agrandisseur pour img2img",
+ "Upscale latent space image when doing hires. fix": "Agrandir l'image de l'espace latent lors de la correction haute résolution",
+ "Face restoration": "Restauration de visage",
+ "CodeFormer weight parameter; 0 = maximum effect; 1 = minimum effect": "Paramètre de poids pour CodeFormer; 0 = effet maximum ; 1 = effet minimum",
+ "Move face restoration model from VRAM into RAM after processing": "Déplacer le modèle de restauration de visage de la VRAM vers la RAM après traitement",
+ "System": "Système",
+ "VRAM usage polls per second during generation. Set to 0 to disable.": "Fréquence d'interrogation par seconde pendant la génération. Mettez la valeur à 0 pour désactiver.",
+ "Always print all generation info to standard output": "Toujours afficher toutes les informations de génération dans la sortie standard",
+ "Add a second progress bar to the console that shows progress for an entire job.": "Ajouter un seconde barre de progression dans la console montrant l'avancement pour un tâche complète.",
+ "Training": "Entrainement",
+ "Unload VAE and CLIP from VRAM when training": "Décharger VAE et CLIP de la VRAM pendant l'entrainement",
+ "Filename word regex": "Regex de mot",
+ "Filename join string": "Chaine de caractère pour lier les noms de fichier",
+ "Number of repeats for a single input image per epoch; used only for displaying epoch number": "Nombre de répétition pour une image unique par époque; utilisé seulement pour afficher le nombre d'époques",
+ "Save an csv containing the loss to log directory every N steps, 0 to disable": "Enregistrer un csv contenant la perte dans le dossier de journalisation toutes les N étapes, 0 pour désactiver",
+ "Stable Diffusion": "Stable Diffusion",
+ "Checkpoints to cache in RAM": "Checkpoint à mettre en cache dans la RAM",
+ "Hypernetwork strength": "Force de l'Hypernetwork",
+ "Apply color correction to img2img results to match original colors.": "Appliquer une correction de couleur aux résultats img2img afin de conserver les couleurs d'origine",
+ "Save a copy of image before applying color correction to img2img results": "Enregistrer une copie de l'image avant d'appliquer les résultats de la correction de couleur img2img",
+ "With img2img, do exactly the amount of steps the slider specifies (normally you'd do less with less denoising).": "Avec img2img, executer exactement le nombre d'étapes spécifiées par la glissière (normalement moins d'étapes sont executées quand la réduction du bruit est plus faible).",
+ "Enable quantization in K samplers for sharper and cleaner results. This may change existing seeds. Requires restart to apply.": "Activer la quantisation des échantillionneurs K pour des résultats plus nets et plus propres. Cela peut modifier les valeurs aléatoires existantes. Requiert un redémarrage pour être actif.",
+ "Emphasis: use (text) to make model pay more attention to text and [text] to make it pay less attention": "Emphase : utilisez (texte) afin de forcer le modèle à porter plus d'attention au texte et [texte] afin qu'il y porte moins attention",
+ "Use old emphasis implementation. Can be useful to reproduce old seeds.": "Utilisez l'ancienne méthode d'emphase. Peut être utile afin de reproduire d'anciennes valeurs aléatoires.",
+ "Make K-diffusion samplers produce same images in a batch as when making a single image": "Demander aux échantillionneurs K-diffusion de produire les mêmes dans un lot que lors de la génération d'une image unique",
+ "Increase coherency by padding from the last comma within n tokens when using more than 75 tokens": "Améliorer la cohérence en remplissant (padding) à partir de la dernière virgule dans les X jetons quand on en utilise plus de 75",
+ "Filter NSFW content": "Filtrer le contenu +18 (NSFW)",
+ "Stop At last layers of CLIP model": "S'arrêter aux derniers niveaux du modèle CLIP",
+ "Interrogate Options": "Options d'intérrogation",
+ "Interrogate: keep models in VRAM": "Interroger : conserver les modèles en VRAM",
+ "Interrogate: use artists from artists.csv": "Interroger : utiliser les artistes dans artists.csv",
+ "Interrogate: include ranks of model tags matches in results (Has no effect on caption-based interrogators).": "Interroger : inclure la correspondance du classement des labels de modèle dans les résultats (N'a pas d'effet sur les interrogateurs basés sur des descriptions) ",
+ "Interrogate: num_beams for BLIP": "Interroger : num_beams pour BLIP",
+ "Interrogate: minimum description length (excluding artists, etc..)": "Interroger : longueur minimale de la description (excluant les artistes, etc.)",
+ "Interrogate: maximum description length": "Interroger : longueur maximale de la description",
+ "CLIP: maximum number of lines in text file (0 = No limit)": "CLIP : nombre maximum de lignes dans le fichier texte (0 = pas de limite)",
+ "Interrogate: deepbooru score threshold": "Interroger : seuil du score deepbooru",
+ "Interrogate: deepbooru sort alphabetically": "Interroger : classement alphabétique deepbooru",
+ "use spaces for tags in deepbooru": "Utiliser des espaces pour les étiquettes dans deepbooru",
+ "escape (\\) brackets in deepbooru (so they are used as literal brackets and not for emphasis)": "échapper (\\) les crochets dans deepbooru (afin qu'ils puissent être utilisés littéralement et non pour mettre en emphase)",
+ "User interface": "Interface utilisateur",
+ "Show progressbar": "Afficher la barre de progression",
+ "Show image creation progress every N sampling steps. Set 0 to disable.": "Afficher l'état d'avancement de la création d'image toutes les X étapes d'échantillionnage. Utiliser 0 pour désactiver.",
+ "Show grid in results for web": "Afficher la grille dans les résultats web",
+ "Do not show any images in results for web": "N'afficher aucune image dans les résultats web'",
+ "Add model hash to generation information": "Ajouter le hash du modèle dans l'information de génération",
+ "Add model name to generation information": "Ajouter le nom du modèle dans l'information de génération",
+ "Font for image grids that have text": "Police pour les grilles d'images contenant du texte",
+ "Enable full page image viewer": "Activer l'affichage des images en plein écran",
+ "Show images zoomed in by default in full page image viewer": "Afficher les images zoomées par défaut lors de l'affichage en plein écran",
+ "Show generation progress in window title.": "Afficher l'avancement de la génération dans le titre de la fenêtre.",
+ "Quicksettings list": "Liste de réglages rapides",
+ "Localization (requires restart)": "Localisation (requiert un redémarrage)",
+ "Sampler parameters": "Paramètres de l'échantillionneur",
+ "Hide samplers in user interface (requires restart)": "Cacher les échantillonneurs dans l'interface utilisateur (requiert un redémarrage)",
+ "eta (noise multiplier) for DDIM": "eta (multiplicateur de bruit) pour DDIM",
+ "eta (noise multiplier) for ancestral samplers": "eta (multiplicateur de bruit) poru les échantillionneurs de type 'ancestral'",
+ "img2img DDIM discretize": "Discrétisation DDIM pour img2img",
+ "uniform": "uniforme",
+ "quad": "quad",
+ "sigma churn": "sigma churn",
+ "sigma tmin": "sigma tmin",
+ "sigma noise": "sigma noise",
+ "Eta noise seed delta": "Eta noise seed delta",
+ "Request browser notifications": "Demander les notifications au navigateur",
+ "Download localization template": "Télécharger le modèle de localisation",
+ "Reload custom script bodies (No ui updates, No restart)": "Recharger le contenu des scripts personnalisés (Pas de mise à jour de l'interface, Pas de redémarrage)",
+ "Restart Gradio and Refresh components (Custom Scripts, ui.py, js and css only)": "Redémarrer Gradio et rafraichir les composants (Scripts personnalisés, ui.py, js et css uniquement)",
+ "Prompt (press Ctrl+Enter or Alt+Enter to generate)": "Requête (Ctrl + Entrée ou Alt + Entrée pour générer)",
+ "Negative prompt (press Ctrl+Enter or Alt+Enter to generate)": "Requête négative (Ctrl + Entrée ou Alt + Entrée pour générer)",
+ "Add a random artist to the prompt.": "Ajouter un artiste aléatoire à la requête",
+ "Read generation parameters from prompt or last generation if prompt is empty into user interface.": "Lire les paramètres de génération depuis la requête, ou depuis la dernière génération si la requête est vide dans l'interface utilisateur.",
+ "Save style": "Sauvegarder le style",
+ "Apply selected styles to current prompt": "Appliquer les styles séléctionnés à la requête actuelle",
+ "Stop processing current image and continue processing.": "Arrêter le traitement de l'image actuelle et continuer le traitement.",
+ "Stop processing images and return any results accumulated so far.": "Arrêter le traitement des images et retourne les résultats accumulés depuis le début.",
+ "Style to apply; styles have components for both positive and negative prompts and apply to both": "Style à appliquer ; les styles sont composés de requêtes positives et négatives et s'appliquent au deux",
+ "Do not do anything special": "Ne rien faire de particulier",
+ "Which algorithm to use to produce the image": "Quel algorithme utiliser pour produire l'image",
+ "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 - très créatif, peut générer des images complètement différentes en fonction du nombre d'étapes, utiliser plus de 30 à 40 étapes n'améliore pas le résultat",
+ "Denoising Diffusion Implicit Models - best at inpainting": "Modèles implicite de réduction du bruit à diffusion - utile pour l'inpainting",
+ "Produce an image that can be tiled.": "Produit une image qui peut être bouclée (tuile).",
+ "Use a two step process to partially create an image at smaller resolution, upscale, and then improve details in it without changing composition": "Utilise un processus en deux étapes afin de créer partiellement une image dans une résolution plus faible, l'agrandir et améliorer ses détails sans modifier la composition",
+ "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.": "Détermine à quel point l'algorithme doit respecter le contenu de l'image. A 0 rien ne changera, à 1 l'image sera entièrement différente. Avec des valeurs inférieures à 1.0 le traitement utilisera moins d'étapes que ce que la glissière Étapes d'échantillionnage spécifie. ",
+ "How many batches of images to create": "Combien de lots d'images créer",
+ "How many image to create in a single batch": "Combien d'images créer par lot",
+ "Classifier Free Guidance Scale - how strongly the image should conform to prompt - lower values produce more creative results": "Classifier Free Guidance Scale - spécifie à quel point l'image doit se conformer à la requête - des valeurs plus faibles produisent des résultats plus créatifs",
+ "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": "Une valeur qui détermine la sortie du générateur de nombres aléatoires - si vous créez une image avec les mêmes paramètres et valeur aléatoire qu'une autre, le résultat sera identique",
+ "Set seed to -1, which will cause a new random number to be used every time": "Passer la valeur aléatoire à -1, cela causera qu'un nombre aléatoire différent sera utilisé à chaque fois",
+ "Reuse seed from last generation, mostly useful if it was randomed": "Réutiliser la valeur aléatoire de la dernière génération, généralement utile uniquement si elle était randomisée",
+ "Seed of a different picture to be mixed into the generation.": "Valeur aléatoire d'une image différente à mélanger dans la génération",
+ "How strong of a variation to produce. At 0, there will be no effect. At 1, you will get the complete picture with variation seed (except for ancestral samplers, where you will just get something).": "Force de la variation à produire. A 0 il n'y aura pas d'effet. A 1 l'image sera composée uniquement de la valeur aléatoire variable spécifiée (à l'exception des échantillionneurs `ancestral`)",
+ "Make an attempt to produce a picture similar to what would have been produced with same seed at specified resolution": "Essayer de produire une image similaire à ce qu'elle aurait été avec la même valeur aléatoire, mais dans la résolution spécifiée",
+ "Separate values for X axis using commas.": "Séparer les valeurs pour l'axe X par des virgules",
+ "Separate values for Y axis using commas.": "Séparer les valeurs pour l'axe Y par des virgules",
+ "Write image to a directory (default - log/images) and generation parameters into csv file.": "Ecrire l'image dans un dossier (par défaut - log/images) et les paramètres de génération dans un fichier csv.",
+ "Open images output directory": "Ouvrir le dossier de sortie des images",
+ "How much to blur the mask before processing, in pixels.": "Quantité de flou à appliquer au masque avant traitement, en pixels",
+ "What to put inside the masked area before processing it with Stable Diffusion.": "Avec quoi remplir la zone masquée avant traitement par Stable Diffusion.",
+ "fill it with colors of the image": "remplir avec les couleurs de l'image",
+ "keep whatever was there originally": "conserver ce qui était présent à l'origine",
+ "fill it with latent space noise": "remplir avec le bruit de l'espace latent",
+ "fill it with latent space zeroes": "remplir avec des zéros dans l'espace latent",
+ "Upscale masked region to target resolution, do inpainting, downscale back and paste into original image": "Agrandir la région masquées à la résolution cible, exécuter l'inpainting, réduire à nouveau puis coller dans l'image originale",
+ "Resize image to target resolution. Unless height and width match, you will get incorrect aspect ratio.": "Redimensionner l'image dans la résolution cible. A moins que la hauteur et la largeur coincident le ratio de l'image sera incorrect.",
+ "Resize the image so that entirety of target resolution is filled with the image. Crop parts that stick out.": "Redimensionner l'image afin que l'entièreté de la résolution cible soit remplie par l'image. Recadrer les parties qui dépassent.",
+ "Resize the image so that entirety of image is inside target resolution. Fill empty space with image's colors.": "Redimensionner l'image afin que l'entièreté de l'image soit contenue dans la résolution cible. Remplir l'espace vide avec les couleurs de l'image.",
+ "How many times to repeat processing an image and using it as input for the next iteration": "Combien de fois répéter le traitement d'une image et l'utiliser comme entrée pour la prochaine itération",
+ "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.": "En mode bouclage (Loopback), à chaque tour de la boucle la force du réducteur de bruit est multipliée par cette valeur. <1 signifie réduire la variation donc votre séquence convergera vers une image fixe. >1 signifie augmenter la variation donc votre séquence deviendra de plus en plus chaotique. ",
+ "For SD upscale, how much overlap in pixels should there be between tiles. Tiles overlap so that when they are merged back into one picture, there is no clearly visible seam.": "Pour l'agrandissement SD, de combien les tuiles doivent se chevaucher, en pixels. Les tuiles se chevauchent de manière à ce qu'il n'y ait pas de couture visible une fois fusionnées en une image. ",
+ "A directory on the same machine where the server is running.": "Un dossier sur la même machine où le serveur tourne.",
+ "Leave blank to save images to the default path.": "Laisser vide pour sauvegarder les images dans le chemin par défaut.",
+ "Result = A * (1 - M) + B * M": "Résultat = A * (1 - M) + B * M",
+ "Result = A + (B - C) * M": "Résultat = A + (B - C) * M",
+ "Path to directory with input images": "Chemin vers le dossier contenant les images d'entrée",
+ "Path to directory where to write outputs": "Chemin vers le dossier où écrire les sorties",
+ "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.": "Utiliser les étiquettes suivantes pour définir le nom des images : [steps], [cfg], [prompt], [prompt_no_styles], [prompt_spaces], [width], [height], [styles], [sampler], [seed], [model_hash], [prompt_words], [date], [datetime], [job_timestamp] ; laisser vide pour le nom par défaut.",
+ "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.": "Si cette option est activée le filigrane ne sera pas ajouté au images crées. Attention : si vous n'ajoutez pas de filigrane vous pourriez vous comporter de manière non éthique.",
+ "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.": "Utiliser les étiquettes suivantes pour définir le nom des sous dossiers pour les images et les grilles : [steps], [cfg], [prompt], [prompt_no_styles], [prompt_spaces], [width], [height], [styles], [sampler], [seed], [model_hash], [prompt_words], [date], [datetime], [job_timestamp] ; laisser vide pour le nom par défaut.",
+ "Restore low quality faces using GFPGAN neural network": "Restaurer les visages de basse qualité en utilisant le réseau neuronal GFPGAN",
+ "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.": "Cette expression régulière sera utilisée pour extraire les mots depuis le nom de fichier ; ils seront joints en utilisant l'option ci dessous en une étiquette utilisée pour l'entrainement. Laisser vide pour conserver le texte du nom de fichier tel quel.",
+ "This string will be used to join split words into a single line if the option above is enabled.": "Cette chaine de caractères sera utilisée pour joindre les mots séparés en une ligne unique si l'option ci dessus est activée.",
+ "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.": "Liste des noms de paramètres, séparés par des virgules, pour les paramètres de la barre d'accès rapide en haut de page, plutôt que dans la page habituelle des paramètres. Voir modules/shared.py pour définir les noms. Requiert un redémarrage pour s'appliquer.",
+ "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.": "Si cette valeur est différente de zéro elle sera ajoutée à la valeur aléatoire et utilisée pour initialiser le générateur de nombres aléatoires du bruit lors de l'utilisation des échantillonneurs supportants Eta. Vous pouvez l'utiliser pour produire encore plus de variation dans les images, ou vous pouvez utiliser ceci pour faire correspondre les images avec d'autres logiciels si vous savez ce que vous faites.",
+ "Enable Autocomplete": "Activer l'autocomplétion",
+ "/0.0": "/0.0"
+} \ No newline at end of file
diff --git a/localizations/ko_KR.json b/localizations/ko_KR.json
index ab12c37e..ff70f1ea 100644
--- a/localizations/ko_KR.json
+++ b/localizations/ko_KR.json
@@ -21,6 +21,7 @@
"Add layer normalization": "레이어 정규화(normalization) 추가",
"Add model hash to generation information": "생성 정보에 모델 해시 추가",
"Add model name to generation information": "생성 정보에 모델 이름 추가",
+ "Add number to filename when saving": "이미지를 저장할 때 파일명에 숫자 추가하기",
"Aesthetic imgs embedding": "스타일 이미지 임베딩",
"Aesthetic learning rate": "스타일 학습 수",
"Aesthetic steps": "스타일 스텝 수",
@@ -35,6 +36,7 @@
"Apply color correction to img2img results to match original colors.": "이미지→이미지 결과물이 기존 색상과 일치하도록 색상 보정 적용하기",
"Apply selected styles to current prompt": "현재 프롬프트에 선택된 스타일 적용",
"Apply settings": "설정 적용하기",
+ "Auto focal point crop": "초점 기준 크롭(자동 감지)",
"Batch count": "배치 수",
"Batch from Directory": "저장 경로로부터 여러장 처리",
"Batch img2img": "이미지→이미지 배치",
@@ -66,12 +68,14 @@
"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 debug image": "디버그 이미지 생성",
"Create embedding": "임베딩 생성",
"Create flipped copies": "좌우로 뒤집은 복사본 생성",
"Create hypernetwork": "하이퍼네트워크 생성",
"Create images embedding": "이미지 임베딩 생성하기",
"Crop and resize": "잘라낸 후 리사이징",
"Crop to fit": "잘라내서 맞추기",
+ "custom fold": "커스텀 경로",
"Custom Name (Optional)": "병합 모델 이름 (선택사항)",
"Dataset directory": "데이터셋 경로",
"DDIM": "DDIM",
@@ -107,6 +111,7 @@
"Embedding": "임베딩",
"Embedding Learning rate": "임베딩 학습률",
"Emphasis: use (text) to make model pay more attention to text and [text] to make it pay less attention": "강조 : (텍스트)를 이용해 모델의 텍스트에 대한 가중치를 더 강하게 주고 [텍스트]를 이용해 더 약하게 줍니다.",
+ "Enable Autocomplete": "태그 자동완성 사용",
"Enable full page image viewer": "전체 페이지 이미지 뷰어 활성화",
"Enable quantization in K samplers for sharper and cleaner results. This may change existing seeds. Requires restart to apply.": "더 예리하고 깔끔한 결과물을 위해 K 샘플러들에 양자화를 적용합니다. 존재하는 시드가 변경될 수 있습니다. 재시작이 필요합니다.",
"End Page": "마지막 페이지",
@@ -145,6 +150,9 @@
"First Page": "처음 페이지",
"Firstpass height": "초기 세로길이",
"Firstpass width": "초기 가로길이",
+ "Focal point edges weight": "경계면 가중치",
+ "Focal point entropy weight": "엔트로피 가중치",
+ "Focal point face weight": "얼굴 가중치",
"Font for image grids that have text": "텍스트가 존재하는 그리드 이미지의 폰트",
"for detailed explanation.": "를 참조하십시오.",
"For SD upscale, how much overlap in pixels should there be between tiles. Tiles overlap so that when they are merged back into one picture, there is no clearly visible seam.": "SD 업스케일링에서 타일 간 몇 픽셀을 겹치게 할지 결정하는 설정값입니다. 타일들이 다시 한 이미지로 합쳐질 때, 눈에 띄는 이음매가 없도록 서로 겹치게 됩니다.",
@@ -195,6 +203,7 @@
"Inpaint masked": "마스크만 처리",
"Inpaint not masked": "마스크 이외만 처리",
"Input directory": "인풋 이미지 경로",
+ "Input images directory": "이미지 경로 입력",
"Interpolation Method": "보간 방법",
"Interrogate\nCLIP": "CLIP\n분석",
"Interrogate\nDeepBooru": "DeepBooru\n분석",
@@ -258,10 +267,12 @@
"None": "없음",
"Nothing": "없음",
"Nothing found in the image.": "Nothing found in the image.",
+ "Number of columns on the page": "각 페이지마다 표시할 가로줄 수",
"Number of grids in each row": "각 세로줄마다 표시될 그리드 수",
"number of images to delete consecutively next": "연속적으로 삭제할 이미지 수",
"Number of pictures displayed on each page": "각 페이지에 표시될 이미지 수",
"Number of repeats for a single input image per epoch; used only for displaying epoch number": "세대(Epoch)당 단일 인풋 이미지의 반복 횟수 - 세대(Epoch) 숫자를 표시하는 데에만 사용됩니다. ",
+ "Number of rows on the page": "각 페이지마다 표시할 세로줄 수",
"Number of vectors per token": "토큰별 벡터 수",
"Open for Clip Aesthetic!": "클립 스타일 기능을 활성화하려면 클릭!",
"Open images output directory": "이미지 저장 경로 열기",
@@ -375,6 +386,7 @@
"Seed": "시드",
"Seed of a different picture to be mixed into the generation.": "결과물에 섞일 다른 그림의 시드",
"Select activation function of hypernetwork": "하이퍼네트워크 활성화 함수 선택",
+ "Select Layer weights initialization. relu-like - Kaiming, sigmoid-like - Xavier is recommended": "레이어 가중치 초기화 방식 선택 - relu류 : Kaiming 추천, sigmoid류 : Xavier 추천",
"Select which Real-ESRGAN models to show in the web UI. (Requires restart)": "WebUI에 표시할 Real-ESRGAN 모델을 선택하십시오. (재시작 필요)",
"Send to extras": "부가기능으로 전송",
"Send to img2img": "이미지→이미지로 전송",
@@ -465,10 +477,11 @@
"Use BLIP for caption": "캡션에 BLIP 사용",
"Use deepbooru for caption": "캡션에 deepbooru 사용",
"Use dropout": "드롭아웃 사용",
- "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.": "다음 태그들을 사용해 이미지 파일명 형식을 결정하세요 : [steps], [cfg], [prompt], [prompt_no_styles], [prompt_spaces], [width], [height], [styles], [sampler], [seed], [model_hash], [prompt_words], [date], [datetime], [job_timestamp]. 비워두면 기본값으로 설정됩니다.",
- "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.": "다음 태그들을 사용해 이미지와 그리드의 하위 디렉토리명의 형식을 결정하세요 : [steps], [cfg], [prompt], [prompt_no_styles], [prompt_spaces], [width], [height], [styles], [sampler], [seed], [model_hash], [prompt_words], [date], [datetime], [job_timestamp]. 비워두면 기본값으로 설정됩니다.",
+ "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], [datetime<Format>], [datetime<Format><Time Zone>], [job_timestamp]; leave empty for default.": "다음 태그들을 사용해 이미지 파일명 형식을 결정하세요 : [steps], [cfg], [prompt], [prompt_no_styles], [prompt_spaces], [width], [height], [styles], [sampler], [seed], [model_hash], [prompt_words], [date], [datetime], [datetime<Format>], [datetime<Format><Time Zone>], [job_timestamp]. 비워두면 기본값으로 설정됩니다.",
+ "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], [datetime<Format>], [datetime<Format><Time Zone>], [job_timestamp]; leave empty for default.": "다음 태그들을 사용해 이미지와 그리드의 하위 디렉토리명의 형식을 결정하세요 : [steps], [cfg], [prompt], [prompt_no_styles], [prompt_spaces], [width], [height], [styles], [sampler], [seed], [model_hash], [prompt_words], [date], [datetime], [datetime<Format>], [datetime<Format><Time Zone>], [job_timestamp]. 비워두면 기본값으로 설정됩니다.",
"Use old emphasis implementation. Can be useful to reproduce old seeds.": "옛 방식의 강조 구현을 사용합니다. 옛 시드를 재현하는 데 효과적일 수 있습니다.",
"Use original name for output filename during batch process in extras tab": "부가기능 탭에서 이미지를 여러장 처리 시 결과물 파일명에 기존 파일명 사용하기",
+ "Use same seed for each image": "각 이미지에 동일한 시드 사용",
"use spaces for tags in deepbooru": "deepbooru에서 태그에 공백 사용",
"User interface": "사용자 인터페이스",
"Var. seed": "바리에이션 시드",
@@ -485,6 +498,7 @@
"Which algorithm to use to produce the image": "이미지를 생성할 때 사용할 알고리즘",
"Width": "가로",
"wiki": " 위키",
+ "Wildcards": "와일드카드",
"Will upscale the image to twice the dimensions; use width and height sliders to set tile size": "이미지를 설정된 사이즈의 2배로 업스케일합니다. 상단의 가로와 세로 슬라이더를 이용해 타일 사이즈를 지정하세요.",
"With img2img, do exactly the amount of steps the slider specifies (normally you'd do less with less denoising).": "이미지→이미지 진행 시, 슬라이더로 설정한 스텝 수를 정확히 실행하기 (일반적으로 디노이즈 강도가 낮을수록 실제 설정된 스텝 수보다 적게 진행됨)",
"Write image to a directory (default - log/images) and generation parameters into csv file.": "이미지를 경로에 저장하고, 설정값들을 csv 파일로 저장합니다. (기본 경로 - log/images)",
diff --git a/localizations/pt_BR.json b/localizations/pt_BR.json
new file mode 100644
index 00000000..49d71edc
--- /dev/null
+++ b/localizations/pt_BR.json
@@ -0,0 +1,468 @@
+{
+ "⤡": "⤡",
+ "⊞": "⊞",
+ "×": "×",
+ "❮": "❮",
+ "❯": "❯",
+ "Loading...": "Carregando...",
+ "view": "ver ",
+ "api": "api",
+ "•": "•",
+ "built with gradio": "Criado com gradio",
+ "Stable Diffusion checkpoint": "Stable Diffusion checkpoint",
+ "txt2img": "txt2img",
+ "img2img": "img2img",
+ "Extras": "Extras",
+ "PNG Info": "Informações de PNG",
+ "Checkpoint Merger": "Fusão de Checkpoint",
+ "Train": "Treinar",
+ "Settings": "Configurações",
+ "Prompt": "Prompt",
+ "Negative prompt": "Prompt negativo",
+ "Run": "Executar",
+ "Skip": "Pular",
+ "Interrupt": "Interromper",
+ "Generate": "Gerar",
+ "Style 1": "Estilo 1",
+ "Style 2": "Estilo 2",
+ "Label": "Rótulo",
+ "File": "Arquivo",
+ "Drop File Here": "Coloque aqui o arquivo",
+ "-": "-",
+ "or": "ou",
+ "Click to Upload": "Clique para carregar um arquivo",
+ "Image": "Imagem",
+ "Check progress": "Checar progresso",
+ "Check progress (first)": "Checar progresso (primeiro)",
+ "Sampling Steps": "Passos de amostragem",
+ "Sampling method": "Método de amostragem",
+ "Euler a": "Euler a",
+ "Euler": "Euler",
+ "LMS": "LMS",
+ "Heun": "Heun",
+ "DPM2": "DPM2",
+ "DPM2 a": "DPM2 a",
+ "DPM fast": "DPM fast",
+ "DPM adaptive": "DPM adaptive",
+ "LMS Karras": "LMS Karras",
+ "DPM2 Karras": "DPM2 Karras",
+ "DPM2 a Karras": "DPM2 a Karras",
+ "DDIM": "DDIM",
+ "PLMS": "PLMS",
+ "Width": "Largura",
+ "Height": "Altura",
+ "Restore faces": "Restaurar rostos",
+ "Tiling": "Ladrilhar",
+ "Highres. fix": "Ajuste de alta resolução",
+ "Firstpass width": "Primeira Passagem da largura",
+ "Firstpass height": "Primeira Passagem da altura",
+ "Denoising strength": "Denoising strength",
+ "Batch count": "Quantidade por lote",
+ "Batch size": "Quantidade de lotes",
+ "CFG Scale": "Escala CFG",
+ "Seed": "Seed",
+ "Extra": "Extra",
+ "Variation seed": "Variação de seed",
+ "Variation strength": "Força da variação",
+ "Resize seed from width": "Redimensionar a seed a partir da largura",
+ "Resize seed from height": "Redimensionar a seed a partir da altura",
+ "Script": "Script",
+ "None": "Nenhum",
+ "Prompt matrix": "Matriz de Prompt",
+ "Prompts from file or textbox": "Prompts a partir de arquivo ou caixa de texto",
+ "X/Y plot": "X/Y plot",
+ "Put variable parts at start of prompt": "Coloca partes variáveis no começo do prompt",
+ "Iterate seed every line": "Iterar seed a cada linha",
+ "List of prompt inputs": "Lista de entradas de texto para prompt",
+ "Upload prompt inputs": "Carregar entradas de textos para prompts",
+ "X type": "Tipo do X",
+ "Nothing": "Nenhum",
+ "Var. seed": "Var. seed",
+ "Var. strength": "Var. da força",
+ "Steps": "Passos",
+ "Prompt S/R": "Prompt S/R",
+ "Prompt order": "Ordem de Prompt",
+ "Sampler": "Sampler",
+ "Checkpoint name": "Nome do Checkpoint",
+ "Hypernetwork": "Hypernetwork",
+ "Hypernet str.": "Força da Hypernet",
+ "Sigma Churn": "Sigma Churn",
+ "Sigma min": "Sigma min",
+ "Sigma max": "Sigma max",
+ "Sigma noise": "Sigma noise",
+ "Eta": "Tempo estimado",
+ "Clip skip": "Pular Clip",
+ "Denoising": "Denoising",
+ "X values": "Valores de X",
+ "Y type": "Tipo de Y",
+ "Y values": "Valores de Y",
+ "Draw legend": "Desenhar a legenda",
+ "Include Separate Images": "Incluir Imagens Separadas",
+ "Keep -1 for seeds": "Manter em -1 para seeds",
+ "Drop Image Here": "Coloque a imagem aqui",
+ "Save": "Salvar",
+ "Send to img2img": "Mandar para img2img",
+ "Send to inpaint": "Mandar para inpaint",
+ "Send to extras": "Mandar para extras",
+ "Make Zip when Save?": "Criar um Zip quando salvar?",
+ "Textbox": "Caixa de texto",
+ "Interrogate\nCLIP": "Interrogatório\nCLIP",
+ "Inpaint": "Inpaint",
+ "Batch img2img": "Lote img2img",
+ "Image for img2img": "Imagem para img2img",
+ "Image for inpainting with mask": "Imagem para inpainting com máscara",
+ "Mask": "Máscara",
+ "Mask blur": "Desfoque da máscara",
+ "Mask mode": "Modo de máscara",
+ "Draw mask": "Desenhar máscara",
+ "Upload mask": "Carregar máscara",
+ "Masking mode": "Modo de máscara",
+ "Inpaint masked": "Inpaint o que está dentro da máscara",
+ "Inpaint not masked": "Inpaint o que está fora da máscara",
+ "Masked content": "Conteúdo mascarado",
+ "fill": "preencher",
+ "original": "original",
+ "latent noise": "latent noise",
+ "latent nothing": "latent nothing",
+ "Inpaint at full resolution": "Inpaint em resolução total",
+ "Inpaint at full resolution padding, pixels": "Inpaint de preenchimento em resolução total, pixels",
+ "Process images in a directory on the same machine where the server is running.": "Processar imagens no diretório da mesma maquina onde o servidor está rodando.",
+ "Use an empty output directory to save pictures normally instead of writing to the output directory.": "Usar um diretório vazio para salvar imagens, ao invés de salvá-las no diretório output.",
+ "Input directory": "Diretório de entrada",
+ "Output directory": "Diretório de saída",
+ "Resize mode": "Modo de redimensionamento",
+ "Just resize": "Apenas redimensionar",
+ "Crop and resize": "Cortar e redimensionar",
+ "Resize and fill": "Redimensionar e preencher",
+ "img2img alternative test": "Teste alternativo de img2img",
+ "Loopback": "Loopback",
+ "Outpainting mk2": "Outpainting mk2",
+ "Poor man's outpainting": "Poor man's outpainting",
+ "SD upscale": "Ampliamento SD",
+ "should be 2 or lower.": "deve ser 2 ou menos.",
+ "Override `Sampling method` to Euler?(this method is built for it)": "Substituir 'Método de amostragem' para Euler? (este método foi feito para isso)",
+ "Override `prompt` to the same value as `original prompt`?(and `negative prompt`)": "Substituir 'prompt' para o mesmo valor que o 'prompt original'? (também para o 'prompt negativo')",
+ "Original prompt": "Prompt original",
+ "Original negative prompt": "Prompt negativo original",
+ "Override `Sampling Steps` to the same value as `Decode steps`?": "Substituir 'Passos de Amostragem' para o mesmo valor que 'Decodificar Passos'?",
+ "Decode steps": "Decode steps",
+ "Override `Denoising strength` to 1?": "Substituir 'Quantidade do Denoise' para 1?",
+ "Decode CFG scale": "Decodificar escala CFG",
+ "Randomness": "Aleatoriedade",
+ "Sigma adjustment for finding noise for image": "Ajuste Sigma para encontrar ruído para imagem",
+ "Loops": "Loops",
+ "Denoising strength change factor": "Fator de mudança na quantidade do Denoise",
+ "Recommended settings: Sampling Steps: 80-100, Sampler: Euler a, Denoising strength: 0.8": "Configurações recomendadas",
+ "Pixels to expand": "Pixels para expandir",
+ "Outpainting direction": "Direção do Outpainting",
+ "left": "esquerda",
+ "right": "direita",
+ "up": "cima",
+ "down": "baixo",
+ "Fall-off exponent (lower=higher detail)": "Exponente de queda (menor=mais detalhes)",
+ "Color variation": "Variação de cor",
+ "Will upscale the image to twice the dimensions; use width and height sliders to set tile size": "Amplia a imagem em dobro; ajusta a largura e altura para definir o tamanho do ladrilho",
+ "Tile overlap": "Sobreposição de ladrilho",
+ "Upscaler": "Ampliador",
+ "Lanczos": "Lanczos",
+ "LDSR": "LDSR",
+ "4x_foolhardy_Remacri": "4x_foolhardy_Remacri",
+ "Put ESRGAN models here": "Coloque modelos ESRGAN aqui",
+ "R-ESRGAN General 4xV3": "R-ESRGAN General 4xV3",
+ "R-ESRGAN AnimeVideo": "R-ESRGAN AnimeVideo",
+ "R-ESRGAN 4x+": "R-ESRGAN 4x+",
+ "R-ESRGAN 4x+ Anime6B": "R-ESRGAN 4x+ Anime6B",
+ "R-ESRGAN 2x+": "R-ESRGAN 2x+",
+ "ScuNET": "ScuNET",
+ "ScuNET PSNR": "ScuNET PSNR",
+ "put_swinir_models_here": "put_swinir_models_here",
+ "Single Image": "Uma imagem",
+ "Batch Process": "Processo em lote",
+ "Batch from Directory": "Lote apartir de diretório",
+ "Source": "Origem",
+ "Show result images": "Mostrar imagens resultantes",
+ "Scale by": "Aumentar proporcionalmente em",
+ "Scale to": "Aumentar proporcionalmente para",
+ "Resize": "Redimensionar",
+ "Crop to fit": "Cortar para caber",
+ "Upscaler 2 visibility": "Visibilidade da ferramenta de ampliação 2",
+ "GFPGAN visibility": "Visibilidade GFPGAN",
+ "CodeFormer visibility": "Visibilidade CodeFormer",
+ "CodeFormer weight (0 = maximum effect, 1 = minimum effect)": "Peso do CodeFormer (0 = efeito máximo, 1 = efeito mínimo)",
+ "Open output directory": "Abrir diretório de saída",
+ "Send to txt2img": "Mandar para txt2img",
+ "A merger of the two checkpoints will be generated in your": "Uma fusão dos dois checkpoints será gerada em seu ",
+ "checkpoint": "checkpoint",
+ "directory.": " diretório.",
+ "Primary model (A)": "Modelo primário (A)",
+ "Secondary model (B)": "Modelo secundário (B)",
+ "Tertiary model (C)": "Modelo terciário (C)",
+ "Custom Name (Optional)": "Nome personalizado (Opcional)",
+ "Multiplier (M) - set to 0 to get model A": "Multiplicador (M) - definir em 0 para obter o modelo A",
+ "Interpolation Method": "Método de Interpolação",
+ "Weighted sum": "Soma de pesos",
+ "Add difference": "Acrescentar diferença",
+ "Save as float16": "Salvar como float16",
+ "See": "Ver",
+ "wiki": "wiki",
+ "for detailed explanation.": "para explicação detalhada.",
+ "Create embedding": "Criar incorporação",
+ "Create hypernetwork": "Criar hypernetwork",
+ "Preprocess images": "Pré-processar imagens",
+ "Name": "Nome",
+ "Initialization text": "Texto de inicialização",
+ "Number of vectors per token": "Número de vetores por token",
+ "Overwrite Old Embedding": "Substituir Incorporação anterior",
+ "Modules": "Módulos",
+ "Enter hypernetwork layer structure": "Entrar na estrutura de camadas da hypernetwork",
+ "Select activation function of hypernetwork": "Selecionar a função de ativação de hypernetwork",
+ "relu": "relu",
+ "leakyrelu": "leakyrelu",
+ "elu": "elu",
+ "swish": "swish",
+ "tanh": "tanh",
+ "sigmoid": "sigmoid",
+ "celu": "celu",
+ "gelu": "gelu",
+ "glu": "glu",
+ "hardshrink": "hardshrink",
+ "hardsigmoid": "hardsigmoid",
+ "hardswish": "hardswish",
+ "hardtanh": "hardtanh",
+ "logsigmoid": "logsigmoid",
+ "logsoftmax": "logsoftmax",
+ "mish": "mish",
+ "multiheadattention": "multiheadattention",
+ "prelu": "prelu",
+ "rrelu": "rrelu",
+ "relu6": "relu6",
+ "selu": "selu",
+ "silu": "silu",
+ "softmax": "softmax",
+ "softmax2d": "softmax2d",
+ "softmin": "softmin",
+ "softplus": "softplus",
+ "softshrink": "softshrink",
+ "softsign": "softsign",
+ "tanhshrink": "tanhshrink",
+ "threshold": "threshold",
+ "Select Layer weights initialization. relu-like - Kaiming, sigmoid-like - Xavier is recommended": "Selecionar a inicialização de pesos de camada. relu-like - Kaiming, sigmoid-like - Xavier é recomendado",
+ "Normal": "Normal",
+ "KaimingUniform": "KaimingUniform",
+ "KaimingNormal": "KaimingNormal",
+ "XavierUniform": "XavierUniform",
+ "XavierNormal": "XavierNormal",
+ "Add layer normalization": "Adicionar normalização de camada",
+ "Use dropout": "Usar dropout",
+ "Overwrite Old Hypernetwork": "Sobrescrever Hypernetwork Anterior",
+ "Source directory": "Diretório de origem",
+ "Destination directory": "Diretório de destino",
+ "Existing Caption txt Action": "Ação de legenda txt já existente",
+ "ignore": "ignorar",
+ "copy": "copiar",
+ "prepend": "adicionar ao início",
+ "append": "adicionar ao final",
+ "Create flipped copies": "Criar cópias espelhadas",
+ "Split oversized images into two": "Dividir imagens maiores em duas",
+ "Auto focal point crop": "Ajuste de corte em ponto focal automático",
+ "Use BLIP for caption": "Usar BLIP para o título",
+ "Use deepbooru for caption": "Usar deepbooru para o título",
+ "Split image threshold": "Limite de divisão de imagem",
+ "Split image overlap ratio": "Proporção de sobreposição da divisão de imagem",
+ "Focal point face weight": "Peso de ponto focal para rosto",
+ "Focal point entropy weight": "Peso de ponto focal para entropia",
+ "Focal point edges weight": "Peso de ponto focal para bordas",
+ "Create debug image": "Criar imagem de depuração",
+ "Preprocess": "Pré-processar",
+ "Train an embedding; must specify a directory with a set of 1:1 ratio images": "Treinar um embedding; precisa especificar um diretório com imagens de proporção 1:1",
+ "[wiki]": "[wiki]",
+ "Embedding": "Embedding",
+ "Embedding Learning rate": "Taxa de aprendizagem da incorporação",
+ "Hypernetwork Learning rate": "Taxa de aprendizagem de Hypernetwork",
+ "Dataset directory": "Diretório de Dataset",
+ "Log directory": "Diretório de Log",
+ "Prompt template file": "Arquivo padrão de Prompt",
+ "Max steps": "Passos máximos",
+ "Save an image to log directory every N steps, 0 to disable": "Salvar uma imagem no diretório de log a cada N passos. 0 para desativar",
+ "Save a copy of embedding to log directory every N steps, 0 to disable": "Salva uma cópia da incorporação no diretório de log a cada N passos. 0 para desativar",
+ "Save images with embedding in PNG chunks": "Salva imagens com incorporação em segmentos de PNG",
+ "Read parameters (prompt, etc...) from txt2img tab when making previews": "Ler parâmetros (prompt, etc...) para a aba txt2img durante os previews",
+ "Train Hypernetwork": "Treinar Hypernetwork",
+ "Train Embedding": "Treinar Incorporação",
+ "Apply settings": "Aplicar configurações",
+ "Saving images/grids": "Salvar imagens/grades",
+ "Always save all generated images": "Sempre salvar todas as imagens geradas",
+ "File format for images": "Tipo de formato das imagens salvas",
+ "Images filename pattern": "Padrão de nomeação para imagens salvas",
+ "Add number to filename when saving": "Adicionar número para o nome do arquivo quando salvar",
+ "Always save all generated image grids": "Sempre salvar todas as grades de imagens",
+ "File format for grids": "Tipo de formato das grades de imagens salvas",
+ "Add extended info (seed, prompt) to filename when saving grid": "Adicionar informações extras (seed, prompt) para os arquivos quando gerar uma grade",
+ "Do not save grids consisting of one picture": "Não salvar grades de apenas uma imagem",
+ "Prevent empty spots in grid (when set to autodetect)": "Previnir espaços vazios na grade (quando marcado para autodetectar)",
+ "Grid row count; use -1 for autodetect and 0 for it to be same as batch size": "Contagem de linhas da grade; -1 para autodetectar e 0 para ser igual ao valor do tamanho das levas",
+ "Save text information about generation parameters as chunks to png files": "Salvar informações de parâmetros de geração como segmentos png",
+ "Create a text file next to every image with generation parameters.": "Criar um arquivo de texto com informações de geração junto a cada imagem gerada.",
+ "Save a copy of image before doing face restoration.": "Salva uma cópia de cada imagem antes do refinamento facial.",
+ "Quality for saved jpeg images": "Qualidade das imagens jpeg",
+ "If PNG image is larger than 4MB or any dimension is larger than 4000, downscale and save copy as JPG": "Se a imagem PNG for maior que 4MB ou qualquer dimensão mair que 4000, diminuir e salvar uma cópia em JPG",
+ "Use original name for output filename during batch process in extras tab": "Usar o nome original para os arquivos de output durante o processo de levas da aba Extras",
+ "When using 'Save' button, only save a single selected image": "Quando usar o botão 'Salvar', somente salvar as imagens selecionadas.",
+ "Do not add watermark to images": "Não adicionar marca dágua nas imagens",
+ "Paths for saving": "Caminhos para salvar",
+ "Output directory for images; if empty, defaults to three directories below": "Diretório de saída para imagens; se deixado em branco, as imagens vao para os seguintes diretórios",
+ "Output directory for txt2img images": "Diretório de Saída para imagens txt2img",
+ "Output directory for img2img images": "Diretório de Saída para imagens img2img",
+ "Output directory for images from extras tab": "Diretório de Saída para a aba Extras",
+ "Output directory for grids; if empty, defaults to two directories below": "Diretório de Saída para grades; se vazio, vão para os diretórios seguintes",
+ "Output directory for txt2img grids": "Diretório de Saída para grades de imagens txt2img",
+ "Output directory for img2img grids": "Diretório de Saída para grades de imagens img2img",
+ "Directory for saving images using the Save button": "Diretório para imagens salvas utilizando o botão de salvar",
+ "Saving to a directory": "Salvando para um diretório",
+ "Save images to a subdirectory": "Salvar imagens para um subdiretório",
+ "Save grids to a subdirectory": "Salvar grades de imagens para um subdiretório",
+ "When using \"Save\" button, save images to a subdirectory": "Quando usar o botão \"Salvar\", salvar imagens para um subdiretório",
+ "Directory name pattern": "Padrão de nome de diretório",
+ "Max prompt words for [prompt_words] pattern": "Número máximo de palavras do padrão de prompt [prompt_words]",
+ "Upscaling": "Ampliando",
+ "Tile size for ESRGAN upscalers. 0 = no tiling.": "Tamanho do ladrilho para ampliação ESRGAN. 0 = sem ladrilho.",
+ "Tile overlap, in pixels for ESRGAN upscalers. Low values = visible seam.": "Sobreposição de azulejo, em pixels, para amplicação ESRGAN. Valores baixos = linhas de fusão mais aparente.",
+ "Tile size for all SwinIR.": "Tamanho do azulejo para todo SwinIR.",
+ "Tile overlap, in pixels for SwinIR. Low values = visible seam.": "Sobreposição de azulejo, em pixels, para SwinIR. Valores baixos = junção mais aparente.",
+ "LDSR processing steps. Lower = faster": "Steps de processamento LDSR. Menos = rápido",
+ "Upscaler for img2img": "Ampliação para img2img",
+ "Upscale latent space image when doing hires. fix": "Ampliar a imagem do espaço latente quando usando o ajuste de alta definição - hires. fix",
+ "Face restoration": "Refinamento de rosto",
+ "CodeFormer weight parameter; 0 = maximum effect; 1 = minimum effect": "Parâmento de peso do CodeFormer; 0 = efeito máximo; 1 = efeito mínimo",
+ "Move face restoration model from VRAM into RAM after processing": "Mover o processo de refinamento de rosto da VRAM da placa de vídeo para a RAM do computador depois do processamento.",
+ "System": "Sistema",
+ "VRAM usage polls per second during generation. Set to 0 to disable.": "Levantamento de uso de VRAM por segundo durante gerações. Deixar em 0 para desativar.",
+ "Always print all generation info to standard output": "Sempre mostrar as informações de todas as gerações no padrão de output",
+ "Add a second progress bar to the console that shows progress for an entire job.": "Adicionar uma segunda barra de processamento no console que mostra a progressão de todo o trabalho.",
+ "Training": "Treinamento",
+ "Move VAE and CLIP to RAM when training hypernetwork. Saves VRAM.": "Mover VAE e CLIP para a RAM quando treinando hypernetwork. Preserva VRAM.",
+ "Filename word regex": "Palavra de nome de arquivo regex",
+ "Filename join string": "Nome de arquivo join string",
+ "Number of repeats for a single input image per epoch; used only for displaying epoch number": "Número de repetições para entrada única de imagens por época; serve apenas para mostrar o número de época",
+ "Save an csv containing the loss to log directory every N steps, 0 to disable": "Salvar um csv com as perdas para o diretório de log a cada N steps, 0 para desativar",
+ "Stable Diffusion": "Stable Diffusion",
+ "Checkpoints to cache in RAM": "Checkpoints para manter no cache da RAM",
+ "Hypernetwork strength": "Força da Hypernetwork",
+ "Apply color correction to img2img results to match original colors.": "Aplicar correção de cor nas imagens geradas em img2img, usando a imagem original como base. Recomendação: se marcar essa opção, marcar também a de baixo",
+ "Save a copy of image before applying color correction to img2img results": "Salvar uma cópia das imagens geradas em img2img antes de aplicar a correção de cor",
+ "With img2img, do exactly the amount of steps the slider specifies (normally you'd do less with less denoising).": "Durante gerações img2img, fazer examente o número de steps definidos na barra (normalmente você faz menos steps com denoising menor).",
+ "Enable quantization in K samplers for sharper and cleaner results. This may change existing seeds. Requires restart to apply.": "Ativar quantização em K samples para resultados mais nítidos e visíveis. Pode alterar seeds ja existentes. Precisa reiniciar para funcionar.",
+ "Emphasis: use (text) to make model pay more attention to text and [text] to make it pay less attention": "Ênfase: usar parênteses ao redor de palavras (texto de exemplo) para fazer o modelo dar mais atenção par aquela palavra ou frase, e chaves [texto de exemplo] para tirar atenção",
+ "Use old emphasis implementation. Can be useful to reproduce old seeds.": "Usar método anterior de implementação de ênfase. Útil para reproduzir seeds antigas.",
+ "Make K-diffusion samplers produce same images in a batch as when making a single image": "Faz as amostragens K-diffusion produzirem imagens iguais em lotes quando criando uma única imagem",
+ "Increase coherency by padding from the last comma within n tokens when using more than 75 tokens": "Aumenta a coerência por preenchimento apartir da ultima vírgula dentro de n tokens quando usando mais de 75 tokens",
+ "Filter NSFW content": "Filtra conteúdos inadequados(geralmente +18)",
+ "Stop At last layers of CLIP model": "Para na última camada do modelo CLIP",
+ "Interrogate Options": "Opções de Interrogatório",
+ "Interrogate: keep models in VRAM": "Interrogar: manter modelos na VRAM",
+ "Interrogate: use artists from artists.csv": "Interrogar: usa artistas e estilos do documento artists.csv",
+ "Interrogate: include ranks of model tags matches in results (Has no effect on caption-based interrogators).": "Interrogar: incluir classificação de tags de modelo combinando nos resultados(Não tem efeito na interrogação feita por legenda).",
+ "Interrogate: num_beams for BLIP": "Interrogar: num_beams para BLIP",
+ "Interrogate: minimum description length (excluding artists, etc..)": "Interrogar: tamanho mínimo da descrição (tirando artistas, etc..)",
+ "Interrogate: maximum description length": "Interrogar: tamanho máximo da descrição",
+ "CLIP: maximum number of lines in text file (0 = No limit)": "CLIP: número máximo de linhas no arquivo de texto(0 = Sem limites)",
+ "Interrogate: deepbooru score threshold": "Interrogatório: limite de score deepbooru",
+ "Interrogate: deepbooru sort alphabetically": "Interrogar: organizar deepbooru por ordem alfabética",
+ "use spaces for tags in deepbooru": "usar espaços para tags em deepbooru",
+ "escape (\\) brackets in deepbooru (so they are used as literal brackets and not for emphasis)": "espaço (\\) colchetes em deepbooru (são usados como colchetes ao invés de dar ênfase)",
+ "User interface": "Interface de Usuário",
+ "Show progressbar": "Mostrar barra de progresso",
+ "Show image creation progress every N sampling steps. Set 0 to disable.": "Mostrar a criação de imagens a cada N sampling steps. Em 1 já dá para ver o processo de geração. Marcar como 0 para desativar.",
+ "Show previews of all images generated in a batch as a grid": "Mostrar previsualização de todas as imagens geradas em leva numa grade",
+ "Show grid in results for web": "Mostrar grade em resultados para web",
+ "Do not show any images in results for web": "Não mostrar nenhuma imagem em resultados para web",
+ "Add model hash to generation information": "Adicionar hash do modelo para informação de geração",
+ "Add model name to generation information": "Adicionar nome do modelo para informação de geração",
+ "When reading generation parameters from text into UI (from PNG info or pasted text), do not change the selected model/checkpoint.": "Quando ler parâmetros de texto para a interface (de informações de PNG ou texto copiado), não alterar o modelo/intervalo selecionado.",
+ "Font for image grids that have text": "Fonte para grade de imagenss que tem texto",
+ "Enable full page image viewer": "Ativar visualizador de página inteira",
+ "Show images zoomed in by default in full page image viewer": "Mostrar imagens com zoom por definição no visualizador de página inteira",
+ "Show generation progress in window title.": "Mostrar barra de progresso no nome da janela.",
+ "Quicksettings list": "Lista de configurações rapidas",
+ "Localization (requires restart)": "Localização (precisa reiniciar)",
+ "ar_AR": "ar_AR",
+ "es_ES": "es_ES",
+ "fr-FR": "fr-FR",
+ "ja_JP": "ja_JP",
+ "ko_KR": "ko_KR",
+ "ru_RU": "ru_RU",
+ "tr_TR": "tr_TR",
+ "zh_CN": "zh_CN",
+ "Sampler parameters": "Parâmetros de Amostragem",
+ "Hide samplers in user interface (requires restart)": "Esconder amostragens na interface de usuário (precisa reiniciar)",
+ "eta (noise multiplier) for DDIM": "tempo estimado (multiplicador de ruído) para DDIM",
+ "eta (noise multiplier) for ancestral samplers": "tempo estimado (multiplicador de ruído) para amostragens ancestrais",
+ "img2img DDIM discretize": "Discretização de img2img DDIM",
+ "uniform": "uniforme",
+ "quad": "quad",
+ "sigma churn": "sigma churn",
+ "sigma tmin": "sigma tmin",
+ "sigma noise": "sigma noise",
+ "Eta noise seed delta": "tempo estimado para ruído seed delta",
+ "Request browser notifications": "Solicitar notificações do navegador",
+ "Download localization template": "Baixar arquivo modelo de localização",
+ "Reload custom script bodies (No ui updates, No restart)": "Recarregar scripts personalizados (Sem atualizar a interface, Sem reiniciar)",
+ "Restart Gradio and Refresh components (Custom Scripts, ui.py, js and css only)": "Reiniciar Gradio e atualizar componentes (Scripts personalizados, ui.py, js e css)",
+ "Prompt (press Ctrl+Enter or Alt+Enter to generate)": "Prompt (apertar Ctrl+Enter ou Alt+Enter para gerar)",
+ "Negative prompt (press Ctrl+Enter or Alt+Enter to generate)": "Prompt Negativo (apertar Ctrl+Enter ou Alt+Enter para gerar)",
+ "Add a random artist to the prompt.": "Adicionar um artista aleatório para o prompt.",
+ "Read generation parameters from prompt or last generation if prompt is empty into user interface.": "Lê os parâmetros de geração do prompt ou da última geraçao, caso o prompt esteja vazio.",
+ "Save style": "Salva um estilo de prompt.",
+ "Apply selected styles to current prompt": "Aplica o estilo para o prompt atual.",
+ "Stop processing current image and continue processing.": "Pula a imagem sendo gerada e vai para a próxima.",
+ "Stop processing images and return any results accumulated so far.": "Interrompe o processo e mostra o que foi gerado até então.",
+ "Style to apply; styles have components for both positive and negative prompts and apply to both": "Estilo para aplicar; também serve para o prompt negativo e vai preencher se usado.",
+ "Do not do anything special": "Não faça nada de especial",
+ "Which algorithm to use to produce the image": "O tipo de algoritmo para gerar imagens.",
+ "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 - cria mais variações para as imagens em diferentes passos. Mais que 40 passos cancela o efeito.",
+ "Denoising Diffusion Implicit Models - Funciona melhor para inpainting.": "Denoising Diffusion Implicit Models - Funciona melhor para inpainting.",
+ "Produce an image that can be tiled.": "Produz uma imagem que pode ser ladrilhada.",
+ "Use a two step process to partially create an image at smaller resolution, upscale, and then improve details in it without changing composition": "Cria um processo em duas etapas, com uma imagem em baixa qualidade primeiro, aumenta a imagem e refina os detalhes sem alterar a composição da imagem",
+ "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.": "Quanto o algoritmo deve manter da imagem original. Em 0, nada muda. Em 1 o algoritmo ignora a imagem original. Valores menores que 1.0 demoram mais.",
+ "How many batches of images to create": "Quantos lotes de imagens criar",
+ "How many image to create in a single batch": "Quantas imagens criar em um único lote",
+ "Classifier Free Guidance Scale - how strongly the image should conform to prompt - lower values produce more creative results": "Classifier Free Guidance Scale - Quanto maior o valor, mais segue o prompt e quanto menor, menor segue.",
+ "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": "Codigo de geração de uma imagem - criando uma imagem com os mesmos parâmetros e seed trazem o mesmo resultado.",
+ "Set seed to -1, which will cause a new random number to be used every time": "Define seed como -1, deixando o valor que vai aparecer como aleatório.",
+ "Reuse seed from last generation, mostly useful if it was randomed": "Reutilizar a seed da última geração, útil principalmente se ela foi aleatória",
+ "Seed of a different picture to be mixed into the generation.": "Seed de uma imagem diferente é misturada na geração.",
+ "How strong of a variation to produce. At 0, there will be no effect. At 1, you will get the complete picture with variation seed (except for ancestral samplers, where you will just get something).": "Qual a variação a ser gerada. Em 0, não tem efeito. Em 1, gera uma imagem completa com a variação de seed, (exceto com amostragens a).",
+ "Make an attempt to produce a picture similar to what would have been produced with same seed at specified resolution": "Tenta gerar uma imagem similar ao que teria sido feito com a mesma seed em dimensões especifica.",
+ "Separate values for X axis using commas.": "Separa os valores para o eixo X usando vírgulas.",
+ "Separate values for Y axis using commas.": "Separa os valores para o eixo Y usando vírgulas.",
+ "Write image to a directory (default - log/images) and generation parameters into csv file.": "Salva a imagem no diretório padrão ou escolhido e cria um arquivo csv com os parâmetros da geração.",
+ "Open images output directory": "Abre o diretório de saída de imagens.",
+ "How much to blur the mask before processing, in pixels.": "Transição do contorno da máscara, em pixels.",
+ "What to put inside the masked area before processing it with Stable Diffusion.": "O que vai dentro da máscara antes de processar.",
+ "fill it with colors of the image": "Preenche usando as cores da imagem.",
+ "keep whatever was there originally": "manter usando o que estava lá originalmente",
+ "fill it with latent space noise": "Preenche com ruídos do espaço latente.",
+ "fill it with latent space zeroes": "Preenche com zeros do espaço latente.",
+ "Upscale masked region to target resolution, do inpainting, downscale back and paste into original image": "Faz ampliação na região com máscara para atingir a resolução desejada, faz inpainting, faz downscale para voltar na resolução original e cola na imagem original",
+ "Resize image to target resolution. Unless height and width match, you will get incorrect aspect ratio.": "Redimensiona a imagem para a resolução desejada. A menos que a altura e a largura correspondam, você obterá uma proporção incorreta.",
+ "Resize the image so that entirety of target resolution is filled with the image. Crop parts that stick out.": "Redimensiona a imagem para que toda a resolução desejada seja preenchida com a imagem. Corta as partes que ficaram pra fora.",
+ "Resize the image so that entirety of image is inside target resolution. Fill empty space with image's colors.": "Redimensiona a imagem para que toda a imagem esteja dentro da resolução desejada. Preenche o espaço vazio com as cores da imagem.",
+ "How many times to repeat processing an image and using it as input for the next iteration": "Quantas vezes vai repetir o processamento de uma imagem e usá-la como entrada para a próxima iteração",
+ "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.": "No modo de loopback, em cada loop a força do denoise é multiplicado por este valor. <1 significa diminuir a variedade para que sua sequência converta em uma imagem fixa. >1 significa aumentar a variedade para que sua sequência se torne cada vez mais caótica.",
+ "For SD upscale, how much overlap in pixels should there be between tiles. Tiles overlap so that when they are merged back into one picture, there is no clearly visible seam.": "Para ampliação SD, quanta sobreposição em pixels deve haver entre os ladrilhos. Os ladrilhos se sobrepõem para que, quando forem mesclados de volta em uma imagem, não haja linhas de junção claramente visível.",
+ "A directory on the same machine where the server is running.": "Um diretório na mesma máquina onde o server está rodando.",
+ "Leave blank to save images to the default path.": "Deixar em branco para salvar imagens no caminho padrão.",
+ "Result = A * (1 - M) + B * M": "Resultado = A * (1 - M) + B * M",
+ "Result = A + (B - C) * M": "Resultado = A + (B - C) * M",
+ "1st and last digit must be 1. ex:'1, 2, 1'": "Primeiro e último dígito precisam ser 1. ex:'1, 2, 1'",
+ "Path to directory with input images": "Caminho para o diretório com imagens de entrada",
+ "Path to directory where to write outputs": "Caminho para o diretório para gravar as saídas",
+ "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], [datetime<Format>], [datetime<Format><Time Zone>], [job_timestamp]; leave empty for default.": "Usa essas tags para definir como os nomes dos arquivos sao escolhidos: [steps], [cfg], [prompt], [prompt_no_styles], [prompt_spaces], [width], [height], [styles], [sampler], [seed], [model_hash], [prompt_words], [date], [datetime], [job_timestamp]; deixe em branco para manter o padrao.",
+ "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 esta opção estiver marcada, as imagens não vão ter marca d'água. Aviso: se você não quer a marca d'água, você pode estar se envolvendo em comportamentos antiéticos",
+ "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], [datetime<Format>], [datetime<Format><Time Zone>], [job_timestamp]; leave empty for default.": "Usa essas tags para definir como os nomes dos subdiretorios e ghrades sao escolhidos: [steps], [cfg], [prompt], [prompt_no_styles], [prompt_spaces], [width], [height], [styles], [sampler], [seed], [model_hash], [prompt_words], [date], [datetime], [job_timestamp]; deixe em branco para manter o padrao.",
+ "Restore low quality faces using GFPGAN neural network": "Restaurar rostos de baixa qualidade usando a rede neural GFPGAN",
+ "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.": "Esta expressão regular vai retirar palavras do nome do arquivo e vai se juntar usando a opção abaixo em etiquetas usadas em treinamento. Não mexer para manter os nomes como estão.",
+ "This string will be used to join split words into a single line if the option above is enabled.": "Esta string será usada para unir palavras divididas em uma única linha se a opção acima estiver habilitada.",
+ "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.": "Lista de nomes de configurações, separados por vírgulas, para configurações que devem ir para a barra de acesso rápido na parte superior, em vez da guia de configuração usual. Veja modules/shared.py para nomes de configuração. Necessita reinicialização para aplicar.",
+ "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 este valor for diferente de zero, ele será adicionado à seed e usado para inicializar o RNG para ruídos ao usar amostragens com Tempo Estimado. Você pode usar isso para produzir ainda mais variações de imagens ou pode usar isso para combinar imagens de outro software se souber o que está fazendo."
+}
diff --git a/localizations/tr_TR.json b/localizations/tr_TR.json
new file mode 100644
index 00000000..74cdf056
--- /dev/null
+++ b/localizations/tr_TR.json
@@ -0,0 +1,423 @@
+{
+ "⤡": "⤡",
+ "⊞": "⊞",
+ "×": "×",
+ "❮": "❮",
+ "❯": "❯",
+ "Loading...": "Yükleniyor...",
+ "view": "arayüz",
+ "api": "",
+ "•": "-",
+ "built with gradio": "gradio ile inşa edildi",
+ "Stable Diffusion checkpoint": "Kararlı Difüzyon kontrol noktası",
+ "txt2img": "txt2img",
+ "img2img": "img2img",
+ "Extras": "Ekstralar",
+ "PNG Info": "PNG Bilgisi",
+ "Checkpoint Merger": "Checkpoint Birleştir",
+ "Train": "Eğitim",
+ "Settings": "Ayarlar",
+ "Prompt": "İstem",
+ "Negative prompt": "Negatif istem",
+ "Run": "Koşmak",
+ "Skip": "Atla",
+ "Interrupt": "Durdur",
+ "Generate": "Oluştur",
+ "Style 1": "Stil 1",
+ "Style 2": "Stil 2",
+ "Label": "Etiket",
+ "File": "Dosya",
+ "Drop File Here": "Dosyayı Buraya Bırakın",
+ "-": "-",
+ "or": "veya",
+ "Click to Upload": "Yüklemek için Tıklayınız",
+ "Image": "Resim",
+ "Check progress": "İlerlemeyi kontrol edin",
+ "Check progress (first)": "Önce ilerlemeyi kontrol edin",
+ "Sampling Steps": "Örnekleme Adımları",
+ "Sampling method": "Örnekleme yöntemi",
+ "Euler a": "Euler a",
+ "Euler": "Euler",
+ "LMS": "LMS",
+ "Heun": "Heun",
+ "DPM2": "DPM2",
+ "DPM2 a": "DPM2 a",
+ "DPM fast": "DPM hızlı",
+ "DPM adaptive": "DPM uyarlanabilir",
+ "LMS Karras": "LMS Karras",
+ "DPM2 Karras": "DPM2 Karras",
+ "DPM2 a Karras": "DPM2 a Karras",
+ "DDIM": "DDIM",
+ "PLMS": "PLMS",
+ "Width": "Genişlik",
+ "Height": "Yükseklik",
+ "Restore faces": "Yüzleri düzeltme",
+ "Tiling": "Döşeme Oluştur",
+ "Highres. fix": "Highres. düzeltme",
+ "Firstpass width": "İlk geçiş genişliği",
+ "Firstpass height": "İlk geçiş yüksekliği",
+ "Denoising strength": "Gürültü arındırma gücü",
+ "Batch count": "Grup sayısı",
+ "Batch size": "Grup büyüklüğü",
+ "CFG Scale": "CFG Ölçeği",
+ "Seed": "Tohum",
+ "Extra": "Ekstra",
+ "Variation seed": "Varyasyon tohumu",
+ "Variation strength": "Varyasyon gücü",
+ "Resize seed from width": "Tohumu genişlik ile yeniden boyutlandırma",
+ "Resize seed from height": "Tohumu yükseklik ile yeniden boyutlandırma",
+ "Script": "Scriptler",
+ "None": "Hiçbiri",
+ "Prompt matrix": "İstem matrisi",
+ "Prompts from file or textbox": "Dosyadan veya metin kutusundan istemler",
+ "X/Y plot": "X/Y grafiği",
+ "Put variable parts at start of prompt": "Değişken parçaları komut isteminin başına koyun",
+ "Show Textbox": "Metin Kutusunu Göster",
+ "File with inputs": "Girdileri içeren dosya",
+ "Prompts": "İpuçları",
+ "X type": "X tipi",
+ "Nothing": "Hiçbir şey",
+ "Var. seed": "Var. tohum",
+ "Var. strength": "Var. güç",
+ "Steps": "Adımlar",
+ "Prompt S/R": "İstem S/R",
+ "Prompt order": "İstem sırası",
+ "Sampler": "Örnekleyici",
+ "Checkpoint name": "Kontrol noktası adı",
+ "Hypernetwork": "Hipernetwork",
+ "Hypernet str.": "Hypernet str.",
+ "Sigma Churn": "Sigma Churn",
+ "Sigma min": "Sigma dakika",
+ "Sigma max": "Sigma maksimum",
+ "Sigma noise": "Sigma gürültüsü",
+ "Eta": "Eta",
+ "Clip skip": "Klip atlama",
+ "Denoising": "Denoising",
+ "X values": "X değerleri",
+ "Y type": "Y tipi",
+ "Y values": "Y değerleri",
+ "Draw legend": "Gösterge çizin",
+ "Include Separate Images": "Ayrı Görseller Ekleyin",
+ "Keep -1 for seeds": "Tohumlar için -1'i saklayın",
+ "Drop Image Here": "Resmi Buraya Bırakın",
+ "Save": "Kaydet",
+ "Send to img2img": "img2img'ye gönder",
+ "Send to inpaint": "Inpaint'e gönder",
+ "Send to extras": "Ekstralara gönder",
+ "Make Zip when Save?": "Kaydederken Zip Yap?",
+ "Textbox": "Metin Kutusu",
+ "Interrogate\nCLIP": "Sorgula\nCLIP",
+ "Inpaint": "Inpaint",
+ "Batch img2img": "Toplu img2img",
+ "Image for img2img": "img2img için resim",
+ "Image for inpainting with mask": "Maske ile inpainting için görüntü",
+ "Mask": "Maske",
+ "Mask blur": "Maske bulanıklığı",
+ "Mask mode": "Maske modu",
+ "Draw mask": "Maske çizin",
+ "Upload mask": "Maske yükle",
+ "Masking mode": "Maskeleme modu",
+ "Inpaint masked": "Maskeli inpaint",
+ "Inpaint not masked": "Boya maskelenmemiş",
+ "Masked content": "Maskelenmiş içerik",
+ "fill": "doldurun",
+ "original": "orijinal",
+ "latent noise": "gizli gürültü",
+ "latent nothing": "gizli hiçbir şey",
+ "Inpaint at full resolution": "Tam çözünürlükte inpaint",
+ "Inpaint at full resolution padding, pixels": "Tam çözünürlükte inpaint dolgu, piksel",
+ "Process images in a directory on the same machine where the server is running.": "Görüntüleri sunucunun çalıştığı makinedeki bir dizinde işleyin.",
+ "Use an empty output directory to save pictures normally instead of writing to the output directory.": "Resimleri çıktı dizinine yazmak yerine normal şekilde kaydetmek için boş bir çıktı dizini kullanın.",
+ "Input directory": "Girdi dizini",
+ "Output directory": "Çıktı dizini",
+ "Resize mode": "Yeniden boyutlandırma modu",
+ "Just resize": "Sadece yeniden boyutlandır",
+ "Crop and resize": "Kırpma ve yeniden boyutlandırma",
+ "Resize and fill": "Yeniden boyutlandırın ve doldurun",
+ "img2img alternative test": "img2img alternatif test",
+ "Loopback": "Geri Döngü",
+ "Outpainting mk2": "Outpainting mk2",
+ "Poor man's outpainting": "Zavallı adamın dış boyaması",
+ "SD upscale": "SD lüks",
+ "should be 2 or lower.": "2 veya daha düşük olmalıdır.",
+ "Override `Sampling method` to Euler?(this method is built for it)": "Euler için `Örnekleme yöntemini` geçersiz kılın (bu yöntem bunun için oluşturulmuştur)",
+ "Override `prompt` to the same value as `original prompt`?(and `negative prompt`)": "Prompt` değerini `orijinal prompt` ile aynı değere geçersiz kılma (ve `negatif prompt`)",
+ "Original prompt": "Orijinal bilgi istemi",
+ "Original negative prompt": "Orijinal negatif istem",
+ "Override `Sampling Steps` to the same value as `Decode steps`?": "Örnekleme Adımlarını `Kod çözme adımları` ile aynı değere mi geçersiz kılıyorsunuz?",
+ "Decode steps": "Kod çözme adımları",
+ "Override `Denoising strength` to 1?": "`Denoising strength` değerini 1 olarak geçersiz kıl?",
+ "Decode CFG scale": "CFG ölçeğinin kodunu çöz",
+ "Randomness": "Rastgelelik",
+ "Sigma adjustment for finding noise for image": "Görüntü için gürültü bulmaya yönelik Sigma ayarı",
+ "Loops": "Döngüler",
+ "Denoising strength change factor": "Denoising gücü değişim faktörü",
+ "Recommended settings: Sampling Steps: 80-100, Sampler: Euler a, Denoising strength: 0.8": "Önerilen ayarlar: Örnekleme Adımları: 80-100, Örnekleyici: Euler a, Denoising gücü: 0.8",
+ "Pixels to expand": "Genişletilecek pikseller",
+ "Outpainting direction": "Dış boyama yönü",
+ "left": "sol",
+ "right": "doğru",
+ "up": "yukarı",
+ "down": "aşağı",
+ "Fall-off exponent (lower=higher detail)": "Düşme üssü (düşük=daha yüksek detay)",
+ "Color variation": "Renk çeşitliliği",
+ "Will upscale the image to twice the dimensions; use width and height sliders to set tile size": "Görüntüyü boyutlarının iki katına yükseltir; döşeme boyutunu ayarlamak için genişlik ve yükseklik kaydırıcılarını kullanın",
+ "Tile overlap": "Karo örtüşmesi",
+ "Upscaler": "Upscaler",
+ "Lanczos": "Lanczos",
+ "LDSR": "LDSR",
+ "SwinIR 4x": "SwinIR 4x",
+ "ScuNET GAN": "ScuNET GAN",
+ "ScuNET PSNR": "ScuNET PSNR",
+ "ESRGAN_4x": "ESRGAN_4x",
+ "Single Image": "Tek Resim",
+ "Batch Process": "Toplu İşlem",
+ "Batch from Directory": "Dizinden Toplu İş",
+ "Source": "Kaynak",
+ "Show result images": "Sonuç resimlerini göster",
+ "Scale by": "Ölçek tarafından",
+ "Scale to": "Ölçeklendir",
+ "Resize": "Yeniden Boyutlandır",
+ "Crop to fit": "Sığdırmak için kırpın",
+ "Upscaler 2 visibility": "Upscaler 2 görünürlüğü",
+ "GFPGAN visibility": "GFPGAN görünürlüğü",
+ "CodeFormer visibility": "CodeFormer görünürlüğü",
+ "CodeFormer weight (0 = maximum effect, 1 = minimum effect)": "CodeFormer ağırlığı (0 = maksimum etki, 1 = minimum etki)",
+ "Open output directory": "Çıktı dizinini aç",
+ "Send to txt2img": "txt2img'ye gönder",
+ "A merger of the two checkpoints will be generated in your": "İki kontrol noktasının bir birleşimi sizin kontrol noktanızda oluşturulacaktır.",
+ "checkpoint": "kontrol noktası",
+ "directory.": "dizin.",
+ "Primary model (A)": "Birincil model (A)",
+ "Secondary model (B)": "İkincil model (B)",
+ "Tertiary model (C)": "Üçüncü model (C)",
+ "Custom Name (Optional)": "Özel Ad (İsteğe Bağlı)",
+ "Multiplier (M) - set to 0 to get model A": "Çarpan (M) - A modelini elde etmek için 0'a ayarlayın",
+ "Interpolation Method": "İnterpolasyon Yöntemi",
+ "Weighted sum": "Ağırlıklı toplam",
+ "Add difference": "Farklılık ekleyin",
+ "Save as float16": "float16 olarak kaydet",
+ "See": "Bkz. ",
+ "wiki": "wiki",
+ "for detailed explanation.": " ayrıntılı açıklama için.",
+ "Create embedding": "Yerleştirme oluşturma",
+ "Create hypernetwork": "Hipernet oluşturun",
+ "Preprocess images": "Görüntüleri ön işleme",
+ "Name": "İsim",
+ "Initialization text": "Başlatma metni",
+ "Number of vectors per token": "Belirteç başına vektör sayısı",
+ "Overwrite Old Embedding": "Eski Yerleştirmenin Üzerine Yaz",
+ "Modules": "Modüller",
+ "Enter hypernetwork layer structure": "Hipernetwork katman yapısına girin",
+ "Select activation function of hypernetwork": "Hipernetwork'ün aktivasyon fonksiyonunu seçin",
+ "linear": "doğrusal",
+ "relu": "relu",
+ "leakyrelu": "leakyrelu",
+ "elu": "elu",
+ "swish": "swish",
+ "Add layer normalization": "Katman normalizasyonu ekleyin",
+ "Use dropout": "Bırakmayı kullanın",
+ "Overwrite Old Hypernetwork": "Eski Hipernetwork'ün Üzerine Yazma",
+ "Source directory": "Kaynak dizini",
+ "Destination directory": "Hedef dizini",
+ "Existing Caption txt Action": "Mevcut Başlık txt Eylem",
+ "ignore": "görmezden gel",
+ "copy": "kopya",
+ "prepend": "prepend",
+ "append": "ekle",
+ "Create flipped copies": "Ters çevrilmiş kopyalar oluşturun",
+ "Split oversized images": "Büyük boyutlu görüntüleri bölme",
+ "Use BLIP for caption": "Başlık için BLIP kullanın",
+ "Use deepbooru for caption": "Başlık için deepbooru kullanın",
+ "Split image threshold": "Bölünmüş görüntü eşiği",
+ "Split image overlap ratio": "Bölünmüş görüntü örtüşme oranı",
+ "Preprocess": "Ön işlem",
+ "Train an embedding or Hypernetwork; you must specify a directory with a set of 1:1 ratio images": "Bir gömme veya Hipernetwork eğitin; 1:1 oranlı görüntülerin bulunduğu bir dizin belirtmelisiniz",
+ "[wiki]": "[wiki]",
+ "Embedding": "Yerleştirme",
+ "Embedding Learning rate": "Gömme Öğrenme oranı",
+ "Hypernetwork Learning rate": "Hypernetwork Öğrenme oranı",
+ "Dataset directory": "Veri seti dizini",
+ "Log directory": "Günlük dizini",
+ "Prompt template file": "Komut istemi şablon dosyası",
+ "Max steps": "Maksimum adım",
+ "Save an image to log directory every N steps, 0 to disable": "Her N adımda bir görüntüyü günlük dizinine kaydet, 0 devre dışı bırakmak için",
+ "Save a copy of embedding to log directory every N steps, 0 to disable": "Katıştırmanın bir kopyasını her N adımda bir günlük dizinine kaydedin, devre dışı bırakmak için 0",
+ "Save images with embedding in PNG chunks": "Görüntüleri PNG parçalarına yerleştirerek kaydedin",
+ "Read parameters (prompt, etc...) from txt2img tab when making previews": "Önizleme yaparken txt2img sekmesinden parametreleri (istem, vb...) okuma",
+ "Train Hypernetwork": "Tren Hipernetwork",
+ "Train Embedding": "Tren Gömme",
+ "Apply settings": "Ayarları uygula",
+ "Saving images/grids": "Görüntüleri/gridleri kaydetme",
+ "Always save all generated images": "Oluşturulan tüm görüntüleri her zaman kaydedin",
+ "File format for images": "Görüntüler için dosya formatı",
+ "Images filename pattern": "Görüntü dosya adı deseni",
+ "Add number to filename when saving": "Kaydederken dosya adına numara ekle",
+ "Always save all generated image grids": "Oluşturulan tüm görüntü ızgaralarını her zaman kaydedin",
+ "File format for grids": "Izgaralar için dosya formatı",
+ "Add extended info (seed, prompt) to filename when saving grid": "Izgarayı kaydederken dosya adına genişletilmiş bilgi (tohum, istem) ekleyin",
+ "Do not save grids consisting of one picture": "Tek resimden oluşan ızgaraları kaydetmeyin",
+ "Prevent empty spots in grid (when set to autodetect)": "Izgaradaki boş noktaları önleme (otomatik algılamaya ayarlandığında)",
+ "Grid row count; use -1 for autodetect and 0 for it to be same as batch size": "Izgara satır sayısı; otomatik algılama için -1, yığın boyutuyla aynı olması için 0 kullanın",
+ "Save text information about generation parameters as chunks to png files": "Üretim parametreleri hakkındaki metin bilgilerini png dosyalarına parçalar halinde kaydedin",
+ "Create a text file next to every image with generation parameters.": "Oluşturma parametreleri ile her görüntünün yanında bir metin dosyası oluşturun.",
+ "Save a copy of image before doing face restoration.": "Yüz restorasyonu yapmadan önce görüntünün bir kopyasını kaydedin.",
+ "Quality for saved jpeg images": "Kaydedilen jpeg görüntüleri için kalite",
+ "If PNG image is larger than 4MB or any dimension is larger than 4000, downscale and save copy as JPG": "PNG görüntüsü 4MB'den büyükse veya herhangi bir boyut 4000'den büyükse, ölçeği küçültün ve kopyayı JPG olarak kaydedin",
+ "Use original name for output filename during batch process in extras tab": "Ekstralar sekmesinde toplu işlem sırasında çıktı dosya adı için orijinal adı kullan",
+ "When using 'Save' button, only save a single selected image": "'Kaydet' düğmesini kullanırken, yalnızca seçilen tek bir resmi kaydedin",
+ "Do not add watermark to images": "Görüntülere filigran eklemeyin",
+ "Paths for saving": "Tasarruf için yollar",
+ "Output directory for images; if empty, defaults to three directories below": "Görüntüler için çıktı dizini; boşsa, varsayılan olarak aşağıdaki üç dizine gider",
+ "Output directory for txt2img images": "txt2img görüntüleri için çıktı dizini",
+ "Output directory for img2img images": "img2img görüntüleri için çıktı dizini",
+ "Output directory for images from extras tab": "Ekstralar sekmesindeki görüntüler için çıktı dizini",
+ "Output directory for grids; if empty, defaults to two directories below": "Izgaralar için çıktı dizini; boşsa, varsayılan olarak aşağıdaki iki dizine gider",
+ "Output directory for txt2img grids": "txt2img ızgaraları için çıktı dizini",
+ "Output directory for img2img grids": "img2img ızgaraları için çıktı dizini",
+ "Directory for saving images using the Save button": "Kaydet düğmesini kullanarak görüntüleri kaydetmek için dizin",
+ "Saving to a directory": "Bir dizine kaydetme",
+ "Save images to a subdirectory": "Görüntüleri bir alt dizine kaydetme",
+ "Save grids to a subdirectory": "Izgaraları bir alt dizine kaydetme",
+ "When using \"Save\" button, save images to a subdirectory": "\"Kaydet\" düğmesini kullanırken, görüntüleri bir alt dizine kaydedin",
+ "Directory name pattern": "Dizin adı kalıbı",
+ "Max prompt words for [prompt_words] pattern": "prompt_words] kalıbı için maksimum istem sözcükleri",
+ "Upscaling": "Yükseltme",
+ "Tile size for ESRGAN upscalers. 0 = no tiling.": "ESRGAN yükselticileri için döşeme boyutu. 0 = döşeme yok.",
+ "Tile overlap, in pixels for ESRGAN upscalers. Low values = visible seam.": "ESRGAN yükselticileri için piksel cinsinden döşeme örtüşmesi. Düşük değerler = görünür bağlantı hattı.",
+ "Tile size for all SwinIR.": "Tüm SwinIR için döşeme boyutu.",
+ "Tile overlap, in pixels for SwinIR. Low values = visible seam.": "SwinIR için piksel cinsinden döşeme örtüşmesi. Düşük değerler = görünür dikiş.",
+ "LDSR processing steps. Lower = faster": "LDSR işleme adımları. Düşük = daha hızlı",
+ "Upscaler for img2img": "img2img için üst ölçekleyici",
+ "Upscale latent space image when doing hires. fix": "İşe alım yaparken gizli alan görüntüsünü yükselt. düzelt",
+ "Face restoration": "Yüz restorasyonu",
+ "CodeFormer weight parameter; 0 = maximum effect; 1 = minimum effect": "CodeFormer ağırlık parametresi; 0 = maksimum etki; 1 = minimum etki",
+ "Move face restoration model from VRAM into RAM after processing": "İşlemden sonra yüz restorasyon modelini VRAM'den RAM'e taşıma",
+ "System": "Sistem",
+ "VRAM usage polls per second during generation. Set to 0 to disable.": "Üretim sırasında saniye başına VRAM kullanım yoklamaları. Devre dışı bırakmak için 0 olarak ayarlayın.",
+ "Always print all generation info to standard output": "Tüm üretim bilgilerini her zaman standart çıktıya yazdır",
+ "Add a second progress bar to the console that shows progress for an entire job.": "Konsola tüm iş için ilerlemeyi gösteren ikinci bir ilerleme çubuğu ekleyin.",
+ "Training": "Eğitim",
+ "Move VAE and CLIP to RAM when training hypernetwork. Saves VRAM.": "Hiperneti eğitirken VAE ve CLIP'i RAM'e taşıyın. VRAM'den tasarruf sağlar.",
+ "Filename word regex": "Dosya adı kelime regex",
+ "Filename join string": "Dosya adı birleştirme dizesi",
+ "Number of repeats for a single input image per epoch; used only for displaying epoch number": "Epok başına tek bir girdi görüntüsü için tekrar sayısı; yalnızca epok numarasını görüntülemek için kullanılır",
+ "Save an csv containing the loss to log directory every N steps, 0 to disable": "Her N adımda bir günlük dizinine kaybı içeren bir csv kaydedin, devre dışı bırakmak için 0",
+ "Stable Diffusion": "Kararlı Difüzyon",
+ "Checkpoints to cache in RAM": "RAM'de önbelleğe alınacak kontrol noktaları",
+ "Hypernetwork strength": "Hipernetwork gücü",
+ "Apply color correction to img2img results to match original colors.": "Orijinal renklerle eşleştirmek için img2img sonuçlarına renk düzeltmesi uygulayın.",
+ "Save a copy of image before applying color correction to img2img results": "img2img sonuçlarına renk düzeltmesi uygulamadan önce görüntünün bir kopyasını kaydedin",
+ "With img2img, do exactly the amount of steps the slider specifies (normally you'd do less with less denoising).": "img2img ile, kaydırıcının belirttiği adım miktarını tam olarak yapın (normalde daha az denoising ile daha az yaparsınız).",
+ "Enable quantization in K samplers for sharper and cleaner results. This may change existing seeds. Requires restart to apply.": "Daha keskin ve temiz sonuçlar için K örnekleyicilerinde nicelemeyi etkinleştirin. Bu, mevcut tohumları değiştirebilir. Uygulamak için yeniden başlatma gerektirir.",
+ "Emphasis: use (text) to make model pay more attention to text and [text] to make it pay less attention": "Vurgu: modelin metne daha fazla dikkat etmesini sağlamak için (metin) ve daha az dikkat etmesini sağlamak için [metin] kullanın",
+ "Use old emphasis implementation. Can be useful to reproduce old seeds.": "Eski vurgu uygulamasını kullanın. Eski tohumları yeniden üretmek faydalı olabilir.",
+ "Make K-diffusion samplers produce same images in a batch as when making a single image": "K-difüzyon örnekleyicilerinin tek bir görüntü oluştururken olduğu gibi toplu halde aynı görüntüleri üretmesini sağlayın",
+ "Increase coherency by padding from the last comma within n tokens when using more than 75 tokens": "75'ten fazla belirteç kullanıldığında n belirteç içindeki son virgülden itibaren dolgu yaparak tutarlılığı artırın",
+ "Filter NSFW content": "NSFW içeriği filtreleme",
+ "Stop At last layers of CLIP model": "Durdur CLIP modelinin son katmanlarında",
+ "Interrogate Options": "Sorgulama Seçenekleri",
+ "Interrogate: keep models in VRAM": "Sorgula: modelleri VRAM'de tut",
+ "Interrogate: use artists from artists.csv": "Sorgula: artists.csv dosyasındaki sanatçıları kullan",
+ "Interrogate: include ranks of model tags matches in results (Has no effect on caption-based interrogators).": "Interrogate: sonuçlara eşleşen model etiketlerinin sıralarını dahil et (Başlık tabanlı sorgulayıcılar üzerinde etkisi yoktur).",
+ "Interrogate: num_beams for BLIP": "Sorgula: BLIP için num_beams",
+ "Interrogate: minimum description length (excluding artists, etc..)": "Sorgula: minimum açıklama uzunluğu (sanatçılar vb. hariç)",
+ "Interrogate: maximum description length": "Sorgula: maksimum açıklama uzunluğu",
+ "CLIP: maximum number of lines in text file (0 = No limit)": "CLIP: metin dosyasındaki maksimum satır sayısı (0 = Sınır yok)",
+ "Interrogate: deepbooru score threshold": "Sorgula: deepbooru puan eşiği",
+ "Interrogate: deepbooru sort alphabetically": "Sorgula: deepbooru alfabetik olarak sırala",
+ "use spaces for tags in deepbooru": "deepbooru'da etiketler için boşluk kullanın",
+ "escape (\\) brackets in deepbooru (so they are used as literal brackets and not for emphasis)": "deepbooru'da kaçış (\\) parantezleri (böylece vurgu için değil, gerçek parantez olarak kullanılırlar)",
+ "User interface": "Kullanıcı arayüzü",
+ "Show progressbar": "İlerleme çubuğunu göster",
+ "Show image creation progress every N sampling steps. Set 0 to disable.": "Her N örnekleme adımında görüntü oluşturma ilerlemesini gösterir. Devre dışı bırakmak için 0 olarak ayarlayın.",
+ "Show previews of all images generated in a batch as a grid": "Bir toplu işte oluşturulan tüm görüntülerin önizlemelerini ızgara olarak göster",
+ "Show grid in results for web": "Web için sonuçlarda ızgarayı göster",
+ "Do not show any images in results for web": "Web için sonuçlarda herhangi bir resim gösterme",
+ "Add model hash to generation information": "Üretim bilgilerine model karması ekleyin",
+ "Add model name to generation information": "Üretim bilgilerine model adı ekleme",
+ "When reading generation parameters from text into UI (from PNG info or pasted text), do not change the selected model/checkpoint.": "Üretim parametrelerini metinden kullanıcı arayüzüne okurken (PNG bilgisinden veya yapıştırılan metinden), seçilen modeli/denetim noktasını değiştirmeyin.",
+ "Font for image grids that have text": "Metin içeren görüntü ızgaraları için yazı tipi",
+ "Enable full page image viewer": "Tam sayfa resim görüntüleyiciyi etkinleştir",
+ "Show images zoomed in by default in full page image viewer": "Tam sayfa resim görüntüleyicide resimleri varsayılan olarak yakınlaştırılmış olarak gösterme",
+ "Show generation progress in window title.": "Pencere başlığında üretim ilerlemesini göster.",
+ "Quicksettings list": "Hızlı ayarlar listesi",
+ "Localization (requires restart)": "Yerelleştirme (yeniden başlatma gerektirir)",
+ "ko_KR": "ko_KR",
+ "ru_RU": "ru_RU",
+ "es_ES": "es_ES",
+ "ja_JP": "ja_JP",
+ "ar_AR": "ar_AR",
+ "Sampler parameters": "Örnekleyici parametreleri",
+ "Hide samplers in user interface (requires restart)": "Kullanıcı arayüzünde örnekleyicileri gizle (yeniden başlatma gerektirir)",
+ "eta (noise multiplier) for DDIM": "DDIM için eta (gürültü çarpanı)",
+ "eta (noise multiplier) for ancestral samplers": "eta örnekleyiciler için eta (gürültü çarpanı)",
+ "img2img DDIM discretize": "img2img DDIM discretize",
+ "uniform": "üniforma",
+ "quad": "dörtlü",
+ "sigma churn": "sigma churn",
+ "sigma tmin": "sigma tmin",
+ "sigma noise": "sigma gürültüsü",
+ "Eta noise seed delta": "Eta gürültü tohum deltası",
+ "Request browser notifications": "Tarayıcı bildirimleri isteyin",
+ "Download localization template": "Dil şablonunu indirin",
+ "Reload custom script bodies (No ui updates, No restart)": "Kişisel komut dosyası gövdelerini yeniden yükle (Kullanıcı arayüzü güncellemesi yok, yeniden başlatma yok)",
+ "Restart Gradio and Refresh components (Custom Scripts, ui.py, js and css only)": "Gradio'yu yeniden başlatın ve bileşenleri yenileyin (yalnızca Özel Komut Dosyaları, ui.py, js ve css)",
+ "Prompt (press Ctrl+Enter or Alt+Enter to generate)": "İstem (oluşturmak için Ctrl+Enter veya Alt+Enter tuşlarına basın)",
+ "Negative prompt (press Ctrl+Enter or Alt+Enter to generate)": "Negatif istem (oluşturmak için Ctrl+Enter veya Alt+Enter tuşlarına basın)",
+ "Add a random artist to the prompt.": "Komut istemine rastgele bir sanatçı ekleyin.",
+ "Read generation parameters from prompt or last generation if prompt is empty into user interface.": "Kullanıcı arayüzüne istemden veya istem boşsa son üretimden üretim parametrelerini okuyun.",
+ "Save style": "Stil kaydet",
+ "Apply selected styles to current prompt": "Seçilen stilleri geçerli komut istemine uygulama",
+ "Stop processing current image and continue processing.": "Geçerli görüntüyü işlemeyi durdurun ve işlemeye devam edin.",
+ "Stop processing images and return any results accumulated so far.": "Görüntüleri işlemeyi durdurun ve o ana kadar biriken tüm sonuçları döndürün.",
+ "Style to apply; styles have components for both positive and negative prompts and apply to both": "Uygulanacak stil; stillerin hem pozitif hem de negatif istemler için bileşenleri vardır ve her ikisine de uygulanır",
+ "Do not do anything special": "Özel bir şey yapmayın",
+ "Which algorithm to use to produce the image": "Görüntüyü üretmek için hangi algoritmanın kullanılacağı",
+ "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 - çok yaratıcı, adım sayısına bağlı olarak her biri tamamen farklı bir resim elde edebilir, adımları 30-40'tan daha yükseğe ayarlamak yardımcı olmaz",
+ "Denoising Diffusion Implicit Models - best at inpainting": "Denoising Difüzyon Örtük Modelleri - en iyi inpainting",
+ "Produce an image that can be tiled.": "Döşenebilen bir görüntü üretin.",
+ "Use a two step process to partially create an image at smaller resolution, upscale, and then improve details in it without changing composition": "Bir görüntüyü kısmen daha düşük çözünürlükte oluşturmak, büyütmek ve ardından kompozisyonu değiştirmeden ayrıntıları iyileştirmek için iki adımlı bir işlem kullanın",
+ "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.": "Algoritmanın resmin içeriğine ne kadar az saygı göstermesi gerektiğini belirler. 0'da hiçbir şey değişmez ve 1'de ilgisiz bir görüntü elde edersiniz. 1,0'ın altındaki değerlerde işleme, Örnekleme Adımları kaydırıcısının belirttiğinden daha az adım atacaktır.",
+ "How many batches of images to create": "Kaç görüntü grubu oluşturulacağı",
+ "How many image to create in a single batch": "Tek bir partide kaç görüntü oluşturulacağı",
+ "Classifier Free Guidance Scale - how strongly the image should conform to prompt - lower values produce more creative results": "Sınıflandırıcı Serbest Rehberlik Ölçeği - görüntünün istemle ne kadar uyumlu olması gerektiği - düşük değerler daha yaratıcı sonuçlar üretir",
+ "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": "Rastgele sayı üretecinin çıktısını belirleyen bir değer - başka bir resimle aynı parametrelere ve tohuma sahip bir resim oluşturursanız, aynı sonucu alırsınız",
+ "Set seed to -1, which will cause a new random number to be used every time": "Tohum değerini -1 olarak ayarlayın, bu her seferinde yeni bir rastgele sayı kullanılmasına neden olacaktır",
+ "Reuse seed from last generation, mostly useful if it was randomed": "Son nesilden tohumu yeniden kullanın, çoğunlukla rastgele ise kullanışlıdır",
+ "Seed of a different picture to be mixed into the generation.": "Nesle karıştırılacak farklı bir resmin tohumu.",
+ "How strong of a variation to produce. At 0, there will be no effect. At 1, you will get the complete picture with variation seed (except for ancestral samplers, where you will just get something).": "Ne kadar güçlü bir varyasyon üretileceği. 0'da hiçbir etki olmayacaktır. 1'de, varyasyon tohumu ile tam bir resim elde edersiniz (sadece bir şey alacağınız atasal örnekleyiciler hariç).",
+ "Make an attempt to produce a picture similar to what would have been produced with same seed at specified resolution": "Belirtilen çözünürlükte aynı tohumla üretilecek olana benzer bir resim üretme girişiminde bulunun",
+ "Separate values for X axis using commas.": "X ekseni için değerleri virgül kullanarak ayırın.",
+ "Separate values for Y axis using commas.": "Y ekseni için değerleri virgül kullanarak ayırın.",
+ "Write image to a directory (default - log/images) and generation parameters into csv file.": "Görüntüyü bir dizine (varsayılan - log/images) ve üretim parametrelerini csv dosyasına yazın.",
+ "Open images output directory": "Görüntü çıktı dizinini açın",
+ "How much to blur the mask before processing, in pixels.": "İşlemeden önce maskenin piksel cinsinden ne kadar bulanıklaştırılacağı.",
+ "What to put inside the masked area before processing it with Stable Diffusion.": "Kararlı Difüzyon ile işlemeden önce maskelenmiş alanın içine ne konulacağı.",
+ "fill it with colors of the image": "Görüntünün renkleriyle doldurun",
+ "keep whatever was there originally": "başlangıçta orada ne varsa saklayın",
+ "fill it with latent space noise": "gizli alan gürültüsü ile doldurun",
+ "fill it with latent space zeroes": "gizli uzay sıfırları ile doldurun",
+ "Upscale masked region to target resolution, do inpainting, downscale back and paste into original image": "Maskelenmiş bölgeyi hedef çözünürlüğe yükseltme, inpainting yapma, ölçeği küçültme ve orijinal görüntüye yapıştırma",
+ "Resize image to target resolution. Unless height and width match, you will get incorrect aspect ratio.": "Görüntüyü hedef çözünürlüğe göre yeniden boyutlandırın. Yükseklik ve genişlik eşleşmediği sürece, yanlış en boy oranı elde edersiniz.",
+ "Resize the image so that entirety of target resolution is filled with the image. Crop parts that stick out.": "Görüntüyü, hedef çözünürlüğün tamamı görüntüyle dolacak şekilde yeniden boyutlandırın. Dışarıda kalan kısımları kırpın.",
+ "Resize the image so that entirety of image is inside target resolution. Fill empty space with image's colors.": "Görüntünün tamamı hedef çözünürlüğün içinde olacak şekilde görüntüyü yeniden boyutlandırın. Boş alanı görüntünün renkleriyle doldurun.",
+ "How many times to repeat processing an image and using it as input for the next iteration": "Bir görüntüyü işlemeyi kaç kez tekrarlamak ve bir sonraki yineleme için girdi olarak kullanmak",
+ "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.": "Geri döngü modunda, her döngüde denoising gücü bu değerle çarpılır. <1 çeşitliliğin azalması anlamına gelir, böylece diziniz sabit bir resme yakınsayacaktır. >1'den büyük olması çeşitliliğin artması anlamına gelir, böylece sekansınız gittikçe daha kaotik hale gelecektir.",
+ "For SD upscale, how much overlap in pixels should there be between tiles. Tiles overlap so that when they are merged back into one picture, there is no clearly visible seam.": "SD yükseltme için karolar arasında piksel olarak ne kadar örtüşme olmalıdır. Döşemeler, tekrar tek bir resimde birleştirildiklerinde açıkça görülebilen bir dikiş olmayacak şekilde üst üste biner.",
+ "A directory on the same machine where the server is running.": "Sunucunun çalıştığı makinedeki bir dizin.",
+ "Leave blank to save images to the default path.": "Görüntüleri varsayılan yola kaydetmek için boş bırakın.",
+ "Result = A * (1 - M) + B * M": "Sonuç = A * (1 - M) + B * M",
+ "Result = A + (B - C) * M": "Sonuç = A + (B - C) * M",
+ "1st and last digit must be 1. ex:'1, 2, 1'": "1. ve son rakam 1 olmalıdır. örn:'1, 2, 1'",
+ "Path to directory with input images": "Girdi resimlerinin bulunduğu dizinin yolu",
+ "Path to directory where to write outputs": "Çıktıların yazılacağı dizinin yolu",
+ "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], [datetime<Format>], [datetime<Format><Time Zone>], [job_timestamp]; leave empty for default.": "Görüntülerin dosya adlarının nasıl seçileceğini tanımlamak için aşağıdaki etiketleri kullanın: [steps], [cfg], [prompt], [prompt_no_styles], [prompt_spaces], [width], [height], [styles], [sampler], [seed], [model_hash], [prompt_words], [date], [datetime], [datetime<Format>], [datetime<Format><Time Zone>], [job_timestamp]; varsayılan için boş bırakın.",
+ "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.": "Bu seçenek etkinleştirilirse, oluşturulan görüntülere filigran eklenmeyecektir. Uyarı: filigran eklemezseniz, etik olmayan bir şekilde davranıyor olabilirsiniz.",
+ "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], [datetime<Format>], [datetime<Format><Time Zone>], [job_timestamp]; leave empty for default.": "Görüntüler ve ızgaralar için alt dizinlerin nasıl seçileceğini tanımlamak için aşağıdaki etiketleri kullanın: [steps], [cfg], [prompt], [prompt_no_styles], [prompt_spaces], [width], [height], [styles], [sampler], [seed], [model_hash], [prompt_words], [date], [datetime], [datetime<Format>], [datetime<Format><Time Zone>], [job_timestamp]; varsayılan için boş bırakın.",
+ "Restore low quality faces using GFPGAN neural network": "GFPGAN sinir ağını kullanarak düşük kaliteli yüzleri geri yükleme",
+ "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.": "Bu düzenli ifade, dosya adından sözcükleri ayıklamak için kullanılır ve bunlar aşağıdaki seçenek kullanılarak eğitim için kullanılan etiket metnine birleştirilir. Dosya adı metnini olduğu gibi tutmak için boş bırakın.",
+ "This string will be used to join split words into a single line if the option above is enabled.": "Bu dize, yukarıdaki seçenek etkinleştirilirse bölünmüş kelimeleri tek bir satırda birleştirmek için kullanılacaktır.",
+ "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.": "Normal ayar sekmesi yerine üstteki hızlı erişim çubuğuna gitmesi gereken ayarlar için virgülle ayrılmış ayar adlarının listesi. Ayar adları için modules/shared.py dosyasına bakın. Uygulanması için yeniden başlatma gerekir.",
+ "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.": "Bu değer sıfır değilse, tohuma eklenecek ve Eta ile örnekleyiciler kullanılırken gürültüler için RNG'yi başlatmak için kullanılacaktır. Bunu daha fazla görüntü çeşitliliği üretmek için kullanabilir veya ne yaptığınızı biliyorsanız diğer yazılımların görüntülerini eşleştirmek için kullanabilirsiniz.."
+}
diff --git a/localizations/zh_CN.json b/localizations/zh_CN.json
new file mode 100644
index 00000000..e453f5e3
--- /dev/null
+++ b/localizations/zh_CN.json
@@ -0,0 +1,488 @@
+{
+ "⤡": "⤡",
+ "⊞": "⊞",
+ "×": "×",
+ "❮": "❮",
+ "❯": "❯",
+ "Loading...": "载入中...",
+ "view": "查看",
+ "api": "api",
+ "•": "•",
+ "built with gradio": "基于 Gradio 构建",
+ "Stable Diffusion checkpoint": "Stable Diffusion 模型(ckpt)",
+ "txt2img": "文生图",
+ "img2img": "图生图",
+ "Extras": "后处理",
+ "PNG Info": "PNG 信息",
+ "Checkpoint Merger": "模型(ckpt)合并工具",
+ "Train": "训练",
+ "Create aesthetic embedding": "生成美术风格 embedding",
+ "Image Browser": "图库浏览器",
+ "History": "历史记录",
+ "Settings": "设置",
+ "Prompt": "提示词",
+ "Negative prompt": "反向提示词",
+ "Run": "运行",
+ "Skip": "跳过",
+ "Interrupt": "中止",
+ "Generate": "生成",
+ "Style 1": "模版风格 1",
+ "Style 2": "模版风格 2",
+ "Label": "标签",
+ "File": "文件",
+ "Drop File Here": "拖拽文件到此",
+ "-": "-",
+ "or": "或",
+ "Click to Upload": "点击上传",
+ "Image": "图像",
+ "Check progress": "查看进度",
+ "Check progress (first)": "(首次)查看进度",
+ "Sampling Steps": "采样迭代步数",
+ "Sampling method": "采样方法",
+ "Euler a": "Euler a",
+ "Euler": "Euler",
+ "LMS": "LMS",
+ "Heun": "Heun",
+ "DPM2": "DPM2",
+ "DPM2 a": "DPM2 a",
+ "DPM fast": "DPM fast",
+ "DPM adaptive": "DPM adaptive",
+ "LMS Karras": "LMS Karras",
+ "DPM2 Karras": "DPM2 Karras",
+ "DPM2 a Karras": "DPM2 a Karras",
+ "DDIM": "DDIM",
+ "PLMS": "PLMS",
+ "Width": "宽度",
+ "Height": "高度",
+ "Restore faces": "面部修复",
+ "Tiling": "可平铺(Tiling)",
+ "Highres. fix": "高分辨率修复",
+ "Firstpass width": "第一遍的宽度",
+ "Firstpass height": "第一遍的高度",
+ "Denoising strength": "去噪强度",
+ "Batch count": "批次",
+ "Batch size": "批量",
+ "CFG Scale": "提示词相关性(CFG Scale)",
+ "Seed": "随机种子",
+ "Extra": "额外参数",
+ "Variation seed": "差异随机种子",
+ "Variation strength": "差异强度",
+ "Resize seed from width": "自宽度缩放随机种子",
+ "Resize seed from height": "自高度缩放随机种子",
+ "Open for Clip Aesthetic!": "打开美术风格 Clip!",
+ "▼": "▼",
+ "Aesthetic weight": "美术风格权重",
+ "Aesthetic steps": "美术风格迭代步数",
+ "Aesthetic learning rate": "美术风格学习率",
+ "Slerp interpolation": "Slerp 插值",
+ "Aesthetic imgs embedding": "美术风格图集 embedding",
+ "None": "无",
+ "Aesthetic text for imgs": "该图集的美术风格描述",
+ "Slerp angle": "Slerp 角度",
+ "Is negative text": "是反向提示词",
+ "Script": "脚本",
+ "Embedding to Shareable PNG": "将 Embedding 转换为可分享的 PNG",
+ "Prompt matrix": "提示词矩阵",
+ "Prompts from file or textbox": "从文本框或文件载入提示词",
+ "X/Y plot": "X/Y 图表",
+ "Source embedding to convert": "用于转换的源 Embedding",
+ "Embedding token": "Embedding 的 token (关键词)",
+ "Put variable parts at start of prompt": "把变量部分放在提示词文本的开头",
+ "Show Textbox": "显示文本框",
+ "File with inputs": "含输入内容的文件",
+ "Prompts": "提示词",
+ "X type": "X轴类型",
+ "Nothing": "无",
+ "Var. seed": "差异随机种子",
+ "Var. strength": "差异强度",
+ "Steps": "迭代步数",
+ "Prompt S/R": "提示词替换",
+ "Prompt order": "提示词顺序",
+ "Sampler": "采样器",
+ "Checkpoint name": "模型(ckpt)名",
+ "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": "去噪",
+ "X values": "X轴数值",
+ "Y type": "Y轴类型",
+ "Y values": "Y轴数值",
+ "Draw legend": "在图表中包括轴标题",
+ "Include Separate Images": "包括独立的图像",
+ "Keep -1 for seeds": "保持随机种子为-1",
+ "Drop Image Here": "拖拽图像到此",
+ "Save": "保存",
+ "Send to img2img": ">> 图生图",
+ "Send to inpaint": ">> 内补绘制",
+ "Send to extras": ">> 后处理",
+ "Make Zip when Save?": "保存时生成zip压缩文件?",
+ "Textbox": "文本框",
+ "Interrogate\nCLIP": "CLIP\n反推提示词",
+ "Interrogate\nDeepBooru": "DeepBooru\n反推提示词",
+ "Inpaint": "内补绘制",
+ "Batch img2img": "批量图生图",
+ "Image for img2img": "图生图的图像",
+ "Image for inpainting with mask": "用于内补绘制蒙版内容的图像",
+ "Mask": "蒙版",
+ "Mask blur": "蒙版模糊",
+ "Mask mode": "蒙版模式",
+ "Draw mask": "绘制蒙版",
+ "Upload mask": "上传蒙版",
+ "Masking mode": "蒙版模式",
+ "Inpaint masked": "内补绘制蒙版内容",
+ "Inpaint not masked": "内补绘制非蒙版内容",
+ "Masked content": "蒙版蒙住的内容",
+ "fill": "填充",
+ "original": "原图",
+ "latent noise": "潜空间噪声",
+ "latent nothing": "潜空间数值零",
+ "Inpaint at full resolution": "以完整分辨率进行内补绘制",
+ "Inpaint at full resolution padding, pixels": "以完整分辨率进行内补绘制 - 填补像素",
+ "Process images in a directory on the same machine where the server is running.": "在服务器主机上的目录中处理图像",
+ "Use an empty output directory to save pictures normally instead of writing to the output directory.": "指定一个空的文件夹为输出目录而非默认的 output 文件夹为输出目录",
+ "Disabled when launched with --hide-ui-dir-config.": "启动 --hide-ui-dir-config 时禁用",
+ "Input directory": "输入目录",
+ "Output directory": "输出目录",
+ "Resize mode": "缩放模式",
+ "Just resize": "只缩放",
+ "Crop and resize": "缩放并剪裁",
+ "Resize and fill": "缩放并填充",
+ "img2img alternative test": "图生图的另一种测试",
+ "Loopback": "回送",
+ "Outpainting mk2": "外补绘制第二版",
+ "Poor man's outpainting": "效果稍差的外补绘制",
+ "SD upscale": "使用 SD 放大(SD upscale)",
+ "should be 2 or lower.": "必须小于等于2",
+ "Override `Sampling method` to Euler?(this method is built for it)": "覆写 `采样方法` 为 Euler?(这个方法就是为这样做设计的)",
+ "Override `prompt` to the same value as `original prompt`?(and `negative prompt`)": "覆写 `提示词` 为 `初始提示词`?(包括`反向提示词`)",
+ "Original prompt": "初始提示词",
+ "Original negative prompt": "初始反向提示词",
+ "Override `Sampling Steps` to the same value as `Decode steps`?": "覆写 `采样迭代步数` 为 `解码迭代步数`?",
+ "Decode steps": "解码迭代步数",
+ "Override `Denoising strength` to 1?": "覆写 `去噪强度` 为 1?",
+ "Decode CFG scale": "解码提示词相关性(CFG scale)",
+ "Randomness": "随机度",
+ "Sigma adjustment for finding noise for image": "为寻找图中噪点的 Sigma 调整",
+ "Loops": "迭代次数",
+ "Denoising strength change factor": "去噪强度的调整系数",
+ "Recommended settings: Sampling Steps: 80-100, Sampler: Euler a, Denoising strength: 0.8": "推荐设置:采样迭代步数:80-100,采样器:Euler a,去噪强度:0.8",
+ "Pixels to expand": "拓展的像素数",
+ "Outpainting direction": "外补绘制的方向",
+ "left": "左",
+ "right": "右",
+ "up": "上",
+ "down": "下",
+ "Fall-off exponent (lower=higher detail)": "衰减指数(越低细节越好)",
+ "Color variation": "色彩变化",
+ "Will upscale the image to twice the dimensions; use width and height sliders to set tile size": "将图像放大到两倍尺寸; 使用宽度和高度滑块设置图块尺寸(tile size)",
+ "Tile overlap": "图块重叠的像素(Tile overlap)",
+ "Upscaler": "放大算法",
+ "Lanczos": "Lanczos",
+ "LDSR": "LDSR",
+ "BSRGAN 4x": "BSRGAN 4x",
+ "ESRGAN_4x": "ESRGAN_4x",
+ "R-ESRGAN 4x+ Anime6B": "R-ESRGAN 4x+ Anime6B",
+ "ScuNET GAN": "ScuNET GAN",
+ "ScuNET PSNR": "ScuNET PSNR",
+ "SwinIR_4x": "SwinIR 4x",
+ "Single Image": "单个图像",
+ "Batch Process": "批量处理",
+ "Batch from Directory": "从目录进行批量处理",
+ "Source": "来源",
+ "Show result images": "显示输出图像",
+ "Scale by": "等比缩放",
+ "Scale to": "指定尺寸缩放",
+ "Resize": "缩放",
+ "Crop to fit": "裁剪以适应",
+ "Upscaler 2": "放大算法 2",
+ "Upscaler 2 visibility": "放大算法 2 可见度",
+ "GFPGAN visibility": "GFPGAN 可见度",
+ "CodeFormer visibility": "CodeFormer 可见度",
+ "CodeFormer weight (0 = maximum effect, 1 = minimum effect)": "CodeFormer 权重 (0 = 最大效果, 1 = 最小效果)",
+ "Open output directory": "打开输出目录",
+ "Send to txt2img": ">> 文生图",
+ "A merger of the two checkpoints will be generated in your": "合并后的模型(ckpt)会生成在你的",
+ "checkpoint": "模型(ckpt)",
+ "directory.": "目录",
+ "Primary model (A)": "主要模型 (A)",
+ "Secondary model (B)": "第二模型 (B)",
+ "Tertiary model (C)": "第三模型 (C)",
+ "Custom Name (Optional)": "自定义名称 (可选)",
+ "Multiplier (M) - set to 0 to get model A": "倍率 (M) - 设为 0 等价于模型 A",
+ "Interpolation Method": "插值方法",
+ "Weighted sum": "加权和",
+ "Add difference": "添加差分",
+ "Save as float16": "以 float16 储存",
+ "See": "查看",
+ "wiki": "wiki",
+ "for detailed explanation.": "以了解详细说明",
+ "Create embedding": "生成 embedding",
+ "Create aesthetic images embedding": "生成美术风格图集 embedding",
+ "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 的激活函数",
+ "linear": "linear",
+ "relu": "relu",
+ "leakyrelu": "leakyrelu",
+ "elu": "elu",
+ "swish": "swish",
+ "Add layer normalization": "添加层标准化",
+ "Use dropout": "采用 dropout 防止过拟合",
+ "Overwrite Old Hypernetwork": "覆写旧的 Hypernetwork",
+ "Source directory": "源目录",
+ "Destination directory": "目标目录",
+ "Existing Caption txt Action": "对已有的 txt 说明文字的行为",
+ "ignore": "无视",
+ "copy": "复制",
+ "prepend": "放前面",
+ "append": "放后面",
+ "Create flipped copies": "生成镜像副本",
+ "Split oversized images into two": "将过大的图像分为两份",
+ "Split oversized images": "分割过大的图像",
+ "Use BLIP for caption": "使用 BLIP 生成说明文字(自然语言描述)",
+ "Use deepbooru for caption": "使用 deepbooru 生成说明文字(tags)",
+ "Split image threshold": "图像分割阈值",
+ "Split image overlap ratio": "分割图像重叠的比率",
+ "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]",
+ "Embedding": "Embedding",
+ "Embedding Learning rate": "Embedding 学习率",
+ "Hypernetwork Learning rate": "Hypernetwork 学习率",
+ "Learning rate": "学习率",
+ "Dataset directory": "数据集目录",
+ "Log directory": "日志目录",
+ "Prompt template file": "提示词模版文件",
+ "Max steps": "最大迭代步数",
+ "Save an image to log directory every N steps, 0 to disable": "每 N 步保存一个图像到日志目录,0 表示禁用",
+ "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 Embedding": "训练 Embedding",
+ "Create an aesthetic embedding out of any number of images": "从任意数量的图像中创建美术风格 embedding",
+ "Create images embedding": "生成图集 embedding",
+ "txt2img history": "文生图历史记录",
+ "img2img history": "图生图历史记录",
+ "extras history": "后处理历史记录",
+ "Renew Page": "刷新页面",
+ "extras": "后处理",
+ "favorites": "收藏夹",
+ "custom fold": "自定义文件夹",
+ "Load": "载入",
+ "Images directory": "图像目录",
+ "Prev batch": "上一批",
+ "Next batch": "下一批",
+ "First Page": "首页",
+ "Prev Page": "上一页",
+ "Page Index": "页数",
+ "Next Page": "下一页",
+ "End Page": "尾页",
+ "number of images to delete consecutively next": "接下来要连续删除的图像数",
+ "Delete": "删除",
+ "Generate Info": "生成信息",
+ "File Name": "文件名",
+ "Collect": "收藏",
+ "Refresh page": "刷新页面",
+ "Date to": "日期至",
+ "Number": "数量",
+ "set_index": "设置索引",
+ "Checkbox": "勾选框",
+ "Apply settings": "保存设置",
+ "Saving images/grids": "保存图像/概览图",
+ "Always save all generated images": "始终保存所有生成的图像",
+ "File format for images": "图像的文件格式",
+ "Images filename pattern": "图像文件名格式",
+ "Always save all generated image grids": "始终保存所有生成的概览图",
+ "File format for grids": "概览图的文件格式",
+ "Add extended info (seed, prompt) to filename when saving grid": "保存概览时将扩展信息(随机种子、提示词)添加到文件名",
+ "Do not save grids consisting of one picture": "只有一张图片时不要保存概览图",
+ "Prevent empty spots in grid (when set to autodetect)": "(在自动检测时)防止概览图中出现空位",
+ "Grid row count; use -1 for autodetect and 0 for it to be same as batch size": "概览行数; 使用 -1 进行自动检测,使用 0 使其与批量大小相同",
+ "Save text information about generation parameters as chunks to png files": "将有关生成参数的文本信息作为块保存到 png 文件中",
+ "Create a text file next to every image with generation parameters.": "保存图像时在每个图像旁边创建一个文本文件储存生成参数",
+ "Save a copy of image before doing face restoration.": "在进行面部修复之前保存图像副本",
+ "Quality for saved jpeg images": "保存的 jpeg 图像的质量",
+ "If PNG image is larger than 4MB or any dimension is larger than 4000, downscale and save copy as JPG": "如果 PNG 图像大于 4MB 或宽高大于 4000,则缩小并保存副本为 JPG",
+ "Use original name for output filename during batch process in extras tab": "在后处理选项卡中的批量处理过程中使用原始名称作为输出文件名",
+ "When using 'Save' button, only save a single selected image": "使用“保存”按钮时,只保存一个选定的图像",
+ "Do not add watermark to images": "不要给图像加水印",
+ "Paths for saving": "保存路径",
+ "Output directory for images; if empty, defaults to three directories below": "图像的输出目录; 如果为空,则默认为以下三个目录",
+ "Output directory for txt2img images": "文生图的输出目录",
+ "Output directory for img2img images": "图生图的输出目录",
+ "Output directory for images from extras tab": "后处理的输出目录",
+ "Output directory for grids; if empty, defaults to two directories below": "概览图的输出目录; 如果为空,则默认为以下两个目录",
+ "Output directory for txt2img grids": "文生图概览的输出目录",
+ "Output directory for img2img grids": "图生图概览的输出目录",
+ "Directory for saving images using the Save button": "使用“保存”按钮保存图像的目录",
+ "Saving to a directory": "保存到目录",
+ "Save images to a subdirectory": "将图像保存到子目录",
+ "Save grids to a subdirectory": "将概览图保存到子目录",
+ "When using \"Save\" button, save images to a subdirectory": "使用“保存”按钮时,将图像保存到子目录",
+ "Directory name pattern": "目录名称格式",
+ "Max prompt words for [prompt_words] pattern": "[prompt_words] 格式的最大提示词数量",
+ "Upscaling": "放大",
+ "Tile size for ESRGAN upscalers. 0 = no tiling.": "ESRGAN 的图块尺寸(Tile size)。0 = 不分块(no tiling)",
+ "Tile overlap, in pixels for ESRGAN upscalers. Low values = visible seam.": "ESRGAN 的图块重叠(Tile overlap)像素。低值 = 可见接缝",
+ "Tile size for all SwinIR.": "适用所有 SwinIR 系算法的图块尺寸(Tile size)",
+ "Tile overlap, in pixels for SwinIR. Low values = visible seam.": "SwinIR 的图块重叠(Tile overlap)像素。低值 = 可见接缝",
+ "LDSR processing steps. Lower = faster": "LDSR 处理迭代步数。更低 = 更快",
+ "Upscaler for img2img": "图生图的放大算法",
+ "Upscale latent space image when doing hires. fix": "做高分辨率修复时也放大潜空间图像",
+ "Face restoration": "面部修复",
+ "CodeFormer weight parameter; 0 = maximum effect; 1 = minimum effect": "CodeFormer 权重参数; 0 = 最大效果; 1 = 最小效果",
+ "Move face restoration model from VRAM into RAM after processing": "面部修复处理完成后将面部修复模型从显存(VRAM)移至内存(RAM)",
+ "System": "系统",
+ "VRAM usage polls per second during generation. Set to 0 to disable.": "生成图像时每秒轮询显存(VRAM)使用情况的次数。设置为 0 以禁用",
+ "Always print all generation info to standard output": "始终将所有生成信息输出到 standard output (一般为控制台)",
+ "Add a second progress bar to the console that shows progress for an entire job.": "向控制台添加第二个进度条,显示整个作业的进度",
+ "Training": "训练",
+ "Unload VAE and CLIP from VRAM when training": "训练时从显存(VRAM)中取消 VAE 和 CLIP 的加载",
+ "Move VAE and CLIP to RAM when training hypernetwork. Saves VRAM.": "训练时将 VAE 和 CLIP 从显存(VRAM)移放到内存(RAM),节省显存(VRAM)",
+ "Filename word regex": "文件名用词的正则表达式",
+ "Filename join string": "文件名连接用字符串",
+ "Number of repeats for a single input image per epoch; used only for displaying epoch number": "每个 epoch 中单个输入图像的重复次数; 仅用于显示 epoch 数",
+ "Save an csv containing the loss to log directory every N steps, 0 to disable": "每 N 步保存一个包含 loss 的 csv 到日志目录,0 表示禁用",
+ "Stable Diffusion": "Stable Diffusion",
+ "Checkpoints to cache in RAM": "缓存在内存(RAM)中的模型(ckpt)",
+ "Hypernetwork strength": "Hypernetwork 强度",
+ "Apply color correction to img2img results to match original colors.": "对图生图结果应用颜色校正以匹配原始颜色",
+ "Save a copy of image before applying color correction to img2img results": "在对图生图结果应用颜色校正之前保存图像副本",
+ "With img2img, do exactly the amount of steps the slider specifies (normally you'd do less with less denoising).": "在进行图生图的时候,确切地执行滑块指定的迭代步数(正常情况下更弱的去噪需要更少的迭代步数)",
+ "Enable quantization in K samplers for sharper and cleaner results. This may change existing seeds. Requires restart to apply.": "在 K 采样器中启用量化以获得更清晰、更清晰的结果。这可能会改变现有的随机种子。需要重新启动才能应用",
+ "Emphasis: use (text) to make model pay more attention to text and [text] to make it pay less attention": "强调符:使用 (文字) 使模型更关注该文本,使用 [文字] 使其减少关注",
+ "Use old emphasis implementation. Can be useful to reproduce old seeds.": "使用旧的强调符实现。可用于复现旧随机种子",
+ "Make K-diffusion samplers produce same images in a batch as when making a single image": "使 K-diffusion 采样器批量生成与生成单个图像时产出相同的图像",
+ "Increase coherency by padding from the last comma within n tokens when using more than 75 tokens": "当使用超过 75 个 token 时,通过从 n 个 token 中的最后一个逗号填补来提高一致性",
+ "Filter NSFW content": "过滤成人内容",
+ "Stop At last layers of CLIP model": "在 CLIP 模型的最后哪一层停下",
+ "Interrogate Options": "反推提示词选项",
+ "Interrogate: keep models in VRAM": "反推: 将模型保存在显存(VRAM)中",
+ "Interrogate: use artists from artists.csv": "反推: 使用 artists.csv 中的艺术家",
+ "Interrogate: include ranks of model tags matches in results (Has no effect on caption-based interrogators).": "反推: 在生成结果中包含与模型标签(tags)相匹配的等级(对基于生成自然语言描述的反推没有影响)",
+ "Interrogate: num_beams for BLIP": "反推: BLIP 的 num_beams",
+ "Interrogate: minimum description length (excluding artists, etc..)": "反推: 最小描述长度(不包括艺术家, 等…)",
+ "Interrogate: maximum description length": "反推: 最大描述长度",
+ "CLIP: maximum number of lines in text file (0 = No limit)": "CLIP: 文本文件中的最大行数(0 = 无限制)",
+ "Interrogate: deepbooru score threshold": "反推: deepbooru 分数阈值",
+ "Interrogate: deepbooru sort alphabetically": "反推: deepbooru 按字母顺序排序",
+ "use spaces for tags in deepbooru": "在 deepbooru 中为标签使用空格",
+ "escape (\\) brackets in deepbooru (so they are used as literal brackets and not for emphasis)": "在 deepbooru 中使用转义 (\\) 括号(因此它们用作文字括号而不是强调符号)",
+ "User interface": "用户界面",
+ "Show progressbar": "显示进度条",
+ "Show image creation progress every N sampling steps. Set 0 to disable.": "每 N 个采样迭代步数显示图像生成进度。设置 0 禁用",
+ "Show previews of all images generated in a batch as a grid": "以网格的形式预览所有批量生成出来的图像",
+ "Show grid in results for web": "在网页的结果中显示概览图",
+ "Do not show any images in results for web": "不在网页的结果中显示任何图像",
+ "Add model hash to generation information": "将模型的哈希值添加到生成信息",
+ "Add model name to generation information": "将模型名称添加到生成信息",
+ "When reading generation parameters from text into UI (from PNG info or pasted text), do not change the selected model/checkpoint.": "当从文本读取生成参数到 UI(从 PNG 信息或粘贴文本)时,不要更改选定的模型(ckpt)",
+ "Font for image grids that have text": "有文字的概览图使用的字体",
+ "Enable full page image viewer": "启用整页图像查看器",
+ "Show images zoomed in by default in full page image viewer": "在整页图像查看器中默认放大显示图像",
+ "Show generation progress in window title.": "在窗口标题中显示生成进度",
+ "Quicksettings list": "快速设置列表",
+ "Localization (requires restart)": "本地化(需要重新启动)",
+ "Sampler parameters": "采样器参数",
+ "Hide samplers in user interface (requires restart)": "在用户界面中隐藏采样器(需要重新启动)",
+ "eta (noise multiplier) for DDIM": "DDIM 的 eta (噪声乘数) ",
+ "eta (noise multiplier) for ancestral samplers": "ancestral 采样器的 eta (噪声乘数)",
+ "img2img DDIM discretize": "图生图 DDIM 离散化",
+ "uniform": "均勻",
+ "quad": "二阶",
+ "sigma churn": "sigma churn",
+ "sigma tmin": "最小(tmin) sigma",
+ "sigma noise": "sigma 噪声",
+ "Eta noise seed delta": "Eta 噪声种子偏移(noise seed delta)",
+ "Images Browser": "图库浏览器",
+ "Preload images at startup": "在启动时预载图像",
+ "Number of columns on the page": "每页列数",
+ "Number of rows on the page": "每页行数",
+ "Number of pictures displayed on each page": "每页显示的图像数量",
+ "Minimum number of pages per load": "每次加载的最小页数",
+ "Number of grids in each row": "每行显示多少格",
+ "Wildcards": "通配符",
+ "Use same seed for all images": "为所有图像使用同一个随机种子",
+ "Request browser notifications": "请求浏览器通知",
+ "Download localization template": "下载本地化模板",
+ "Reload custom script bodies (No ui updates, No restart)": "重新加载自定义脚本主体(无 ui 更新,无重启)",
+ "Restart Gradio and Refresh components (Custom Scripts, ui.py, js and css only)": "重启 Gradio 及刷新组件(仅限自定义脚本、ui.py、js 和 css)",
+ "Prompt (press Ctrl+Enter or Alt+Enter to generate)": "提示词(按 Ctrl+Enter 或 Alt+Enter 生成)",
+ "Negative prompt (press Ctrl+Enter or Alt+Enter to generate)": "反向提示词(按 Ctrl+Enter 或 Alt+Enter 生成)",
+ "Add a random artist to the prompt.": "随机添加一个艺术家到提示词中",
+ "Read generation parameters from prompt or last generation if prompt is empty into user interface.": "从提示词中读取生成参数,如果提示词为空,则读取上一次的生成参数到用户界面",
+ "Save style": "储存为模版风格",
+ "Apply selected styles to current prompt": "将所选样式应用于当前提示",
+ "Stop processing current image and continue processing.": "停止处理当前图像并继续处理下一个",
+ "Stop processing images and return any results accumulated so far.": "停止处理图像并返回迄今为止累积的任何结果",
+ "Style to apply; styles have components for both positive and negative prompts and apply to both": "要应用的模版风格; 模版风格包含正向和反向提示词,并应用于两者",
+ "Do not do anything special": "什么都不做",
+ "Which algorithm to use to produce the image": "使用哪种算法生成图像",
+ "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 不会有正面作用",
+ "Denoising Diffusion Implicit Models - best at inpainting": "Denoising Diffusion Implicit models - 最擅长内补绘制",
+ "Produce an image that can be tiled.": "生成可用于平铺(tiled)的图像",
+ "Use a two step process to partially create an image at smaller resolution, upscale, and then improve details in it without changing composition": "使用两步处理的时候以较小的分辨率生成初步图像、接着放大图像,然后在不更改构图的情况下改进其中的细节",
+ "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 时,处理的迭代步数将少于“采样迭代步数”滑块指定的步数",
+ "How many batches of images to create": "创建多少批次的图像",
+ "How many image to create in a single batch": "每批创建多少图像",
+ "Classifier Free Guidance Scale - how strongly the image should conform to prompt - lower values produce more creative results": "Classifier Free Guidance Scale - 图像应在多大程度上服从提示词 - 较低的值会产生更有创意的结果",
+ "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": "一个固定随机数生成器输出的值 - 以相同参数和随机种子生成的图像会得到相同的结果",
+ "Set seed to -1, which will cause a new random number to be used every time": "将随机种子设置为-1,则每次都会使用一个新的随机数",
+ "Reuse seed from last generation, mostly useful if it was randomed": "重用上一次使用的随机种子,如果想要固定结果就会很有用",
+ "Seed of a different picture to be mixed into the generation.": "将要参与生成的另一张图的随机种子",
+ "How strong of a variation to produce. At 0, there will be no effect. At 1, you will get the complete picture with variation seed (except for ancestral samplers, where you will just get something).": "想要产生多强烈的变化。设为 0 时,将没有效果。设为 1 时,你将获得完全产自差异随机种子的图像(ancestral 采样器除外,你只是单纯地生成了一些东西)",
+ "Make an attempt to produce a picture similar to what would have been produced with same seed at specified resolution": "尝试生成与在指定分辨率下使用相同随机种子生成的图像相似的图片",
+ "This text is used to rotate the feature space of the imgs embs": "此文本用于旋转图集 embeddings 的特征空间",
+ "Separate values for X axis using commas.": "使用逗号分隔 X 轴的值",
+ "Separate values for Y axis using commas.": "使用逗号分隔 Y 轴的值",
+ "Write image to a directory (default - log/images) and generation parameters into csv file.": "将图像写入目录(默认 - log/images)并将生成参数写入 csv 文件",
+ "Open images output directory": "打开图像输出目录",
+ "How much to blur the mask before processing, in pixels.": "处理前要对蒙版进行多强的模糊,以像素为单位",
+ "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": "用潜空间的零填充它",
+ "Upscale masked region to target resolution, do inpainting, downscale back and paste into original image": "将蒙版区域放大到目标分辨率,做内补绘制,缩小后粘贴到原始图像中",
+ "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.": "调整图像大小,使整个目标分辨率都被图像填充。裁剪多出来的部分",
+ "Resize the image so that entirety of image is inside target resolution. Fill empty space with image's colors.": "调整图像大小,使整个图像在目标分辨率内。用图像的颜色填充空白区域",
+ "How many times to repeat processing an image and using it as input for the next iteration": "重复处理图像并用作下次迭代输入的次数",
+ "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 意味着增加多样性,因此你的这一组图将变得越来越混乱",
+ "For SD upscale, how much overlap in pixels should there be between tiles. Tiles overlap so that when they are merged back into one picture, there is no clearly visible seam.": "使用 SD 放大(SD upscale)时,图块(Tiles)之间应该有多少像素重叠。图块(Tiles)之间需要重叠才可以让它们在合并回一张图像时,没有清晰可见的接缝",
+ "A directory on the same machine where the server is running.": "与服务器主机上的目录",
+ "Leave blank to save images to the default path.": "留空以将图像保存到默认路径",
+ "Result = A * (1 - M) + B * M": "结果 = A * (1 - M) + B * M",
+ "Result = A + (B - C) * M": "结果 = A + (B - C) * M",
+ "1st and last digit must be 1. ex:'1, 2, 1'": "第一个和最后一个数字必须是 1。例:'1, 2, 1'",
+ "how fast should the training go. Low values will take longer to train, high values may fail to converge (not generate accurate results) and/or may break the embedding (This has happened if you see Loss: nan in the training info textbox. If this happens, you need to manually restore your embedding from an older not-broken backup).\n\nYou can set a single numeric value, or multiple learning rates using the syntax:\n\n rate_1:max_steps_1, rate_2:max_steps_2, ...\n\nEG: 0.005:100, 1e-3:1000, 1e-5\n\nWill train with rate of 0.005 for first 100 steps, then 1e-3 until 1000 steps, then 1e-5 for all remaining steps.": "训练应该多快。低值将需要更长的时间来训练,高值可能无法收敛(无法产生准确的结果)以及/也许可能会破坏 embedding(如果你在训练信息文本框中看到 Loss: nan 就会发生这种情况。如果发生这种情况,你需要从较旧的未损坏的备份手动恢复 embedding)\n\n你可以使用以下语法设置单个数值或多个学习率:\n\n 率1:步限1, 率2:步限2, ...\n\n如: 0.005:100, 1e-3:1000, 1e-5\n\n即前 100 步将以 0.005 的速率训练,接着直到 1000 步为止以 1e-3 训练,然后剩余所有步以 1e-5 训练",
+ "Path to directory with input images": "带有输入图像的路径",
+ "Path to directory where to write outputs": "进行输出的路径",
+ "Input images directory": "输入图像目录",
+ "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.": "使用以下标签定义如何选择图像的文件名: [steps], [cfg], [prompt], [prompt_no_styles], [prompt_spaces], [width], [height], [styles], [sampler], [seed], [model_hash], [prompt_words], [date], [datetime], [job_timestamp]; 默认请留空",
+ "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.": "如果启用此选项,水印将不会添加到生成出来的图像中。警告:如果你不添加水印,你的行为可能是不符合专业操守的",
+ "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.": "使用以下标签定义如何选择图像和概览图的子目录: [steps], [cfg], [prompt], [prompt_no_styles], [prompt_spaces], [width], [height], [styles], [sampler], [seed], [model_hash], [prompt_words], [date], [datetime], [job_timestamp]; 默认请留空",
+ "Restore low quality faces using GFPGAN neural network": "使用 GFPGAN 神经网络修复低质量面部",
+ "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.": "如果启用了上述选项,则此处的字符会用于将拆分的单词接合为同一行",
+ "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。需要重新启动才能应用",
+ "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.": "如果这个值不为零,它将被添加到随机种子中,并在使用带有 Eta 的采样器时用于初始化随机噪声。你可以使用它来产生更多的图像变化,或者你可以使用它来模仿其他软件生成的图像,如果你知道你在做什么",
+ "Enable Autocomplete": "开启Tag补全",
+ "Allowed categories for random artists selection when using the Roll button": "使用抽选艺术家按钮时将会随机的艺术家类别",
+ "Roll three": "抽三位出來",
+ "Generate forever": "不停地生成",
+ "Cancel generate forever": "取消不停地生成"
+}
diff --git a/localizations/zh_TW.json b/localizations/zh_TW.json
new file mode 100644
index 00000000..724df1ac
--- /dev/null
+++ b/localizations/zh_TW.json
@@ -0,0 +1,488 @@
+{
+ "⤡": "⤡",
+ "⊞": "⊞",
+ "×": "×",
+ "❮": "❮",
+ "❯": "❯",
+ "Loading...": "載入中…",
+ "view": "檢視",
+ "api": "api",
+ "•": "•",
+ "built with gradio": "基於 Gradio 構建",
+ "Stable Diffusion checkpoint": "Stable Diffusion 模型權重存檔點",
+ "txt2img": "文生圖",
+ "img2img": "圖生圖",
+ "Extras": "後處理",
+ "PNG Info": "PNG 資訊",
+ "Checkpoint Merger": "模型權重存檔點合併工具",
+ "Train": "訓練",
+ "Create aesthetic embedding": "生成美術風格 embedding",
+ "Image Browser": "圖庫瀏覽器",
+ "History": "歷史記錄",
+ "Settings": "設定",
+ "Prompt": "提示詞",
+ "Negative prompt": "反向提示詞",
+ "Run": "執行",
+ "Skip": "跳過",
+ "Interrupt": "中止",
+ "Generate": "生成",
+ "Style 1": "模版風格 1",
+ "Style 2": "模版風格 2",
+ "Label": "標籤",
+ "File": "檔案",
+ "Drop File Here": "拖曳檔案到此",
+ "-": "-",
+ "or": "或",
+ "Click to Upload": "點擊上傳",
+ "Image": "圖像",
+ "Check progress": "檢視進度",
+ "Check progress (first)": "(首次)檢視進度",
+ "Sampling Steps": "採樣疊代步數",
+ "Sampling method": "採樣方法",
+ "Euler a": "Euler a",
+ "Euler": "Euler",
+ "LMS": "LMS",
+ "Heun": "Heun",
+ "DPM2": "DPM2",
+ "DPM2 a": "DPM2 a",
+ "DPM fast": "DPM fast",
+ "DPM adaptive": "DPM adaptive",
+ "LMS Karras": "LMS Karras",
+ "DPM2 Karras": "DPM2 Karras",
+ "DPM2 a Karras": "DPM2 a Karras",
+ "DDIM": "DDIM",
+ "PLMS": "PLMS",
+ "Width": "寬度",
+ "Height": "高度",
+ "Restore faces": "面部修復",
+ "Tiling": "可平鋪",
+ "Highres. fix": "高解析度修復",
+ "Firstpass width": "第一遍的寬度",
+ "Firstpass height": "第一遍的高度",
+ "Denoising strength": "去噪強度",
+ "Batch count": "批次",
+ "Batch size": "批量",
+ "CFG Scale": "提示詞相關性(CFG)",
+ "Seed": "隨機種子",
+ "Extra": "額外參數",
+ "Variation seed": "差異隨機種子",
+ "Variation strength": "差異強度",
+ "Resize seed from width": "自寬度縮放隨機種子",
+ "Resize seed from height": "自高度縮放隨機種子",
+ "Open for Clip Aesthetic!": "打開美術風格 Clip!",
+ "▼": "▼",
+ "Aesthetic weight": "美術風格權重",
+ "Aesthetic steps": "美術風格疊代步數",
+ "Aesthetic learning rate": "美術風格學習率",
+ "Slerp interpolation": "Slerp 插值",
+ "Aesthetic imgs embedding": "美術風格圖集 embedding",
+ "None": "無",
+ "Aesthetic text for imgs": "該圖集的美術風格描述",
+ "Slerp angle": "Slerp 角度",
+ "Is negative text": "是反向提示詞",
+ "Script": "指令碼",
+ "Embedding to Shareable PNG": "將 Embedding 轉換為可分享的 PNG",
+ "Prompt matrix": "提示詞矩陣",
+ "Prompts from file or textbox": "從文字方塊或檔案載入提示詞",
+ "X/Y plot": "X/Y 圖表",
+ "Source embedding to convert": "用於轉換的源 Embedding",
+ "Embedding token": "Embedding 的關鍵詞",
+ "Put variable parts at start of prompt": "把變量部分放在提示詞文本的開頭",
+ "Show Textbox": "顯示文字方塊",
+ "File with inputs": "含輸入內容的檔案",
+ "Prompts": "提示詞",
+ "X type": "X軸類型",
+ "Nothing": "無",
+ "Var. seed": "差異隨機種子",
+ "Var. strength": "差異強度",
+ "Steps": "疊代步數",
+ "Prompt S/R": "提示詞替換",
+ "Prompt order": "提示詞順序",
+ "Sampler": "採樣器",
+ "Checkpoint name": "模型權重存檔點的名稱",
+ "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": "去噪",
+ "X values": "X軸數值",
+ "Y type": "Y軸類型",
+ "Y values": "Y軸數值",
+ "Draw legend": "在圖表中包括軸標題",
+ "Include Separate Images": "包括獨立的圖像",
+ "Keep -1 for seeds": "保持隨機種子為-1",
+ "Drop Image Here": "拖曳圖像到此",
+ "Save": "儲存",
+ "Send to img2img": ">> 圖生圖",
+ "Send to inpaint": ">> 內補繪製",
+ "Send to extras": ">> 後處理",
+ "Make Zip when Save?": "儲存時生成ZIP壓縮檔案?",
+ "Textbox": "文字方塊",
+ "Interrogate\nCLIP": "CLIP\n反推提示詞",
+ "Interrogate\nDeepBooru": "DeepBooru\n反推提示詞",
+ "Inpaint": "內補繪製",
+ "Batch img2img": "批量圖生圖",
+ "Image for img2img": "圖生圖的圖像",
+ "Image for inpainting with mask": "用於內補繪製蒙版內容的圖像",
+ "Mask": "蒙版",
+ "Mask blur": "蒙版模糊",
+ "Mask mode": "蒙版模式",
+ "Draw mask": "繪製蒙版",
+ "Upload mask": "上傳蒙版",
+ "Masking mode": "蒙版模式",
+ "Inpaint masked": "內補繪製蒙版內容",
+ "Inpaint not masked": "內補繪製非蒙版內容",
+ "Masked content": "蒙版蒙住的內容",
+ "fill": "填充",
+ "original": "原圖",
+ "latent noise": "潛空間噪聲",
+ "latent nothing": "潛空間數值零",
+ "Inpaint at full resolution": "以完整解析度進行內補繪製",
+ "Inpaint at full resolution padding, pixels": "以完整解析度進行內補繪製 — 填補畫素",
+ "Process images in a directory on the same machine where the server is running.": "在伺服器主機上的目錄中處理圖像",
+ "Use an empty output directory to save pictures normally instead of writing to the output directory.": "指定一個空的資料夾為輸出目錄而非預設的 output 資料夾為輸出目錄",
+ "Disabled when launched with --hide-ui-dir-config.": "啟動 --hide-ui-dir-config 時禁用",
+ "Input directory": "輸入目錄",
+ "Output directory": "輸出目錄",
+ "Resize mode": "縮放模式",
+ "Just resize": "只縮放",
+ "Crop and resize": "縮放並剪裁",
+ "Resize and fill": "縮放並填充",
+ "img2img alternative test": "圖生圖的另一種測試",
+ "Loopback": "回送",
+ "Outpainting mk2": "外補繪製第二版",
+ "Poor man's outpainting": "效果稍差的外補繪製",
+ "SD upscale": "使用 SD 放大",
+ "should be 2 or lower.": "必須小於等於2",
+ "Override `Sampling method` to Euler?(this method is built for it)": "覆寫「採樣方法」為 Euler?(這個方法就是為這樣做設計的)",
+ "Override `prompt` to the same value as `original prompt`?(and `negative prompt`)": "覆寫「提示詞」為「初始提示詞」?(包括「反向提示詞」)",
+ "Original prompt": "初始提示詞",
+ "Original negative prompt": "初始反向提示詞",
+ "Override `Sampling Steps` to the same value as `Decode steps`?": "覆寫「採樣疊代步數」為「解碼疊代步數」?",
+ "Decode steps": "解碼疊代步數",
+ "Override `Denoising strength` to 1?": "覆寫「去噪強度」為1?",
+ "Decode CFG scale": "解碼提示詞相關性(CFG)",
+ "Randomness": "隨機度",
+ "Sigma adjustment for finding noise for image": "為尋找圖中噪點的 Sigma 調整",
+ "Loops": "疊代次數",
+ "Denoising strength change factor": "去噪強度的調整係數",
+ "Recommended settings: Sampling Steps: 80-100, Sampler: Euler a, Denoising strength: 0.8": "推薦設定:採樣疊代步數:80-100,採樣器:Euler a,去噪強度:0.8",
+ "Pixels to expand": "拓展的畫素數",
+ "Outpainting direction": "外補繪製的方向",
+ "left": "左",
+ "right": "右",
+ "up": "上",
+ "down": "下",
+ "Fall-off exponent (lower=higher detail)": "衰減指數(越低細節越好)",
+ "Color variation": "色彩變化",
+ "Will upscale the image to twice the dimensions; use width and height sliders to set tile size": "將圖像放大到兩倍尺寸; 使用寬度和高度滑塊設定圖塊尺寸",
+ "Tile overlap": "圖塊重疊的畫素",
+ "Upscaler": "放大演算法",
+ "Lanczos": "Lanczos",
+ "LDSR": "LDSR",
+ "BSRGAN 4x": "BSRGAN 4x",
+ "ESRGAN_4x": "ESRGAN_4x",
+ "R-ESRGAN 4x+ Anime6B": "R-ESRGAN 4x+ Anime6B",
+ "ScuNET GAN": "ScuNET GAN",
+ "ScuNET PSNR": "ScuNET PSNR",
+ "SwinIR_4x": "SwinIR 4x",
+ "Single Image": "單個圖像",
+ "Batch Process": "批量處理",
+ "Batch from Directory": "從目錄進行批量處理",
+ "Source": "來源",
+ "Show result images": "顯示輸出圖像",
+ "Scale by": "等比縮放",
+ "Scale to": "指定尺寸縮放",
+ "Resize": "縮放",
+ "Crop to fit": "裁剪以適應",
+ "Upscaler 2": "放大演算法 2",
+ "Upscaler 2 visibility": "放大演算法 2 可見度",
+ "GFPGAN visibility": "GFPGAN 可見度",
+ "CodeFormer visibility": "CodeFormer 可見度",
+ "CodeFormer weight (0 = maximum effect, 1 = minimum effect)": "CodeFormer 權重 (0 = 最大效果, 1 = 最小效果)",
+ "Open output directory": "打開輸出目錄",
+ "Send to txt2img": ">> 文生圖",
+ "A merger of the two checkpoints will be generated in your": "合併後的模型權重存檔點會生成在你的",
+ "checkpoint": "模型權重存檔點",
+ "directory.": "目錄",
+ "Primary model (A)": "主要模型 (A)",
+ "Secondary model (B)": "第二模型 (B)",
+ "Tertiary model (C)": "第三模型 (C)",
+ "Custom Name (Optional)": "自訂名稱 (可選)",
+ "Multiplier (M) - set to 0 to get model A": "倍率 (M) - 設為 0 等價於模型 A",
+ "Interpolation Method": "插值方法",
+ "Weighted sum": "加權和",
+ "Add difference": "加入差分",
+ "Save as float16": "以 float16 儲存",
+ "See": "檢視",
+ "wiki": "wiki",
+ "for detailed explanation.": "以了解詳細說明",
+ "Create embedding": "生成 embedding",
+ "Create aesthetic images embedding": "生成美術風格圖集 embedding",
+ "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 的激活函數",
+ "linear": "linear",
+ "relu": "relu",
+ "leakyrelu": "leakyrelu",
+ "elu": "elu",
+ "swish": "swish",
+ "Add layer normalization": "加入層標準化",
+ "Use dropout": "採用 dropout 防止過擬合",
+ "Overwrite Old Hypernetwork": "覆寫舊的 Hypernetwork",
+ "Source directory": "來源目錄",
+ "Destination directory": "目標目錄",
+ "Existing Caption txt Action": "對已有的TXT說明文字的行為",
+ "ignore": "無視",
+ "copy": "複製",
+ "prepend": "放前面",
+ "append": "放後面",
+ "Create flipped copies": "生成鏡像副本",
+ "Split oversized images into two": "將過大的圖像分為兩份",
+ "Split oversized images": "分割過大的圖像",
+ "Use BLIP for caption": "使用 BLIP 生成說明文字(自然語言描述)",
+ "Use deepbooru for caption": "使用 deepbooru 生成說明文字(標籤)",
+ "Split image threshold": "圖像分割閾值",
+ "Split image overlap ratio": "分割圖像重疊的比率",
+ "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]",
+ "Embedding": "Embedding",
+ "Embedding Learning rate": "Embedding 學習率",
+ "Hypernetwork Learning rate": "Hypernetwork 學習率",
+ "Learning rate": "學習率",
+ "Dataset directory": "資料集目錄",
+ "Log directory": "日誌目錄",
+ "Prompt template file": "提示詞模版檔案",
+ "Max steps": "最大疊代步數",
+ "Save an image to log directory every N steps, 0 to disable": "每 N 步儲存一個圖像到日誌目錄,0 表示禁用",
+ "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 Embedding": "訓練 Embedding",
+ "Create an aesthetic embedding out of any number of images": "從任意數量的圖像中建立美術風格 embedding",
+ "Create images embedding": "生成圖集 embedding",
+ "txt2img history": "文生圖歷史記錄",
+ "img2img history": "圖生圖歷史記錄",
+ "extras history": "後處理歷史記錄",
+ "Renew Page": "刷新頁面",
+ "extras": "後處理",
+ "favorites": "收藏夾",
+ "custom fold": "自訂資料夾",
+ "Load": "載入",
+ "Images directory": "圖像目錄",
+ "Prev batch": "上一批",
+ "Next batch": "下一批",
+ "First Page": "首頁",
+ "Prev Page": "上一頁",
+ "Page Index": "頁數",
+ "Next Page": "下一頁",
+ "End Page": "尾頁",
+ "number of images to delete consecutively next": "接下來要連續刪除的圖像數",
+ "Delete": "刪除",
+ "Generate Info": "生成資訊",
+ "File Name": "檔案名",
+ "Collect": "收藏",
+ "Refresh page": "刷新頁面",
+ "Date to": "日期至",
+ "Number": "數量",
+ "set_index": "設定索引",
+ "Checkbox": "核取方塊",
+ "Apply settings": "儲存設定",
+ "Saving images/grids": "儲存圖像/概覽圖",
+ "Always save all generated images": "始終儲存所有生成的圖像",
+ "File format for images": "圖像的檔案格式",
+ "Images filename pattern": "圖像檔案名格式",
+ "Always save all generated image grids": "始終儲存所有生成的概覽圖",
+ "File format for grids": "概覽圖的檔案格式",
+ "Add extended info (seed, prompt) to filename when saving grid": "儲存概覽時將擴展資訊(隨機種子,提示詞)加入到檔案名",
+ "Do not save grids consisting of one picture": "只有一張圖片時不要儲存概覽圖",
+ "Prevent empty spots in grid (when set to autodetect)": "(在自動檢測時)防止概覽圖中出現空位",
+ "Grid row count; use -1 for autodetect and 0 for it to be same as batch size": "概覽行數; 使用 -1 進行自動檢測,使用 0 使其與批量大小相同",
+ "Save text information about generation parameters as chunks to png files": "將有關生成參數的文本資訊作為塊儲存到PNG檔案中",
+ "Create a text file next to every image with generation parameters.": "儲存圖像時在每個圖像旁邊建立一個文本檔案儲存生成參數",
+ "Save a copy of image before doing face restoration.": "在進行面部修復之前儲存圖像副本",
+ "Quality for saved jpeg images": "儲存的JPEG圖像的品質",
+ "If PNG image is larger than 4MB or any dimension is larger than 4000, downscale and save copy as JPG": "如果 PNG 圖像大於 4MB 或寬高大於 4000,則縮小並儲存副本為 JPG",
+ "Use original name for output filename during batch process in extras tab": "在後處理頁籤中的批量處理過程中使用原始名稱作為輸出檔案名",
+ "When using 'Save' button, only save a single selected image": "使用「儲存」按鈕時,只儲存一個選定的圖像",
+ "Do not add watermark to images": "不要給圖像加浮水印",
+ "Paths for saving": "儲存路徑",
+ "Output directory for images; if empty, defaults to three directories below": "圖像的輸出目錄; 如果為空,則預設為以下三個目錄",
+ "Output directory for txt2img images": "文生圖的輸出目錄",
+ "Output directory for img2img images": "圖生圖的輸出目錄",
+ "Output directory for images from extras tab": "後處理的輸出目錄",
+ "Output directory for grids; if empty, defaults to two directories below": "概覽圖的輸出目錄; 如果為空,則預設為以下兩個目錄",
+ "Output directory for txt2img grids": "文生圖概覽的輸出目錄",
+ "Output directory for img2img grids": "圖生圖概覽的輸出目錄",
+ "Directory for saving images using the Save button": "使用「儲存」按鈕儲存圖像的目錄",
+ "Saving to a directory": "儲存到目錄",
+ "Save images to a subdirectory": "將圖像儲存到子目錄",
+ "Save grids to a subdirectory": "將概覽圖儲存到子目錄",
+ "When using \"Save\" button, save images to a subdirectory": "使用「儲存」按鈕時,將圖像儲存到子目錄",
+ "Directory name pattern": "目錄名稱格式",
+ "Max prompt words for [prompt_words] pattern": "[prompt_words] 格式的最大提示詞數量",
+ "Upscaling": "放大",
+ "Tile size for ESRGAN upscalers. 0 = no tiling.": "ESRGAN 的圖塊尺寸。0 = 不分塊",
+ "Tile overlap, in pixels for ESRGAN upscalers. Low values = visible seam.": "ESRGAN 的圖塊重疊畫素。低值 = 可見接縫",
+ "Tile size for all SwinIR.": "適用所有 SwinIR 系演算法的圖塊尺寸",
+ "Tile overlap, in pixels for SwinIR. Low values = visible seam.": "SwinIR 的圖塊重疊畫素。低值 = 可見接縫",
+ "LDSR processing steps. Lower = faster": "LDSR 處理疊代步數。更低 = 更快",
+ "Upscaler for img2img": "圖生圖的放大演算法",
+ "Upscale latent space image when doing hires. fix": "做高解析度修復時也放大潛空間圖像",
+ "Face restoration": "面部修復",
+ "CodeFormer weight parameter; 0 = maximum effect; 1 = minimum effect": "CodeFormer 權重參數; 0 = 最大效果; 1 = 最小效果",
+ "Move face restoration model from VRAM into RAM after processing": "面部修復處理完成後將面部修復模型從顯存(VRAM)移至內存(RAM)",
+ "System": "系統",
+ "VRAM usage polls per second during generation. Set to 0 to disable.": "生成圖像時每秒輪詢顯存(VRAM)使用情況的次數。設定為 0 以禁用",
+ "Always print all generation info to standard output": "始終將所有生成資訊輸出到 standard output (一般為控制台)",
+ "Add a second progress bar to the console that shows progress for an entire job.": "向控制台加入第二個進度列,顯示整個作業的進度",
+ "Training": "訓練",
+ "Unload VAE and CLIP from VRAM when training": "訓練時從顯存(VRAM)中取消 VAE 和 CLIP 的載入",
+ "Move VAE and CLIP to RAM when training hypernetwork. Saves VRAM.": "訓練時將 VAE 和 CLIP 從顯存(VRAM)移放到內存(RAM),節省顯存(VRAM)",
+ "Filename word regex": "檔案名用詞的正則表達式",
+ "Filename join string": "檔案名連接用字串",
+ "Number of repeats for a single input image per epoch; used only for displaying epoch number": "每個 epoch 中單個輸入圖像的重複次數; 僅用於顯示 epoch 數",
+ "Save an csv containing the loss to log directory every N steps, 0 to disable": "每 N 步儲存一個包含 loss 的CSV到日誌目錄,0 表示禁用",
+ "Stable Diffusion": "Stable Diffusion",
+ "Checkpoints to cache in RAM": "快取在內存(RAM)中的模型權重存檔點",
+ "Hypernetwork strength": "Hypernetwork 強度",
+ "Apply color correction to img2img results to match original colors.": "對圖生圖結果套用顏色校正以匹配原始顏色",
+ "Save a copy of image before applying color correction to img2img results": "在對圖生圖結果套用顏色校正之前儲存圖像副本",
+ "With img2img, do exactly the amount of steps the slider specifies (normally you'd do less with less denoising).": "在進行圖生圖的時候,確切地執行滑塊指定的疊代步數(正常情況下更弱的去噪需要更少的疊代步數)",
+ "Enable quantization in K samplers for sharper and cleaner results. This may change existing seeds. Requires restart to apply.": "在 K 採樣器中啟用量化以獲得更清晰,更清晰的結果。這可能會改變現有的隨機種子。需要重新啟動才能套用",
+ "Emphasis: use (text) to make model pay more attention to text and [text] to make it pay less attention": "強調符:使用 (文字) 使模型更關注該文本,使用 [文字] 使其減少關注",
+ "Use old emphasis implementation. Can be useful to reproduce old seeds.": "使用舊的強調符實作。可用於復現舊隨機種子",
+ "Make K-diffusion samplers produce same images in a batch as when making a single image": "使 K-diffusion 採樣器批量生成與生成單個圖像時產出相同的圖像",
+ "Increase coherency by padding from the last comma within n tokens when using more than 75 tokens": "當使用超過 75 個 token 時,通過從 n 個 token 中的最後一個逗號填補來提高一致性",
+ "Filter NSFW content": "過濾成人內容",
+ "Stop At last layers of CLIP model": "在 CLIP 模型的最後哪一層停下",
+ "Interrogate Options": "反推提示詞選項",
+ "Interrogate: keep models in VRAM": "反推: 將模型儲存在顯存(VRAM)中",
+ "Interrogate: use artists from artists.csv": "反推: 使用 artists.csv 中的藝術家",
+ "Interrogate: include ranks of model tags matches in results (Has no effect on caption-based interrogators).": "反推: 在生成結果中包含與模型標籤相匹配的等級(對基於生成自然語言描述的反推沒有影響)",
+ "Interrogate: num_beams for BLIP": "反推: BLIP 的 num_beams",
+ "Interrogate: minimum description length (excluding artists, etc..)": "反推: 最小描述長度(不包括藝術家, 等…)",
+ "Interrogate: maximum description length": "反推: 最大描述長度",
+ "CLIP: maximum number of lines in text file (0 = No limit)": "CLIP: 文本檔案中的最大行數(0 = 無限制)",
+ "Interrogate: deepbooru score threshold": "反推: deepbooru 分數閾值",
+ "Interrogate: deepbooru sort alphabetically": "反推: deepbooru 按字母順序排序",
+ "use spaces for tags in deepbooru": "在 deepbooru 中為標籤使用空格",
+ "escape (\\) brackets in deepbooru (so they are used as literal brackets and not for emphasis)": "在 deepbooru 中使用轉義 (\\) 括號(因此它們用作文字括號而不是強調符號)",
+ "User interface": "使用者介面",
+ "Show progressbar": "顯示進度列",
+ "Show image creation progress every N sampling steps. Set 0 to disable.": "每 N 個採樣疊代步數顯示圖像生成進度。設定 0 禁用",
+ "Show previews of all images generated in a batch as a grid": "以網格的形式預覽所有批量生成出來的圖像",
+ "Show grid in results for web": "在網頁的結果中顯示概覽圖",
+ "Do not show any images in results for web": "不在網頁的結果中顯示任何圖像",
+ "Add model hash to generation information": "將模型的雜湊值加入到生成資訊",
+ "Add model name to generation information": "將模型名稱加入到生成資訊",
+ "When reading generation parameters from text into UI (from PNG info or pasted text), do not change the selected model/checkpoint.": "當從文本讀取生成參數到 UI(從 PNG 資訊或粘貼文本)時,不要更改選定的模型權重存檔點",
+ "Font for image grids that have text": "有文字的概覽圖使用的字體",
+ "Enable full page image viewer": "啟用整頁圖像檢視器",
+ "Show images zoomed in by default in full page image viewer": "在整頁圖像檢視器中預設放大顯示圖像",
+ "Show generation progress in window title.": "在視窗標題中顯示生成進度",
+ "Quicksettings list": "快速設定列表",
+ "Localization (requires restart)": "本地化(需要重新啟動)",
+ "Sampler parameters": "採樣器參數",
+ "Hide samplers in user interface (requires restart)": "在使用者介面中隱藏採樣器(需要重新啟動)",
+ "eta (noise multiplier) for DDIM": "DDIM 的 eta (噪聲乘數)",
+ "eta (noise multiplier) for ancestral samplers": "ancestral 採樣器的 eta (噪聲乘數)",
+ "img2img DDIM discretize": "圖生圖 DDIM 離散化",
+ "uniform": "均勻",
+ "quad": "二階",
+ "sigma churn": "sigma churn",
+ "sigma tmin": "最小(tmin) sigma",
+ "sigma noise": "sigma 噪聲",
+ "Eta noise seed delta": "Eta 噪聲種子偏移(noise seed delta)",
+ "Images Browser": "圖庫瀏覽器",
+ "Preload images at startup": "在啟動時預載圖像",
+ "Number of columns on the page": "每頁列數",
+ "Number of rows on the page": "每頁行數",
+ "Number of pictures displayed on each page": "每頁顯示的圖像數量",
+ "Minimum number of pages per load": "每次載入的最小頁數",
+ "Number of grids in each row": "每行顯示多少格",
+ "Wildcards": "萬用字元",
+ "Use same seed for all images": "為所有圖像使用同一個隨機種子",
+ "Request browser notifications": "請求瀏覽器通知",
+ "Download localization template": "下載本地化模板",
+ "Reload custom script bodies (No ui updates, No restart)": "重新載入自訂指令碼主體(無UI更新,無重啟)",
+ "Restart Gradio and Refresh components (Custom Scripts, ui.py, js and css only)": "重啟 Gradio 及刷新組件(僅限自訂指令碼,ui.py,JS 和 CSS)",
+ "Prompt (press Ctrl+Enter or Alt+Enter to generate)": "提示詞(按 Ctrl+Enter 或 Alt+Enter 生成)",
+ "Negative prompt (press Ctrl+Enter or Alt+Enter to generate)": "反向提示詞(按 Ctrl+Enter 或 Alt+Enter 生成)",
+ "Add a random artist to the prompt.": "隨機加入一個藝術家到提示詞中",
+ "Read generation parameters from prompt or last generation if prompt is empty into user interface.": "從提示詞中讀取生成參數,如果提示詞為空,則讀取上一次的生成參數到使用者介面",
+ "Save style": "存儲為模板風格",
+ "Apply selected styles to current prompt": "將所選樣式套用於當前提示",
+ "Stop processing current image and continue processing.": "停止處理當前圖像並繼續處理下一個",
+ "Stop processing images and return any results accumulated so far.": "停止處理圖像並返回迄今為止累積的任何結果",
+ "Style to apply; styles have components for both positive and negative prompts and apply to both": "要套用的模版風格; 模版風格包含正向和反向提示詞,並套用於兩者",
+ "Do not do anything special": "什麼都不做",
+ "Which algorithm to use to produce the image": "使用哪種演算法生成圖像",
+ "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 不會有正面作用",
+ "Denoising Diffusion Implicit Models - best at inpainting": "Denoising Diffusion Implicit models - 最擅長內補繪製",
+ "Produce an image that can be tiled.": "生成可用於平舖的圖像",
+ "Use a two step process to partially create an image at smaller resolution, upscale, and then improve details in it without changing composition": "使用兩步處理的時候以較小的解析度生成初步圖像,接著放大圖像,然後在不更改構圖的情況下改進其中的細節",
+ "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 時,處理的疊代步數將少於「採樣疊代步數」滑塊指定的步數",
+ "How many batches of images to create": "建立多少批次的圖像",
+ "How many image to create in a single batch": "每批建立多少圖像",
+ "Classifier Free Guidance Scale - how strongly the image should conform to prompt - lower values produce more creative results": "Classifier Free Guidance Scale - 圖像應在多大程度上服從提示詞 - 較低的值會產生更有創意的結果",
+ "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": "一個固定隨機數生成器輸出的值 — 以相同參數和隨機種子生成的圖像會得到相同的結果",
+ "Set seed to -1, which will cause a new random number to be used every time": "將隨機種子設定為-1,則每次都會使用一個新的隨機數",
+ "Reuse seed from last generation, mostly useful if it was randomed": "重用上一次使用的隨機種子,如果想要固定結果就會很有用",
+ "Seed of a different picture to be mixed into the generation.": "將要參與生成的另一張圖的隨機種子",
+ "How strong of a variation to produce. At 0, there will be no effect. At 1, you will get the complete picture with variation seed (except for ancestral samplers, where you will just get something).": "想要產生多強烈的變化。設為 0 時,將沒有效果。設為 1 時,你將獲得完全產自差異隨機種子的圖像(ancestral 採樣器除外,你只是單純地生成了一些東西)",
+ "Make an attempt to produce a picture similar to what would have been produced with same seed at specified resolution": "嘗試生成與在指定解析度下使用相同隨機種子生成的圖像相似的圖片",
+ "This text is used to rotate the feature space of the imgs embs": "此文本用於旋轉圖集 embeddings 的特徵空間",
+ "Separate values for X axis using commas.": "使用逗號分隔 X 軸的值",
+ "Separate values for Y axis using commas.": "使用逗號分隔 Y 軸的值",
+ "Write image to a directory (default - log/images) and generation parameters into csv file.": "將圖像寫入目錄(預設 — log/images)並將生成參數寫入CSV檔案",
+ "Open images output directory": "打開圖像輸出目錄",
+ "How much to blur the mask before processing, in pixels.": "處理前要對蒙版進行多強的模糊,以畫素為單位",
+ "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": "用潛空間的零填充它",
+ "Upscale masked region to target resolution, do inpainting, downscale back and paste into original image": "將蒙版區域放大到目標解析度,做內補繪製,縮小後粘貼到原始圖像中",
+ "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.": "調整圖像大小,使整個目標解析度都被圖像填充。裁剪多出來的部分",
+ "Resize the image so that entirety of image is inside target resolution. Fill empty space with image's colors.": "調整圖像大小,使整個圖像在目標解析度內。用圖像的顏色填充空白區域",
+ "How many times to repeat processing an image and using it as input for the next iteration": "重複處理圖像並用作下次疊代輸入的次數",
+ "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 意味著增加多樣性,因此你的這一組圖將變得越來越混亂",
+ "For SD upscale, how much overlap in pixels should there be between tiles. Tiles overlap so that when they are merged back into one picture, there is no clearly visible seam.": "使用 SD 放大時,圖塊之間應該有多少畫素重疊。圖塊之間需要重疊才可以讓它們在合併回一張圖像時,沒有清晰可見的接縫",
+ "A directory on the same machine where the server is running.": "與伺服器主機上的目錄",
+ "Leave blank to save images to the default path.": "留空以將圖像儲存到預設路徑",
+ "Result = A * (1 - M) + B * M": "結果 = A * (1 - M) + B * M",
+ "Result = A + (B - C) * M": "結果 = A + (B - C) * M",
+ "1st and last digit must be 1. ex:'1, 2, 1'": "第一個和最後一個數字必須是 1。例:'1, 2, 1'",
+ "how fast should the training go. Low values will take longer to train, high values may fail to converge (not generate accurate results) and/or may break the embedding (This has happened if you see Loss: nan in the training info textbox. If this happens, you need to manually restore your embedding from an older not-broken backup).\n\nYou can set a single numeric value, or multiple learning rates using the syntax:\n\n rate_1:max_steps_1, rate_2:max_steps_2, ...\n\nEG: 0.005:100, 1e-3:1000, 1e-5\n\nWill train with rate of 0.005 for first 100 steps, then 1e-3 until 1000 steps, then 1e-5 for all remaining steps.": "訓練應該多快。低值將需要更長的時間來訓練,高值可能無法收斂(無法產生準確的結果)以及/也許可能會破壞 embedding(如果你在訓練資訊文字方塊中看到 Loss: nan 就會發生這種情況。如果發生這種情況,你需要從較舊的未損壞的備份手動恢復 embedding)\n\n你可以使用以下語法設定單個數值或多個學習率:\n\n 率1:步限1, 率2:步限2, …\n\n如: 0.005:100, 1e-3:1000, 1e-5\n\n即前 100 步將以 0.005 的速率訓練,接著直到 1000 步為止以 1e-3 訓練,然後剩餘所有步以 1e-5 訓練",
+ "Path to directory with input images": "帶有輸入圖像的路徑",
+ "Path to directory where to write outputs": "進行輸出的路徑",
+ "Input images directory": "輸入圖像目錄",
+ "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.": "使用以下標籤定義如何選擇圖像的檔案名: [steps], [cfg], [prompt], [prompt_no_styles], [prompt_spaces], [width], [height], [styles], [sampler], [seed], [model_hash], [prompt_words], [date], [datetime], [job_timestamp]; 預設請留空",
+ "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.": "如果啟用此選項,浮水印將不會加入到生成出來的圖像中。警告:如果你不加入浮水印,你的行為可能是不符合道德操守的",
+ "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.": "使用以下標籤定義如何選擇圖像和概覽圖的子目錄: [steps], [cfg], [prompt], [prompt_no_styles], [prompt_spaces], [width], [height], [styles], [sampler], [seed], [model_hash], [prompt_words], [date], [datetime], [job_timestamp]; 預設請留空",
+ "Restore low quality faces using GFPGAN neural network": "使用 GFPGAN 神經網路修復低品質面部",
+ "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.": "如果啟用了上述選項,則此處的字元會用於將拆分的單詞接合為同一行",
+ "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。需要重新啟動才能套用",
+ "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.": "如果這個值不為零,它將被加入到隨機種子中,並在使用帶有 Eta 的採樣器時用於初始化隨機噪聲。你可以使用它來產生更多的圖像變化,或者你可以使用它來模仿其他軟體生成的圖像,如果你知道你在做什麼",
+ "Enable Autocomplete": "開啟Tag補全",
+ "Allowed categories for random artists selection when using the Roll button": "使用抽選藝術家按鈕時將會隨機的藝術家類別",
+ "Roll three": "抽三位出來",
+ "Generate forever": "不停地生成",
+ "Cancel generate forever": "取消不停地生成"
+}
diff --git a/modules/api/api.py b/modules/api/api.py
index a860a964..49c213ea 100644
--- a/modules/api/api.py
+++ b/modules/api/api.py
@@ -1,45 +1,37 @@
-from modules.api.models import StableDiffusionTxt2ImgProcessingAPI, StableDiffusionImg2ImgProcessingAPI
+import uvicorn
+from gradio.processing_utils import encode_pil_to_base64, decode_base64_to_file, decode_base64_to_image
+from fastapi import APIRouter, HTTPException
+import modules.shared as shared
+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_pnginfo
-import modules.shared as shared
-import uvicorn
-from fastapi import Body, APIRouter, HTTPException
-from fastapi.responses import JSONResponse
-from pydantic import BaseModel, Field, Json
-import json
-import io
-import base64
-from PIL import Image
-
-sampler_to_index = lambda name: next(filter(lambda row: name.lower() == row[1].name.lower(), enumerate(all_samplers)), None)
+from modules.extras import run_extras
-class TextToImageResponse(BaseModel):
- images: list[str] = Field(default=None, title="Image", description="The generated image in base64 format.")
- parameters: Json
- info: Json
+def upscaler_to_index(name: str):
+ try:
+ return [x.name.lower() for x in shared.sd_upscalers].index(name.lower())
+ except:
+ raise HTTPException(status_code=400, detail=f"Invalid upscaler, needs to be on of these: {' , '.join([x.name for x in sd_upscalers])}")
-class ImageToImageResponse(BaseModel):
- images: list[str] = Field(default=None, title="Image", description="The generated image in base64 format.")
- parameters: Json
- info: Json
+sampler_to_index = lambda name: next(filter(lambda row: name.lower() == row[1].name.lower(), enumerate(all_samplers)), None)
+def setUpscalers(req: dict):
+ reqDict = vars(req)
+ reqDict['extras_upscaler_1'] = upscaler_to_index(req.upscaler_1)
+ reqDict['extras_upscaler_2'] = upscaler_to_index(req.upscaler_2)
+ reqDict.pop('upscaler_1')
+ reqDict.pop('upscaler_2')
+ return reqDict
class Api:
def __init__(self, app, queue_lock):
self.router = APIRouter()
self.app = app
self.queue_lock = queue_lock
- self.app.add_api_route("/sdapi/v1/txt2img", self.text2imgapi, methods=["POST"])
- self.app.add_api_route("/sdapi/v1/img2img", self.img2imgapi, methods=["POST"])
-
- def __base64_to_image(self, base64_string):
- # if has a comma, deal with prefix
- if "," in base64_string:
- base64_string = base64_string.split(",")[1]
- imgdata = base64.b64decode(base64_string)
- # convert base64 to PIL image
- return Image.open(io.BytesIO(imgdata))
+ self.app.add_api_route("/sdapi/v1/txt2img", self.text2imgapi, methods=["POST"], response_model=TextToImageResponse)
+ self.app.add_api_route("/sdapi/v1/img2img", self.img2imgapi, methods=["POST"], response_model=ImageToImageResponse)
+ self.app.add_api_route("/sdapi/v1/extra-single-image", self.extras_single_image_api, methods=["POST"], response_model=ExtrasSingleImageResponse)
+ self.app.add_api_route("/sdapi/v1/extra-batch-images", self.extras_batch_images_api, methods=["POST"], response_model=ExtrasBatchImagesResponse)
def text2imgapi(self, txt2imgreq: StableDiffusionTxt2ImgProcessingAPI):
sampler_index = sampler_to_index(txt2imgreq.sampler_index)
@@ -59,15 +51,9 @@ class Api:
with self.queue_lock:
processed = process_images(p)
- b64images = []
- for i in processed.images:
- buffer = io.BytesIO()
- i.save(buffer, format="png")
- b64images.append(base64.b64encode(buffer.getvalue()))
-
- return TextToImageResponse(images=b64images, parameters=json.dumps(vars(txt2imgreq)), info=json.dumps(processed.info))
-
+ b64images = list(map(encode_pil_to_base64, processed.images))
+ return TextToImageResponse(images=b64images, parameters=vars(txt2imgreq), info=processed.js())
def img2imgapi(self, img2imgreq: StableDiffusionImg2ImgProcessingAPI):
sampler_index = sampler_to_index(img2imgreq.sampler_index)
@@ -82,7 +68,7 @@ class Api:
mask = img2imgreq.mask
if mask:
- mask = self.__base64_to_image(mask)
+ mask = decode_base64_to_image(mask)
populate = img2imgreq.copy(update={ # Override __init__ params
@@ -97,7 +83,7 @@ class Api:
imgs = []
for img in init_images:
- img = self.__base64_to_image(img)
+ img = decode_base64_to_image(img)
imgs = [img] * p.batch_size
p.init_images = imgs
@@ -105,17 +91,40 @@ class Api:
with self.queue_lock:
processed = process_images(p)
- b64images = []
- for i in processed.images:
- buffer = io.BytesIO()
- i.save(buffer, format="png")
- b64images.append(base64.b64encode(buffer.getvalue()))
+ b64images = list(map(encode_pil_to_base64, processed.images))
- return ImageToImageResponse(images=b64images, parameters=json.dumps(vars(img2imgreq)), info=json.dumps(processed.info))
+ if (not img2imgreq.include_init_images):
+ img2imgreq.init_images = None
+ img2imgreq.mask = None
+
+ return ImageToImageResponse(images=b64images, parameters=vars(img2imgreq), info=processed.js())
- def extrasapi(self):
- raise NotImplementedError
+ def extras_single_image_api(self, req: ExtrasSingleImageRequest):
+ reqDict = setUpscalers(req)
+
+ reqDict['image'] = decode_base64_to_image(reqDict['image'])
+
+ with self.queue_lock:
+ result = run_extras(extras_mode=0, image_folder="", input_dir="", output_dir="", **reqDict)
+
+ return ExtrasSingleImageResponse(image=encode_pil_to_base64(result[0][0]), html_info=result[1])
+
+ def extras_batch_images_api(self, req: ExtrasBatchImagesRequest):
+ reqDict = setUpscalers(req)
+
+ def prepareFiles(file):
+ file = decode_base64_to_file(file.data, file_path=file.name)
+ file.orig_name = file.name
+ return file
+
+ reqDict['image_folder'] = list(map(prepareFiles, reqDict['imageList']))
+ reqDict.pop('imageList')
+
+ with self.queue_lock:
+ result = run_extras(extras_mode=1, image="", input_dir="", output_dir="", **reqDict)
+ return ExtrasBatchImagesResponse(images=list(map(encode_pil_to_base64, result[0])), html_info=result[1])
+
def pnginfoapi(self):
raise NotImplementedError
diff --git a/modules/api/models.py b/modules/api/models.py
index f551fa35..dd122321 100644
--- a/modules/api/models.py
+++ b/modules/api/models.py
@@ -1,10 +1,10 @@
-from array import array
-from inflection import underscore
-from typing import Any, Dict, Optional
+import inspect
from pydantic import BaseModel, Field, create_model
+from typing import Any, Optional
+from typing_extensions import Literal
+from inflection import underscore
from modules.processing import StableDiffusionProcessingTxt2Img, StableDiffusionProcessingImg2Img
-import inspect
-
+from modules.shared import sd_upscalers
API_NOT_ALLOWED = [
"self",
@@ -31,6 +31,7 @@ class ModelDef(BaseModel):
field_alias: str
field_type: Any
field_value: Any
+ field_exclude: bool = False
class PydanticModelGenerator:
@@ -78,7 +79,8 @@ class PydanticModelGenerator:
field=underscore(fields["key"]),
field_alias=fields["key"],
field_type=fields["type"],
- field_value=fields["default"]))
+ field_value=fields["default"],
+ field_exclude=fields["exclude"] if "exclude" in fields else False))
def generate_model(self):
"""
@@ -86,7 +88,7 @@ class PydanticModelGenerator:
from the json and overrides provided at initialization
"""
fields = {
- d.field: (d.field_type, Field(default=d.field_value, alias=d.field_alias)) for d in self._model_def
+ d.field: (d.field_type, Field(default=d.field_value, alias=d.field_alias, exclude=d.field_exclude)) for d in self._model_def
}
DynamicModel = create_model(self._model_name, **fields)
DynamicModel.__config__.allow_population_by_field_name = True
@@ -102,5 +104,48 @@ StableDiffusionTxt2ImgProcessingAPI = PydanticModelGenerator(
StableDiffusionImg2ImgProcessingAPI = PydanticModelGenerator(
"StableDiffusionProcessingImg2Img",
StableDiffusionProcessingImg2Img,
- [{"key": "sampler_index", "type": str, "default": "Euler"}, {"key": "init_images", "type": list, "default": None}, {"key": "denoising_strength", "type": float, "default": 0.75}, {"key": "mask", "type": str, "default": None}]
-).generate_model() \ No newline at end of file
+ [{"key": "sampler_index", "type": str, "default": "Euler"}, {"key": "init_images", "type": list, "default": None}, {"key": "denoising_strength", "type": float, "default": 0.75}, {"key": "mask", "type": str, "default": None}, {"key": "include_init_images", "type": bool, "default": False, "exclude" : True}]
+).generate_model()
+
+class TextToImageResponse(BaseModel):
+ images: list[str] = Field(default=None, title="Image", description="The generated image in base64 format.")
+ parameters: dict
+ info: str
+
+class ImageToImageResponse(BaseModel):
+ images: list[str] = Field(default=None, title="Image", description="The generated image in base64 format.")
+ parameters: dict
+ info: str
+
+class ExtrasBaseRequest(BaseModel):
+ resize_mode: Literal[0, 1] = Field(default=0, title="Resize Mode", description="Sets the resize mode: 0 to upscale by upscaling_resize amount, 1 to upscale up to upscaling_resize_h x upscaling_resize_w.")
+ show_extras_results: bool = Field(default=True, title="Show results", description="Should the backend return the generated image?")
+ gfpgan_visibility: float = Field(default=0, title="GFPGAN Visibility", ge=0, le=1, allow_inf_nan=False, description="Sets the visibility of GFPGAN, values should be between 0 and 1.")
+ codeformer_visibility: float = Field(default=0, title="CodeFormer Visibility", ge=0, le=1, allow_inf_nan=False, description="Sets the visibility of CodeFormer, values should be between 0 and 1.")
+ codeformer_weight: float = Field(default=0, title="CodeFormer Weight", ge=0, le=1, allow_inf_nan=False, description="Sets the weight of CodeFormer, values should be between 0 and 1.")
+ upscaling_resize: float = Field(default=2, title="Upscaling Factor", ge=1, le=4, description="By how much to upscale the image, only used when resize_mode=0.")
+ upscaling_resize_w: int = Field(default=512, title="Target Width", ge=1, description="Target width for the upscaler to hit. Only used when resize_mode=1.")
+ upscaling_resize_h: int = Field(default=512, title="Target Height", ge=1, description="Target height for the upscaler to hit. Only used when resize_mode=1.")
+ upscaling_crop: bool = Field(default=True, title="Crop to fit", description="Should the upscaler crop the image to fit in the choosen size?")
+ upscaler_1: str = Field(default="None", title="Main upscaler", description=f"The name of the main upscaler to use, it has to be one of this list: {' , '.join([x.name for x in sd_upscalers])}")
+ upscaler_2: str = Field(default="None", title="Secondary upscaler", description=f"The name of the secondary upscaler to use, it has to be one of this list: {' , '.join([x.name for x in sd_upscalers])}")
+ extras_upscaler_2_visibility: float = Field(default=0, title="Secondary upscaler visibility", ge=0, le=1, allow_inf_nan=False, description="Sets the visibility of secondary upscaler, values should be between 0 and 1.")
+
+class ExtraBaseResponse(BaseModel):
+ html_info: str = Field(title="HTML info", description="A series of HTML tags containing the process info.")
+
+class ExtrasSingleImageRequest(ExtrasBaseRequest):
+ image: str = Field(default="", title="Image", description="Image to work on, must be a Base64 string containing the image's data.")
+
+class ExtrasSingleImageResponse(ExtraBaseResponse):
+ image: str = Field(default=None, title="Image", description="The generated image in base64 format.")
+
+class FileData(BaseModel):
+ data: str = Field(title="File data", description="Base64 representation of the file")
+ name: str = Field(title="File name")
+
+class ExtrasBatchImagesRequest(ExtrasBaseRequest):
+ imageList: list[FileData] = Field(title="Images", description="List of images to work on. Must be Base64 strings")
+
+class ExtrasBatchImagesResponse(ExtraBaseResponse):
+ images: list[str] = Field(title="Images", description="The generated images in base64 format.") \ No newline at end of file
diff --git a/modules/extras.py b/modules/extras.py
index 22c5a1c1..4d51088b 100644
--- a/modules/extras.py
+++ b/modules/extras.py
@@ -1,3 +1,4 @@
+from __future__ import annotations
import math
import os
@@ -7,6 +8,10 @@ from PIL import Image
import torch
import tqdm
+from typing import Callable, List, OrderedDict, Tuple
+from functools import partial
+from dataclasses import dataclass
+
from modules import processing, shared, images, devices, sd_models
from modules.shared import opts
import modules.gfpgan_model
@@ -17,10 +22,38 @@ import piexif.helper
import gradio as gr
-cached_images = {}
+class LruCache(OrderedDict):
+ @dataclass(frozen=True)
+ class Key:
+ image_hash: int
+ info_hash: int
+ args_hash: int
+
+ @dataclass
+ class Value:
+ image: Image.Image
+ info: str
+
+ def __init__(self, max_size: int = 5, *args, **kwargs):
+ super().__init__(*args, **kwargs)
+ self._max_size = max_size
+
+ def get(self, key: LruCache.Key) -> LruCache.Value:
+ ret = super().get(key)
+ if ret is not None:
+ self.move_to_end(key) # Move to end of eviction list
+ return ret
+
+ def put(self, key: LruCache.Key, value: LruCache.Value) -> None:
+ self[key] = value
+ while len(self) > self._max_size:
+ self.popitem(last=False)
+
+cached_images: LruCache = LruCache(max_size=5)
-def run_extras(extras_mode, resize_mode, image, image_folder, input_dir, output_dir, show_extras_results, gfpgan_visibility, codeformer_visibility, codeformer_weight, upscaling_resize, upscaling_resize_w, upscaling_resize_h, upscaling_crop, extras_upscaler_1, extras_upscaler_2, extras_upscaler_2_visibility):
+
+def run_extras(extras_mode, resize_mode, image, image_folder, input_dir, output_dir, show_extras_results, gfpgan_visibility, codeformer_visibility, codeformer_weight, upscaling_resize, upscaling_resize_w, upscaling_resize_h, upscaling_crop, extras_upscaler_1, extras_upscaler_2, extras_upscaler_2_visibility, upscale_first: bool):
devices.torch_gc()
imageArr = []
@@ -39,7 +72,7 @@ def run_extras(extras_mode, resize_mode, image, image_folder, input_dir, output_
if input_dir == '':
return outputs, "Please select an input directory.", ''
- image_list = [file for file in [os.path.join(input_dir, x) for x in sorted(os.listdir(input_dir))] if os.path.isfile(file)]
+ image_list = shared.listfiles(input_dir)
for img in image_list:
try:
image = Image.open(img)
@@ -56,72 +89,102 @@ def run_extras(extras_mode, resize_mode, image, image_folder, input_dir, output_
else:
outpath = opts.outdir_samples or opts.outdir_extras_samples
-
- for image, image_name in zip(imageArr, imageNameArr):
- if image is None:
- return outputs, "Please select an input image.", ''
- existing_pnginfo = image.info or {}
+ # Extra operation definitions
- image = image.convert("RGB")
- info = ""
+ def run_gfpgan(image: Image.Image, info: str) -> Tuple[Image.Image, str]:
+ restored_img = modules.gfpgan_model.gfpgan_fix_faces(np.array(image, dtype=np.uint8))
+ res = Image.fromarray(restored_img)
- if gfpgan_visibility > 0:
- restored_img = modules.gfpgan_model.gfpgan_fix_faces(np.array(image, dtype=np.uint8))
- res = Image.fromarray(restored_img)
+ if gfpgan_visibility < 1.0:
+ res = Image.blend(image, res, gfpgan_visibility)
- if gfpgan_visibility < 1.0:
- res = Image.blend(image, res, gfpgan_visibility)
+ info += f"GFPGAN visibility:{round(gfpgan_visibility, 2)}\n"
+ return (res, info)
- info += f"GFPGAN visibility:{round(gfpgan_visibility, 2)}\n"
- image = res
+ def run_codeformer(image: Image.Image, info: str) -> Tuple[Image.Image, str]:
+ restored_img = modules.codeformer_model.codeformer.restore(np.array(image, dtype=np.uint8), w=codeformer_weight)
+ res = Image.fromarray(restored_img)
- if codeformer_visibility > 0:
- restored_img = modules.codeformer_model.codeformer.restore(np.array(image, dtype=np.uint8), w=codeformer_weight)
- res = Image.fromarray(restored_img)
+ if codeformer_visibility < 1.0:
+ res = Image.blend(image, res, codeformer_visibility)
- if codeformer_visibility < 1.0:
- res = Image.blend(image, res, codeformer_visibility)
+ info += f"CodeFormer w: {round(codeformer_weight, 2)}, CodeFormer visibility:{round(codeformer_visibility, 2)}\n"
+ return (res, info)
- info += f"CodeFormer w: {round(codeformer_weight, 2)}, CodeFormer visibility:{round(codeformer_visibility, 2)}\n"
- image = res
+ def upscale(image, scaler_index, resize, mode, resize_w, resize_h, crop):
+ upscaler = shared.sd_upscalers[scaler_index]
+ res = upscaler.scaler.upscale(image, resize, upscaler.data_path)
+ if mode == 1 and crop:
+ cropped = Image.new("RGB", (resize_w, resize_h))
+ cropped.paste(res, box=(resize_w // 2 - res.width // 2, resize_h // 2 - res.height // 2))
+ res = cropped
+ return res
+ def run_prepare_crop(image: Image.Image, info: str) -> Tuple[Image.Image, str]:
+ # Actual crop happens in run_upscalers_blend, this just sets upscaling_resize and adds info text
+ nonlocal upscaling_resize
if resize_mode == 1:
upscaling_resize = max(upscaling_resize_w/image.width, upscaling_resize_h/image.height)
crop_info = " (crop)" if upscaling_crop else ""
info += f"Resize to: {upscaling_resize_w:g}x{upscaling_resize_h:g}{crop_info}\n"
+ return (image, info)
+
+ @dataclass
+ class UpscaleParams:
+ upscaler_idx: int
+ blend_alpha: float
+
+ def run_upscalers_blend(params: List[UpscaleParams], image: Image.Image, info: str) -> Tuple[Image.Image, str]:
+ blended_result: Image.Image = None
+ for upscaler in params:
+ upscale_args = (upscaler.upscaler_idx, upscaling_resize, resize_mode,
+ 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))
+ cached_entry = cached_images.get(cache_key)
+ if cached_entry is None:
+ res = upscale(image, *upscale_args)
+ info += f"Upscale: {round(upscaling_resize, 3)}, visibility: {upscaler.blend_alpha}, model:{shared.sd_upscalers[upscaler.upscaler_idx].name}\n"
+ cached_images.put(cache_key, LruCache.Value(image=res, info=info))
+ else:
+ res, info = cached_entry.image, cached_entry.info
+
+ if blended_result is None:
+ blended_result = res
+ else:
+ blended_result = Image.blend(blended_result, res, upscaler.blend_alpha)
+ return (blended_result, info)
+
+ # Build a list of operations to run
+ facefix_ops: List[Callable] = []
+ facefix_ops += [run_gfpgan] if gfpgan_visibility > 0 else []
+ facefix_ops += [run_codeformer] if codeformer_visibility > 0 else []
+
+ upscale_ops: List[Callable] = []
+ upscale_ops += [run_prepare_crop] if resize_mode == 1 else []
+
+ if upscaling_resize != 0:
+ step_params: List[UpscaleParams] = []
+ step_params.append(UpscaleParams(upscaler_idx=extras_upscaler_1, blend_alpha=1.0))
+ if extras_upscaler_2 != 0 and extras_upscaler_2_visibility > 0:
+ step_params.append(UpscaleParams(upscaler_idx=extras_upscaler_2, blend_alpha=extras_upscaler_2_visibility))
+
+ upscale_ops.append(partial(run_upscalers_blend, step_params))
+
+ extras_ops: List[Callable] = (upscale_ops + facefix_ops) if upscale_first else (facefix_ops + upscale_ops)
+
+ for image, image_name in zip(imageArr, imageNameArr):
+ if image is None:
+ return outputs, "Please select an input image.", ''
+ existing_pnginfo = image.info or {}
+
+ image = image.convert("RGB")
+ info = ""
+ # Run each operation on each image
+ for op in extras_ops:
+ image, info = op(image, info)
- if upscaling_resize != 1.0:
- def upscale(image, scaler_index, resize, mode, resize_w, resize_h, crop):
- small = image.crop((image.width // 2, image.height // 2, image.width // 2 + 10, image.height // 2 + 10))
- pixels = tuple(np.array(small).flatten().tolist())
- key = (resize, scaler_index, image.width, image.height, gfpgan_visibility, codeformer_visibility, codeformer_weight,
- resize_mode, upscaling_resize, upscaling_resize_w, upscaling_resize_h, upscaling_crop) + pixels
-
- c = cached_images.get(key)
- if c is None:
- upscaler = shared.sd_upscalers[scaler_index]
- c = upscaler.scaler.upscale(image, resize, upscaler.data_path)
- if mode == 1 and crop:
- cropped = Image.new("RGB", (resize_w, resize_h))
- cropped.paste(c, box=(resize_w // 2 - c.width // 2, resize_h // 2 - c.height // 2))
- c = cropped
- cached_images[key] = c
-
- return c
-
- info += f"Upscale: {round(upscaling_resize, 3)}, model:{shared.sd_upscalers[extras_upscaler_1].name}\n"
- res = upscale(image, extras_upscaler_1, upscaling_resize, resize_mode, upscaling_resize_w, upscaling_resize_h, upscaling_crop)
-
- if extras_upscaler_2 != 0 and extras_upscaler_2_visibility > 0:
- res2 = upscale(image, extras_upscaler_2, upscaling_resize, resize_mode, upscaling_resize_w, upscaling_resize_h, upscaling_crop)
- info += f"Upscale: {round(upscaling_resize, 3)}, visibility: {round(extras_upscaler_2_visibility, 3)}, model:{shared.sd_upscalers[extras_upscaler_2].name}\n"
- res = Image.blend(res, res2, extras_upscaler_2_visibility)
-
- image = res
-
- while len(cached_images) > 2:
- del cached_images[next(iter(cached_images.keys()))]
-
if opts.use_original_name_batch and image_name != None:
basename = os.path.splitext(os.path.basename(image_name))[0]
else:
@@ -141,6 +204,9 @@ def run_extras(extras_mode, resize_mode, image, image_folder, input_dir, output_
return outputs, plaintext_to_html(info), ''
+def clear_cache():
+ cached_images.clear()
+
def run_pnginfo(image):
if image is None:
diff --git a/modules/generation_parameters_copypaste.py b/modules/generation_parameters_copypaste.py
index f73647da..d590e9ee 100644
--- a/modules/generation_parameters_copypaste.py
+++ b/modules/generation_parameters_copypaste.py
@@ -1,14 +1,20 @@
+import base64
+import io
import os
import re
import gradio as gr
from modules.shared import script_path
from modules import shared
+import tempfile
+from PIL import Image, PngImagePlugin
re_param_code = r'\s*([\w ]+):\s*("(?:\\|\"|[^\"])+"|[^,]*)(?:,|$)'
re_param = re.compile(re_param_code)
re_params = re.compile(r"^(?:" + re_param_code + "){3,}$")
re_imagesize = re.compile(r"^(\d+)x(\d+)$")
type_of_gr_update = type(gr.update())
+paste_fields = {}
+bind_list = []
def quote(text):
@@ -20,6 +26,94 @@ def quote(text):
text = text.replace('"', '\\"')
return f'"{text}"'
+
+def image_from_url_text(filedata):
+ if type(filedata) == dict and filedata["is_file"]:
+ filename = filedata["name"]
+ tempdir = os.path.normpath(tempfile.gettempdir())
+ normfn = os.path.normpath(filename)
+ assert normfn.startswith(tempdir), 'trying to open image file not in temporary directory'
+
+ return Image.open(filename)
+
+ if type(filedata) == list:
+ if len(filedata) == 0:
+ return None
+
+ filedata = filedata[0]
+
+ if filedata.startswith("data:image/png;base64,"):
+ filedata = filedata[len("data:image/png;base64,"):]
+
+ filedata = base64.decodebytes(filedata.encode('utf-8'))
+ image = Image.open(io.BytesIO(filedata))
+ return image
+
+
+def add_paste_fields(tabname, init_img, fields):
+ paste_fields[tabname] = {"init_img": init_img, "fields": fields}
+
+ # backwards compatibility for existing extensions
+ import modules.ui
+ if tabname == 'txt2img':
+ modules.ui.txt2img_paste_fields = fields
+ elif tabname == 'img2img':
+ modules.ui.img2img_paste_fields = fields
+
+
+def create_buttons(tabs_list):
+ buttons = {}
+ for tab in tabs_list:
+ buttons[tab] = gr.Button(f"Send to {tab}")
+ return buttons
+
+
+#if send_generate_info is a tab name, mean generate_info comes from the params fields of the tab
+def bind_buttons(buttons, send_image, send_generate_info):
+ bind_list.append([buttons, send_image, send_generate_info])
+
+
+def run_bind():
+ for buttons, send_image, send_generate_info in bind_list:
+ for tab in buttons:
+ button = buttons[tab]
+ if send_image and paste_fields[tab]["init_img"]:
+ if type(send_image) == gr.Gallery:
+ button.click(
+ fn=lambda x: image_from_url_text(x),
+ _js="extract_image_from_gallery",
+ inputs=[send_image],
+ outputs=[paste_fields[tab]["init_img"]],
+ )
+ else:
+ button.click(
+ fn=lambda x:x,
+ inputs=[send_image],
+ outputs=[paste_fields[tab]["init_img"]],
+ )
+
+ if send_generate_info and paste_fields[tab]["fields"] is not None:
+ paste_field_names = ['Prompt', 'Negative prompt', 'Steps', 'Face restoration', 'Size-1', 'Size-2']
+ if shared.opts.send_seed:
+ paste_field_names += ["Seed"]
+ if send_generate_info in paste_fields:
+ button.click(
+ fn=lambda *x:x,
+ inputs=[field for field,name in paste_fields[send_generate_info]["fields"] if name in paste_field_names],
+ outputs=[field for field,name in paste_fields[tab]["fields"] if name in paste_field_names],
+ )
+
+ else:
+ connect_paste(button, [(field, name) for field, name in paste_fields[tab]["fields"] if name in paste_field_names], send_generate_info)
+
+ button.click(
+ fn=None,
+ _js=f"switch_to_{tab}",
+ inputs=None,
+ outputs=None,
+ )
+
+
def parse_generation_parameters(x: str):
"""parses generation parameters string, the one you see in text field under the picture in UI:
```
@@ -68,7 +162,7 @@ Steps: 20, Sampler: Euler a, CFG scale: 7, Seed: 965400086, Size: 512x512, Model
return res
-def connect_paste(button, paste_fields, input_comp, js=None):
+def connect_paste(button, paste_fields, input_comp, jsfunc=None):
def paste_func(prompt):
if not prompt and not shared.cmd_opts.hide_ui_dir_config:
filename = os.path.join(script_path, "params.txt")
@@ -106,7 +200,9 @@ def connect_paste(button, paste_fields, input_comp, js=None):
button.click(
fn=paste_func,
- _js=js,
+ _js=jsfunc,
inputs=[input_comp],
outputs=[x[0] for x in paste_fields],
)
+
+
diff --git a/modules/hypernetworks/hypernetwork.py b/modules/hypernetworks/hypernetwork.py
index d647ea55..2e84583b 100644
--- a/modules/hypernetworks/hypernetwork.py
+++ b/modules/hypernetworks/hypernetwork.py
@@ -5,6 +5,7 @@ import html
import os
import sys
import traceback
+import inspect
import modules.textual_inversion.dataset
import torch
@@ -15,20 +16,26 @@ from modules import devices, processing, sd_models, shared
from modules.textual_inversion import textual_inversion
from modules.textual_inversion.learn_schedule import LearnRateScheduler
from torch import einsum
+from torch.nn.init import normal_, xavier_normal_, xavier_uniform_, kaiming_normal_, kaiming_uniform_, zeros_
from collections import defaultdict, deque
from statistics import stdev, mean
+
class HypernetworkModule(torch.nn.Module):
multiplier = 1.0
activation_dict = {
+ "linear": torch.nn.Identity,
"relu": torch.nn.ReLU,
"leakyrelu": torch.nn.LeakyReLU,
"elu": torch.nn.ELU,
"swish": torch.nn.Hardswish,
+ "tanh": torch.nn.Tanh,
+ "sigmoid": torch.nn.Sigmoid,
}
+ activation_dict.update({cls_name.lower(): cls_obj for cls_name, cls_obj in inspect.getmembers(torch.nn.modules.activation) if inspect.isclass(cls_obj) and cls_obj.__module__ == 'torch.nn.modules.activation'})
- def __init__(self, dim, state_dict=None, layer_structure=None, activation_func=None, add_layer_norm=False, use_dropout=False):
+ def __init__(self, dim, state_dict=None, layer_structure=None, activation_func=None, weight_init='Normal', add_layer_norm=False, use_dropout=False):
super().__init__()
assert layer_structure is not None, "layer_structure must not be None"
@@ -65,9 +72,24 @@ class HypernetworkModule(torch.nn.Module):
else:
for layer in self.linear:
if type(layer) == torch.nn.Linear or type(layer) == torch.nn.LayerNorm:
- layer.weight.data.normal_(mean=0.0, std=0.01)
- layer.bias.data.zero_()
-
+ w, b = layer.weight.data, layer.bias.data
+ if weight_init == "Normal" or type(layer) == torch.nn.LayerNorm:
+ normal_(w, mean=0.0, std=0.01)
+ normal_(b, mean=0.0, std=0.005)
+ elif weight_init == 'XavierUniform':
+ xavier_uniform_(w)
+ zeros_(b)
+ elif weight_init == 'XavierNormal':
+ xavier_normal_(w)
+ zeros_(b)
+ elif weight_init == 'KaimingUniform':
+ kaiming_uniform_(w, nonlinearity='leaky_relu' if 'leakyrelu' == activation_func else 'relu')
+ zeros_(b)
+ elif weight_init == 'KaimingNormal':
+ kaiming_normal_(w, nonlinearity='leaky_relu' if 'leakyrelu' == activation_func else 'relu')
+ zeros_(b)
+ else:
+ raise KeyError(f"Key {weight_init} is not defined as initialization!")
self.to(devices.device)
def fix_old_state_dict(self, state_dict):
@@ -105,7 +127,7 @@ class Hypernetwork:
filename = None
name = None
- def __init__(self, name=None, enable_sizes=None, layer_structure=None, activation_func=None, add_layer_norm=False, use_dropout=False):
+ def __init__(self, name=None, enable_sizes=None, layer_structure=None, activation_func=None, weight_init=None, add_layer_norm=False, use_dropout=False):
self.filename = None
self.name = name
self.layers = {}
@@ -114,13 +136,14 @@ class Hypernetwork:
self.sd_checkpoint_name = None
self.layer_structure = layer_structure
self.activation_func = activation_func
+ self.weight_init = weight_init
self.add_layer_norm = add_layer_norm
self.use_dropout = use_dropout
for size in enable_sizes or []:
self.layers[size] = (
- HypernetworkModule(size, None, self.layer_structure, self.activation_func, self.add_layer_norm, self.use_dropout),
- HypernetworkModule(size, None, self.layer_structure, self.activation_func, self.add_layer_norm, self.use_dropout),
+ HypernetworkModule(size, None, self.layer_structure, self.activation_func, self.weight_init, self.add_layer_norm, self.use_dropout),
+ HypernetworkModule(size, None, self.layer_structure, self.activation_func, self.weight_init, self.add_layer_norm, self.use_dropout),
)
def weights(self):
@@ -144,6 +167,7 @@ class Hypernetwork:
state_dict['layer_structure'] = self.layer_structure
state_dict['activation_func'] = self.activation_func
state_dict['is_layer_norm'] = self.add_layer_norm
+ state_dict['weight_initialization'] = self.weight_init
state_dict['use_dropout'] = self.use_dropout
state_dict['sd_checkpoint'] = self.sd_checkpoint
state_dict['sd_checkpoint_name'] = self.sd_checkpoint_name
@@ -158,15 +182,21 @@ class Hypernetwork:
state_dict = torch.load(filename, map_location='cpu')
self.layer_structure = state_dict.get('layer_structure', [1, 2, 1])
+ print(self.layer_structure)
self.activation_func = state_dict.get('activation_func', None)
+ print(f"Activation function is {self.activation_func}")
+ self.weight_init = state_dict.get('weight_initialization', 'Normal')
+ print(f"Weight initialization is {self.weight_init}")
self.add_layer_norm = state_dict.get('is_layer_norm', False)
+ print(f"Layer norm is set to {self.add_layer_norm}")
self.use_dropout = state_dict.get('use_dropout', False)
+ print(f"Dropout usage is set to {self.use_dropout}" )
for size, sd in state_dict.items():
if type(size) == int:
self.layers[size] = (
- HypernetworkModule(size, sd[0], self.layer_structure, self.activation_func, self.add_layer_norm, self.use_dropout),
- HypernetworkModule(size, sd[1], self.layer_structure, self.activation_func, self.add_layer_norm, self.use_dropout),
+ HypernetworkModule(size, sd[0], self.layer_structure, self.activation_func, self.weight_init, self.add_layer_norm, self.use_dropout),
+ HypernetworkModule(size, sd[1], self.layer_structure, self.activation_func, self.weight_init, self.add_layer_norm, self.use_dropout),
)
self.name = state_dict.get('name', self.name)
@@ -399,7 +429,9 @@ def train_hypernetwork(hypernetwork_name, learn_rate, batch_size, data_root, log
optimizer.step()
- if torch.isnan(losses[hypernetwork.step % losses.shape[0]]):
+ steps_done = hypernetwork.step + 1
+
+ if torch.isnan(losses[hypernetwork.step % losses.shape[0]]):
raise RuntimeError("Loss diverged.")
if len(previous_mean_losses) > 1:
@@ -409,9 +441,9 @@ def train_hypernetwork(hypernetwork_name, learn_rate, batch_size, data_root, log
dataset_loss_info = f"dataset loss:{mean(previous_mean_losses):.3f}" + u"\u00B1" + f"({std / (len(previous_mean_losses) ** 0.5):.3f})"
pbar.set_description(dataset_loss_info)
- if hypernetwork.step > 0 and hypernetwork_dir is not None and hypernetwork.step % save_hypernetwork_every == 0:
+ if hypernetwork_dir is not None and steps_done % save_hypernetwork_every == 0:
# Before saving, change name to match current checkpoint.
- hypernetwork.name = f'{hypernetwork_name}-{hypernetwork.step}'
+ hypernetwork.name = f'{hypernetwork_name}-{steps_done}'
last_saved_file = os.path.join(hypernetwork_dir, f'{hypernetwork.name}.pt')
hypernetwork.save(last_saved_file)
@@ -420,8 +452,8 @@ def train_hypernetwork(hypernetwork_name, learn_rate, batch_size, data_root, log
"learn_rate": scheduler.learn_rate
})
- if hypernetwork.step > 0 and images_dir is not None and hypernetwork.step % create_image_every == 0:
- forced_filename = f'{hypernetwork_name}-{hypernetwork.step}'
+ if images_dir is not None and steps_done % create_image_every == 0:
+ forced_filename = f'{hypernetwork_name}-{steps_done}'
last_saved_image = os.path.join(images_dir, forced_filename)
optimizer.zero_grad()
@@ -458,7 +490,7 @@ def train_hypernetwork(hypernetwork_name, learn_rate, batch_size, data_root, log
if image is not None:
shared.state.current_image = image
- last_saved_image, last_text_info = images.save_image(image, images_dir, "", p.seed, p.prompt, shared.opts.samples_format, processed.infotexts[0], p=p, forced_filename=forced_filename)
+ last_saved_image, last_text_info = images.save_image(image, images_dir, "", p.seed, p.prompt, shared.opts.samples_format, processed.infotexts[0], p=p, forced_filename=forced_filename, save_to_dirs=False)
last_saved_image += f", prompt: {preview_text}"
shared.state.job_no = hypernetwork.step
diff --git a/modules/hypernetworks/ui.py b/modules/hypernetworks/ui.py
index 2b472d87..aad09ffc 100644
--- a/modules/hypernetworks/ui.py
+++ b/modules/hypernetworks/ui.py
@@ -8,8 +8,10 @@ import modules.textual_inversion.textual_inversion
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)
-def create_hypernetwork(name, enable_sizes, overwrite_old, layer_structure=None, activation_func=None, add_layer_norm=False, use_dropout=False):
+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.
name = "".join( x for x in name if (x.isalnum() or x in "._- "))
@@ -25,6 +27,7 @@ def create_hypernetwork(name, enable_sizes, overwrite_old, layer_structure=None,
enable_sizes=[int(x) for x in enable_sizes],
layer_structure=layer_structure,
activation_func=activation_func,
+ weight_init=weight_init,
add_layer_norm=add_layer_norm,
use_dropout=use_dropout,
)
diff --git a/modules/images.py b/modules/images.py
index 286de2ae..a0728553 100644
--- a/modules/images.py
+++ b/modules/images.py
@@ -277,7 +277,7 @@ invalid_filename_chars = '<>:"/\\|?*\n'
invalid_filename_prefix = ' '
invalid_filename_postfix = ' .'
re_nonletters = re.compile(r'[\s' + string.punctuation + ']+')
-re_pattern = re.compile(r"([^\[\]]+|\[([^]]+)]|[\[\]]*)")
+re_pattern = re.compile(r"(.*?)(?:\[([^\[\]]+)\]|$)")
re_pattern_arg = re.compile(r"(.*)<([^>]*)>$")
max_filename_part_length = 128
@@ -300,8 +300,8 @@ class FilenameGenerator:
'seed': lambda self: self.seed if self.seed is not None else '',
'steps': lambda self: self.p and self.p.steps,
'cfg': lambda self: self.p and self.p.cfg_scale,
- 'width': lambda self: self.p and self.p.width,
- 'height': lambda self: self.p and self.p.height,
+ 'width': lambda self: self.image.width,
+ 'height': lambda self: self.image.height,
'styles': lambda self: self.p and sanitize_filename_part(", ".join([style for style in self.p.styles if not style == "None"]) or "None", replace_spaces=False),
'sampler': lambda self: self.p and sanitize_filename_part(sd_samplers.samplers[self.p.sampler_index].name, replace_spaces=False),
'model_hash': lambda self: getattr(self.p, "sd_model_hash", shared.sd_model.sd_model_hash),
@@ -315,10 +315,11 @@ class FilenameGenerator:
}
default_time_format = '%Y%m%d%H%M%S'
- def __init__(self, p, seed, prompt):
+ def __init__(self, p, seed, prompt, image):
self.p = p
self.seed = seed
self.prompt = prompt
+ self.image = image
def prompt_no_style(self):
if self.p is None or self.prompt is None:
@@ -343,7 +344,7 @@ class FilenameGenerator:
def datetime(self, *args):
time_datetime = datetime.datetime.now()
- time_format = args[0] if len(args) > 0 else self.default_time_format
+ time_format = args[0] if len(args) > 0 and args[0] != "" else self.default_time_format
try:
time_zone = pytz.timezone(args[1]) if len(args) > 1 else None
except pytz.exceptions.UnknownTimeZoneError as _:
@@ -362,9 +363,9 @@ class FilenameGenerator:
for m in re_pattern.finditer(x):
text, pattern = m.groups()
+ res += text
if pattern is None:
- res += text
continue
pattern_args = []
@@ -385,12 +386,9 @@ class FilenameGenerator:
print(f"Error adding [{pattern}] to filename", file=sys.stderr)
print(traceback.format_exc(), file=sys.stderr)
- if replacement is None:
- res += f'[{pattern}]'
- else:
+ if replacement is not None:
res += str(replacement)
-
- continue
+ continue
res += f'[{pattern}]'
@@ -452,18 +450,7 @@ def save_image(image, path, basename, seed=None, prompt=None, extension='png', i
txt_fullfn (`str` or None):
If a text file is saved for this image, this will be its full path. Otherwise None.
"""
- namegen = FilenameGenerator(p, seed, prompt)
-
- if extension == 'png' and opts.enable_pnginfo and info is not None:
- pnginfo = PngImagePlugin.PngInfo()
-
- if existing_info is not None:
- for k, v in existing_info.items():
- pnginfo.add_text(k, str(v))
-
- pnginfo.add_text(pnginfo_section_name, info)
- else:
- pnginfo = None
+ namegen = FilenameGenerator(p, seed, prompt, image)
if save_to_dirs is None:
save_to_dirs = (grid and opts.grid_save_to_dirs) or (not grid and opts.save_to_dirs and not no_prompt)
@@ -492,19 +479,27 @@ def save_image(image, path, basename, seed=None, prompt=None, extension='png', i
if add_number:
basecount = get_next_sequence_number(path, basename)
fullfn = None
- fullfn_without_extension = None
for i in range(500):
fn = f"{basecount + i:05}" if basename == '' else f"{basename}-{basecount + i:04}"
fullfn = os.path.join(path, f"{fn}{file_decoration}.{extension}")
- fullfn_without_extension = os.path.join(path, f"{fn}{file_decoration}")
if not os.path.exists(fullfn):
break
else:
fullfn = os.path.join(path, f"{file_decoration}.{extension}")
- fullfn_without_extension = os.path.join(path, file_decoration)
else:
fullfn = os.path.join(path, f"{forced_filename}.{extension}")
- fullfn_without_extension = os.path.join(path, forced_filename)
+
+ pnginfo = existing_info or {}
+ if info is not None:
+ pnginfo[pnginfo_section_name] = info
+
+ params = script_callbacks.ImageSaveParams(image, p, fullfn, pnginfo)
+ script_callbacks.before_image_saved_callback(params)
+
+ image = params.image
+ fullfn = params.filename
+ info = params.pnginfo.get(pnginfo_section_name, None)
+ fullfn_without_extension, extension = os.path.splitext(params.filename)
def exif_bytes():
return piexif.dump({
@@ -513,12 +508,20 @@ def save_image(image, path, basename, seed=None, prompt=None, extension='png', i
},
})
- if extension.lower() in ("jpg", "jpeg", "webp"):
+ if extension.lower() == '.png':
+ pnginfo_data = PngImagePlugin.PngInfo()
+ for k, v in params.pnginfo.items():
+ pnginfo_data.add_text(k, str(v))
+
+ image.save(fullfn, quality=opts.jpeg_quality, pnginfo=pnginfo_data)
+
+ elif extension.lower() in (".jpg", ".jpeg", ".webp"):
image.save(fullfn, quality=opts.jpeg_quality)
+
if opts.enable_pnginfo and info is not None:
piexif.insert(exif_bytes(), fullfn)
else:
- image.save(fullfn, quality=opts.jpeg_quality, pnginfo=pnginfo)
+ image.save(fullfn, quality=opts.jpeg_quality)
target_side_length = 4000
oversize = image.width > target_side_length or image.height > target_side_length
@@ -541,7 +544,8 @@ def save_image(image, path, basename, seed=None, prompt=None, extension='png', i
else:
txt_fullfn = None
- script_callbacks.image_saved_callback(image, p, fullfn, txt_fullfn)
+ script_callbacks.image_saved_callback(params)
+
return fullfn, txt_fullfn
diff --git a/modules/img2img.py b/modules/img2img.py
index 8d9f7cf9..efda26e1 100644
--- a/modules/img2img.py
+++ b/modules/img2img.py
@@ -19,7 +19,7 @@ import modules.scripts
def process_batch(p, input_dir, output_dir, args):
processing.fix_seed(p)
- images = [file for file in [os.path.join(input_dir, x) for x in os.listdir(input_dir)] if os.path.isfile(file)]
+ images = shared.listfiles(input_dir)
print(f"Will process {len(images)} images, creating {p.n_iter * p.batch_size} new images for each.")
@@ -39,6 +39,8 @@ def process_batch(p, input_dir, output_dir, args):
break
img = Image.open(image)
+ # Use the EXIF orientation of photos taken by smartphones.
+ img = ImageOps.exif_transpose(img)
p.init_images = [img] * p.batch_size
proc = modules.scripts.scripts_img2img.run(p, *args)
@@ -61,19 +63,25 @@ def img2img(mode: int, prompt: str, negative_prompt: str, prompt_style: str, pro
is_batch = mode == 2
if is_inpaint:
+ # Drawn mask
if mask_mode == 0:
image = init_img_with_mask['image']
mask = init_img_with_mask['mask']
alpha_mask = ImageOps.invert(image.split()[-1]).convert('L').point(lambda x: 255 if x > 0 else 0, mode='1')
mask = ImageChops.lighter(alpha_mask, mask.convert('L')).convert('L')
image = image.convert('RGB')
+ # Uploaded mask
else:
image = init_img_inpaint
mask = init_mask_inpaint
+ # No mask
else:
image = init_img
mask = None
+ # Use the EXIF orientation of photos taken by smartphones.
+ image = ImageOps.exif_transpose(image)
+
assert 0. <= denoising_strength <= 1., 'can only work with strength in [0.0, 1.0]'
p = StableDiffusionProcessingImg2Img(
diff --git a/modules/processing.py b/modules/processing.py
index c61bbfbd..548eec29 100644
--- a/modules/processing.py
+++ b/modules/processing.py
@@ -77,9 +77,8 @@ def get_correct_sampler(p):
class StableDiffusionProcessing():
"""
The first set of paramaters: sd_models -> do_not_reload_embeddings represent the minimum required to create a StableDiffusionProcessing
-
"""
- def __init__(self, sd_model=None, outpath_samples=None, outpath_grids=None, prompt: str="", styles: List[str]=None, seed: int=-1, subseed: int=-1, subseed_strength: float=0, seed_resize_from_h: int=-1, seed_resize_from_w: int=-1, seed_enable_extras: bool=True, sampler_index: int=0, batch_size: int=1, n_iter: int=1, steps:int =50, cfg_scale:float=7.0, width:int=512, height:int=512, restore_faces:bool=False, tiling:bool=False, do_not_save_samples:bool=False, do_not_save_grid:bool=False, extra_generation_params: Dict[Any,Any]=None, overlay_images: Any=None, negative_prompt: str=None, eta: float =None, do_not_reload_embeddings: bool=False, denoising_strength: float = 0, ddim_discretize: str = "uniform", s_churn: float = 0.0, s_tmax: float = None, s_tmin: float = 0.0, s_noise: float = 1.0):
+ def __init__(self, sd_model=None, outpath_samples=None, outpath_grids=None, prompt: str = "", styles: List[str] = None, seed: int = -1, subseed: int = -1, subseed_strength: float = 0, seed_resize_from_h: int = -1, seed_resize_from_w: int = -1, seed_enable_extras: bool = True, sampler_index: int = 0, batch_size: int = 1, n_iter: int = 1, steps: int = 50, cfg_scale: float = 7.0, width: int = 512, height: int = 512, restore_faces: bool = False, tiling: bool = False, do_not_save_samples: bool = False, do_not_save_grid: bool = False, extra_generation_params: Dict[Any, Any] = None, overlay_images: Any = None, negative_prompt: str = None, eta: float = None, do_not_reload_embeddings: bool = False, denoising_strength: float = 0, ddim_discretize: str = None, s_churn: float = 0.0, s_tmax: float = None, s_tmin: float = 0.0, s_noise: float = 1.0, override_settings: Dict[str, Any] = None):
self.sd_model = sd_model
self.outpath_samples: str = outpath_samples
self.outpath_grids: str = outpath_grids
@@ -109,13 +108,14 @@ class StableDiffusionProcessing():
self.do_not_reload_embeddings = do_not_reload_embeddings
self.paste_to = None
self.color_corrections = None
- self.denoising_strength: float = 0
+ self.denoising_strength: float = denoising_strength
self.sampler_noise_scheduler_override = None
- self.ddim_discretize = opts.ddim_discretize
+ self.ddim_discretize = ddim_discretize or opts.ddim_discretize
self.s_churn = s_churn or opts.s_churn
self.s_tmin = s_tmin or opts.s_tmin
self.s_tmax = s_tmax or float('inf') # not representable as a standard ui option
self.s_noise = s_noise or opts.s_noise
+ self.override_settings = {k: v for k, v in (override_settings or {}).items() if k not in shared.restricted_opts}
if not seed_enable_extras:
self.subseed = -1
@@ -129,6 +129,72 @@ class StableDiffusionProcessing():
self.all_seeds = None
self.all_subseeds = None
+ def txt2img_image_conditioning(self, x, width=None, height=None):
+ if self.sampler.conditioning_key not in {'hybrid', 'concat'}:
+ # Dummy zero conditioning if we're not using inpainting model.
+ # Still takes up a bit of memory, but no encoder call.
+ # Pretty sure we can just make this a 1x1 image since its not going to be used besides its batch size.
+ return torch.zeros(
+ x.shape[0], 5, 1, 1,
+ dtype=x.dtype,
+ device=x.device
+ )
+
+ height = height or self.height
+ width = width or self.width
+
+ # The "masked-image" in this case will just be all zeros since the entire image is masked.
+ image_conditioning = torch.zeros(x.shape[0], 3, height, width, device=x.device)
+ image_conditioning = self.sd_model.get_first_stage_encoding(self.sd_model.encode_first_stage(image_conditioning))
+
+ # Add the fake full 1s mask to the first dimension.
+ image_conditioning = torch.nn.functional.pad(image_conditioning, (0, 0, 0, 0, 1, 0), value=1.0)
+ image_conditioning = image_conditioning.to(x.dtype)
+
+ return image_conditioning
+
+ def img2img_image_conditioning(self, source_image, latent_image, image_mask = None):
+ if self.sampler.conditioning_key not in {'hybrid', 'concat'}:
+ # Dummy zero conditioning if we're not using inpainting model.
+ return torch.zeros(
+ latent_image.shape[0], 5, 1, 1,
+ dtype=latent_image.dtype,
+ device=latent_image.device
+ )
+
+ # Handle the different mask inputs
+ if image_mask is not None:
+ if torch.is_tensor(image_mask):
+ conditioning_mask = image_mask
+ else:
+ conditioning_mask = np.array(image_mask.convert("L"))
+ conditioning_mask = conditioning_mask.astype(np.float32) / 255.0
+ conditioning_mask = torch.from_numpy(conditioning_mask[None, None])
+
+ # Inpainting model uses a discretized mask as input, so we round to either 1.0 or 0.0
+ conditioning_mask = torch.round(conditioning_mask)
+ else:
+ conditioning_mask = torch.ones(1, 1, *source_image.shape[-2:])
+
+ # Create another latent image, this time with a masked version of the original input.
+ # Smoothly interpolate between the masked and unmasked latent conditioning image using a parameter.
+ conditioning_mask = conditioning_mask.to(source_image.device)
+ conditioning_image = torch.lerp(
+ source_image,
+ source_image * (1.0 - conditioning_mask),
+ getattr(self, "inpainting_mask_weight", shared.opts.inpainting_mask_weight)
+ )
+
+ # Encode the new masked image using first stage of network.
+ conditioning_image = self.sd_model.get_first_stage_encoding(self.sd_model.encode_first_stage(conditioning_image))
+
+ # Create the concatenated conditioning tensor to be fed to `c_concat`
+ conditioning_mask = torch.nn.functional.interpolate(conditioning_mask, size=latent_image.shape[-2:])
+ conditioning_mask = conditioning_mask.expand(conditioning_image.shape[0], -1, -1, -1)
+ image_conditioning = torch.cat([conditioning_mask, conditioning_image], dim=1)
+ image_conditioning = image_conditioning.to(shared.device).type(self.sd_model.dtype)
+
+ return image_conditioning
def init(self, all_prompts, all_seeds, all_subseeds):
pass
@@ -351,6 +417,22 @@ def create_infotext(p, all_prompts, all_seeds, all_subseeds, comments, iteration
def process_images(p: StableDiffusionProcessing) -> Processed:
+ stored_opts = {k: opts.data[k] for k in p.override_settings.keys()}
+
+ try:
+ for k, v in p.override_settings.items():
+ opts.data[k] = v # we don't call onchange for simplicity which makes changing model, hypernet impossible
+
+ res = process_images_inner(p)
+
+ finally:
+ for k, v in stored_opts.items():
+ opts.data[k] = v
+
+ return res
+
+
+def process_images_inner(p: StableDiffusionProcessing) -> Processed:
"""this is the main loop that both txt2img and img2img use; it calls func_init once inside all the scopes and func_sample once per batch"""
if type(p.prompt) == list:
@@ -556,37 +638,16 @@ class StableDiffusionProcessingTxt2Img(StableDiffusionProcessing):
self.truncate_x = int(self.firstphase_width - firstphase_width_truncated) // opt_f
self.truncate_y = int(self.firstphase_height - firstphase_height_truncated) // opt_f
- def create_dummy_mask(self, x, width=None, height=None):
- if self.sampler.conditioning_key in {'hybrid', 'concat'}:
- height = height or self.height
- width = width or self.width
-
- # The "masked-image" in this case will just be all zeros since the entire image is masked.
- image_conditioning = torch.zeros(x.shape[0], 3, height, width, device=x.device)
- image_conditioning = self.sd_model.get_first_stage_encoding(self.sd_model.encode_first_stage(image_conditioning))
-
- # Add the fake full 1s mask to the first dimension.
- image_conditioning = torch.nn.functional.pad(image_conditioning, (0, 0, 0, 0, 1, 0), value=1.0)
- image_conditioning = image_conditioning.to(x.dtype)
-
- else:
- # Dummy zero conditioning if we're not using inpainting model.
- # Still takes up a bit of memory, but no encoder call.
- # Pretty sure we can just make this a 1x1 image since its not going to be used besides its batch size.
- image_conditioning = torch.zeros(x.shape[0], 5, 1, 1, dtype=x.dtype, device=x.device)
-
- return image_conditioning
-
def sample(self, conditioning, unconditional_conditioning, seeds, subseeds, subseed_strength):
self.sampler = sd_samplers.create_sampler_with_index(sd_samplers.samplers, self.sampler_index, self.sd_model)
if not self.enable_hr:
x = create_random_tensors([opt_C, self.height // opt_f, self.width // opt_f], seeds=seeds, subseeds=subseeds, subseed_strength=self.subseed_strength, seed_resize_from_h=self.seed_resize_from_h, seed_resize_from_w=self.seed_resize_from_w, p=self)
- samples = self.sampler.sample(self, x, conditioning, unconditional_conditioning, image_conditioning=self.create_dummy_mask(x))
+ samples = self.sampler.sample(self, x, conditioning, unconditional_conditioning, image_conditioning=self.txt2img_image_conditioning(x))
return samples
x = create_random_tensors([opt_C, self.firstphase_height // opt_f, self.firstphase_width // opt_f], seeds=seeds, subseeds=subseeds, subseed_strength=self.subseed_strength, seed_resize_from_h=self.seed_resize_from_h, seed_resize_from_w=self.seed_resize_from_w, p=self)
- samples = self.sampler.sample(self, x, conditioning, unconditional_conditioning, image_conditioning=self.create_dummy_mask(x, self.firstphase_width, self.firstphase_height))
+ samples = self.sampler.sample(self, x, conditioning, unconditional_conditioning, image_conditioning=self.txt2img_image_conditioning(x, self.firstphase_width, self.firstphase_height))
samples = samples[:, :, self.truncate_y//2:samples.shape[2]-self.truncate_y//2, self.truncate_x//2:samples.shape[3]-self.truncate_x//2]
@@ -623,7 +684,12 @@ class StableDiffusionProcessingTxt2Img(StableDiffusionProcessing):
x = None
devices.torch_gc()
- samples = self.sampler.sample_img2img(self, samples, noise, conditioning, unconditional_conditioning, steps=self.steps, image_conditioning=self.create_dummy_mask(samples))
+ image_conditioning = self.img2img_image_conditioning(
+ decoded_samples,
+ samples,
+ decoded_samples.new_ones(decoded_samples.shape[0], 1, decoded_samples.shape[2], decoded_samples.shape[3])
+ )
+ samples = self.sampler.sample_img2img(self, samples, noise, conditioning, unconditional_conditioning, steps=self.steps, image_conditioning=image_conditioning)
return samples
@@ -755,33 +821,7 @@ class StableDiffusionProcessingImg2Img(StableDiffusionProcessing):
elif self.inpainting_fill == 3:
self.init_latent = self.init_latent * self.mask
- if self.sampler.conditioning_key in {'hybrid', 'concat'}:
- if self.image_mask is not None:
- conditioning_mask = np.array(self.image_mask.convert("L"))
- conditioning_mask = conditioning_mask.astype(np.float32) / 255.0
- conditioning_mask = torch.from_numpy(conditioning_mask[None, None])
-
- # Inpainting model uses a discretized mask as input, so we round to either 1.0 or 0.0
- conditioning_mask = torch.round(conditioning_mask)
- else:
- conditioning_mask = torch.ones(1, 1, *image.shape[-2:])
-
- # Create another latent image, this time with a masked version of the original input.
- conditioning_mask = conditioning_mask.to(image.device)
- conditioning_image = image * (1.0 - conditioning_mask)
- conditioning_image = self.sd_model.get_first_stage_encoding(self.sd_model.encode_first_stage(conditioning_image))
-
- # Create the concatenated conditioning tensor to be fed to `c_concat`
- conditioning_mask = torch.nn.functional.interpolate(conditioning_mask, size=self.init_latent.shape[-2:])
- conditioning_mask = conditioning_mask.expand(conditioning_image.shape[0], -1, -1, -1)
- self.image_conditioning = torch.cat([conditioning_mask, conditioning_image], dim=1)
- self.image_conditioning = self.image_conditioning.to(shared.device).type(self.sd_model.dtype)
- else:
- self.image_conditioning = torch.zeros(
- self.init_latent.shape[0], 5, 1, 1,
- dtype=self.init_latent.dtype,
- device=self.init_latent.device
- )
+ self.image_conditioning = self.img2img_image_conditioning(image, self.init_latent, self.image_mask)
def sample(self, conditioning, unconditional_conditioning, seeds, subseeds, subseed_strength):
diff --git a/modules/script_callbacks.py b/modules/script_callbacks.py
index dc520abc..6ea58d61 100644
--- a/modules/script_callbacks.py
+++ b/modules/script_callbacks.py
@@ -9,15 +9,34 @@ def report_exception(c, job):
print(traceback.format_exc(), file=sys.stderr)
+class ImageSaveParams:
+ def __init__(self, image, p, filename, pnginfo):
+ self.image = image
+ """the PIL image itself"""
+
+ self.p = p
+ """p object with processing parameters; either StableDiffusionProcessing or an object with same fields"""
+
+ self.filename = filename
+ """name of file that the image would be saved to"""
+
+ self.pnginfo = pnginfo
+ """dictionary with parameters for image's PNG info data; infotext will have the key 'parameters'"""
+
+
ScriptCallback = namedtuple("ScriptCallback", ["script", "callback"])
callbacks_model_loaded = []
callbacks_ui_tabs = []
callbacks_ui_settings = []
+callbacks_before_image_saved = []
callbacks_image_saved = []
+
def clear_callbacks():
callbacks_model_loaded.clear()
callbacks_ui_tabs.clear()
+ callbacks_ui_settings.clear()
+ callbacks_before_image_saved.clear()
callbacks_image_saved.clear()
@@ -49,10 +68,18 @@ def ui_settings_callback():
report_exception(c, 'ui_settings_callback')
-def image_saved_callback(image, p, fullfn, txt_fullfn):
+def before_image_saved_callback(params: ImageSaveParams):
for c in callbacks_image_saved:
try:
- c.callback(image, p, fullfn, txt_fullfn)
+ c.callback(params)
+ except Exception:
+ report_exception(c, 'before_image_saved_callback')
+
+
+def image_saved_callback(params: ImageSaveParams):
+ for c in callbacks_image_saved:
+ try:
+ c.callback(params)
except Exception:
report_exception(c, 'image_saved_callback')
@@ -64,7 +91,6 @@ def add_callback(callbacks, fun):
callbacks.append(ScriptCallback(filename, fun))
-
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"""
@@ -90,11 +116,17 @@ def on_ui_settings(callback):
add_callback(callbacks_ui_settings, callback)
-def on_save_imaged(callback):
- """register a function to be called after modules.images.save_image is called.
- The callback is called with three arguments:
- - p - procesing object (or a dummy object with same fields if the image is saved using save button)
- - fullfn - image filename
- - txt_fullfn - text file with parameters; may be None
+def on_before_image_saved(callback):
+ """register a function to be called before an image is saved to a file.
+ 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)
+
+
+def on_image_saved(callback):
+ """register a function to be called after an image is saved to a file.
+ 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)
diff --git a/modules/sd_models.py b/modules/sd_models.py
index e697bb72..64d5ee0d 100644
--- a/modules/sd_models.py
+++ b/modules/sd_models.py
@@ -3,6 +3,7 @@ import os.path
import sys
from collections import namedtuple
import torch
+import re
from omegaconf import OmegaConf
from ldm.util import instantiate_from_config
@@ -35,8 +36,10 @@ def setup_model():
list_models()
-def checkpoint_tiles():
- return sorted([x.title for x in checkpoints_list.values()])
+def checkpoint_tiles():
+ convert = lambda name: int(name) if name.isdigit() else name.lower()
+ alphanumeric_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)]
+ return sorted([x.title for x in checkpoints_list.values()], key = alphanumeric_key)
def list_models():
diff --git a/modules/shared.py b/modules/shared.py
index 308fccce..5d1ceb85 100644
--- a/modules/shared.py
+++ b/modules/shared.py
@@ -82,9 +82,10 @@ parser.add_argument("--api", action='store_true', help="use api=True to launch t
parser.add_argument("--nowebui", action='store_true', help="use api=True to launch the api instead of the webui")
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)
cmd_opts = parser.parse_args()
-restricted_opts = [
+restricted_opts = {
"samples_filename_pattern",
"directories_filename_pattern",
"outdir_samples",
@@ -94,7 +95,7 @@ restricted_opts = [
"outdir_grids",
"outdir_txt2img_grids",
"outdir_save",
-]
+}
devices.device, devices.device_interrogate, devices.device_gfpgan, devices.device_swinir, devices.device_esrgan, devices.device_scunet, devices.device_codeformer = \
(devices.cpu if any(y in cmd_opts.use_cpu for y in [x, 'all']) else devices.get_optimal_device() for x in ['sd', 'interrogate', 'gfpgan', 'swinir', 'esrgan', 'scunet', 'codeformer'])
@@ -267,6 +268,7 @@ options_templates.update(options_section(('sd', "Stable Diffusion"), {
"sd_checkpoint_cache": OptionInfo(0, "Checkpoints to cache in RAM", gr.Slider, {"minimum": 0, "maximum": 10, "step": 1}),
"sd_hypernetwork": OptionInfo("None", "Hypernetwork", gr.Dropdown, lambda: {"choices": ["None"] + [x for x in hypernetworks.keys()]}, refresh=reload_hypernetworks),
"sd_hypernetwork_strength": OptionInfo(1.0, "Hypernetwork strength", gr.Slider, {"minimum": 0.0, "maximum": 1.0, "step": 0.001}),
+ "inpainting_mask_weight": OptionInfo(1.0, "Inpainting conditioning mask strength", gr.Slider, {"minimum": 0.0, "maximum": 1.0, "step": 0.01}),
"img2img_color_correction": OptionInfo(False, "Apply color correction to img2img results to match original colors."),
"save_images_before_color_correction": OptionInfo(False, "Save a copy of image before applying color correction to img2img results"),
"img2img_fix_steps": OptionInfo(False, "With img2img, do exactly the amount of steps the slider specifies (normally you'd do less with less denoising)."),
@@ -278,6 +280,7 @@ options_templates.update(options_section(('sd', "Stable Diffusion"), {
"filter_nsfw": OptionInfo(False, "Filter NSFW content"),
'CLIP_stop_at_last_layers': OptionInfo(1, "Stop At last layers of CLIP model", gr.Slider, {"minimum": 1, "maximum": 12, "step": 1}),
"random_artist_categories": OptionInfo([], "Allowed categories for random artists selection when using the Roll button", gr.CheckboxGroup, {"choices": artist_db.categories()}),
+ "send_seed": OptionInfo(False, "Send seed when sending prompt or image to other interface"),
}))
options_templates.update(options_section(('interrogate', "Interrogate Options"), {
@@ -449,3 +452,8 @@ total_tqdm = TotalTQDM()
mem_mon = modules.memmon.MemUsageMonitor("MemMon", device, opts)
mem_mon.start()
+
+
+def listfiles(dirname):
+ filenames = [os.path.join(dirname, x) for x in sorted(os.listdir(dirname)) if not x.startswith(".")]
+ return [file for file in filenames if os.path.isfile(file)]
diff --git a/modules/textual_inversion/autocrop.py b/modules/textual_inversion/autocrop.py
new file mode 100644
index 00000000..9859974a
--- /dev/null
+++ b/modules/textual_inversion/autocrop.py
@@ -0,0 +1,341 @@
+import cv2
+import requests
+import os
+from collections import defaultdict
+from math import log, sqrt
+import numpy as np
+from PIL import Image, ImageDraw
+
+GREEN = "#0F0"
+BLUE = "#00F"
+RED = "#F00"
+
+
+def crop_image(im, settings):
+ """ Intelligently crop an image to the subject matter """
+
+ scale_by = 1
+ if is_landscape(im.width, im.height):
+ scale_by = settings.crop_height / im.height
+ elif is_portrait(im.width, im.height):
+ scale_by = settings.crop_width / im.width
+ elif is_square(im.width, im.height):
+ if is_square(settings.crop_width, settings.crop_height):
+ scale_by = settings.crop_width / im.width
+ elif is_landscape(settings.crop_width, settings.crop_height):
+ scale_by = settings.crop_width / im.width
+ elif is_portrait(settings.crop_width, settings.crop_height):
+ scale_by = settings.crop_height / im.height
+
+ im = im.resize((int(im.width * scale_by), int(im.height * scale_by)))
+ im_debug = im.copy()
+
+ focus = focal_point(im_debug, settings)
+
+ # take the focal point and turn it into crop coordinates that try to center over the focal
+ # point but then get adjusted back into the frame
+ y_half = int(settings.crop_height / 2)
+ x_half = int(settings.crop_width / 2)
+
+ x1 = focus.x - x_half
+ if x1 < 0:
+ x1 = 0
+ elif x1 + settings.crop_width > im.width:
+ x1 = im.width - settings.crop_width
+
+ y1 = focus.y - y_half
+ if y1 < 0:
+ y1 = 0
+ elif y1 + settings.crop_height > im.height:
+ y1 = im.height - settings.crop_height
+
+ x2 = x1 + settings.crop_width
+ y2 = y1 + settings.crop_height
+
+ crop = [x1, y1, x2, y2]
+
+ results = []
+
+ results.append(im.crop(tuple(crop)))
+
+ if settings.annotate_image:
+ d = ImageDraw.Draw(im_debug)
+ rect = list(crop)
+ rect[2] -= 1
+ rect[3] -= 1
+ d.rectangle(rect, outline=GREEN)
+ results.append(im_debug)
+ if settings.destop_view_image:
+ im_debug.show()
+
+ return results
+
+def focal_point(im, settings):
+ corner_points = image_corner_points(im, settings) if settings.corner_points_weight > 0 else []
+ entropy_points = image_entropy_points(im, settings) if settings.entropy_points_weight > 0 else []
+ face_points = image_face_points(im, settings) if settings.face_points_weight > 0 else []
+
+ pois = []
+
+ weight_pref_total = 0
+ if len(corner_points) > 0:
+ weight_pref_total += settings.corner_points_weight
+ if len(entropy_points) > 0:
+ weight_pref_total += settings.entropy_points_weight
+ if len(face_points) > 0:
+ weight_pref_total += settings.face_points_weight
+
+ corner_centroid = None
+ if len(corner_points) > 0:
+ corner_centroid = centroid(corner_points)
+ corner_centroid.weight = settings.corner_points_weight / weight_pref_total
+ pois.append(corner_centroid)
+
+ entropy_centroid = None
+ if len(entropy_points) > 0:
+ entropy_centroid = centroid(entropy_points)
+ entropy_centroid.weight = settings.entropy_points_weight / weight_pref_total
+ pois.append(entropy_centroid)
+
+ face_centroid = None
+ if len(face_points) > 0:
+ face_centroid = centroid(face_points)
+ face_centroid.weight = settings.face_points_weight / weight_pref_total
+ pois.append(face_centroid)
+
+ average_point = poi_average(pois, settings)
+
+ if settings.annotate_image:
+ d = ImageDraw.Draw(im)
+ max_size = min(im.width, im.height) * 0.07
+ if corner_centroid is not None:
+ color = BLUE
+ box = corner_centroid.bounding(max_size * corner_centroid.weight)
+ d.text((box[0], box[1]-15), "Edge: %.02f" % corner_centroid.weight, fill=color)
+ d.ellipse(box, outline=color)
+ if len(corner_points) > 1:
+ for f in corner_points:
+ d.rectangle(f.bounding(4), outline=color)
+ if entropy_centroid is not None:
+ color = "#ff0"
+ box = entropy_centroid.bounding(max_size * entropy_centroid.weight)
+ d.text((box[0], box[1]-15), "Entropy: %.02f" % entropy_centroid.weight, fill=color)
+ d.ellipse(box, outline=color)
+ if len(entropy_points) > 1:
+ for f in entropy_points:
+ d.rectangle(f.bounding(4), outline=color)
+ if face_centroid is not None:
+ color = RED
+ box = face_centroid.bounding(max_size * face_centroid.weight)
+ d.text((box[0], box[1]-15), "Face: %.02f" % face_centroid.weight, fill=color)
+ d.ellipse(box, outline=color)
+ if len(face_points) > 1:
+ for f in face_points:
+ d.rectangle(f.bounding(4), outline=color)
+
+ d.ellipse(average_point.bounding(max_size), outline=GREEN)
+
+ return average_point
+
+
+def image_face_points(im, settings):
+ if settings.dnn_model_path is not None:
+ detector = cv2.FaceDetectorYN.create(
+ settings.dnn_model_path,
+ "",
+ (im.width, im.height),
+ 0.9, # score threshold
+ 0.3, # nms threshold
+ 5000 # keep top k before nms
+ )
+ faces = detector.detect(np.array(im))
+ results = []
+ if faces[1] is not None:
+ for face in faces[1]:
+ x = face[0]
+ y = face[1]
+ w = face[2]
+ h = face[3]
+ results.append(
+ PointOfInterest(
+ int(x + (w * 0.5)), # face focus left/right is center
+ int(y + (h * 0.33)), # face focus up/down is close to the top of the head
+ size = w,
+ weight = 1/len(faces[1])
+ )
+ )
+ return results
+ else:
+ np_im = np.array(im)
+ gray = cv2.cvtColor(np_im, cv2.COLOR_BGR2GRAY)
+
+ tries = [
+ [ f'{cv2.data.haarcascades}haarcascade_eye.xml', 0.01 ],
+ [ f'{cv2.data.haarcascades}haarcascade_frontalface_default.xml', 0.05 ],
+ [ f'{cv2.data.haarcascades}haarcascade_profileface.xml', 0.05 ],
+ [ f'{cv2.data.haarcascades}haarcascade_frontalface_alt.xml', 0.05 ],
+ [ f'{cv2.data.haarcascades}haarcascade_frontalface_alt2.xml', 0.05 ],
+ [ f'{cv2.data.haarcascades}haarcascade_frontalface_alt_tree.xml', 0.05 ],
+ [ f'{cv2.data.haarcascades}haarcascade_eye_tree_eyeglasses.xml', 0.05 ],
+ [ f'{cv2.data.haarcascades}haarcascade_upperbody.xml', 0.05 ]
+ ]
+ for t in tries:
+ classifier = cv2.CascadeClassifier(t[0])
+ minsize = int(min(im.width, im.height) * t[1]) # at least N percent of the smallest side
+ try:
+ faces = classifier.detectMultiScale(gray, scaleFactor=1.1,
+ minNeighbors=7, minSize=(minsize, minsize), flags=cv2.CASCADE_SCALE_IMAGE)
+ except:
+ continue
+
+ if len(faces) > 0:
+ rects = [[f[0], f[1], f[0] + f[2], f[1] + f[3]] for f in faces]
+ return [PointOfInterest((r[0] +r[2]) // 2, (r[1] + r[3]) // 2, size=abs(r[0]-r[2]), weight=1/len(rects)) for r in rects]
+ return []
+
+
+def image_corner_points(im, settings):
+ grayscale = im.convert("L")
+
+ # naive attempt at preventing focal points from collecting at watermarks near the bottom
+ gd = ImageDraw.Draw(grayscale)
+ gd.rectangle([0, im.height*.9, im.width, im.height], fill="#999")
+
+ np_im = np.array(grayscale)
+
+ points = cv2.goodFeaturesToTrack(
+ np_im,
+ maxCorners=100,
+ qualityLevel=0.04,
+ minDistance=min(grayscale.width, grayscale.height)*0.06,
+ useHarrisDetector=False,
+ )
+
+ if points is None:
+ return []
+
+ focal_points = []
+ for point in points:
+ x, y = point.ravel()
+ focal_points.append(PointOfInterest(x, y, size=4, weight=1/len(points)))
+
+ return focal_points
+
+
+def image_entropy_points(im, settings):
+ landscape = im.height < im.width
+ portrait = im.height > im.width
+ if landscape:
+ move_idx = [0, 2]
+ move_max = im.size[0]
+ elif portrait:
+ move_idx = [1, 3]
+ move_max = im.size[1]
+ else:
+ return []
+
+ e_max = 0
+ crop_current = [0, 0, settings.crop_width, settings.crop_height]
+ crop_best = crop_current
+ while crop_current[move_idx[1]] < move_max:
+ crop = im.crop(tuple(crop_current))
+ e = image_entropy(crop)
+
+ if (e > e_max):
+ e_max = e
+ crop_best = list(crop_current)
+
+ crop_current[move_idx[0]] += 4
+ crop_current[move_idx[1]] += 4
+
+ x_mid = int(crop_best[0] + settings.crop_width/2)
+ y_mid = int(crop_best[1] + settings.crop_height/2)
+
+ return [PointOfInterest(x_mid, y_mid, size=25, weight=1.0)]
+
+
+def image_entropy(im):
+ # greyscale image entropy
+ # band = np.asarray(im.convert("L"))
+ band = np.asarray(im.convert("1"), dtype=np.uint8)
+ hist, _ = np.histogram(band, bins=range(0, 256))
+ hist = hist[hist > 0]
+ return -np.log2(hist / hist.sum()).sum()
+
+def centroid(pois):
+ x = [poi.x for poi in pois]
+ y = [poi.y for poi in pois]
+ return PointOfInterest(sum(x)/len(pois), sum(y)/len(pois))
+
+
+def poi_average(pois, settings):
+ weight = 0.0
+ x = 0.0
+ y = 0.0
+ for poi in pois:
+ weight += poi.weight
+ x += poi.x * poi.weight
+ y += poi.y * poi.weight
+ avg_x = round(x / weight)
+ avg_y = round(y / weight)
+
+ return PointOfInterest(avg_x, avg_y)
+
+
+def is_landscape(w, h):
+ return w > h
+
+
+def is_portrait(w, h):
+ return h > w
+
+
+def is_square(w, h):
+ return w == h
+
+
+def download_and_cache_models(dirname):
+ download_url = 'https://github.com/opencv/opencv_zoo/blob/91fb0290f50896f38a0ab1e558b74b16bc009428/models/face_detection_yunet/face_detection_yunet_2022mar.onnx?raw=true'
+ model_file_name = 'face_detection_yunet.onnx'
+
+ if not os.path.exists(dirname):
+ os.makedirs(dirname)
+
+ cache_file = os.path.join(dirname, model_file_name)
+ if not os.path.exists(cache_file):
+ print(f"downloading face detection model from '{download_url}' to '{cache_file}'")
+ response = requests.get(download_url)
+ with open(cache_file, "wb") as f:
+ f.write(response.content)
+
+ if os.path.exists(cache_file):
+ return cache_file
+ return None
+
+
+class PointOfInterest:
+ def __init__(self, x, y, weight=1.0, size=10):
+ self.x = x
+ self.y = y
+ self.weight = weight
+ self.size = size
+
+ def bounding(self, size):
+ return [
+ self.x - size//2,
+ self.y - size//2,
+ self.x + size//2,
+ self.y + size//2
+ ]
+
+
+class Settings:
+ def __init__(self, crop_width=512, crop_height=512, corner_points_weight=0.5, entropy_points_weight=0.5, face_points_weight=0.5, annotate_image=False, dnn_model_path=None):
+ self.crop_width = crop_width
+ self.crop_height = crop_height
+ self.corner_points_weight = corner_points_weight
+ self.entropy_points_weight = entropy_points_weight
+ self.face_points_weight = face_points_weight
+ self.annotate_image = annotate_image
+ self.destop_view_image = False
+ self.dnn_model_path = dnn_model_path \ No newline at end of file
diff --git a/modules/textual_inversion/dataset.py b/modules/textual_inversion/dataset.py
index 5b1c5002..8bb00d27 100644
--- a/modules/textual_inversion/dataset.py
+++ b/modules/textual_inversion/dataset.py
@@ -86,12 +86,12 @@ class PersonalizedBase(Dataset):
assert len(self.dataset) > 0, "No images have been found in the dataset."
self.length = len(self.dataset) * repeats // batch_size
- self.initial_indexes = np.arange(len(self.dataset))
+ self.dataset_length = len(self.dataset)
self.indexes = None
self.shuffle()
def shuffle(self):
- self.indexes = self.initial_indexes[torch.randperm(self.initial_indexes.shape[0]).numpy()]
+ self.indexes = np.random.permutation(self.dataset_length)
def create_text(self, filename_text):
text = random.choice(self.lines)
diff --git a/modules/textual_inversion/learn_schedule.py b/modules/textual_inversion/learn_schedule.py
index 2062726a..3a736065 100644
--- a/modules/textual_inversion/learn_schedule.py
+++ b/modules/textual_inversion/learn_schedule.py
@@ -52,7 +52,7 @@ class LearnRateScheduler:
self.finished = False
def apply(self, optimizer, step_number):
- if step_number <= self.end_step:
+ if step_number < self.end_step:
return
try:
diff --git a/modules/textual_inversion/preprocess.py b/modules/textual_inversion/preprocess.py
index 33eaddb6..e13b1894 100644
--- a/modules/textual_inversion/preprocess.py
+++ b/modules/textual_inversion/preprocess.py
@@ -7,12 +7,14 @@ import tqdm
import time
from modules import shared, images
+from modules.paths import models_path
from modules.shared import opts, cmd_opts
+from modules.textual_inversion import autocrop
if cmd_opts.deepdanbooru:
import modules.deepbooru as deepbooru
-def preprocess(process_src, process_dst, process_width, process_height, preprocess_txt_action, process_flip, process_split, process_caption, process_caption_deepbooru=False, split_threshold=0.5, overlap_ratio=0.2):
+def preprocess(process_src, process_dst, process_width, process_height, preprocess_txt_action, process_flip, process_split, process_caption, process_caption_deepbooru=False, split_threshold=0.5, overlap_ratio=0.2, process_focal_crop=False, process_focal_crop_face_weight=0.9, process_focal_crop_entropy_weight=0.3, process_focal_crop_edges_weight=0.5, process_focal_crop_debug=False):
try:
if process_caption:
shared.interrogator.load()
@@ -22,7 +24,7 @@ def preprocess(process_src, process_dst, process_width, process_height, preproce
db_opts[deepbooru.OPT_INCLUDE_RANKS] = False
deepbooru.create_deepbooru_process(opts.interrogate_deepbooru_score_threshold, db_opts)
- preprocess_work(process_src, process_dst, process_width, process_height, preprocess_txt_action, process_flip, process_split, process_caption, process_caption_deepbooru, split_threshold, overlap_ratio)
+ preprocess_work(process_src, process_dst, process_width, process_height, preprocess_txt_action, process_flip, process_split, process_caption, process_caption_deepbooru, split_threshold, overlap_ratio, process_focal_crop, process_focal_crop_face_weight, process_focal_crop_entropy_weight, process_focal_crop_edges_weight, process_focal_crop_debug)
finally:
@@ -34,7 +36,7 @@ def preprocess(process_src, process_dst, process_width, process_height, preproce
-def preprocess_work(process_src, process_dst, process_width, process_height, preprocess_txt_action, process_flip, process_split, process_caption, process_caption_deepbooru=False, split_threshold=0.5, overlap_ratio=0.2):
+def preprocess_work(process_src, process_dst, process_width, process_height, preprocess_txt_action, process_flip, process_split, process_caption, process_caption_deepbooru=False, split_threshold=0.5, overlap_ratio=0.2, process_focal_crop=False, process_focal_crop_face_weight=0.9, process_focal_crop_entropy_weight=0.3, process_focal_crop_edges_weight=0.5, process_focal_crop_debug=False):
width = process_width
height = process_height
src = os.path.abspath(process_src)
@@ -113,6 +115,7 @@ def preprocess_work(process_src, process_dst, process_width, process_height, pre
splitted = image.crop((0, y, to_w, y + to_h))
yield splitted
+
for index, imagefile in enumerate(tqdm.tqdm(files)):
subindex = [0]
filename = os.path.join(src, imagefile)
@@ -137,11 +140,36 @@ def preprocess_work(process_src, process_dst, process_width, process_height, pre
ratio = (img.height * width) / (img.width * height)
inverse_xy = True
+ process_default_resize = True
+
if process_split and ratio < 1.0 and ratio <= split_threshold:
for splitted in split_pic(img, inverse_xy):
save_pic(splitted, index, existing_caption=existing_caption)
- else:
+ process_default_resize = False
+
+ if process_focal_crop and img.height != img.width:
+
+ dnn_model_path = None
+ try:
+ dnn_model_path = autocrop.download_and_cache_models(os.path.join(models_path, "opencv"))
+ except Exception as e:
+ print("Unable to load face detection model for auto crop selection. Falling back to lower quality haar method.", e)
+
+ autocrop_settings = autocrop.Settings(
+ crop_width = width,
+ crop_height = height,
+ face_points_weight = process_focal_crop_face_weight,
+ entropy_points_weight = process_focal_crop_entropy_weight,
+ corner_points_weight = process_focal_crop_edges_weight,
+ annotate_image = process_focal_crop_debug,
+ dnn_model_path = dnn_model_path,
+ )
+ for focal in autocrop.crop_image(img, autocrop_settings):
+ save_pic(focal, index, existing_caption=existing_caption)
+ process_default_resize = False
+
+ if process_default_resize:
img = images.resize_image(1, img, width, height)
save_pic(img, index, existing_caption=existing_caption)
- shared.state.nextjob()
+ shared.state.nextjob() \ No newline at end of file
diff --git a/modules/textual_inversion/textual_inversion.py b/modules/textual_inversion/textual_inversion.py
index 529ed3e2..17dfb223 100644
--- a/modules/textual_inversion/textual_inversion.py
+++ b/modules/textual_inversion/textual_inversion.py
@@ -10,7 +10,7 @@ import csv
from PIL import Image, PngImagePlugin
-from modules import shared, devices, sd_hijack, processing, sd_models
+from modules import shared, devices, sd_hijack, processing, sd_models, images
import modules.textual_inversion.dataset
from modules.textual_inversion.learn_schedule import LearnRateScheduler
@@ -157,6 +157,9 @@ def create_embedding(name, num_vectors_per_token, overwrite_old, init_text='*'):
cond_model = shared.sd_model.cond_stage_model
embedding_layer = cond_model.wrapped.transformer.text_model.embeddings
+ with devices.autocast():
+ cond_model([""]) # will send cond model to GPU if lowvram/medvram is active
+
ids = cond_model.tokenizer(init_text, max_length=num_vectors_per_token, return_tensors="pt", add_special_tokens=False)["input_ids"]
embedded = embedding_layer.token_embedding.wrapped(ids.to(devices.device)).squeeze(0)
vec = torch.zeros((num_vectors_per_token, embedded.shape[1]), device=devices.device)
@@ -164,6 +167,8 @@ def create_embedding(name, num_vectors_per_token, overwrite_old, init_text='*'):
for i in range(num_vectors_per_token):
vec[i] = embedded[i * int(embedded.shape[0]) // num_vectors_per_token]
+ # Remove illegal characters from name.
+ name = "".join( x for x in name if (x.isalnum() or x in "._- "))
fn = os.path.join(shared.cmd_opts.embeddings_dir, f"{name}.pt")
if not overwrite_old:
assert not os.path.exists(fn), f"file {fn} already exists"
@@ -179,9 +184,8 @@ def write_loss(log_directory, filename, step, epoch_len, values):
if shared.opts.training_write_csv_every == 0:
return
- if step % shared.opts.training_write_csv_every != 0:
+ if (step + 1) % shared.opts.training_write_csv_every != 0:
return
-
write_csv_header = False if os.path.exists(os.path.join(log_directory, filename)) else True
with open(os.path.join(log_directory, filename), "a+", newline='') as fout:
@@ -191,11 +195,11 @@ def write_loss(log_directory, filename, step, epoch_len, values):
csv_writer.writeheader()
epoch = step // epoch_len
- epoch_step = step - epoch * epoch_len
+ epoch_step = step % epoch_len
csv_writer.writerow({
"step": step + 1,
- "epoch": epoch + 1,
+ "epoch": epoch,
"epoch_step": epoch_step + 1,
**values,
})
@@ -244,6 +248,7 @@ def train_embedding(embedding_name, learn_rate, batch_size, data_root, log_direc
last_saved_file = "<none>"
last_saved_image = "<none>"
+ forced_filename = "<none>"
embedding_yet_to_be_embedded = False
ititial_step = embedding.step or 0
@@ -276,14 +281,17 @@ def train_embedding(embedding_name, learn_rate, batch_size, data_root, log_direc
loss.backward()
optimizer.step()
+ steps_done = embedding.step + 1
epoch_num = embedding.step // len(ds)
- epoch_step = embedding.step - (epoch_num * len(ds)) + 1
+ epoch_step = embedding.step % len(ds)
- pbar.set_description(f"[Epoch {epoch_num}: {epoch_step}/{len(ds)}]loss: {losses.mean():.7f}")
+ pbar.set_description(f"[Epoch {epoch_num}: {epoch_step+1}/{len(ds)}]loss: {losses.mean():.7f}")
- if embedding.step > 0 and embedding_dir is not None and embedding.step % save_embedding_every == 0:
- last_saved_file = os.path.join(embedding_dir, f'{embedding_name}-{embedding.step}.pt')
+ if embedding_dir is not None and steps_done % save_embedding_every == 0:
+ # Before saving, change name to match current checkpoint.
+ embedding.name = f'{embedding_name}-{steps_done}'
+ last_saved_file = os.path.join(embedding_dir, f'{embedding.name}.pt')
embedding.save(last_saved_file)
embedding_yet_to_be_embedded = True
@@ -292,9 +300,9 @@ def train_embedding(embedding_name, learn_rate, batch_size, data_root, log_direc
"learn_rate": scheduler.learn_rate
})
- if embedding.step > 0 and images_dir is not None and embedding.step % create_image_every == 0:
- last_saved_image = os.path.join(images_dir, f'{embedding_name}-{embedding.step}.png')
-
+ 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)
p = processing.StableDiffusionProcessingTxt2Img(
sd_model=shared.sd_model,
do_not_save_grid=True,
@@ -326,7 +334,7 @@ def train_embedding(embedding_name, learn_rate, batch_size, data_root, log_direc
if save_image_with_stored_embedding and os.path.exists(last_saved_file) and embedding_yet_to_be_embedded:
- last_saved_image_chunks = os.path.join(images_embeds_dir, f'{embedding_name}-{embedding.step}.png')
+ last_saved_image_chunks = os.path.join(images_embeds_dir, f'{embedding_name}-{steps_done}.png')
info = PngImagePlugin.PngInfo()
data = torch.load(last_saved_file)
@@ -342,7 +350,7 @@ def train_embedding(embedding_name, learn_rate, batch_size, data_root, log_direc
checkpoint = sd_models.select_checkpoint()
footer_left = checkpoint.model_name
footer_mid = '[{}]'.format(checkpoint.hash)
- footer_right = '{}v {}s'.format(vectorSize, embedding.step)
+ footer_right = '{}v {}s'.format(vectorSize, steps_done)
captioned_image = caption_image_overlay(image, title, footer_left, footer_mid, footer_right)
captioned_image = insert_image_data_embed(captioned_image, data)
@@ -350,8 +358,7 @@ def train_embedding(embedding_name, learn_rate, batch_size, data_root, log_direc
captioned_image.save(last_saved_image_chunks, "PNG", pnginfo=info)
embedding_yet_to_be_embedded = False
- image.save(last_saved_image)
-
+ last_saved_image, last_text_info = images.save_image(image, images_dir, "", p.seed, p.prompt, shared.opts.samples_format, processed.infotexts[0], p=p, forced_filename=forced_filename, save_to_dirs=False)
last_saved_image += f", prompt: {preview_text}"
shared.state.job_no = embedding.step
@@ -371,6 +378,9 @@ Last saved image: {html.escape(last_saved_image)}<br/>
embedding.sd_checkpoint = checkpoint.hash
embedding.sd_checkpoint_name = checkpoint.model_name
embedding.cached_checksum = None
+ # Before saving for the last time, change name back to base name (as opposed to the save_embedding_every step-suffixed naming convention).
+ embedding.name = embedding_name
+ filename = os.path.join(shared.cmd_opts.embeddings_dir, f'{embedding.name}.pt')
embedding.save(filename)
return embedding, filename
diff --git a/modules/ui.py b/modules/ui.py
index 03528968..b2e1805f 100644
--- a/modules/ui.py
+++ b/modules/ui.py
@@ -1,6 +1,4 @@
-import base64
import html
-import io
import json
import math
import mimetypes
@@ -18,13 +16,8 @@ import gradio as gr
import gradio.routes
import gradio.utils
import numpy as np
-import piexif
-import torch
from PIL import Image, PngImagePlugin
-import gradio as gr
-import gradio.utils
-import gradio.routes
from modules import sd_hijack, sd_models, localization, script_callbacks
from modules.paths import script_path
@@ -35,7 +28,7 @@ if cmd_opts.deepdanbooru:
from modules.deepbooru import get_deepbooru_tags
import modules.codeformer_model
-import modules.generation_parameters_copypaste
+import modules.generation_parameters_copypaste as parameters_copypaste
import modules.gfpgan_model
import modules.hypernetworks.ui
import modules.ldsr_model
@@ -49,13 +42,11 @@ from modules.sd_hijack import model_hijack
from modules.sd_samplers import samplers, samplers_for_img2img
import modules.textual_inversion.ui
import modules.hypernetworks.ui
+from modules.generation_parameters_copypaste import image_from_url_text
# this is a fix for Windows users. Without it, javascript files will be served with text/html content-type and the browser will not show any UI
mimetypes.init()
mimetypes.add_type('application/javascript', '.js')
-txt2img_paste_fields = []
-img2img_paste_fields = []
-
if not cmd_opts.share and not cmd_opts.listen:
# fix gradio phoning home
@@ -98,37 +89,11 @@ def plaintext_to_html(text):
text = "<p>" + "<br>\n".join([f"{html.escape(x)}" for x in text.split('\n')]) + "</p>"
return text
-
-def image_from_url_text(filedata):
- if type(filedata) == dict and filedata["is_file"]:
- filename = filedata["name"]
- tempdir = os.path.normpath(tempfile.gettempdir())
- normfn = os.path.normpath(filename)
- assert normfn.startswith(tempdir), 'trying to open image file not in temporary directory'
-
- return Image.open(filename)
-
- if type(filedata) == list:
- if len(filedata) == 0:
- return None
-
- filedata = filedata[0]
-
- if filedata.startswith("data:image/png;base64,"):
- filedata = filedata[len("data:image/png;base64,"):]
-
- filedata = base64.decodebytes(filedata.encode('utf-8'))
- image = Image.open(io.BytesIO(filedata))
- return image
-
-
def send_gradio_gallery_to_image(x):
if len(x) == 0:
return None
-
return image_from_url_text(x[0])
-
def save_files(js_data, images, do_make_zip, index):
import csv
filenames = []
@@ -192,7 +157,6 @@ def save_files(js_data, images, do_make_zip, index):
return gr.File.update(value=fullfns, visible=True), '', '', plaintext_to_html(f"Saved: {filenames[0]}")
-
def save_pil_to_file(pil_image, dir=None):
use_metadata = False
metadata = PngImagePlugin.PngInfo()
@@ -625,6 +589,82 @@ def create_refresh_button(refresh_component, refresh_method, refreshed_args, ele
)
return refresh_button
+def create_output_panel(tabname, outdir):
+ def open_folder(f):
+ if not os.path.exists(f):
+ print(f'Folder "{f}" does not exist. After you create an image, the folder will be created.')
+ return
+ elif not os.path.isdir(f):
+ print(f"""
+WARNING
+An open_folder request was made with an argument that is not a folder.
+This could be an error or a malicious attempt to run code on your computer.
+Requested path was: {f}
+""", file=sys.stderr)
+ return
+
+ if not shared.cmd_opts.hide_ui_dir_config:
+ path = os.path.normpath(f)
+ if platform.system() == "Windows":
+ os.startfile(path)
+ elif platform.system() == "Darwin":
+ sp.Popen(["open", path])
+ else:
+ sp.Popen(["xdg-open", path])
+
+ with gr.Column(variant='panel'):
+ with gr.Group():
+ result_gallery = gr.Gallery(label='Output', show_label=False, elem_id=f"{tabname}_gallery").style(grid=4)
+
+ generation_info = None
+ with gr.Column():
+ with gr.Row():
+ if tabname != "extras":
+ save = gr.Button('Save')
+
+ buttons = parameters_copypaste.create_buttons(["img2img", "inpaint", "extras"])
+ button_id = "hidden_element" if shared.cmd_opts.hide_ui_dir_config else 'open_folder'
+ open_folder_button = gr.Button(folder_symbol, elem_id=button_id)
+
+ open_folder_button.click(
+ fn=lambda: open_folder(opts.outdir_samples or outdir),
+ inputs=[],
+ outputs=[],
+ )
+
+ if tabname != "extras":
+ with gr.Row():
+ do_make_zip = gr.Checkbox(label="Make Zip when Save?", value=False)
+
+ with gr.Row():
+ download_files = gr.File(None, file_count="multiple", interactive=False, show_label=False, visible=False)
+
+ with gr.Group():
+ html_info = gr.HTML()
+ generation_info = gr.Textbox(visible=False)
+
+ save.click(
+ fn=wrap_gradio_call(save_files),
+ _js="(x, y, z, w) => [x, y, z, selected_gallery_index()]",
+ inputs=[
+ generation_info,
+ result_gallery,
+ do_make_zip,
+ html_info,
+ ],
+ outputs=[
+ download_files,
+ html_info,
+ html_info,
+ html_info,
+ ]
+ )
+ else:
+ html_info_x = gr.HTML()
+ html_info = gr.HTML()
+ parameters_copypaste.bind_buttons(buttons, result_gallery, "txt2img" if tabname == "txt2img" else None)
+ return result_gallery, generation_info if tabname != "extras" else html_info_x, html_info
+
def create_ui(wrap_gradio_gpu_call):
import modules.img2img
@@ -675,30 +715,9 @@ def create_ui(wrap_gradio_gpu_call):
with gr.Group():
custom_inputs = modules.scripts.scripts_txt2img.setup_ui(is_img2img=False)
- with gr.Column(variant='panel'):
- with gr.Group():
- txt2img_preview = gr.Image(elem_id='txt2img_preview', visible=False)
- txt2img_gallery = gr.Gallery(label='Output', show_label=False, elem_id='txt2img_gallery').style(grid=4)
- with gr.Column():
- with gr.Row():
- save = gr.Button('Save')
- send_to_img2img = gr.Button('Send to img2img')
- send_to_inpaint = gr.Button('Send to inpaint')
- send_to_extras = gr.Button('Send to extras')
- button_id = "hidden_element" if shared.cmd_opts.hide_ui_dir_config else 'open_folder'
- open_txt2img_folder = gr.Button(folder_symbol, elem_id=button_id)
-
- with gr.Row():
- do_make_zip = gr.Checkbox(label="Make Zip when Save?", value=False)
-
- with gr.Row():
- download_files = gr.File(None, file_count="multiple", interactive=False, show_label=False, visible=False)
-
- with gr.Group():
- html_info = gr.HTML()
- generation_info = gr.Textbox(visible=False)
+ txt2img_gallery, generation_info, html_info = create_output_panel("txt2img", opts.outdir_txt2img_samples)
connect_reuse_seed(seed, reuse_seed, generation_info, dummy_component, is_subseed=False)
connect_reuse_seed(subseed, reuse_subseed, generation_info, dummy_component, is_subseed=True)
@@ -756,23 +775,6 @@ def create_ui(wrap_gradio_gpu_call):
outputs=[hr_options],
)
- save.click(
- fn=wrap_gradio_call(save_files),
- _js="(x, y, z, w) => [x, y, z, selected_gallery_index()]",
- inputs=[
- generation_info,
- txt2img_gallery,
- do_make_zip,
- html_info,
- ],
- outputs=[
- download_files,
- html_info,
- html_info,
- html_info,
- ]
- )
-
roll.click(
fn=roll_artist,
_js="update_txt2img_tokens",
@@ -784,8 +786,7 @@ def create_ui(wrap_gradio_gpu_call):
]
)
- global txt2img_paste_fields
- txt2img_paste_fields = [
+ parameters_copypaste.add_paste_fields("txt2img", None, [
(txt2img_prompt, "Prompt"),
(txt2img_negative_prompt, "Negative prompt"),
(steps, "Steps"),
@@ -806,7 +807,7 @@ def create_ui(wrap_gradio_gpu_call):
(firstphase_width, "First pass size-1"),
(firstphase_height, "First pass size-2"),
*modules.scripts.scripts_txt2img.infotext_fields
- ]
+ ])
txt2img_preview_params = [
txt2img_prompt,
@@ -893,30 +894,7 @@ def create_ui(wrap_gradio_gpu_call):
with gr.Group():
custom_inputs = modules.scripts.scripts_img2img.setup_ui(is_img2img=True)
- with gr.Column(variant='panel'):
-
- with gr.Group():
- img2img_preview = gr.Image(elem_id='img2img_preview', visible=False)
- img2img_gallery = gr.Gallery(label='Output', show_label=False, elem_id='img2img_gallery').style(grid=4)
-
- with gr.Column():
- with gr.Row():
- save = gr.Button('Save')
- img2img_send_to_img2img = gr.Button('Send to img2img')
- img2img_send_to_inpaint = gr.Button('Send to inpaint')
- img2img_send_to_extras = gr.Button('Send to extras')
- button_id = "hidden_element" if shared.cmd_opts.hide_ui_dir_config else 'open_folder'
- open_img2img_folder = gr.Button(folder_symbol, elem_id=button_id)
-
- with gr.Row():
- do_make_zip = gr.Checkbox(label="Make Zip when Save?", value=False)
-
- with gr.Row():
- download_files = gr.File(None, file_count="multiple", interactive=False, show_label=False, visible=False)
-
- with gr.Group():
- html_info = gr.HTML()
- generation_info = gr.Textbox(visible=False)
+ img2img_gallery, generation_info, html_info = create_output_panel("img2img", opts.outdir_img2img_samples)
connect_reuse_seed(seed, reuse_seed, generation_info, dummy_component, is_subseed=False)
connect_reuse_seed(subseed, reuse_subseed, generation_info, dummy_component, is_subseed=True)
@@ -1003,25 +981,9 @@ def create_ui(wrap_gradio_gpu_call):
fn=interrogate_deepbooru,
inputs=[init_img],
outputs=[img2img_prompt],
- )
-
- save.click(
- fn=wrap_gradio_call(save_files),
- _js="(x, y, z, w) => [x, y, z, selected_gallery_index()]",
- inputs=[
- generation_info,
- img2img_gallery,
- do_make_zip,
- html_info,
- ],
- outputs=[
- download_files,
- html_info,
- html_info,
- html_info,
- ]
)
+
roll.click(
fn=roll_artist,
_js="update_img2img_tokens",
@@ -1055,7 +1017,8 @@ def create_ui(wrap_gradio_gpu_call):
outputs=[prompt, negative_prompt, style1, style2],
)
- global img2img_paste_fields
+ token_button.click(fn=update_token_counter, inputs=[img2img_prompt, steps], outputs=[token_counter])
+
img2img_paste_fields = [
(img2img_prompt, "Prompt"),
(img2img_negative_prompt, "Negative prompt"),
@@ -1074,7 +1037,9 @@ def create_ui(wrap_gradio_gpu_call):
(denoising_strength, "Denoising strength"),
*modules.scripts.scripts_img2img.infotext_fields
]
- token_button.click(fn=update_token_counter, inputs=[img2img_prompt, steps], outputs=[token_counter])
+ parameters_copypaste.add_paste_fields("img2img", init_img, img2img_paste_fields)
+ parameters_copypaste.add_paste_fields("inpaint", init_img_with_mask, img2img_paste_fields)
+
with gr.Blocks(analytics_enabled=False) as extras_interface:
with gr.Row().style(equal_height=False):
@@ -1104,9 +1069,9 @@ def create_ui(wrap_gradio_gpu_call):
upscaling_resize_w = gr.Number(label="Width", value=512, precision=0)
upscaling_resize_h = gr.Number(label="Height", value=512, precision=0)
upscaling_crop = gr.Checkbox(label='Crop to fit', value=True)
-
+
with gr.Group():
- extras_upscaler_1 = gr.Radio(label='Upscaler 1', elem_id="extras_upscaler_1", choices=[x.name for x in shared.sd_upscalers], value=shared.sd_upscalers[0].name, type="index")
+ extras_upscaler_1 = gr.Radio(label='Upscaler 1', elem_id="extras_upscaler_1", choices=[x.name for x in shared.sd_upscalers], value=shared.sd_upscalers[0].name, type="index")
with gr.Group():
extras_upscaler_2 = gr.Radio(label='Upscaler 2', elem_id="extras_upscaler_2", choices=[x.name for x in shared.sd_upscalers], value=shared.sd_upscalers[0].name, type="index")
@@ -1119,17 +1084,13 @@ def create_ui(wrap_gradio_gpu_call):
codeformer_visibility = gr.Slider(minimum=0.0, maximum=1.0, step=0.001, label="CodeFormer visibility", value=0, interactive=modules.codeformer_model.have_codeformer)
codeformer_weight = gr.Slider(minimum=0.0, maximum=1.0, step=0.001, label="CodeFormer weight (0 = maximum effect, 1 = minimum effect)", value=0, interactive=modules.codeformer_model.have_codeformer)
+ with gr.Group():
+ upscale_before_face_fix = gr.Checkbox(label='Upscale Before Restoring Faces', value=False)
+
submit = gr.Button('Generate', elem_id="extras_generate", variant='primary')
- with gr.Column(variant='panel'):
- result_images = gr.Gallery(label="Result", show_label=False)
- html_info_x = gr.HTML()
- html_info = gr.HTML()
- extras_send_to_img2img = gr.Button('Send to img2img')
- extras_send_to_inpaint = gr.Button('Send to inpaint')
- button_id = "hidden_element" if shared.cmd_opts.hide_ui_dir_config else ''
- open_extras_folder = gr.Button('Open output directory', elem_id=button_id)
+ result_images, html_info_x, html_info = create_output_panel("extras", opts.outdir_extras_samples)
submit.click(
fn=wrap_gradio_gpu_call(modules.extras.run_extras),
@@ -1152,6 +1113,7 @@ def create_ui(wrap_gradio_gpu_call):
extras_upscaler_1,
extras_upscaler_2,
extras_upscaler_2_visibility,
+ upscale_before_face_fix,
],
outputs=[
result_images,
@@ -1159,19 +1121,12 @@ def create_ui(wrap_gradio_gpu_call):
html_info,
]
)
+ parameters_copypaste.add_paste_fields("extras", extras_image, None)
- extras_send_to_img2img.click(
- fn=lambda x: image_from_url_text(x),
- _js="extract_image_from_gallery_img2img",
- inputs=[result_images],
- outputs=[init_img],
- )
- extras_send_to_inpaint.click(
- fn=lambda x: image_from_url_text(x),
- _js="extract_image_from_gallery_inpaint",
- inputs=[result_images],
- outputs=[init_img_with_mask],
+ extras_image.change(
+ fn=modules.extras.clear_cache,
+ inputs=[], outputs=[]
)
with gr.Blocks(analytics_enabled=False) as pnginfo_interface:
@@ -1183,17 +1138,16 @@ def create_ui(wrap_gradio_gpu_call):
html = gr.HTML()
generation_info = gr.Textbox(visible=False)
html2 = gr.HTML()
-
with gr.Row():
- pnginfo_send_to_txt2img = gr.Button('Send to txt2img')
- pnginfo_send_to_img2img = gr.Button('Send to img2img')
+ buttons = parameters_copypaste.create_buttons(["txt2img", "img2img", "inpaint", "extras"])
+ parameters_copypaste.bind_buttons(buttons, image, generation_info)
image.change(
fn=wrap_gradio_call(modules.extras.run_pnginfo),
inputs=[image],
outputs=[html, generation_info, html2],
)
-
+
with gr.Blocks() as modelmerger_interface:
with gr.Row().style(equal_height=False):
with gr.Column(variant='panel'):
@@ -1238,7 +1192,8 @@ def create_ui(wrap_gradio_gpu_call):
new_hypernetwork_name = gr.Textbox(label="Name")
new_hypernetwork_sizes = gr.CheckboxGroup(label="Modules", value=["768", "320", "640", "1280"], choices=["768", "320", "640", "1280"])
new_hypernetwork_layer_structure = gr.Textbox("1, 2, 1", label="Enter hypernetwork layer structure", placeholder="1st and last digit must be 1. ex:'1, 2, 1'")
- new_hypernetwork_activation_func = gr.Dropdown(value="relu", label="Select activation function of hypernetwork", choices=["linear", "relu", "leakyrelu", "elu", "swish"])
+ new_hypernetwork_activation_func = gr.Dropdown(value="linear", label="Select activation function of hypernetwork", choices=modules.hypernetworks.ui.keys)
+ new_hypernetwork_initialization_option = gr.Dropdown(value = "Normal", label="Select Layer weights initialization. relu-like - Kaiming, sigmoid-like - Xavier is recommended", choices=["Normal", "KaimingUniform", "KaimingNormal", "XavierUniform", "XavierNormal"])
new_hypernetwork_add_layer_norm = gr.Checkbox(label="Add layer normalization")
new_hypernetwork_use_dropout = gr.Checkbox(label="Use dropout")
overwrite_old_hypernetwork = gr.Checkbox(value=False, label="Overwrite Old Hypernetwork")
@@ -1260,6 +1215,7 @@ def create_ui(wrap_gradio_gpu_call):
with gr.Row():
process_flip = gr.Checkbox(label='Create flipped copies')
process_split = gr.Checkbox(label='Split oversized images')
+ process_focal_crop = gr.Checkbox(label='Auto focal point crop')
process_caption = gr.Checkbox(label='Use BLIP for caption')
process_caption_deepbooru = gr.Checkbox(label='Use deepbooru for caption', visible=True if cmd_opts.deepdanbooru else False)
@@ -1267,6 +1223,12 @@ def create_ui(wrap_gradio_gpu_call):
process_split_threshold = gr.Slider(label='Split image threshold', value=0.5, minimum=0.0, maximum=1.0, step=0.05)
process_overlap_ratio = gr.Slider(label='Split image overlap ratio', value=0.2, minimum=0.0, maximum=0.9, step=0.05)
+ with gr.Row(visible=False) as process_focal_crop_row:
+ process_focal_crop_face_weight = gr.Slider(label='Focal point face weight', value=0.9, minimum=0.0, maximum=1.0, step=0.05)
+ process_focal_crop_entropy_weight = gr.Slider(label='Focal point entropy weight', value=0.15, minimum=0.0, maximum=1.0, step=0.05)
+ process_focal_crop_edges_weight = gr.Slider(label='Focal point edges weight', value=0.5, minimum=0.0, maximum=1.0, step=0.05)
+ process_focal_crop_debug = gr.Checkbox(label='Create debug image')
+
with gr.Row():
with gr.Column(scale=3):
gr.HTML(value="")
@@ -1280,6 +1242,12 @@ def create_ui(wrap_gradio_gpu_call):
outputs=[process_split_extra_row],
)
+ process_focal_crop.change(
+ fn=lambda show: gr_show(show),
+ inputs=[process_focal_crop],
+ outputs=[process_focal_crop_row],
+ )
+
with gr.Tab(label="Train"):
gr.HTML(value="<p style='margin-bottom: 0.7em'>Train an embedding or Hypernetwork; you must specify a directory with a set of 1:1 ratio images <a href=\"https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Textual-Inversion\" style=\"font-weight:bold;\">[wiki]</a></p>")
with gr.Row():
@@ -1342,6 +1310,7 @@ def create_ui(wrap_gradio_gpu_call):
overwrite_old_hypernetwork,
new_hypernetwork_layer_structure,
new_hypernetwork_activation_func,
+ new_hypernetwork_initialization_option,
new_hypernetwork_add_layer_norm,
new_hypernetwork_use_dropout
],
@@ -1367,6 +1336,11 @@ def create_ui(wrap_gradio_gpu_call):
process_caption_deepbooru,
process_split_threshold,
process_overlap_ratio,
+ process_focal_crop,
+ process_focal_crop_face_weight,
+ process_focal_crop_entropy_weight,
+ process_focal_crop_edges_weight,
+ process_focal_crop_debug,
],
outputs=[
ti_output,
@@ -1471,28 +1445,6 @@ def create_ui(wrap_gradio_gpu_call):
script_callbacks.ui_settings_callback()
opts.reorder()
- def open_folder(f):
- if not os.path.exists(f):
- print(f'Folder "{f}" does not exist. After you create an image, the folder will be created.')
- return
- elif not os.path.isdir(f):
- print(f"""
-WARNING
-An open_folder request was made with an argument that is not a folder.
-This could be an error or a malicious attempt to run code on your computer.
-Requested path was: {f}
-""", file=sys.stderr)
- return
-
- if not shared.cmd_opts.hide_ui_dir_config:
- path = os.path.normpath(f)
- if platform.system() == "Windows":
- os.startfile(path)
- elif platform.system() == "Darwin":
- sp.Popen(["open", path])
- else:
- sp.Popen(["xdg-open", path])
-
def run_settings(*args):
changed = 0
@@ -1637,6 +1589,9 @@ Requested path was: {f}
if column is not None:
column.__exit__()
+
+
+
interfaces = [
(txt2img_interface, "txt2img", "txt2img"),
(img2img_interface, "img2img", "img2img"),
@@ -1727,68 +1682,7 @@ Requested path was: {f}
component_dict['sd_model_checkpoint'],
]
)
- paste_field_names = ['Prompt', 'Negative prompt', 'Steps', 'Face restoration', 'Seed', 'Size-1', 'Size-2']
- txt2img_fields = [field for field,name in txt2img_paste_fields if name in paste_field_names]
- img2img_fields = [field for field,name in img2img_paste_fields if name in paste_field_names]
- send_to_img2img.click(
- fn=lambda img, *args: (image_from_url_text(img),*args),
- _js="(gallery, ...args) => [extract_image_from_gallery_img2img(gallery), ...args]",
- inputs=[txt2img_gallery] + txt2img_fields,
- outputs=[init_img] + img2img_fields,
- )
- send_to_inpaint.click(
- fn=lambda x, *args: (image_from_url_text(x), *args),
- _js="(gallery, ...args) => [extract_image_from_gallery_inpaint(gallery), ...args]",
- inputs=[txt2img_gallery] + txt2img_fields,
- outputs=[init_img_with_mask] + img2img_fields,
- )
-
- img2img_send_to_img2img.click(
- fn=lambda x: image_from_url_text(x),
- _js="extract_image_from_gallery_img2img",
- inputs=[img2img_gallery],
- outputs=[init_img],
- )
-
- img2img_send_to_inpaint.click(
- fn=lambda x: image_from_url_text(x),
- _js="extract_image_from_gallery_inpaint",
- inputs=[img2img_gallery],
- outputs=[init_img_with_mask],
- )
-
- send_to_extras.click(
- fn=lambda x: image_from_url_text(x),
- _js="extract_image_from_gallery_extras",
- inputs=[txt2img_gallery],
- outputs=[extras_image],
- )
-
- open_txt2img_folder.click(
- fn=lambda: open_folder(opts.outdir_samples or opts.outdir_txt2img_samples),
- inputs=[],
- outputs=[],
- )
-
- open_img2img_folder.click(
- fn=lambda: open_folder(opts.outdir_samples or opts.outdir_img2img_samples),
- inputs=[],
- outputs=[],
- )
-
- open_extras_folder.click(
- fn=lambda: open_folder(opts.outdir_samples or opts.outdir_extras_samples),
- inputs=[],
- outputs=[],
- )
-
- img2img_send_to_extras.click(
- fn=lambda x: image_from_url_text(x),
- _js="extract_image_from_gallery_extras",
- inputs=[img2img_gallery],
- outputs=[extras_image],
- )
settings_map = {
'sd_hypernetwork': 'Hypernet',
@@ -1796,16 +1690,7 @@ Requested path was: {f}
'sd_model_checkpoint': 'Model hash',
}
- settings_paste_fields = [
- (component_dict[k], lambda d, k=k, v=v: apply_setting(k, d.get(v, None)))
- for k, v in settings_map.items()
- ]
-
- modules.generation_parameters_copypaste.connect_paste(txt2img_paste, txt2img_paste_fields + settings_paste_fields, txt2img_prompt)
- modules.generation_parameters_copypaste.connect_paste(img2img_paste, img2img_paste_fields + settings_paste_fields, img2img_prompt)
-
- modules.generation_parameters_copypaste.connect_paste(pnginfo_send_to_txt2img, txt2img_paste_fields + settings_paste_fields, generation_info, 'switch_to_txt2img')
- modules.generation_parameters_copypaste.connect_paste(pnginfo_send_to_img2img, img2img_paste_fields + settings_paste_fields, generation_info, 'switch_to_img2img_img2img')
+ parameters_copypaste.run_bind()
ui_config_file = cmd_opts.ui_config_file
ui_settings = {}
@@ -1885,7 +1770,7 @@ def load_javascript(raw_response):
javascript = f'<script>{jsfile.read()}</script>'
scripts_list = modules.scripts.list_scripts("javascript", ".js")
-
+
for basedir, filename, path in scripts_list:
with open(path, "r", encoding="utf8") as jsfile:
javascript += f"\n<!-- {filename} --><script>{jsfile.read()}</script>"
diff --git a/requirements.txt b/requirements.txt
index da1969cf..75b37c4f 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -8,6 +8,8 @@ gradio==3.5
invisible-watermark
numpy
omegaconf
+opencv-python
+requests
piexif
Pillow
pytorch_lightning
diff --git a/scripts/prompts_from_file.py b/scripts/prompts_from_file.py
index 1266be6f..1be22960 100644
--- a/scripts/prompts_from_file.py
+++ b/scripts/prompts_from_file.py
@@ -1,6 +1,7 @@
import copy
import math
import os
+import random
import sys
import traceback
import shlex
@@ -81,32 +82,34 @@ def cmdargs(line):
return res
+def load_prompt_file(file):
+ if (file is None):
+ lines = []
+ else:
+ lines = [x.strip() for x in file.decode('utf8', errors='ignore').split("\n")]
+
+ return None, "\n".join(lines), gr.update(lines=7)
+
class Script(scripts.Script):
def title(self):
return "Prompts from file or textbox"
def ui(self, is_img2img):
- # This checkbox would look nicer as two tabs, but there are two problems:
- # 1) There is a bug in Gradio 3.3 that prevents visibility from working on Tabs
- # 2) Even with Gradio 3.3.1, returning a control (like Tabs) that can't be used as input
- # causes a AttributeError: 'Tabs' object has no attribute 'preprocess' assert,
- # due to the way Script assumes all controls returned can be used as inputs.
- # Therefore, there's no good way to use grouping components right now,
- # so we will use a checkbox! :)
- checkbox_txt = gr.Checkbox(label="Show Textbox", value=False)
- file = gr.File(label="File with inputs", type='bytes')
- prompt_txt = gr.TextArea(label="Prompts")
- checkbox_txt.change(fn=lambda x: [gr.File.update(visible = not x), gr.TextArea.update(visible = x)], inputs=[checkbox_txt], outputs=[file, prompt_txt])
- return [checkbox_txt, file, prompt_txt]
-
- def on_show(self, checkbox_txt, file, prompt_txt):
- return [ gr.Checkbox.update(visible = True), gr.File.update(visible = not checkbox_txt), gr.TextArea.update(visible = checkbox_txt) ]
-
- def run(self, p, checkbox_txt, data: bytes, prompt_txt: str):
- if checkbox_txt:
- lines = [x.strip() for x in prompt_txt.splitlines()]
- else:
- lines = [x.strip() for x in data.decode('utf8', errors='ignore').split("\n")]
+ checkbox_iterate = gr.Checkbox(label="Iterate seed every line", value=False)
+
+ prompt_txt = gr.Textbox(label="List of prompt inputs", lines=1)
+ file = gr.File(label="Upload prompt inputs", type='bytes')
+
+ file.change(fn=load_prompt_file, inputs=[file], outputs=[file, prompt_txt, prompt_txt])
+
+ # We start at one line. When the text changes, we jump to seven lines, or two lines if no \n.
+ # We don't shrink back to 1, because that causes the control to ignore [enter], and it may
+ # be unclear to the user that shift-enter is needed.
+ prompt_txt.change(lambda tb: gr.update(lines=7) if ("\n" in tb) else gr.update(lines=2), inputs=[prompt_txt], outputs=[prompt_txt])
+ return [checkbox_iterate, file, prompt_txt]
+
+ def run(self, p, checkbox_iterate, file, prompt_txt: str):
+ lines = [x.strip() for x in prompt_txt.splitlines()]
lines = [x for x in lines if len(x) > 0]
p.do_not_save_grid = True
@@ -134,6 +137,9 @@ class Script(scripts.Script):
jobs.append(args)
print(f"Will process {len(lines)} lines in {job_count} jobs.")
+ if (checkbox_iterate and p.seed == -1):
+ p.seed = int(random.randrange(4294967294))
+
state.job_count = job_count
images = []
@@ -146,5 +152,9 @@ class Script(scripts.Script):
proc = process_images(copy_p)
images += proc.images
+
+ if (checkbox_iterate):
+ p.seed = p.seed + (p.batch_size * p.n_iter)
+
- return Processed(p, images, p.seed, "")
+ return Processed(p, images, p.seed, "") \ No newline at end of file
diff --git a/scripts/xy_grid.py b/scripts/xy_grid.py
index eff0c942..f5255786 100644
--- a/scripts/xy_grid.py
+++ b/scripts/xy_grid.py
@@ -153,7 +153,6 @@ def str_permutations(x):
"""dummy function for specifying it in AxisOption's type when you want to get a list of permutations"""
return x
-
AxisOption = namedtuple("AxisOption", ["label", "type", "apply", "format_value", "confirm"])
AxisOptionImg2Img = namedtuple("AxisOptionImg2Img", ["label", "type", "apply", "format_value", "confirm"])
@@ -178,6 +177,7 @@ axis_options = [
AxisOption("Eta", float, apply_field("eta"), format_value_add_label, None),
AxisOption("Clip skip", int, apply_clip_skip, format_value_add_label, None),
AxisOption("Denoising", float, apply_field("denoising_strength"), format_value_add_label, None),
+ AxisOption("Cond. Image Mask Weight", float, apply_field("inpainting_mask_weight"), format_value_add_label, None),
]