silence the warning from transformers
add feature demonstrations to readme
This commit is contained in:
parent
3395c29127
commit
60e95f1d8c
48
README.md
48
README.md
|
@ -4,8 +4,9 @@ A browser interface based on Gradio library for Stable Diffusion.
|
||||||
Original script with Gradio UI was written by a kind anonymopus user. This is a modification.
|
Original script with Gradio UI was written by a kind anonymopus user. This is a modification.
|
||||||
|
|
||||||
![](screenshot.png)
|
![](screenshot.png)
|
||||||
|
## Installing and running
|
||||||
|
|
||||||
## Stable Diffusion
|
### Stable Diffusion
|
||||||
|
|
||||||
This script assumes that you already have main Stable Diffusion sutff installed, assumed to be in directory `/sd`.
|
This script assumes that you already have main Stable Diffusion sutff installed, assumed to be in directory `/sd`.
|
||||||
If you don't have it installed, follow the guide:
|
If you don't have it installed, follow the guide:
|
||||||
|
@ -21,7 +22,7 @@ Particularly, following files must exist:
|
||||||
- `/sd/ldm/util.py`
|
- `/sd/ldm/util.py`
|
||||||
- `/sd/k_diffusion/__init__.py`
|
- `/sd/k_diffusion/__init__.py`
|
||||||
|
|
||||||
## GFPGAN
|
### GFPGAN
|
||||||
|
|
||||||
If you want to use GFPGAN to improve generated faces, you need to install it separately.
|
If you want to use GFPGAN to improve generated faces, you need to install it separately.
|
||||||
Follow instructions from https://github.com/TencentARC/GFPGAN, but when cloning it, do so into Stable Diffusion main directory, `/sd`.
|
Follow instructions from https://github.com/TencentARC/GFPGAN, but when cloning it, do so into Stable Diffusion main directory, `/sd`.
|
||||||
|
@ -37,7 +38,7 @@ The following files must exist:
|
||||||
If the GFPGAN directory does not exist, you will not get the option to use GFPGAN in the UI. If it does exist, you will either be able
|
If the GFPGAN directory does not exist, you will not get the option to use GFPGAN in the UI. If it does exist, you will either be able
|
||||||
to use it, or there will be a message in console with an error related to GFPGAN.
|
to use it, or there will be a message in console with an error related to GFPGAN.
|
||||||
|
|
||||||
## Web UI
|
### Web UI
|
||||||
|
|
||||||
Run the script as:
|
Run the script as:
|
||||||
|
|
||||||
|
@ -56,3 +57,44 @@ Running on local URL: http://127.0.0.1:7860/
|
||||||
```
|
```
|
||||||
|
|
||||||
Open the URL in browser, and you are good to go.
|
Open the URL in browser, and you are good to go.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
The script creates a web UI for Stable Diffusion's txt2img and img2img scripts. Following are features added
|
||||||
|
that are not in original script.
|
||||||
|
|
||||||
|
### GFPGAN
|
||||||
|
Lets you improve faces in pictures using the GFPGAN model. There is a checkbox in every tab to use GFPGAN at 100%, and
|
||||||
|
also a separate tab that just allows you to use GFPGAN on any picture, with a slider that controls how strongthe effect is.
|
||||||
|
|
||||||
|
![](images/GFPGAN.png)
|
||||||
|
|
||||||
|
### Sampling method selection
|
||||||
|
Pick out of three sampling methods for txt2img: DDIM, PLMS, k-diffusion:
|
||||||
|
|
||||||
|
![](images/sampling.png)
|
||||||
|
|
||||||
|
### Prompt matrix
|
||||||
|
Separate multiple prompts using the `|` character, and the system will produce an image for every combination of them.
|
||||||
|
For example, if you use `a house in a field of grass|at dawn|illustration` prompt, there are four combinations possible (first part of prompt is always kept):
|
||||||
|
|
||||||
|
- `a house in a field of grass`
|
||||||
|
- `a house in a field of grass, at dawn`
|
||||||
|
- `a house in a field of grass, illustration`
|
||||||
|
- `a house in a field of grass, at dawn, illustration`
|
||||||
|
|
||||||
|
Four images will be produced, in this order, all with same seed and each with corresponding prompt:
|
||||||
|
|
||||||
|
![](images/prompt-matrix.png)
|
||||||
|
|
||||||
|
### Flagging
|
||||||
|
Click the Flag button under the output section, and generated images will be saved to `log/images` directory, and generation parameters
|
||||||
|
will be appended to a csv file `log/log.csv` in the `/sd` directory.
|
||||||
|
|
||||||
|
### Copy-paste generation parameters
|
||||||
|
A text output provides generation parameters in an easy to copy-paste form for easy sharing.
|
||||||
|
|
||||||
|
![](images/kopipe.png)
|
||||||
|
|
||||||
|
### Correct seeds for batches
|
||||||
|
If you use a seed of 1000 to generate two batches of two images each, four generated images will have seeds: `1000, 1001, 1002, 1003`.
|
||||||
|
Previous versions of the UI would produce `1000, x, 1001, x`, where x is an iamge that can't be generated by any seed.
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 677 KiB |
Binary file not shown.
After Width: | Height: | Size: 460 KiB |
Binary file not shown.
After Width: | Height: | Size: 1.7 MiB |
Binary file not shown.
After Width: | Height: | Size: 5.3 MiB |
34
webui.py
34
webui.py
|
@ -13,13 +13,20 @@ from contextlib import contextmanager, nullcontext
|
||||||
import mimetypes
|
import mimetypes
|
||||||
import random
|
import random
|
||||||
import math
|
import math
|
||||||
import csv
|
|
||||||
|
|
||||||
import k_diffusion as K
|
import k_diffusion as K
|
||||||
from ldm.util import instantiate_from_config
|
from ldm.util import instantiate_from_config
|
||||||
from ldm.models.diffusion.ddim import DDIMSampler
|
from ldm.models.diffusion.ddim import DDIMSampler
|
||||||
from ldm.models.diffusion.plms import PLMSSampler
|
from ldm.models.diffusion.plms import PLMSSampler
|
||||||
|
|
||||||
|
try:
|
||||||
|
# this silences the annoying "Some weights of the model checkpoint were not used when initializing..." message at start.
|
||||||
|
|
||||||
|
from transformers import logging
|
||||||
|
logging.set_verbosity_error()
|
||||||
|
except:
|
||||||
|
pass
|
||||||
|
|
||||||
# this is a fix for Windows users. Without it, javascript files will be served with text/html content-type and the bowser will not show any UI
|
# this is a fix for Windows users. Without it, javascript files will be served with text/html content-type and the bowser will not show any UI
|
||||||
mimetypes.init()
|
mimetypes.init()
|
||||||
mimetypes.add_type('application/javascript', '.js')
|
mimetypes.add_type('application/javascript', '.js')
|
||||||
|
@ -28,7 +35,7 @@ mimetypes.add_type('application/javascript', '.js')
|
||||||
opt_C = 4
|
opt_C = 4
|
||||||
opt_f = 8
|
opt_f = 8
|
||||||
|
|
||||||
invalid_filename_chars = '<>:"/\|?*'
|
invalid_filename_chars = '<>:"/\|?*\n'
|
||||||
|
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
parser.add_argument("--outdir", type=str, nargs="?", help="dir to write results to", default=None)
|
parser.add_argument("--outdir", type=str, nargs="?", help="dir to write results to", default=None)
|
||||||
|
@ -121,7 +128,6 @@ if os.path.exists(GFPGAN_dir):
|
||||||
print("Error loading GFPGAN:", file=sys.stderr)
|
print("Error loading GFPGAN:", file=sys.stderr)
|
||||||
print(traceback.format_exc(), file=sys.stderr)
|
print(traceback.format_exc(), file=sys.stderr)
|
||||||
|
|
||||||
|
|
||||||
config = OmegaConf.load("configs/stable-diffusion/v1-inference.yaml")
|
config = OmegaConf.load("configs/stable-diffusion/v1-inference.yaml")
|
||||||
model = load_model_from_config(config, "models/ldm/stable-diffusion-v1/model.ckpt")
|
model = load_model_from_config(config, "models/ldm/stable-diffusion-v1/model.ckpt")
|
||||||
|
|
||||||
|
@ -296,7 +302,9 @@ class Flagging(gr.FlaggingCallback):
|
||||||
def setup(self, components, flagging_dir: str):
|
def setup(self, components, flagging_dir: str):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def flag(self, flag_data, flag_option=None, flag_index=None, username=None) -> int:
|
def flag(self, flag_data, flag_option=None, flag_index=None, username=None):
|
||||||
|
import csv
|
||||||
|
|
||||||
os.makedirs("log/images", exist_ok=True)
|
os.makedirs("log/images", exist_ok=True)
|
||||||
|
|
||||||
# those must match the "dream" function
|
# those must match the "dream" function
|
||||||
|
@ -341,7 +349,7 @@ dream_interface = gr.Interface(
|
||||||
gr.Slider(minimum=0.0, maximum=1.0, step=0.01, label="DDIM ETA", value=0.0, visible=False),
|
gr.Slider(minimum=0.0, maximum=1.0, step=0.01, label="DDIM ETA", value=0.0, visible=False),
|
||||||
gr.Slider(minimum=1, maximum=16, step=1, label='Batch count (how many batches of images to generate)', value=1),
|
gr.Slider(minimum=1, maximum=16, step=1, label='Batch count (how many batches of images to generate)', value=1),
|
||||||
gr.Slider(minimum=1, maximum=4, step=1, label='Batch size (how many images are in a batch; memory-hungry)', value=1),
|
gr.Slider(minimum=1, maximum=4, step=1, label='Batch size (how many images are in a batch; memory-hungry)', value=1),
|
||||||
gr.Slider(minimum=1.0, maximum=15.0, step=0.5, label='Classifier Free Guidance Scale (how strongly should the image follow the prompt)', value=7.0),
|
gr.Slider(minimum=1.0, maximum=15.0, step=0.5, label='Classifier Free Guidance Scale (how strongly the image should follow the prompt)', value=7.0),
|
||||||
gr.Number(label='Seed', value=-1),
|
gr.Number(label='Seed', value=-1),
|
||||||
gr.Slider(minimum=64, maximum=2048, step=64, label="Height", value=512),
|
gr.Slider(minimum=64, maximum=2048, step=64, label="Height", value=512),
|
||||||
gr.Slider(minimum=64, maximum=2048, step=64, label="Width", value=512),
|
gr.Slider(minimum=64, maximum=2048, step=64, label="Width", value=512),
|
||||||
|
@ -456,13 +464,13 @@ img2img_interface = gr.Interface(
|
||||||
gr.Slider(minimum=1, maximum=150, step=1, label="Sampling Steps", value=50),
|
gr.Slider(minimum=1, maximum=150, step=1, label="Sampling Steps", value=50),
|
||||||
gr.Checkbox(label='Fix faces using GFPGAN', value=False, visible=GFPGAN is not None),
|
gr.Checkbox(label='Fix faces using GFPGAN', value=False, visible=GFPGAN is not None),
|
||||||
gr.Slider(minimum=0.0, maximum=1.0, step=0.01, label="DDIM ETA", value=0.0, visible=False),
|
gr.Slider(minimum=0.0, maximum=1.0, step=0.01, label="DDIM ETA", value=0.0, visible=False),
|
||||||
gr.Slider(minimum=1, maximum=16, step=1, label='Sampling iterations', value=1),
|
gr.Slider(minimum=1, maximum=16, step=1, label='Batch count (how many batches of images to generate)', value=1),
|
||||||
gr.Slider(minimum=1, maximum=4, step=1, label='Samples per iteration', value=1),
|
gr.Slider(minimum=1, maximum=4, step=1, label='Batch size (how many images are in a batch; memory-hungry)', value=1),
|
||||||
gr.Slider(minimum=1.0, maximum=15.0, step=0.5, label='Classifier Free Guidance Scale', value=7.0),
|
gr.Slider(minimum=1.0, maximum=15.0, step=0.5, label='Classifier Free Guidance Scale (how strongly the image should follow the prompt)', value=7.0),
|
||||||
gr.Slider(minimum=0.0, maximum=1.0, step=0.01, label='Denoising Strength', value=0.75),
|
gr.Slider(minimum=0.0, maximum=1.0, step=0.01, label='Denoising Strength', value=0.75),
|
||||||
gr.Number(label='Seed', value=-1),
|
gr.Number(label='Seed', value=-1),
|
||||||
gr.Slider(minimum=64, maximum=2048, step=64, label="Resize Height", value=512),
|
gr.Slider(minimum=64, maximum=2048, step=64, label="Height", value=512),
|
||||||
gr.Slider(minimum=64, maximum=2048, step=64, label="Resize Width", value=512),
|
gr.Slider(minimum=64, maximum=2048, step=64, label="Width", value=512),
|
||||||
],
|
],
|
||||||
outputs=[
|
outputs=[
|
||||||
gr.Gallery(),
|
gr.Gallery(),
|
||||||
|
@ -470,11 +478,12 @@ img2img_interface = gr.Interface(
|
||||||
],
|
],
|
||||||
title="Stable Diffusion Image-to-Image",
|
title="Stable Diffusion Image-to-Image",
|
||||||
description="Generate images from images with Stable Diffusion",
|
description="Generate images from images with Stable Diffusion",
|
||||||
|
allow_flagging="never",
|
||||||
)
|
)
|
||||||
|
|
||||||
interfaces = [
|
interfaces = [
|
||||||
(dream_interface, "Dream"),
|
(dream_interface, "txt2img"),
|
||||||
(img2img_interface, "Image Translation")
|
(img2img_interface, "img2img")
|
||||||
]
|
]
|
||||||
|
|
||||||
def run_GFPGAN(image, strength):
|
def run_GFPGAN(image, strength):
|
||||||
|
@ -501,6 +510,7 @@ if GFPGAN is not None:
|
||||||
],
|
],
|
||||||
title="GFPGAN",
|
title="GFPGAN",
|
||||||
description="Fix faces on images",
|
description="Fix faces on images",
|
||||||
|
allow_flagging="never",
|
||||||
), "GFPGAN"))
|
), "GFPGAN"))
|
||||||
|
|
||||||
demo = gr.TabbedInterface(interface_list=[x[0] for x in interfaces], tab_names=[x[1] for x in interfaces])
|
demo = gr.TabbedInterface(interface_list=[x[0] for x in interfaces], tab_names=[x[1] for x in interfaces])
|
||||||
|
|
Loading…
Reference in New Issue