diff --git a/ui/easydiffusion/backends/sdkit_common.py b/ui/easydiffusion/backends/sdkit_common.py index 4c7eba59..bda1414c 100644 --- a/ui/easydiffusion/backends/sdkit_common.py +++ b/ui/easydiffusion/backends/sdkit_common.py @@ -81,6 +81,7 @@ def generate_images( context: Context, callback=None, controlnet_filter=None, + distilled_guidance_scale: float = 3.5, output_type="pil", **req, ): diff --git a/ui/easydiffusion/backends/webui/impl.py b/ui/easydiffusion/backends/webui/impl.py index e0adae96..6c8c66bd 100644 --- a/ui/easydiffusion/backends/webui/impl.py +++ b/ui/easydiffusion/backends/webui/impl.py @@ -150,6 +150,7 @@ def generate_images( num_outputs: int = 1, num_inference_steps: int = 25, guidance_scale: float = 7.5, + distilled_guidance_scale: float = 3.5, init_image=None, init_image_mask=None, control_image=None, @@ -181,6 +182,7 @@ def generate_images( "steps": num_inference_steps, "seed": seed, "cfg_scale": guidance_scale, + "distilled_cfg_scale": distilled_guidance_scale, "batch_size": num_outputs, "width": width, "height": height, diff --git a/ui/easydiffusion/types.py b/ui/easydiffusion/types.py index 93bfe08f..c26e4fbc 100644 --- a/ui/easydiffusion/types.py +++ b/ui/easydiffusion/types.py @@ -14,6 +14,7 @@ class GenerateImageRequest(BaseModel): num_outputs: int = 1 num_inference_steps: int = 50 guidance_scale: float = 7.5 + distilled_guidance_scale: float = 3.5 init_image: Any = None init_image_mask: Any = None diff --git a/ui/index.html b/ui/index.html index 74f07984..1284d785 100644 --- a/ui/index.html +++ b/ui/index.html @@ -336,6 +336,7 @@ Click to learn more about samplers + Please avoid 'Euler Ancestral' with Flux! - +
+ diff --git a/ui/media/css/main.css b/ui/media/css/main.css index aabdccf9..39b7b6e4 100644 --- a/ui/media/css/main.css +++ b/ui/media/css/main.css @@ -670,9 +670,9 @@ div.img-preview img { display: none; } -#guidanceWarningText { +.warning-label { + font-size: smaller; color: var(--status-orange); - font-size: 9pt; } .display-settings { @@ -1477,11 +1477,6 @@ div.top-right { margin-top: 6px; } -#small_image_warning { - font-size: smaller; - color: var(--status-orange); -} - button#save-system-settings-btn { padding: 4pt 8pt; } diff --git a/ui/media/js/main.js b/ui/media/js/main.js index a1023286..3f372911 100644 --- a/ui/media/js/main.js +++ b/ui/media/js/main.js @@ -14,6 +14,10 @@ const taskConfigSetup = { sampler_name: "Sampler", num_inference_steps: "Inference Steps", guidance_scale: "Guidance Scale", + distilled_guidance_scale: { + label: "Distilled Guidance Scale", + visible: ({ reqBody }) => reqBody?.distilled_guidance_scale, + }, use_stable_diffusion_model: "Model", clip_skip: { label: "Clip Skip", @@ -76,6 +80,8 @@ let numOutputsParallelField = document.querySelector("#num_outputs_parallel") let numInferenceStepsField = document.querySelector("#num_inference_steps") let guidanceScaleSlider = document.querySelector("#guidance_scale_slider") let guidanceScaleField = document.querySelector("#guidance_scale") +let distilledGuidanceScaleSlider = document.querySelector("#distilled_guidance_scale_slider") +let distilledGuidanceScaleField = document.querySelector("#distilled_guidance_scale") let outputQualitySlider = document.querySelector("#output_quality_slider") let outputQualityField = document.querySelector("#output_quality") let outputQualityRow = document.querySelector("#output_quality_row") @@ -1051,6 +1057,9 @@ function makeImage() { if (guidanceScaleField.value == "") { guidanceScaleField.value = guidanceScaleSlider.value / 10 } + if (distilledGuidanceScaleField.value == "") { + distilledGuidanceScaleField.value = distilledGuidanceScaleSlider.value / 10 + } if (hypernetworkStrengthField.value == "") { hypernetworkStrengthField.value = hypernetworkStrengthSlider.value / 100 } @@ -1419,6 +1428,9 @@ function getCurrentUserRequest() { newTask.reqBody.control_filter_to_apply = controlImageFilterField.value } } + if (stableDiffusionModelField.value.toLowerCase().includes("flux")) { + newTask.reqBody.distilled_guidance_scale = parseFloat(distilledGuidanceScaleField.value) + } return newTask } @@ -1866,14 +1878,14 @@ function checkGuidanceValue() { let guidanceWarningText = document.querySelector("#guidanceWarningText") if (sdModelField.value.toLowerCase().includes("flux")) { if (guidance > 1.5) { - guidanceWarningText.innerText = "Flux recommends a guidance scale of 1" + guidanceWarningText.innerText = "Flux recommends a 'Guidance Scale' of 1" guidanceWarning.classList.remove("displayNone") } else { guidanceWarning.classList.add("displayNone") } } else { if (guidance < 2) { - guidanceWarningText.innerText = "A higher Guidance Scale is recommended!" + guidanceWarningText.innerText = "A higher 'Guidance Scale' is recommended!" guidanceWarning.classList.remove("displayNone") } else { guidanceWarning.classList.add("displayNone") @@ -1884,6 +1896,37 @@ sdModelField.addEventListener("change", checkGuidanceValue) guidanceScaleField.addEventListener("change", checkGuidanceValue) guidanceScaleSlider.addEventListener("change", checkGuidanceValue) +function checkGuidanceScaleVisibility() { + let guidanceScaleContainer = document.querySelector("#distilled_guidance_scale_container") + if (sdModelField.value.toLowerCase().includes("flux")) { + guidanceScaleContainer.classList.remove("displayNone") + } else { + guidanceScaleContainer.classList.add("displayNone") + } +} +sdModelField.addEventListener("change", checkGuidanceScaleVisibility) + +function checkFluxSampler() { + let samplerWarning = document.querySelector("#fluxSamplerWarning") + if (sdModelField.value.toLowerCase().includes("flux")) { + if (samplerField.value == "euler_a") { + samplerWarning.classList.remove("displayNone") + } else { + samplerWarning.classList.add("displayNone") + } + } else { + samplerWarning.classList.add("displayNone") + } +} +sdModelField.addEventListener("change", checkFluxSampler) +samplerField.addEventListener("change", checkFluxSampler) + +document.addEventListener("refreshModels", function() { + checkGuidanceValue() + checkGuidanceScaleVisibility() + checkFluxSampler() +}) + // function onControlImageFilterChange() { // let filterId = controlImageFilterField.value // if (filterId.includes("openpose")) { @@ -2012,6 +2055,27 @@ guidanceScaleSlider.addEventListener("input", updateGuidanceScale) guidanceScaleField.addEventListener("input", updateGuidanceScaleSlider) updateGuidanceScale() +/********************* Distilled Guidance **************************/ +function updateDistilledGuidanceScale() { + distilledGuidanceScaleField.value = distilledGuidanceScaleSlider.value / 10 + distilledGuidanceScaleField.dispatchEvent(new Event("change")) +} + +function updateDistilledGuidanceScaleSlider() { + if (distilledGuidanceScaleField.value < 0) { + distilledGuidanceScaleField.value = 0 + } else if (distilledGuidanceScaleField.value > 50) { + distilledGuidanceScaleField.value = 50 + } + + distilledGuidanceScaleSlider.value = distilledGuidanceScaleField.value * 10 + distilledGuidanceScaleSlider.dispatchEvent(new Event("change")) +} + +distilledGuidanceScaleSlider.addEventListener("input", updateDistilledGuidanceScale) +distilledGuidanceScaleField.addEventListener("input", updateDistilledGuidanceScaleSlider) +updateDistilledGuidanceScale() + /********************* Prompt Strength *******************/ function updatePromptStrength() { promptStrengthField.value = promptStrengthSlider.value / 100