diff --git a/CHANGELOG.md b/CHANGELOG.md index 2024d53b4..ea10b48bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,11 +12,7 @@ ## TODO for Dev merge - update docs -- face apply style -- embeddings disappear - control reference mode -- control init image same as control, separate init image -- control t2i-adapter with ip-adapter ## Update for 2023-02-02 diff --git a/modules/face/__init__.py b/modules/face/__init__.py index 316605e9f..54a2436a9 100644 --- a/modules/face/__init__.py +++ b/modules/face/__init__.py @@ -107,6 +107,7 @@ class Script(scripts.Script): input_images[i] = Image.open(image['name']) source_image = input_images[0] + processing.process_init(p) if mode == 'FaceID': # faceid runs as ipadapter in its own pipeline from modules.face.faceid import face_id from modules.face.insightface import get_app diff --git a/modules/face/faceid.py b/modules/face/faceid.py index d139851ab..aff59477a 100644 --- a/modules/face/faceid.py +++ b/modules/face/faceid.py @@ -32,7 +32,6 @@ def face_id(p: processing.StableDiffusionProcessing, app, source_image: Image.Im shared.log.error(f'FaceID download failed: model={model} file={ip_ckpt}') return None - processing.process_init(p) if override: shared.sd_model.scheduler = diffusers.DDIMScheduler( num_train_timesteps=1000, diff --git a/modules/face/instantid.py b/modules/face/instantid.py index ce8dde6c0..43d220566 100644 --- a/modules/face/instantid.py +++ b/modules/face/instantid.py @@ -34,8 +34,9 @@ def instant_id(p: processing.StableDiffusionProcessing, app, source_image, stren shared.log.debug(f'InstantID face: score={face.det_score:.2f} gender={"female" if face.gender==0 else "male"} age={face.age} bbox={face.bbox}') shared.log.debug(f'InstantID loading: model={REPO_ID}') face_adapter = hf.hf_hub_download(repo_id=REPO_ID, filename="ip-adapter.bin") - if controlnet_model is None: + if controlnet_model is None or not cache: controlnet_model = ControlNetModel.from_pretrained(REPO_ID, subfolder="ControlNetModel", torch_dtype=devices.dtype, cache_dir=shared.opts.diffusers_dir) + controlnet_model.to(devices.device, devices.dtype) processing.process_init(p) @@ -57,12 +58,13 @@ def instant_id(p: processing.StableDiffusionProcessing, app, source_image, stren shared.sd_model.load_ip_adapter_instantid(face_adapter, scale=strength) shared.sd_model.set_ip_adapter_scale(strength) if not ((shared.opts.diffusers_model_cpu_offload or shared.cmd_opts.medvram) or (shared.opts.diffusers_seq_cpu_offload or shared.cmd_opts.lowvram)): + print('HERE1') shared.sd_model.to(shared.device, devices.dtype) # move pipeline if needed, but don't touch if its under automatic managment # pipeline specific args orig_prompt_attention = shared.opts.prompt_attention shared.opts.data['prompt_attention'] = 'Fixed attention' # otherwise need to deal with class_tokens_mask - p.task_args['prompt'] = p.prompt # override all logic + p.task_args['prompt'] = p.all_prompts[0] # override all logic p.task_args['image_embeds'] = face_emb p.task_args['image'] = face_kps p.task_args['controlnet_conditioning_scale'] = float(conditioning) diff --git a/modules/face/photomaker.py b/modules/face/photomaker.py index a12322b4c..d62da5c72 100644 --- a/modules/face/photomaker.py +++ b/modules/face/photomaker.py @@ -18,14 +18,14 @@ def photo_maker(p: processing.StableDiffusionProcessing, input_images, trigger, # validate prompt trigger_ids = shared.sd_model.tokenizer.encode(trigger) + shared.sd_model.tokenizer_2.encode(trigger) - prompt_ids1 = shared.sd_model.tokenizer.encode(p.prompt) - prompt_ids2 = shared.sd_model.tokenizer_2.encode(p.prompt) + prompt_ids1 = shared.sd_model.tokenizer.encode(p.all_prompts[0]) + prompt_ids2 = shared.sd_model.tokenizer_2.encode(p.all_prompts[0]) for t in trigger_ids: if prompt_ids1.count(t) != 1: - shared.log.error(f'PhotoMaker: trigger word not matched in prompt: {trigger} ids={trigger_ids} prompt={p.prompt} ids={prompt_ids1}') + shared.log.error(f'PhotoMaker: trigger word not matched in prompt: {trigger} ids={trigger_ids} prompt={p.all_prompts[0]} ids={prompt_ids1}') return None if prompt_ids2.count(t) != 1: - shared.log.error(f'PhotoMaker: trigger word not matched in prompt: {trigger} ids={trigger_ids} prompt={p.prompt} ids={prompt_ids1}') + shared.log.error(f'PhotoMaker: trigger word not matched in prompt: {trigger} ids={trigger_ids} prompt={p.all_prompts[0]} ids={prompt_ids1}') return None # create new pipeline @@ -49,7 +49,7 @@ def photo_maker(p: processing.StableDiffusionProcessing, input_images, trigger, shared.opts.data['prompt_attention'] = 'Fixed attention' # otherwise need to deal with class_tokens_mask p.task_args['input_id_images'] = input_images p.task_args['start_merge_step'] = int(start * p.steps) - p.task_args['prompt'] = p.prompt # override all logic + p.task_args['prompt'] = p.all_prompts[0] # override all logic photomaker_path = hf.hf_hub_download(repo_id="TencentARC/PhotoMaker", filename="photomaker-v1.bin", repo_type="model", cache_dir=shared.opts.diffusers_dir) shared.log.debug(f'PhotoMaker: model={photomaker_path} images={len(input_images)} trigger={trigger} args={p.task_args}')