diff --git a/CHANGELOG.md b/CHANGELOG.md index b75f01d80..c630143af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -81,6 +81,8 @@ Also, there are quite a few offloading improvements and many quality-of-life cha - disallow `zluda` and `directml` on non-windows platforms - update openvino to `openvino==2025.3.0` - add deprecation warning for `python==3.9` + - **Detailer** allow manually setting processing resolution + *note*: this does not impact the actual image resolution, only the resolution at which detailer internally operates - **Fixes** - normalize path hanlding when deleting images - unified compile upscalers diff --git a/TODO.md b/TODO.md index 0c4034cb4..03b22b6e2 100644 --- a/TODO.md +++ b/TODO.md @@ -11,12 +11,10 @@ Main ToDo list can be found at [GitHub projects](https://github.com/users/vladma - Refactor: [GGUF](https://huggingface.co/docs/diffusers/main/en/quantization/gguf) - Feature: Diffusers [group offloading](https://github.com/vladmandic/sdnext/issues/4049) - Feature: LoRA add OMI format support for SD35/FLUX.1 -- Video: Generic API support -- Video: LTX TeaCache and others -- Video: LTX API -- Video: LTX PromptEnhance -- Video: LTX Conditioning preprocess -- [Cosmos-Predict2-Video](https://huggingface.co/nvidia/Cosmos-Predict2-2B-Video2World)(https://github.com/huggingface/diffusers/pull/11695) +- Video Core: API +- Video LTX: TeaCache and others, API, Conditioning preprocess Video: LTX API +- +- ### Blocked items diff --git a/modules/control/run.py b/modules/control/run.py index edd7a3c73..fddf0a0cc 100644 --- a/modules/control/run.py +++ b/modules/control/run.py @@ -256,7 +256,7 @@ def control_run(state: str = '', # pylint: disable=keyword-arg-before-vararg seed: int = -1, subseed: int = -1, subseed_strength: float = 0, seed_resize_from_h: int = -1, seed_resize_from_w: int = -1, cfg_scale: float = 6.0, clip_skip: float = 1.0, image_cfg_scale: float = 6.0, diffusers_guidance_rescale: float = 0.7, pag_scale: float = 0.0, pag_adaptive: float = 0.5, cfg_end: float = 1.0, vae_type: str = 'Full', tiling: bool = False, hidiffusion: bool = False, - detailer_enabled: bool = True, detailer_prompt: str = '', detailer_negative: str = '', detailer_steps: int = 10, detailer_strength: float = 0.3, + detailer_enabled: bool = True, detailer_prompt: str = '', detailer_negative: str = '', detailer_steps: int = 10, detailer_strength: float = 0.3, detailer_resolution: int = 1024, hdr_mode: int = 0, hdr_brightness: float = 0, hdr_color: float = 0, hdr_sharpen: float = 0, hdr_clamp: bool = False, hdr_boundary: float = 4.0, hdr_threshold: float = 0.95, hdr_maximize: bool = False, hdr_max_center: float = 0.6, hdr_max_boundary: float = 1.0, hdr_color_picker: str = None, hdr_tint_ratio: float = 0, resize_mode_before: int = 0, resize_name_before: str = 'None', resize_context_before: str = 'None', width_before: int = 512, height_before: int = 512, scale_by_before: float = 1.0, selected_scale_tab_before: int = 0, @@ -360,6 +360,7 @@ def control_run(state: str = '', # pylint: disable=keyword-arg-before-vararg detailer_negative = detailer_negative, detailer_steps = detailer_steps, detailer_strength = detailer_strength, + detailer_resolution = detailer_resolution, # inpaint inpaint_full_res = masking.opts.mask_only, inpainting_mask_invert = 1 if masking.opts.invert else 0, diff --git a/modules/img2img.py b/modules/img2img.py index 4798671f8..19da4b92f 100644 --- a/modules/img2img.py +++ b/modules/img2img.py @@ -159,7 +159,7 @@ def img2img(id_task: str, state: str, mode: int, sampler_index, mask_blur, mask_alpha, vae_type, tiling, hidiffusion, - detailer_enabled, detailer_prompt, detailer_negative, detailer_steps, detailer_strength, + detailer_enabled, detailer_prompt, detailer_negative, detailer_steps, detailer_strength, detailer_resolution, n_iter, batch_size, cfg_scale, image_cfg_scale, diffusers_guidance_rescale, @@ -268,6 +268,7 @@ def img2img(id_task: str, state: str, mode: int, detailer_negative=detailer_negative, detailer_steps=detailer_steps, detailer_strength=detailer_strength, + detailer_resolution=detailer_resolution, init_images=[image], mask=mask, mask_blur=mask_blur, diff --git a/modules/postprocess/yolo.py b/modules/postprocess/yolo.py index ef618e0f4..300f9d957 100644 --- a/modules/postprocess/yolo.py +++ b/modules/postprocess/yolo.py @@ -270,7 +270,6 @@ class YoloRestorer(Detailer): items = self.merge(items) shared.opts.data['mask_apply_overlay'] = True - resolution = 512 if shared.sd_model_type in ['none', 'sd', 'lcm', 'unknown'] else 1024 orig_prompt: str = orig_p.get('all_prompts', [''])[0] orig_negative: str = orig_p.get('all_negative_prompts', [''])[0] prompt: str = orig_p.get('detailer_prompt', '') @@ -304,8 +303,8 @@ class YoloRestorer(Detailer): 'inpainting_mask_invert': 0, 'mask_blur': shared.opts.detailer_blur, 'inpaint_full_res_padding': shared.opts.detailer_padding, - 'width': resolution, - 'height': resolution, + 'width': p.detailer_resolution, + 'height': p.detailer_resolution, 'vae_type': orig_p.get('vae_type', 'Full'), } args.update(model_args) @@ -335,6 +334,7 @@ class YoloRestorer(Detailer): p.state = '' prev_state = shared.state.job pc = copy(p) + pc.ops.append('detailer') orig_sigma_adjust: float = shared.opts.schedulers_sigma_adjust orig_sigma_end: float = shared.opts.schedulers_sigma_adjust_max @@ -390,7 +390,7 @@ class YoloRestorer(Detailer): return gr.update(visible=False), gr.update(visible=True, value=value), gr.update(visible=False) def ui(self, tab: str): - def ui_settings_change(merge, detailers, text, classes, strength, padding, blur, min_confidence, max_detected, min_size, max_size, iou, steps, renoise_value, renoise_end): + def ui_settings_change(merge, detailers, text, classes, strength, padding, blur, min_confidence, max_detected, min_size, max_size, iou, steps, renoise_value, renoise_end, resolution): shared.opts.detailer_merge = merge shared.opts.detailer_models = detailers shared.opts.detailer_args = text if not self.ui_mode else '' @@ -404,8 +404,9 @@ class YoloRestorer(Detailer): shared.opts.detailer_iou = iou shared.opts.detailer_sigma_adjust = renoise_value shared.opts.detailer_sigma_adjust_max = renoise_end + # shared.opts.detailer_resolution = resolution shared.opts.save(shared.config_filename, silent=True) - shared.log.debug(f'Detailer settings: models={detailers} classes={classes} strength={strength} conf={min_confidence} max={max_detected} iou={iou} size={min_size}-{max_size} padding={padding} steps={steps}') + shared.log.debug(f'Detailer settings: models={detailers} classes={classes} strength={strength} conf={min_confidence} max={max_detected} iou={iou} size={min_size}-{max_size} padding={padding} steps={steps} resolution={resolution}') with gr.Accordion(open=False, label="Detailer", elem_id=f"{tab}_detailer_accordion", elem_classes=["small-accordion"]): with gr.Row(): @@ -427,6 +428,7 @@ class YoloRestorer(Detailer): steps = gr.Slider(label="Detailer steps", elem_id=f"{tab}_detailer_steps", value=10, minimum=0, maximum=99, step=1) strength = gr.Slider(label="Detailer strength", elem_id=f"{tab}_detailer_strength", value=0.3, minimum=0, maximum=1, step=0.01) with gr.Row(): + resolution = gr.Slider(label="Detailer resolution", elem_id=f"{tab}_detailer_resolution", value=1024, minimum=256, maximum=4096, step=8) max_detected = gr.Slider(label="Max detected", elem_id=f"{tab}_detailer_max", value=shared.opts.detailer_max, minimum=1, maximum=10, step=1) with gr.Row(): padding = gr.Slider(label="Edge padding", elem_id=f"{tab}_detailer_padding", value=shared.opts.detailer_padding, minimum=0, maximum=100, step=1) @@ -443,18 +445,19 @@ class YoloRestorer(Detailer): renoise_value = gr.Slider(minimum=0.5, maximum=1.5, step=0.01, label='Renoise', value=shared.opts.detailer_sigma_adjust, elem_id=f"{tab}_detailer_renoise") renoise_end = gr.Slider(minimum=0.0, maximum=1.0, step=0.01, label='Renoise end', value=shared.opts.detailer_sigma_adjust_max, elem_id=f"{tab}_detailer_renoise_end") - merge.change(fn=ui_settings_change, inputs=[merge, detailers, detailers_text, classes, strength, padding, blur, min_confidence, max_detected, min_size, max_size, iou, steps, renoise_value, renoise_end], outputs=[]) - detailers.change(fn=ui_settings_change, inputs=[merge, detailers, detailers_text, classes, strength, padding, blur, min_confidence, max_detected, min_size, max_size, iou, steps, renoise_value, renoise_end], outputs=[]) - detailers_text.change(fn=ui_settings_change, inputs=[merge, detailers, detailers_text, classes, strength, padding, blur, min_confidence, max_detected, min_size, max_size, iou, steps, renoise_value, renoise_end], outputs=[]) - classes.change(fn=ui_settings_change, inputs=[merge, detailers, detailers_text, classes, strength, padding, blur, min_confidence, max_detected, min_size, max_size, iou, steps, renoise_value, renoise_end], outputs=[]) - padding.change(fn=ui_settings_change, inputs=[merge, detailers, detailers_text, classes, strength, padding, blur, min_confidence, max_detected, min_size, max_size, iou, steps, renoise_value, renoise_end], outputs=[]) - blur.change(fn=ui_settings_change, inputs=[merge, detailers, detailers_text, classes, strength, padding, blur, min_confidence, max_detected, min_size, max_size, iou, steps, renoise_value, renoise_end], outputs=[]) - min_confidence.change(fn=ui_settings_change, inputs=[merge, detailers, detailers_text, classes, strength, padding, blur, min_confidence, max_detected, min_size, max_size, iou, steps, renoise_value, renoise_end], outputs=[]) - max_detected.change(fn=ui_settings_change, inputs=[merge, detailers, detailers_text, classes, strength, padding, blur, min_confidence, max_detected, min_size, max_size, iou, steps, renoise_value, renoise_end], outputs=[]) - min_size.change(fn=ui_settings_change, inputs=[merge, detailers, detailers_text, classes, strength, padding, blur, min_confidence, max_detected, min_size, max_size, iou, steps, renoise_value, renoise_end], outputs=[]) - max_size.change(fn=ui_settings_change, inputs=[merge, detailers, detailers_text, classes, strength, padding, blur, min_confidence, max_detected, min_size, max_size, iou, steps, renoise_value, renoise_end], outputs=[]) - iou.change(fn=ui_settings_change, inputs=[merge, detailers, detailers_text, classes, strength, padding, blur, min_confidence, max_detected, min_size, max_size, iou, steps, renoise_value, renoise_end], outputs=[]) - return enabled, prompt, negative, steps, strength + merge.change(fn=ui_settings_change, inputs=[merge, detailers, detailers_text, classes, strength, padding, blur, min_confidence, max_detected, min_size, max_size, iou, steps, renoise_value, renoise_end, resolution], outputs=[]) + detailers.change(fn=ui_settings_change, inputs=[merge, detailers, detailers_text, classes, strength, padding, blur, min_confidence, max_detected, min_size, max_size, iou, steps, renoise_value, renoise_end, resolution], outputs=[]) + detailers_text.change(fn=ui_settings_change, inputs=[merge, detailers, detailers_text, classes, strength, padding, blur, min_confidence, max_detected, min_size, max_size, iou, steps, renoise_value, renoise_end, resolution], outputs=[]) + classes.change(fn=ui_settings_change, inputs=[merge, detailers, detailers_text, classes, strength, padding, blur, min_confidence, max_detected, min_size, max_size, iou, steps, renoise_value, renoise_end, resolution], outputs=[]) + padding.change(fn=ui_settings_change, inputs=[merge, detailers, detailers_text, classes, strength, padding, blur, min_confidence, max_detected, min_size, max_size, iou, steps, renoise_value, renoise_end, resolution], outputs=[]) + blur.change(fn=ui_settings_change, inputs=[merge, detailers, detailers_text, classes, strength, padding, blur, min_confidence, max_detected, min_size, max_size, iou, steps, renoise_value, renoise_end, resolution], outputs=[]) + min_confidence.change(fn=ui_settings_change, inputs=[merge, detailers, detailers_text, classes, strength, padding, blur, min_confidence, max_detected, min_size, max_size, iou, steps, renoise_value, renoise_end, resolution], outputs=[]) + max_detected.change(fn=ui_settings_change, inputs=[merge, detailers, detailers_text, classes, strength, padding, blur, min_confidence, max_detected, min_size, max_size, iou, steps, renoise_value, renoise_end, resolution], outputs=[]) + min_size.change(fn=ui_settings_change, inputs=[merge, detailers, detailers_text, classes, strength, padding, blur, min_confidence, max_detected, min_size, max_size, iou, steps, renoise_value, renoise_end, resolution], outputs=[]) + max_size.change(fn=ui_settings_change, inputs=[merge, detailers, detailers_text, classes, strength, padding, blur, min_confidence, max_detected, min_size, max_size, iou, steps, renoise_value, renoise_end, resolution], outputs=[]) + iou.change(fn=ui_settings_change, inputs=[merge, detailers, detailers_text, classes, strength, padding, blur, min_confidence, max_detected, min_size, max_size, iou, steps, renoise_value, renoise_end, resolution], outputs=[]) + resolution.change(fn=ui_settings_change, inputs=[merge, detailers, detailers_text, classes, strength, padding, blur, min_confidence, max_detected, min_size, max_size, iou, steps, renoise_value, renoise_end, resolution], outputs=[]) + return enabled, prompt, negative, steps, strength, resolution def initialize(): diff --git a/modules/processing_class.py b/modules/processing_class.py index f963b735c..7ea9c2eab 100644 --- a/modules/processing_class.py +++ b/modules/processing_class.py @@ -57,6 +57,7 @@ class StableDiffusionProcessing: detailer_negative: str = '', detailer_steps: int = 10, detailer_strength: float = 0.3, + detailer_resolution: int = 1024, # hdr corrections hdr_mode: int = 0, hdr_brightness: float = 0, @@ -204,6 +205,7 @@ class StableDiffusionProcessing: self.detailer_negative = detailer_negative self.detailer_steps = detailer_steps self.detailer_strength = detailer_strength + self.detailer_resolution = detailer_resolution self.restore_faces = restore_faces self.init_images = init_images self.resize_mode = resize_mode diff --git a/modules/processing_diffusers.py b/modules/processing_diffusers.py index 9c4ec0ec8..fea1b8587 100644 --- a/modules/processing_diffusers.py +++ b/modules/processing_diffusers.py @@ -126,6 +126,9 @@ def process_base(p: processing.StableDiffusionProcessing): update_sampler(p, shared.sd_model) timer.process.record('prepare') process_pre(p) + desc = 'Base' + if 'detailer' in p.ops: + desc = 'Detail' base_args = set_pipeline_args( p=p, model=shared.sd_model, @@ -143,7 +146,7 @@ def process_base(p: processing.StableDiffusionProcessing): num_frames=getattr(p, 'frames', 1), output_type='latent', clip_skip=p.clip_skip, - desc='Base', + desc=desc, ) base_steps = base_args.get('prior_num_inference_steps', None) or p.steps or base_args.get('num_inference_steps', None) shared.state.update(get_job_name(p, shared.sd_model), base_steps, 1) diff --git a/modules/processing_info.py b/modules/processing_info.py index eb6e9c3bb..694fd52b3 100644 --- a/modules/processing_info.py +++ b/modules/processing_info.py @@ -143,6 +143,7 @@ def create_infotext(p: StableDiffusionProcessing, all_prompts=None, all_seeds=No args["Detailer"] = ', '.join(shared.opts.detailer_models) if len(shared.opts.detailer_args) == 0 else shared.opts.detailer_args args["Detailer steps"] = p.detailer_steps args["Detailer strength"] = p.detailer_strength + args["Detailer resolution"] = p.detailer_resolution if p.detailer_resolution != 1024 else None args["Detailer prompt"] = p.detailer_prompt if len(p.detailer_prompt) > 0 else None args["Detailer negative"] = p.detailer_negative if len(p.detailer_negative) > 0 else None if 'color' in p.ops: diff --git a/modules/shared.py b/modules/shared.py index 31a0803c8..407337c1a 100644 --- a/modules/shared.py +++ b/modules/shared.py @@ -592,6 +592,7 @@ options_templates.update(options_section(('postprocessing', "Postprocessing"), { "detailer_iou": OptionInfo(0.5, "Max overlap", gr.Slider, {"minimum": 0, "maximum": 1.0, "step": 0.05, "visible": False}), "detailer_sigma_adjust": OptionInfo(1.0, "Detailer sigma adjust", gr.Slider, {"minimum": 0, "maximum": 1.0, "step": 0.05, "visible": False}), "detailer_sigma_adjust_max": OptionInfo(1.0, "Detailer sigma end", gr.Slider, {"minimum": 0, "maximum": 1.0, "step": 0.05, "visible": False}), + # "detailer_resolution": OptionInfo(1024, "Detailer resolution", gr.Slider, {"minimum": 256, "maximum": 4096, "step": 8, "visible": False}), "detailer_min_size": OptionInfo(0.0, "Min object size", gr.Slider, {"minimum": 0.0, "maximum": 1.0, "step": 0.05, "visible": False}), "detailer_max_size": OptionInfo(1.0, "Max object size", gr.Slider, {"minimum": 0.0, "maximum": 1.0, "step": 0.05, "visible": False}), "detailer_padding": OptionInfo(20, "Item padding", gr.Slider, {"minimum": 0, "maximum": 100, "step": 1, "visible": False}), diff --git a/modules/txt2img.py b/modules/txt2img.py index f198d5ff7..3397d4fe9 100644 --- a/modules/txt2img.py +++ b/modules/txt2img.py @@ -12,7 +12,7 @@ def txt2img(id_task, state, prompt, negative_prompt, prompt_styles, steps, sampler_index, hr_sampler_index, vae_type, tiling, hidiffusion, - detailer_enabled, detailer_prompt, detailer_negative, detailer_steps, detailer_strength, + detailer_enabled, detailer_prompt, detailer_negative, detailer_steps, detailer_strength, detailer_resolution, n_iter, batch_size, cfg_scale, image_cfg_scale, diffusers_guidance_rescale, pag_scale, pag_adaptive, cfg_end, clip_skip, @@ -70,6 +70,7 @@ def txt2img(id_task, state, detailer_negative=detailer_negative, detailer_steps=detailer_steps, detailer_strength=detailer_strength, + detailer_resolution=detailer_resolution, tiling=tiling, hidiffusion=hidiffusion, enable_hr=enable_hr, diff --git a/modules/ui_control.py b/modules/ui_control.py index a2621944b..b1898274b 100644 --- a/modules/ui_control.py +++ b/modules/ui_control.py @@ -174,7 +174,7 @@ def create_ui(_blocks: gr.Blocks=None): video_type, video_duration, video_loop, video_pad, video_interpolate = create_video_inputs(tab='control') enable_hr, hr_sampler_index, hr_denoising_strength, hr_resize_mode, hr_resize_context, hr_upscaler, hr_force, hr_second_pass_steps, hr_scale, hr_resize_x, hr_resize_y, refiner_steps, refiner_start, refiner_prompt, refiner_negative = ui_sections.create_hires_inputs('control') - detailer_enabled, detailer_prompt, detailer_negative, detailer_steps, detailer_strength = shared.yolo.ui('control') + detailer_enabled, detailer_prompt, detailer_negative, detailer_steps, detailer_strength, detailer_resolution = shared.yolo.ui('control') with gr.Row(): override_settings = ui_common.create_override_inputs('control') @@ -584,7 +584,7 @@ def create_ui(_blocks: gr.Blocks=None): steps, sampler_index, seed, subseed, subseed_strength, seed_resize_from_h, seed_resize_from_w, cfg_scale, clip_skip, image_cfg_scale, guidance_rescale, pag_scale, pag_adaptive, cfg_end, vae_type, tiling, hidiffusion, - detailer_enabled, detailer_prompt, detailer_negative, detailer_steps, detailer_strength, + detailer_enabled, detailer_prompt, detailer_negative, detailer_steps, detailer_strength, detailer_resolution, hdr_mode, hdr_brightness, hdr_color, hdr_sharpen, hdr_clamp, hdr_boundary, hdr_threshold, hdr_maximize, hdr_max_center, hdr_max_boundary, hdr_color_picker, hdr_tint_ratio, resize_mode_before, resize_name_before, resize_context_before, width_before, height_before, scale_by_before, selected_scale_tab_before, resize_mode_after, resize_name_after, resize_context_after, width_after, height_after, scale_by_after, selected_scale_tab_after, @@ -679,6 +679,7 @@ def create_ui(_blocks: gr.Blocks=None): (detailer_negative, "Detailer negative"), (detailer_steps, "Detailer steps"), (detailer_strength, "Detailer strength"), + (detailer_resolution, "Detailer resolution"), # second pass (enable_hr, "Second pass"), (enable_hr, "Refine"), diff --git a/modules/ui_img2img.py b/modules/ui_img2img.py index 402a3edc1..c326d24fb 100644 --- a/modules/ui_img2img.py +++ b/modules/ui_img2img.py @@ -135,7 +135,7 @@ def create_ui(): vae_type, tiling, hidiffusion, cfg_scale, clip_skip, image_cfg_scale, diffusers_guidance_rescale, pag_scale, pag_adaptive, cfg_end = ui_sections.create_advanced_inputs('img2img') hdr_mode, hdr_brightness, hdr_color, hdr_sharpen, hdr_clamp, hdr_boundary, hdr_threshold, hdr_maximize, hdr_max_center, hdr_max_boundary, hdr_color_picker, hdr_tint_ratio = ui_sections.create_correction_inputs('img2img') enable_hr, hr_sampler_index, hr_denoising_strength, hr_resize_mode, hr_resize_context, hr_upscaler, hr_force, hr_second_pass_steps, hr_scale, hr_resize_x, hr_resize_y, refiner_steps, hr_refiner_start, refiner_prompt, refiner_negative = ui_sections.create_hires_inputs('txt2img') - detailer_enabled, detailer_prompt, detailer_negative, detailer_steps, detailer_strength = shared.yolo.ui('img2img') + detailer_enabled, detailer_prompt, detailer_negative, detailer_steps, detailer_strength, detailer_resolution = shared.yolo.ui('img2img') # with gr.Group(elem_id="inpaint_controls", visible=False) as inpaint_controls: with gr.Accordion(open=False, label="Mask", elem_classes=["small-accordion"], elem_id="img2img_mask_group") as inpaint_controls: @@ -174,7 +174,7 @@ def create_ui(): sampler_index, mask_blur, mask_alpha, vae_type, tiling, hidiffusion, - detailer_enabled, detailer_prompt, detailer_negative, detailer_steps, detailer_strength, + detailer_enabled, detailer_prompt, detailer_negative, detailer_steps, detailer_strength, detailer_resolution, batch_count, batch_size, cfg_scale, image_cfg_scale, diffusers_guidance_rescale, pag_scale, pag_adaptive, cfg_end, @@ -270,6 +270,7 @@ def create_ui(): (detailer_negative, "Detailer negative"), (detailer_steps, "Detailer steps"), (detailer_strength, "Detailer strength"), + (detailer_resolution, "Detailer resolution"), # second pass (enable_hr, "Second pass"), (enable_hr, "Refine"), diff --git a/modules/ui_txt2img.py b/modules/ui_txt2img.py index 8e888a122..fe9a19c50 100644 --- a/modules/ui_txt2img.py +++ b/modules/ui_txt2img.py @@ -37,7 +37,7 @@ def create_ui(): vae_type, tiling, hidiffusion, _cfg_scale, clip_skip, image_cfg_scale, diffusers_guidance_rescale, pag_scale, pag_adaptive, _cfg_end = ui_sections.create_advanced_inputs('txt2img', base=False) hdr_mode, hdr_brightness, hdr_color, hdr_sharpen, hdr_clamp, hdr_boundary, hdr_threshold, hdr_maximize, hdr_max_center, hdr_max_boundary, hdr_color_picker, hdr_tint_ratio = ui_sections.create_correction_inputs('txt2img') enable_hr, hr_sampler_index, denoising_strength, hr_resize_mode, hr_resize_context, hr_upscaler, hr_force, hr_second_pass_steps, hr_scale, hr_resize_x, hr_resize_y, refiner_steps, refiner_start, refiner_prompt, refiner_negative = ui_sections.create_hires_inputs('txt2img') - detailer_enabled, detailer_prompt, detailer_negative, detailer_steps, detailer_strength = shared.yolo.ui('txt2img') + detailer_enabled, detailer_prompt, detailer_negative, detailer_steps, detailer_strength, detailer_resolution = shared.yolo.ui('txt2img') override_settings = ui_common.create_override_inputs('txt2img') state = gr.Textbox(value='', visible=False) @@ -55,7 +55,7 @@ def create_ui(): txt2img_prompt, txt2img_negative_prompt, txt2img_prompt_styles, steps, sampler_index, hr_sampler_index, vae_type, tiling, hidiffusion, - detailer_enabled, detailer_prompt, detailer_negative, detailer_steps, detailer_strength, + detailer_enabled, detailer_prompt, detailer_negative, detailer_steps, detailer_strength, detailer_resolution, batch_count, batch_size, cfg_scale, image_cfg_scale, diffusers_guidance_rescale, pag_scale, pag_adaptive, cfg_end, clip_skip, @@ -123,6 +123,7 @@ def create_ui(): (detailer_negative, "Detailer negative"), (detailer_steps, "Detailer steps"), (detailer_strength, "Detailer strength"), + (detailer_resolution, "Detailer resolution"), # second pass (enable_hr, "Second pass"), (enable_hr, "Refine"),