import copy import random import numpy as np import args_manager import modules.flags import modules.config import modules.flags as flags import modules.constants as constants import modules.hack_async_worker_class as worker class Fooocus(): def __init__(self) -> None: self._preset_parameters() self._inpaint_parameters() self._define_models() self._load_generator() def _seed_set(self, seed = 0, seed_random = True): if seed_random: self.image_seed = random.randint(constants.MIN_SEED, constants.MAX_SEED) else: try: seed_value = int(seed) if constants.MIN_SEED <= seed_value <= constants.MAX_SEED: self.image_seed = seed_value except ValueError: pass self.image_seed = random.randint(constants.MIN_SEED, constants.MAX_SEED) def _preset_parameters(self): ''' We keep the default parameters of Fooocus unchanged! ''' self.output_format = modules.config.default_output_format # png self.style_selections = copy.deepcopy(modules.config.default_styles) # Fooocus style unchanged:Fooocus V2+Enhanec+Sharp self.performance_selection = modules.config.default_performance self.aspect_ratios_selection = modules.config.default_aspect_ratio self.current_tab = 'inpaint' self.input_image_checkbox = True self.advanced_checkbox = modules.config.default_advanced_checkbox self.uov_method = flags.disabled self.uov_input_image = None # unchanged diffusion setting self.dev_mode = False self.guidance_scale = modules.config.default_cfg_scale self.sharpness = modules.config.default_sample_sharpness self.adm_scaler_end = 0.3 self.adm_scaler_positive = 1.5 self.adm_scaler_negative = 0.8 self.refiner_swap_method = flags.refiner_swap_method self.adaptive_cfg = modules.config.default_cfg_tsnr self.clip_skip = modules.config.default_clip_skip self.sampler_name = modules.config.default_sampler self.scheduler_name = modules.config.default_scheduler self.vae_name = modules.config.default_vae self.generate_image_grid = False self.overwrite_step = modules.config.default_overwrite_step self.overwrite_switch = modules.config.default_overwrite_switch self.overwrite_width = -1 self.overwrite_height = -1 self.overwrite_vary_strength = -1 self.overwrite_upscale_strength = -1 self.disable_preview = modules.config.default_black_out_nsfw self.disable_intermediate_results = flags.Performance.has_restricted_features(modules.config.default_performance) self.disable_seed_increment = False self.read_wildcards_in_order = False self.black_out_nsfw = modules.config.default_black_out_nsfw self.save_metadata_to_images = modules.config.default_save_metadata_to_images self.metadata_scheme = modules.config.default_metadata_scheme self.debugging_cn_preprocessor = False self.skipping_cn_preprocessor = False self.mixing_image_prompt_and_vary_upscale = False self.mixing_image_prompt_and_inpaint = False self.controlnet_softness = 0.25 self.canny_low_threshold = 64 self.canny_high_threshold = 128 freeu_enabled = False freeu_b1 = 1.01 freeu_b2 = 1.02 freeu_s1 = 0.99 freeu_s2 = 0.95 self.freeu_ctrls = [freeu_enabled, freeu_b1, freeu_b2, freeu_s1, freeu_s2] self.image_number = 1 self.default_prompt = modules.config.default_prompt self.negative_prompt = modules.config.default_prompt_negative self.inpaint_additional_prompt = '' self.outpaint_selections = [] self.outpaint_extend_times = 0.0 self.inpaint_ctrls = [False,False,'None',0,0.0,False,False,0] self.ip_ctrls = [] for _ in range(flags.controlnet_image_count): ip_image = None # WHAT'S THIS self.ip_ctrls.append(ip_image) default_end, default_weight = flags.default_parameters[flags.default_ip] ip_stop = default_end self.ip_ctrls.append(ip_stop) ip_weight = default_weight self.ip_ctrls.append(ip_weight) ip_type = flags.default_ip self.ip_ctrls.append(ip_type) def _upsample_parameteres(self): # argue mode self.current_tab = 'uov' self.uov_method = 'Upscale (2x)' self.inpaint_additional_prompt = '' self.outpaint_selections = [] self.outpaint_extend_times = 0.0 self.inpaint_ctrls = [False,False,'None',0,0.0,False,False,0] def _inpaint_parameters(self, inpaint_additional_prompt = '', outpaint_selections = ['Left', 'Right', 'Top', 'Bottom'], outpaint_extend_times = 0.4, inpaint_mode = modules.flags.inpaint_option_default ): # mode change assert inpaint_mode in modules.flags.inpaint_options # argue mode self.current_tab = 'inpaint' self.uov_method = flags.disabled debugging_inpaint_preprocessor = False if inpaint_mode == modules.flags.inpaint_option_detail: self.inpaint_additional_prompt = inpaint_additional_prompt + 'Sharp objects, Clear objects, optimize all blur objects' self.outpaint_selections = [] self.outpaint_extend_times = 0.0 inpaint_disable_initial_latent = False inpaint_engine = 'None' inpaint_strength = 0.3 inpaint_respective_field = 0.0 elif inpaint_mode == modules.flags.inpaint_option_modify: self.inpaint_additional_prompt = inpaint_additional_prompt self.outpaint_selections = [] self.outpaint_extend_times = 0.0 inpaint_disable_initial_latent = True inpaint_engine = modules.config.default_inpaint_engine_version inpaint_strength = 1.0 inpaint_respective_field = 0.0 else: self.inpaint_additional_prompt = '' self.outpaint_selections = outpaint_selections self.outpaint_extend_times = outpaint_extend_times inpaint_disable_initial_latent = False inpaint_engine = modules.config.default_inpaint_engine_version inpaint_strength = 1.0 inpaint_respective_field = 0.618 inpaint_erode_or_dilate = 0 invert_mask_checkbox = False inpaint_mask_upload_checkbox = False self.inpaint_ctrls = [debugging_inpaint_preprocessor, inpaint_disable_initial_latent, inpaint_engine, inpaint_strength, inpaint_respective_field, inpaint_mask_upload_checkbox, invert_mask_checkbox, inpaint_erode_or_dilate] def _define_models(self): # define models self.base_model = modules.config.default_base_model_name self.refiner_model = modules.config.default_refiner_model_name self.refiner_switch = modules.config.default_refiner_switch self.lora_ctrls = [] for i, (enabled, filename, weight) in enumerate(modules.config.default_loras): lora_enabled = enabled lora_model = filename lora_weight = weight self.lora_ctrls += [lora_enabled, lora_model, lora_weight] def _generate_images(self, task: worker.AsyncTask): import ldm_patched.modules.model_management as model_management with model_management.interrupt_processing_mutex: model_management.interrupt_processing = False # outputs=[progress_html, progress_window, progress_gallery, gallery] if len(task.args) == 0: return imgs = self.worker(task) return imgs def _set_ctrls(self, prompt, negative_prompt, # for inpainting/outpainting inpaint_input_image=None, inpaint_mask_image=None, # for upsampling upsample_input_image=None): prompt = prompt + self.default_prompt negative_prompt = negative_prompt + self.negative_prompt currentTask = worker.AsyncTask(args=[]) inpaint_input_image = {'image':inpaint_input_image, 'mask':inpaint_mask_image} inpaint_mask_image = None ctrls = [currentTask, self.generate_image_grid] ctrls += [ prompt, negative_prompt, self.style_selections, self.performance_selection, self.aspect_ratios_selection, self.image_number, self.output_format, self.image_seed, self.read_wildcards_in_order, self.sharpness, self.guidance_scale ] ctrls += [self.base_model, self.refiner_model, self.refiner_switch] + self.lora_ctrls ctrls += [self.input_image_checkbox, self.current_tab] ctrls += [self.uov_method, upsample_input_image] ctrls += [self.outpaint_selections,self.outpaint_extend_times, inpaint_input_image, self.inpaint_additional_prompt, inpaint_mask_image] ctrls += [self.disable_preview, self.disable_intermediate_results, self.disable_seed_increment, self.black_out_nsfw] ctrls += [self.adm_scaler_positive, self.adm_scaler_negative, self.adm_scaler_end, self.adaptive_cfg, self.clip_skip] ctrls += [self.sampler_name, self.scheduler_name, self.vae_name] ctrls += [self.overwrite_step, self.overwrite_switch, self.overwrite_width, self.overwrite_height, self.overwrite_vary_strength] ctrls += [self.overwrite_upscale_strength, self.mixing_image_prompt_and_vary_upscale, self.mixing_image_prompt_and_inpaint] ctrls += [self.debugging_cn_preprocessor, self.skipping_cn_preprocessor, self.canny_low_threshold, self.canny_high_threshold] ctrls += [self.refiner_swap_method, self.controlnet_softness] ctrls += self.freeu_ctrls ctrls += self.inpaint_ctrls if not args_manager.args.disable_metadata: ctrls += [self.save_metadata_to_images, self.metadata_scheme] ctrls += self.ip_ctrls return ctrls def _get_task(self,args): args.pop(0) return worker.AsyncTask(args=args) def _load_generator(self): self.worker = worker.Hack_worker() def _refine(self, image_number = 1, prompt = '', negative_prompt = '', outpaint_selections=[], outpaint_extend_times=0.0, origin_image = None, mask_image = None, seed = None): ''' origin_image numpy HW3 0-255 mask_image numpy HW3 inpaint area be 255,255,255 else be 0,0,0 ''' # input check if np.amax(origin_image) < 1.1: origin_image = (origin_image*255).astype(np.uint8) if np.amax(mask_image) < 1.1: mask_image = (mask_image*255).astype(np.uint8) if mask_image.ndim < 3: mask_image = mask_image[:,:,None].repeat(3,axis=-1) # set seed self.image_number = image_number if seed is None: self._seed_set() else: self._seed_set(seed,seed_random=False) # conduct inpainting self._inpaint_parameters(outpaint_selections=outpaint_selections, outpaint_extend_times=outpaint_extend_times, inpaint_mode = modules.flags.inpaint_option_detail) ctrls = self._set_ctrls(prompt, negative_prompt, origin_image, mask_image) currentTask = self._get_task(ctrls) output = self._generate_images(currentTask) output = [np.array(o)/255. for o in output] return output def _upsample(self, image :np.array = None, image_number = 1, prompt = '', negative_prompt = '', control_strength = 0.382, seed = None): # input check if np.amax(image) < 1.1: image = (image*255).astype(np.uint8) # set seed if seed is None: self._seed_set() else: self._seed_set(seed,seed_random=False) self.image_number=image_number # conduct inpainting self._upsample_parameteres() self.overwrite_upscale_strength = control_strength ctrls = self._set_ctrls(prompt, negative_prompt, upsample_input_image=image) currentTask = self._get_task(ctrls) output = self._generate_images(currentTask) output = [np.array(o)/255. for o in output] return output def __call__(self, image_number = 1, prompt = '', negative_prompt = '', outpaint_selections = ['Left', 'Right', 'Top', 'Bottom'], outpaint_extend_times = 0.4, origin_image = None, mask_image = None, seed = None): ''' origin_image numpy HW3 0-255 / 0-1 mask_image numpy HW(3) inpaint area be 255,255(,255) / 1,1(,1) else be 0,0(,0) ''' # input check if np.amax(origin_image) < 1.1: origin_image = (origin_image*255).astype(np.uint8) if np.amax(mask_image) < 1.1: mask_image = (mask_image*255).astype(np.uint8) if mask_image.ndim < 3: mask_image = mask_image[:,:,None].repeat(3,axis=-1) # set seed if seed is None: self._seed_set() else: self._seed_set(seed,seed_random=False) self.image_number=image_number # conduct inpainting self._inpaint_parameters(outpaint_selections=outpaint_selections, outpaint_extend_times=outpaint_extend_times, inpaint_mode = modules.flags.inpaint_option_default) ctrls = self._set_ctrls(prompt, negative_prompt, origin_image, mask_image) currentTask = self._get_task(ctrls) output = self._generate_images(currentTask) output = [np.array(o)/255. for o in output] return output