diff --git a/.gitignore b/.gitignore index 8251232fe..d68e0ccc4 100644 --- a/.gitignore +++ b/.gitignore @@ -33,4 +33,3 @@ __pycache__ !/embeddings/.placeholder !/outputs/.placeholder !/models/.placeholder -!/localizations/.placeholder diff --git a/TODO.md b/TODO.md index dc2b5b49c..6622db80b 100644 --- a/TODO.md +++ b/TODO.md @@ -52,6 +52,7 @@ Tech that can be integrated as part of the core workflow... - [Hypernetworks](https://civitai.com/models/4086/luisap-tutorial-hypernetwork-monkeypatch-method) - - +- [Null-text inversion](https://github.com/ouhenio/null-text-inversion-colab) ## Video Generation diff --git a/config.json b/config.json index ff1d6b5a3..cc078f23f 100644 --- a/config.json +++ b/config.json @@ -29,7 +29,7 @@ "outdir_grids": "", "outdir_txt2img_grids": "outputs/grids", "outdir_img2img_grids": "outputs/grids", - "outdir_save": "log/save", + "outdir_save": "outputs/save", "save_to_dirs": false, "grid_save_to_dirs": false, "use_save_to_dirs_for_ui": false, @@ -111,7 +111,7 @@ "localization": "None", "live_previews_enable": true, "show_progress_grid": true, - "show_progress_every_n_steps": 1, + "show_progress_every_n_steps": -1, "show_progress_type": "Full", "live_preview_content": "Prompt", "hide_samplers": [ @@ -140,6 +140,7 @@ "eta_noise_seed_delta": 0, "always_discard_next_to_last_sigma": false, "disabled_extensions": [ + "prompt-fusion-extension", "sd-webui-additional-networks", "sdweb-merge-board", "ScuNET" @@ -180,5 +181,8 @@ "outdir_ip2p_samples": "outputs/ip2p-images", "postprocessing_enable_in_main_ui": [], "postprocessing_operation_order": [], - "sd_lora": "None" + "sd_lora": "None", + "images_history_with_subdirs": false, + "images_copy_image": false, + "images_delete_recycle": false } \ No newline at end of file diff --git a/localizations/.placeholder b/localizations/.placeholder deleted file mode 100644 index e69de29bb..000000000 diff --git a/test/__init__.py b/test/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/test/basic_features/__init__.py b/test/basic_features/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/test/basic_features/extras_test.py b/test/basic_features/extras_test.py deleted file mode 100644 index 0170c511f..000000000 --- a/test/basic_features/extras_test.py +++ /dev/null @@ -1,54 +0,0 @@ -import unittest -import requests -from gradio.processing_utils import encode_pil_to_base64 -from PIL import Image - -class TestExtrasWorking(unittest.TestCase): - def setUp(self): - self.url_extras_single = "http://localhost:7860/sdapi/v1/extra-single-image" - self.extras_single = { - "resize_mode": 0, - "show_extras_results": True, - "gfpgan_visibility": 0, - "codeformer_visibility": 0, - "codeformer_weight": 0, - "upscaling_resize": 2, - "upscaling_resize_w": 128, - "upscaling_resize_h": 128, - "upscaling_crop": True, - "upscaler_1": "None", - "upscaler_2": "None", - "extras_upscaler_2_visibility": 0, - "image": encode_pil_to_base64(Image.open(r"test/test_files/img2img_basic.png")) - } - - def test_simple_upscaling_performed(self): - self.extras_single["upscaler_1"] = "Lanczos" - self.assertEqual(requests.post(self.url_extras_single, json=self.extras_single).status_code, 200) - - -class TestPngInfoWorking(unittest.TestCase): - def setUp(self): - self.url_png_info = "http://localhost:7860/sdapi/v1/extra-single-image" - self.png_info = { - "image": encode_pil_to_base64(Image.open(r"test/test_files/img2img_basic.png")) - } - - def test_png_info_performed(self): - self.assertEqual(requests.post(self.url_png_info, json=self.png_info).status_code, 200) - - -class TestInterrogateWorking(unittest.TestCase): - def setUp(self): - self.url_interrogate = "http://localhost:7860/sdapi/v1/extra-single-image" - self.interrogate = { - "image": encode_pil_to_base64(Image.open(r"test/test_files/img2img_basic.png")), - "model": "clip" - } - - def test_interrogate_performed(self): - self.assertEqual(requests.post(self.url_interrogate, json=self.interrogate).status_code, 200) - - -if __name__ == "__main__": - unittest.main() diff --git a/test/basic_features/img2img_test.py b/test/basic_features/img2img_test.py deleted file mode 100644 index 9ceb748ea..000000000 --- a/test/basic_features/img2img_test.py +++ /dev/null @@ -1,66 +0,0 @@ -import unittest -import requests -from gradio.processing_utils import encode_pil_to_base64 -from PIL import Image - - -class TestImg2ImgWorking(unittest.TestCase): - def setUp(self): - self.url_img2img = "http://localhost:7860/sdapi/v1/img2img" - self.simple_img2img = { - "init_images": [encode_pil_to_base64(Image.open(r"test/test_files/img2img_basic.png"))], - "resize_mode": 0, - "denoising_strength": 0.75, - "mask": None, - "mask_blur": 4, - "inpainting_fill": 0, - "inpaint_full_res": False, - "inpaint_full_res_padding": 0, - "inpainting_mask_invert": False, - "prompt": "example prompt", - "styles": [], - "seed": -1, - "subseed": -1, - "subseed_strength": 0, - "seed_resize_from_h": -1, - "seed_resize_from_w": -1, - "batch_size": 1, - "n_iter": 1, - "steps": 3, - "cfg_scale": 7, - "width": 64, - "height": 64, - "restore_faces": False, - "tiling": False, - "negative_prompt": "", - "eta": 0, - "s_churn": 0, - "s_tmax": 0, - "s_tmin": 0, - "s_noise": 1, - "override_settings": {}, - "sampler_index": "Euler a", - "include_init_images": False - } - - def test_img2img_simple_performed(self): - self.assertEqual(requests.post(self.url_img2img, json=self.simple_img2img).status_code, 200) - - def test_inpainting_masked_performed(self): - self.simple_img2img["mask"] = encode_pil_to_base64(Image.open(r"test/test_files/mask_basic.png")) - self.assertEqual(requests.post(self.url_img2img, json=self.simple_img2img).status_code, 200) - - def test_inpainting_with_inverted_masked_performed(self): - self.simple_img2img["mask"] = encode_pil_to_base64(Image.open(r"test/test_files/mask_basic.png")) - self.simple_img2img["inpainting_mask_invert"] = True - self.assertEqual(requests.post(self.url_img2img, json=self.simple_img2img).status_code, 200) - - def test_img2img_sd_upscale_performed(self): - self.simple_img2img["script_name"] = "sd upscale" - self.simple_img2img["script_args"] = ["", 8, "Lanczos", 2.0] - - self.assertEqual(requests.post(self.url_img2img, json=self.simple_img2img).status_code, 200) - - -if __name__ == "__main__": - unittest.main() \ No newline at end of file diff --git a/test/basic_features/txt2img_test.py b/test/basic_features/txt2img_test.py deleted file mode 100644 index 5aa43a44a..000000000 --- a/test/basic_features/txt2img_test.py +++ /dev/null @@ -1,80 +0,0 @@ -import unittest -import requests - - -class TestTxt2ImgWorking(unittest.TestCase): - def setUp(self): - self.url_txt2img = "http://localhost:7860/sdapi/v1/txt2img" - self.simple_txt2img = { - "enable_hr": False, - "denoising_strength": 0, - "firstphase_width": 0, - "firstphase_height": 0, - "prompt": "example prompt", - "styles": [], - "seed": -1, - "subseed": -1, - "subseed_strength": 0, - "seed_resize_from_h": -1, - "seed_resize_from_w": -1, - "batch_size": 1, - "n_iter": 1, - "steps": 3, - "cfg_scale": 7, - "width": 64, - "height": 64, - "restore_faces": False, - "tiling": False, - "negative_prompt": "", - "eta": 0, - "s_churn": 0, - "s_tmax": 0, - "s_tmin": 0, - "s_noise": 1, - "sampler_index": "Euler a" - } - - def test_txt2img_simple_performed(self): - self.assertEqual(requests.post(self.url_txt2img, json=self.simple_txt2img).status_code, 200) - - def test_txt2img_with_negative_prompt_performed(self): - self.simple_txt2img["negative_prompt"] = "example negative prompt" - self.assertEqual(requests.post(self.url_txt2img, json=self.simple_txt2img).status_code, 200) - - def test_txt2img_with_complex_prompt_performed(self): - self.simple_txt2img["prompt"] = "((emphasis)), (emphasis1:1.1), [to:1], [from::2], [from:to:0.3], [alt|alt1]" - self.assertEqual(requests.post(self.url_txt2img, json=self.simple_txt2img).status_code, 200) - - def test_txt2img_not_square_image_performed(self): - self.simple_txt2img["height"] = 128 - self.assertEqual(requests.post(self.url_txt2img, json=self.simple_txt2img).status_code, 200) - - def test_txt2img_with_hrfix_performed(self): - self.simple_txt2img["enable_hr"] = True - self.assertEqual(requests.post(self.url_txt2img, json=self.simple_txt2img).status_code, 200) - - def test_txt2img_with_tiling_performed(self): - self.simple_txt2img["tiling"] = True - self.assertEqual(requests.post(self.url_txt2img, json=self.simple_txt2img).status_code, 200) - - def test_txt2img_with_restore_faces_performed(self): - self.simple_txt2img["restore_faces"] = True - self.assertEqual(requests.post(self.url_txt2img, json=self.simple_txt2img).status_code, 200) - - def test_txt2img_with_vanilla_sampler_performed(self): - self.simple_txt2img["sampler_index"] = "PLMS" - self.assertEqual(requests.post(self.url_txt2img, json=self.simple_txt2img).status_code, 200) - self.simple_txt2img["sampler_index"] = "DDIM" - self.assertEqual(requests.post(self.url_txt2img, json=self.simple_txt2img).status_code, 200) - - def test_txt2img_multiple_batches_performed(self): - self.simple_txt2img["n_iter"] = 2 - self.assertEqual(requests.post(self.url_txt2img, json=self.simple_txt2img).status_code, 200) - - def test_txt2img_batch_performed(self): - self.simple_txt2img["batch_size"] = 2 - self.assertEqual(requests.post(self.url_txt2img, json=self.simple_txt2img).status_code, 200) - - -if __name__ == "__main__": - unittest.main() diff --git a/test/basic_features/utils_test.py b/test/basic_features/utils_test.py deleted file mode 100644 index 0bfc28a0d..000000000 --- a/test/basic_features/utils_test.py +++ /dev/null @@ -1,62 +0,0 @@ -import unittest -import requests - -class UtilsTests(unittest.TestCase): - def setUp(self): - self.url_options = "http://localhost:7860/sdapi/v1/options" - self.url_cmd_flags = "http://localhost:7860/sdapi/v1/cmd-flags" - self.url_samplers = "http://localhost:7860/sdapi/v1/samplers" - self.url_upscalers = "http://localhost:7860/sdapi/v1/upscalers" - self.url_sd_models = "http://localhost:7860/sdapi/v1/sd-models" - self.url_hypernetworks = "http://localhost:7860/sdapi/v1/hypernetworks" - self.url_face_restorers = "http://localhost:7860/sdapi/v1/face-restorers" - self.url_realesrgan_models = "http://localhost:7860/sdapi/v1/realesrgan-models" - self.url_prompt_styles = "http://localhost:7860/sdapi/v1/prompt-styles" - self.url_embeddings = "http://localhost:7860/sdapi/v1/embeddings" - - def test_options_get(self): - self.assertEqual(requests.get(self.url_options).status_code, 200) - - def test_options_write(self): - response = requests.get(self.url_options) - self.assertEqual(response.status_code, 200) - - pre_value = response.json()["send_seed"] - - self.assertEqual(requests.post(self.url_options, json={"send_seed":not pre_value}).status_code, 200) - - response = requests.get(self.url_options) - self.assertEqual(response.status_code, 200) - self.assertEqual(response.json()["send_seed"], not pre_value) - - requests.post(self.url_options, json={"send_seed": pre_value}) - - def test_cmd_flags(self): - self.assertEqual(requests.get(self.url_cmd_flags).status_code, 200) - - def test_samplers(self): - self.assertEqual(requests.get(self.url_samplers).status_code, 200) - - def test_upscalers(self): - self.assertEqual(requests.get(self.url_upscalers).status_code, 200) - - def test_sd_models(self): - self.assertEqual(requests.get(self.url_sd_models).status_code, 200) - - def test_hypernetworks(self): - self.assertEqual(requests.get(self.url_hypernetworks).status_code, 200) - - def test_face_restorers(self): - self.assertEqual(requests.get(self.url_face_restorers).status_code, 200) - - def test_realesrgan_models(self): - self.assertEqual(requests.get(self.url_realesrgan_models).status_code, 200) - - def test_prompt_styles(self): - self.assertEqual(requests.get(self.url_prompt_styles).status_code, 200) - - def test_embeddings(self): - self.assertEqual(requests.get(self.url_embeddings).status_code, 200) - -if __name__ == "__main__": - unittest.main() diff --git a/test/server_poll.py b/test/server_poll.py deleted file mode 100644 index 42d56a4ca..000000000 --- a/test/server_poll.py +++ /dev/null @@ -1,24 +0,0 @@ -import unittest -import requests -import time - - -def run_tests(proc, test_dir): - timeout_threshold = 240 - start_time = time.time() - while time.time()-start_time < timeout_threshold: - try: - requests.head("http://localhost:7860/") - break - except requests.exceptions.ConnectionError: - if proc.poll() is not None: - break - if proc.poll() is None: - if test_dir is None: - test_dir = "test" - suite = unittest.TestLoader().discover(test_dir, pattern="*_test.py", top_level_dir="test") - result = unittest.TextTestRunner(verbosity=2).run(suite) - return len(result.failures) + len(result.errors) - else: - print("Launch unsuccessful") - return 1 diff --git a/test/test_files/img2img_basic.png b/test/test_files/img2img_basic.png deleted file mode 100644 index 49a420482..000000000 Binary files a/test/test_files/img2img_basic.png and /dev/null differ diff --git a/test/test_files/mask_basic.png b/test/test_files/mask_basic.png deleted file mode 100644 index 0c2e9a689..000000000 Binary files a/test/test_files/mask_basic.png and /dev/null differ diff --git a/ui-config.json b/ui-config.json index 3c8539c24..7f37e3fef 100644 --- a/ui-config.json +++ b/ui-config.json @@ -846,5 +846,89 @@ "img2img/Inpaint batch mask directory (required for inpaint batch processing only)/visible": true, "img2img/Inpaint batch mask directory (required for inpaint batch processing only)/value": "", "txt2img/Override settings/value": null, - "img2img/Override settings/value": null + "img2img/Override settings/value": null, + "customscript/prompt_matrix.py/txt2img/Select prompt/visible": true, + "customscript/prompt_matrix.py/txt2img/Select prompt/value": "positive", + "customscript/prompt_matrix.py/txt2img/Select delimiter/visible": true, + "customscript/prompt_matrix.py/txt2img/Select delimiter/value": "comma", + "customscript/prompt_matrix.py/img2img/Select prompt/visible": true, + "customscript/prompt_matrix.py/img2img/Select prompt/value": "positive", + "customscript/prompt_matrix.py/img2img/Select delimiter/visible": true, + "customscript/prompt_matrix.py/img2img/Select delimiter/value": "comma", + "customscript/seed_travel.py/txt2img/Destination seed(s) (Comma separated)/visible": true, + "customscript/seed_travel.py/txt2img/Destination seed(s) (Comma separated)/value": "", + "customscript/seed_travel.py/txt2img/Only use Random seeds (Unless comparing paths)/visible": true, + "customscript/seed_travel.py/txt2img/Only use Random seeds (Unless comparing paths)/value": false, + "customscript/seed_travel.py/txt2img/Number of random seed(s)/visible": true, + "customscript/seed_travel.py/txt2img/Number of random seed(s)/value": 4.0, + "customscript/seed_travel.py/txt2img/Compare paths (Separate travels from 1st seed to each destination)/visible": true, + "customscript/seed_travel.py/txt2img/Compare paths (Separate travels from 1st seed to each destination)/value": false, + "customscript/seed_travel.py/txt2img/Steps (Number of images between each seed)/visible": true, + "customscript/seed_travel.py/txt2img/Steps (Number of images between each seed)/value": 10.0, + "customscript/seed_travel.py/txt2img/Loop back to initial seed/visible": true, + "customscript/seed_travel.py/txt2img/Loop back to initial seed/value": false, + "customscript/seed_travel.py/txt2img/Save results as video/visible": true, + "customscript/seed_travel.py/txt2img/Save results as video/value": true, + "customscript/seed_travel.py/txt2img/Frames per second/visible": true, + "customscript/seed_travel.py/txt2img/Frames per second/value": 30.0, + "customscript/seed_travel.py/txt2img/Number of frames for lead in/out/visible": true, + "customscript/seed_travel.py/txt2img/Number of frames for lead in/out/value": 0.0, + "customscript/seed_travel.py/txt2img/Upscaler/visible": true, + "customscript/seed_travel.py/txt2img/Upscaler/value": "Lanczos", + "customscript/seed_travel.py/txt2img/Upscale ratio/visible": true, + "customscript/seed_travel.py/txt2img/Upscale ratio/value": 1.0, + "customscript/seed_travel.py/txt2img/Upscale ratio/minimum": 0.0, + "customscript/seed_travel.py/txt2img/Upscale ratio/maximum": 8.0, + "customscript/seed_travel.py/txt2img/Upscale ratio/step": 0.1, + "customscript/seed_travel.py/txt2img/Bump seed (If > 0 do a Compare Paths but only one image. No video will be generated.)/visible": true, + "customscript/seed_travel.py/txt2img/Bump seed (If > 0 do a Compare Paths but only one image. No video will be generated.)/value": 0.0, + "customscript/seed_travel.py/txt2img/Bump seed (If > 0 do a Compare Paths but only one image. No video will be generated.)/minimum": 0, + "customscript/seed_travel.py/txt2img/Bump seed (If > 0 do a Compare Paths but only one image. No video will be generated.)/maximum": 1, + "customscript/seed_travel.py/txt2img/Bump seed (If > 0 do a Compare Paths but only one image. No video will be generated.)/step": 0.01, + "customscript/seed_travel.py/txt2img/Use cache/visible": true, + "customscript/seed_travel.py/txt2img/Use cache/value": true, + "customscript/seed_travel.py/txt2img/Show generated images in ui/visible": true, + "customscript/seed_travel.py/txt2img/Show generated images in ui/value": true, + "customscript/seed_travel.py/txt2img/\"Hug the middle\" during interpolation/visible": true, + "customscript/seed_travel.py/txt2img/\"Hug the middle\" during interpolation/value": false, + "customscript/seed_travel.py/txt2img/Allow the default Euler a Sampling method. (Does not produce good results)/visible": true, + "customscript/seed_travel.py/txt2img/Allow the default Euler a Sampling method. (Does not produce good results)/value": false, + "customscript/seed_travel.py/img2img/Destination seed(s) (Comma separated)/visible": true, + "customscript/seed_travel.py/img2img/Destination seed(s) (Comma separated)/value": "", + "customscript/seed_travel.py/img2img/Only use Random seeds (Unless comparing paths)/visible": true, + "customscript/seed_travel.py/img2img/Only use Random seeds (Unless comparing paths)/value": false, + "customscript/seed_travel.py/img2img/Number of random seed(s)/visible": true, + "customscript/seed_travel.py/img2img/Number of random seed(s)/value": 4.0, + "customscript/seed_travel.py/img2img/Compare paths (Separate travels from 1st seed to each destination)/visible": true, + "customscript/seed_travel.py/img2img/Compare paths (Separate travels from 1st seed to each destination)/value": false, + "customscript/seed_travel.py/img2img/Steps (Number of images between each seed)/visible": true, + "customscript/seed_travel.py/img2img/Steps (Number of images between each seed)/value": 10.0, + "customscript/seed_travel.py/img2img/Loop back to initial seed/visible": true, + "customscript/seed_travel.py/img2img/Loop back to initial seed/value": false, + "customscript/seed_travel.py/img2img/Save results as video/visible": true, + "customscript/seed_travel.py/img2img/Save results as video/value": true, + "customscript/seed_travel.py/img2img/Frames per second/visible": true, + "customscript/seed_travel.py/img2img/Frames per second/value": 30.0, + "customscript/seed_travel.py/img2img/Number of frames for lead in/out/visible": true, + "customscript/seed_travel.py/img2img/Number of frames for lead in/out/value": 0.0, + "customscript/seed_travel.py/img2img/Upscaler/visible": true, + "customscript/seed_travel.py/img2img/Upscaler/value": "Lanczos", + "customscript/seed_travel.py/img2img/Upscale ratio/visible": true, + "customscript/seed_travel.py/img2img/Upscale ratio/value": 1.0, + "customscript/seed_travel.py/img2img/Upscale ratio/minimum": 0.0, + "customscript/seed_travel.py/img2img/Upscale ratio/maximum": 8.0, + "customscript/seed_travel.py/img2img/Upscale ratio/step": 0.1, + "customscript/seed_travel.py/img2img/Bump seed (If > 0 do a Compare Paths but only one image. No video will be generated.)/visible": true, + "customscript/seed_travel.py/img2img/Bump seed (If > 0 do a Compare Paths but only one image. No video will be generated.)/value": 0.0, + "customscript/seed_travel.py/img2img/Bump seed (If > 0 do a Compare Paths but only one image. No video will be generated.)/minimum": 0, + "customscript/seed_travel.py/img2img/Bump seed (If > 0 do a Compare Paths but only one image. No video will be generated.)/maximum": 1, + "customscript/seed_travel.py/img2img/Bump seed (If > 0 do a Compare Paths but only one image. No video will be generated.)/step": 0.01, + "customscript/seed_travel.py/img2img/Use cache/visible": true, + "customscript/seed_travel.py/img2img/Use cache/value": true, + "customscript/seed_travel.py/img2img/Show generated images in ui/visible": true, + "customscript/seed_travel.py/img2img/Show generated images in ui/value": true, + "customscript/seed_travel.py/img2img/\"Hug the middle\" during interpolation/visible": true, + "customscript/seed_travel.py/img2img/\"Hug the middle\" during interpolation/value": false, + "customscript/seed_travel.py/img2img/Allow the default Euler a Sampling method. (Does not produce good results)/visible": true, + "customscript/seed_travel.py/img2img/Allow the default Euler a Sampling method. (Does not produce good results)/value": false } \ No newline at end of file diff --git a/webui.bat b/webui.bat old mode 100644 new mode 100755 diff --git a/webui.py b/webui.py index 189c77e42..88f9074ae 100644 --- a/webui.py +++ b/webui.py @@ -86,7 +86,7 @@ def initialize(): check_versions() extensions.list_extensions() - localization.list_localizations(cmd_opts.localizations_dir) + # localization.list_localizations(cmd_opts.localizations_dir) if cmd_opts.ui_debug_mode: shared.sd_upscalers = upscaler.UpscalerLanczos().scalers diff --git a/wiki b/wiki index 50909c7f7..9772bd6ca 160000 --- a/wiki +++ b/wiki @@ -1 +1 @@ -Subproject commit 50909c7f7e9b4765b61c21263afcd12e96b52e4c +Subproject commit 9772bd6cafe08a08714b58222b08804be00056d7