Note that this only influence new users with new downloads Previous users will not be forced to download new files, because this is not friendly and should be avoided. delete user_path_config.txt to receive this new list
305 lines
11 KiB
Python
305 lines
11 KiB
Python
import os
|
||
import json
|
||
import args_manager
|
||
import modules.flags
|
||
import modules.sdxl_styles
|
||
|
||
from modules.model_loader import load_file_from_url
|
||
from modules.util import get_files_from_folder
|
||
|
||
config_path = "user_path_config.txt"
|
||
config_dict = {}
|
||
visited_keys = []
|
||
|
||
try:
|
||
if os.path.exists(config_path):
|
||
with open(config_path, "r", encoding="utf-8") as json_file:
|
||
config_dict = json.load(json_file)
|
||
except Exception as e:
|
||
print('Load path config failed')
|
||
print(e)
|
||
|
||
preset = args_manager.args.preset
|
||
|
||
if isinstance(preset, str):
|
||
preset = os.path.abspath(f'./presets/{preset}.json')
|
||
try:
|
||
if os.path.exists(preset):
|
||
with open(preset, "r", encoding="utf-8") as json_file:
|
||
preset = json.load(json_file)
|
||
except Exception as e:
|
||
print('Load preset config failed')
|
||
print(e)
|
||
|
||
preset = preset if isinstance(preset, dict) else None
|
||
|
||
if preset is not None:
|
||
config_dict.update(preset)
|
||
|
||
|
||
def get_dir_or_set_default(key, default_value):
|
||
global config_dict, visited_keys
|
||
visited_keys.append(key)
|
||
v = config_dict.get(key, None)
|
||
if isinstance(v, str) and os.path.exists(v) and os.path.isdir(v):
|
||
return v
|
||
else:
|
||
dp = os.path.abspath(os.path.join(os.path.dirname(__file__), default_value))
|
||
os.makedirs(dp, exist_ok=True)
|
||
config_dict[key] = dp
|
||
return dp
|
||
|
||
|
||
modelfile_path = get_dir_or_set_default('modelfile_path', '../models/checkpoints/')
|
||
lorafile_path = get_dir_or_set_default('lorafile_path', '../models/loras/')
|
||
embeddings_path = get_dir_or_set_default('embeddings_path', '../models/embeddings/')
|
||
vae_approx_path = get_dir_or_set_default('vae_approx_path', '../models/vae_approx/')
|
||
upscale_models_path = get_dir_or_set_default('upscale_models_path', '../models/upscale_models/')
|
||
inpaint_models_path = get_dir_or_set_default('inpaint_models_path', '../models/inpaint/')
|
||
controlnet_models_path = get_dir_or_set_default('controlnet_models_path', '../models/controlnet/')
|
||
clip_vision_models_path = get_dir_or_set_default('clip_vision_models_path', '../models/clip_vision/')
|
||
fooocus_expansion_path = get_dir_or_set_default('fooocus_expansion_path',
|
||
'../models/prompt_expansion/fooocus_expansion')
|
||
temp_outputs_path = get_dir_or_set_default('temp_outputs_path', '../outputs/')
|
||
|
||
|
||
def get_config_item_or_set_default(key, default_value, validator, disable_empty_as_none=False):
|
||
global config_dict, visited_keys
|
||
visited_keys.append(key)
|
||
if key not in config_dict:
|
||
config_dict[key] = default_value
|
||
return default_value
|
||
|
||
v = config_dict.get(key, None)
|
||
if not disable_empty_as_none:
|
||
if v is None or v == '':
|
||
v = 'None'
|
||
if validator(v):
|
||
return v
|
||
else:
|
||
config_dict[key] = default_value
|
||
return default_value
|
||
|
||
|
||
default_base_model_name = get_config_item_or_set_default(
|
||
key='default_model',
|
||
default_value='juggernautXL_version6Rundiffusion.safetensors',
|
||
validator=lambda x: isinstance(x, str)
|
||
)
|
||
default_refiner_model_name = get_config_item_or_set_default(
|
||
key='default_refiner',
|
||
default_value='None',
|
||
validator=lambda x: isinstance(x, str)
|
||
)
|
||
default_refiner_switch = get_config_item_or_set_default(
|
||
key='default_refiner_switch',
|
||
default_value=0.8,
|
||
validator=lambda x: isinstance(x, float)
|
||
)
|
||
default_lora_name = get_config_item_or_set_default(
|
||
key='default_lora',
|
||
default_value='sd_xl_offset_example-lora_1.0.safetensors',
|
||
validator=lambda x: isinstance(x, str)
|
||
)
|
||
default_lora_weight = get_config_item_or_set_default(
|
||
key='default_lora_weight',
|
||
default_value=0.1,
|
||
validator=lambda x: isinstance(x, float)
|
||
)
|
||
default_cfg_scale = get_config_item_or_set_default(
|
||
key='default_cfg_scale',
|
||
default_value=4.0,
|
||
validator=lambda x: isinstance(x, float)
|
||
)
|
||
default_sample_sharpness = get_config_item_or_set_default(
|
||
key='default_sample_sharpness',
|
||
default_value=2,
|
||
validator=lambda x: isinstance(x, float)
|
||
)
|
||
default_sampler = get_config_item_or_set_default(
|
||
key='default_sampler',
|
||
default_value='dpmpp_2m_sde_gpu',
|
||
validator=lambda x: x in modules.flags.sampler_list
|
||
)
|
||
default_scheduler = get_config_item_or_set_default(
|
||
key='default_scheduler',
|
||
default_value='karras',
|
||
validator=lambda x: x in modules.flags.scheduler_list
|
||
)
|
||
default_styles = get_config_item_or_set_default(
|
||
key='default_styles',
|
||
default_value=['Fooocus V2', 'Fooocus Enhance', 'Fooocus Sharp'],
|
||
validator=lambda x: isinstance(x, list) and all(y in modules.sdxl_styles.legal_style_names for y in x)
|
||
)
|
||
default_prompt_negative = get_config_item_or_set_default(
|
||
key='default_prompt_negative',
|
||
default_value='',
|
||
validator=lambda x: isinstance(x, str),
|
||
disable_empty_as_none=True
|
||
)
|
||
default_prompt = get_config_item_or_set_default(
|
||
key='default_prompt',
|
||
default_value='',
|
||
validator=lambda x: isinstance(x, str),
|
||
disable_empty_as_none=True
|
||
)
|
||
default_advanced_checkbox = get_config_item_or_set_default(
|
||
key='default_advanced_checkbox',
|
||
default_value=False,
|
||
validator=lambda x: isinstance(x, bool)
|
||
)
|
||
default_image_number = get_config_item_or_set_default(
|
||
key='default_image_number',
|
||
default_value=2,
|
||
validator=lambda x: isinstance(x, int) and x >= 1 and x <= 32
|
||
)
|
||
checkpoint_downloads = get_config_item_or_set_default(
|
||
key='checkpoint_downloads',
|
||
default_value={
|
||
'juggernautXL_version6Rundiffusion.safetensors':
|
||
'https://huggingface.co/lllyasviel/fav_models/resolve/main/fav/juggernautXL_version6Rundiffusion.safetensors'
|
||
},
|
||
validator=lambda x: isinstance(x, dict) and all(isinstance(k, str) and isinstance(v, str) for k, v in x.items())
|
||
)
|
||
lora_downloads = get_config_item_or_set_default(
|
||
key='lora_downloads',
|
||
default_value={
|
||
'sd_xl_offset_example-lora_1.0.safetensors':
|
||
'https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_offset_example-lora_1.0.safetensors'
|
||
},
|
||
validator=lambda x: isinstance(x, dict) and all(isinstance(k, str) and isinstance(v, str) for k, v in x.items())
|
||
)
|
||
embeddings_downloads = get_config_item_or_set_default(
|
||
key='embeddings_downloads',
|
||
default_value={},
|
||
validator=lambda x: isinstance(x, dict) and all(isinstance(k, str) and isinstance(v, str) for k, v in x.items())
|
||
)
|
||
available_aspect_ratios = get_config_item_or_set_default(
|
||
key='available_aspect_ratios',
|
||
default_value=['704*1408', '704*1344', '768*1344', '768*1280', '832*1216', '832*1152', '896*1152', '896*1088', '960*1088', '960*1024', '1024*1024', '1024*960', '1088*960', '1088*896', '1152*896', '1152*832', '1216*832', '1280*768', '1344*768', '1344*704', '1408*704', '1472*704', '1536*640', '1600*640', '1664*576', '1728*576'],
|
||
validator=lambda x: isinstance(x, list) and all('*' in v for v in x) and len(x) > 1
|
||
)
|
||
default_aspect_ratio = get_config_item_or_set_default(
|
||
key='default_aspect_ratio',
|
||
default_value='1152*896' if '1152*896' in available_aspect_ratios else available_aspect_ratios[0],
|
||
validator=lambda x: x in available_aspect_ratios
|
||
)
|
||
|
||
if preset is None:
|
||
# Do not overwrite user config if preset is applied.
|
||
with open(config_path, "w", encoding="utf-8") as json_file:
|
||
json.dump({k: config_dict[k] for k in visited_keys}, json_file, indent=4)
|
||
|
||
os.makedirs(temp_outputs_path, exist_ok=True)
|
||
|
||
model_filenames = []
|
||
lora_filenames = []
|
||
|
||
available_aspect_ratios = [x.replace('*', '×') for x in available_aspect_ratios]
|
||
default_aspect_ratio = default_aspect_ratio.replace('*', '×')
|
||
|
||
|
||
def get_model_filenames(folder_path, name_filter=None):
|
||
return get_files_from_folder(folder_path, ['.pth', '.ckpt', '.bin', '.safetensors', '.fooocus.patch'], name_filter)
|
||
|
||
|
||
def update_all_model_names():
|
||
global model_filenames, lora_filenames
|
||
model_filenames = get_model_filenames(modelfile_path)
|
||
lora_filenames = get_model_filenames(lorafile_path)
|
||
return
|
||
|
||
|
||
def downloading_inpaint_models(v):
|
||
assert v in ['v1', 'v2.5']
|
||
|
||
load_file_from_url(
|
||
url='https://huggingface.co/lllyasviel/fooocus_inpaint/resolve/main/fooocus_inpaint_head.pth',
|
||
model_dir=inpaint_models_path,
|
||
file_name='fooocus_inpaint_head.pth'
|
||
)
|
||
head_file = os.path.join(inpaint_models_path, 'fooocus_inpaint_head.pth')
|
||
patch_file = None
|
||
|
||
# load_file_from_url(
|
||
# url='https://huggingface.co/lllyasviel/Annotators/resolve/main/ControlNetLama.pth',
|
||
# model_dir=inpaint_models_path,
|
||
# file_name='ControlNetLama.pth'
|
||
# )
|
||
# lama_file = os.path.join(inpaint_models_path, 'ControlNetLama.pth')
|
||
|
||
if v == 'v1':
|
||
load_file_from_url(
|
||
url='https://huggingface.co/lllyasviel/fooocus_inpaint/resolve/main/inpaint.fooocus.patch',
|
||
model_dir=inpaint_models_path,
|
||
file_name='inpaint.fooocus.patch'
|
||
)
|
||
patch_file = os.path.join(inpaint_models_path, 'inpaint.fooocus.patch')
|
||
|
||
if v == 'v2.5':
|
||
load_file_from_url(
|
||
url='https://huggingface.co/lllyasviel/fooocus_inpaint/resolve/main/inpaint_v25.fooocus.patch',
|
||
model_dir=inpaint_models_path,
|
||
file_name='inpaint_v25.fooocus.patch'
|
||
)
|
||
patch_file = os.path.join(inpaint_models_path, 'inpaint_v25.fooocus.patch')
|
||
|
||
return head_file, patch_file
|
||
|
||
|
||
def downloading_controlnet_canny():
|
||
load_file_from_url(
|
||
url='https://huggingface.co/lllyasviel/misc/resolve/main/control-lora-canny-rank128.safetensors',
|
||
model_dir=controlnet_models_path,
|
||
file_name='control-lora-canny-rank128.safetensors'
|
||
)
|
||
return os.path.join(controlnet_models_path, 'control-lora-canny-rank128.safetensors')
|
||
|
||
|
||
def downloading_controlnet_cpds():
|
||
load_file_from_url(
|
||
url='https://huggingface.co/lllyasviel/misc/resolve/main/fooocus_xl_cpds_128.safetensors',
|
||
model_dir=controlnet_models_path,
|
||
file_name='fooocus_xl_cpds_128.safetensors'
|
||
)
|
||
return os.path.join(controlnet_models_path, 'fooocus_xl_cpds_128.safetensors')
|
||
|
||
|
||
def downloading_ip_adapters():
|
||
results = []
|
||
|
||
load_file_from_url(
|
||
url='https://huggingface.co/lllyasviel/misc/resolve/main/clip_vision_vit_h.safetensors',
|
||
model_dir=clip_vision_models_path,
|
||
file_name='clip_vision_vit_h.safetensors'
|
||
)
|
||
results += [os.path.join(clip_vision_models_path, 'clip_vision_vit_h.safetensors')]
|
||
|
||
load_file_from_url(
|
||
url='https://huggingface.co/lllyasviel/misc/resolve/main/fooocus_ip_negative.safetensors',
|
||
model_dir=controlnet_models_path,
|
||
file_name='fooocus_ip_negative.safetensors'
|
||
)
|
||
results += [os.path.join(controlnet_models_path, 'fooocus_ip_negative.safetensors')]
|
||
|
||
load_file_from_url(
|
||
url='https://huggingface.co/lllyasviel/misc/resolve/main/ip-adapter-plus_sdxl_vit-h.bin',
|
||
model_dir=controlnet_models_path,
|
||
file_name='ip-adapter-plus_sdxl_vit-h.bin'
|
||
)
|
||
results += [os.path.join(controlnet_models_path, 'ip-adapter-plus_sdxl_vit-h.bin')]
|
||
|
||
return results
|
||
|
||
|
||
def downloading_upscale_model():
|
||
load_file_from_url(
|
||
url='https://huggingface.co/lllyasviel/misc/resolve/main/fooocus_upscaler_s409985e5.bin',
|
||
model_dir=upscale_models_path,
|
||
file_name='fooocus_upscaler_s409985e5.bin'
|
||
)
|
||
return os.path.join(upscale_models_path, 'fooocus_upscaler_s409985e5.bin')
|
||
|
||
|
||
update_all_model_names()
|