Spaces:
Running on Zero
Running on Zero
Upload folder using huggingface_hub
Browse files- chain_injectors/ipadapter_injector.py +122 -77
- requirements.txt +4 -3
chain_injectors/ipadapter_injector.py
CHANGED
|
@@ -25,82 +25,127 @@ def inject(assembler, chain_definition, chain_items):
|
|
| 25 |
model_type = final_settings.get('model_type', 'sdxl')
|
| 26 |
megapixels = 1.05 if model_type == 'sdxl' else 0.39
|
| 27 |
|
| 28 |
-
|
| 29 |
-
|
| 30 |
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 64 |
|
| 65 |
-
|
| 66 |
-
|
| 67 |
-
|
| 68 |
-
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
|
| 75 |
-
|
| 76 |
-
|
| 77 |
-
|
| 78 |
-
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
|
| 82 |
-
|
| 83 |
-
|
| 84 |
-
|
| 85 |
-
|
| 86 |
-
|
| 87 |
-
|
| 88 |
-
|
| 89 |
-
|
| 90 |
-
final_loader_node['inputs']['preset'] = final_settings.get('final_preset', 'STANDARD (medium strength)')
|
| 91 |
-
if final_loader_type == 'FaceID':
|
| 92 |
-
final_loader_node['inputs']['lora_strength'] = final_settings.get('final_lora_strength', 0.6)
|
| 93 |
-
assembler.workflow[final_loader_id] = final_loader_node
|
| 94 |
-
|
| 95 |
-
apply_embeds_id = assembler._get_unique_id()
|
| 96 |
-
apply_embeds_node = assembler._get_node_template("IPAdapterEmbeds")
|
| 97 |
-
apply_embeds_node['inputs']['weight'] = final_settings.get('final_weight', 1.0)
|
| 98 |
-
apply_embeds_node['inputs']['embeds_scaling'] = final_settings.get('final_embeds_scaling', 'V only')
|
| 99 |
-
apply_embeds_node['inputs']['model'] = [final_loader_id, 0]
|
| 100 |
-
apply_embeds_node['inputs']['ipadapter'] = [final_loader_id, 1]
|
| 101 |
-
apply_embeds_node['inputs']['pos_embed'] = [pos_combiner_id, 0]
|
| 102 |
-
apply_embeds_node['inputs']['neg_embed'] = [neg_combiner_id, 0]
|
| 103 |
-
assembler.workflow[apply_embeds_id] = apply_embeds_node
|
| 104 |
-
|
| 105 |
-
assembler.workflow[end_node_id]['inputs']['model'] = [apply_embeds_id, 0]
|
| 106 |
-
print(f"IPAdapter injector applied. Redirected '{end_node_name}' model input through {len(chain_items)} reference images.")
|
|
|
|
| 25 |
model_type = final_settings.get('model_type', 'sdxl')
|
| 26 |
megapixels = 1.05 if model_type == 'sdxl' else 0.39
|
| 27 |
|
| 28 |
+
first_preset = chain_items[0].get('preset', '')
|
| 29 |
+
is_faceid_chain = 'FACEID' in first_preset.upper()
|
| 30 |
|
| 31 |
+
if is_faceid_chain:
|
| 32 |
+
for i, item_data in enumerate(chain_items):
|
| 33 |
+
image_loader_id = assembler._get_unique_id()
|
| 34 |
+
image_loader_node = assembler._get_node_template("LoadImage")
|
| 35 |
+
image_loader_node['inputs']['image'] = item_data['image']
|
| 36 |
+
assembler.workflow[image_loader_id] = image_loader_node
|
| 37 |
+
|
| 38 |
+
image_scaler_id = assembler._get_unique_id()
|
| 39 |
+
image_scaler_node = assembler._get_node_template("ImageScaleToTotalPixels")
|
| 40 |
+
image_scaler_node['inputs']['image'] = [image_loader_id, 0]
|
| 41 |
+
image_scaler_node['inputs']['megapixels'] = megapixels
|
| 42 |
+
image_scaler_node['inputs']['upscale_method'] = "lanczos"
|
| 43 |
+
assembler.workflow[image_scaler_id] = image_scaler_node
|
| 44 |
+
|
| 45 |
+
ipadapter_loader_id = assembler._get_unique_id()
|
| 46 |
+
ipadapter_loader_node = assembler._get_node_template("IPAdapterUnifiedLoaderFaceID")
|
| 47 |
+
ipadapter_loader_node['inputs']['model'] = current_model_connection
|
| 48 |
+
ipadapter_loader_node['inputs']['preset'] = item_data['preset']
|
| 49 |
+
ipadapter_loader_node['inputs']['lora_strength'] = item_data.get('lora_strength', 0.6)
|
| 50 |
+
ipadapter_loader_node['inputs']['provider'] = "CUDA"
|
| 51 |
+
assembler.workflow[ipadapter_loader_id] = ipadapter_loader_node
|
| 52 |
+
|
| 53 |
+
apply_id = assembler._get_unique_id()
|
| 54 |
+
apply_node = assembler._get_node_template("IPAdapterFaceID")
|
| 55 |
+
apply_node['inputs']['model'] = [ipadapter_loader_id, 0]
|
| 56 |
+
apply_node['inputs']['ipadapter'] = [ipadapter_loader_id, 1]
|
| 57 |
+
apply_node['inputs']['image'] = [image_scaler_id, 0]
|
| 58 |
+
apply_node['inputs']['weight'] = item_data['weight']
|
| 59 |
+
apply_node['inputs']['weight_faceidv2'] = final_settings.get('final_lora_strength', 0.6)
|
| 60 |
+
apply_node['inputs']['weight_type'] = "linear"
|
| 61 |
+
apply_node['inputs']['combine_embeds'] = final_settings.get('final_combine_method', 'concat')
|
| 62 |
+
apply_node['inputs']['start_at'] = item_data.get('start_percent', 0.0)
|
| 63 |
+
apply_node['inputs']['end_at'] = item_data.get('end_percent', 1.0)
|
| 64 |
+
apply_node['inputs']['embeds_scaling'] = final_settings.get('final_embeds_scaling', 'V only')
|
| 65 |
+
|
| 66 |
+
assembler.workflow[apply_id] = apply_node
|
| 67 |
+
current_model_connection = [apply_id, 0]
|
| 68 |
+
|
| 69 |
+
assembler.workflow[end_node_id]['inputs']['model'] = current_model_connection
|
| 70 |
+
print(f"IPAdapter FaceID injector applied (Direct Apply). Redirected '{end_node_name}' model input through {len(chain_items)} FaceID node(s).")
|
| 71 |
+
return
|
| 72 |
+
|
| 73 |
+
else:
|
| 74 |
+
pos_embed_outputs = []
|
| 75 |
+
neg_embed_outputs = []
|
| 76 |
+
|
| 77 |
+
for i, item_data in enumerate(chain_items):
|
| 78 |
+
loader_type = 'FaceID' if 'FACEID' in item_data.get('preset', '') else 'Unified'
|
| 79 |
+
loader_template_name = "IPAdapterUnifiedLoader"
|
| 80 |
+
if loader_type == 'FaceID':
|
| 81 |
+
loader_template_name = "IPAdapterUnifiedLoaderFaceID"
|
| 82 |
+
|
| 83 |
+
image_loader_id = assembler._get_unique_id()
|
| 84 |
+
image_loader_node = assembler._get_node_template("LoadImage")
|
| 85 |
+
image_loader_node['inputs']['image'] = item_data['image']
|
| 86 |
+
assembler.workflow[image_loader_id] = image_loader_node
|
| 87 |
+
|
| 88 |
+
image_scaler_id = assembler._get_unique_id()
|
| 89 |
+
image_scaler_node = assembler._get_node_template("ImageScaleToTotalPixels")
|
| 90 |
+
image_scaler_node['inputs']['image'] = [image_loader_id, 0]
|
| 91 |
+
image_scaler_node['inputs']['megapixels'] = megapixels
|
| 92 |
+
image_scaler_node['inputs']['upscale_method'] = "lanczos"
|
| 93 |
+
assembler.workflow[image_scaler_id] = image_scaler_node
|
| 94 |
+
|
| 95 |
+
ipadapter_loader_id = assembler._get_unique_id()
|
| 96 |
+
ipadapter_loader_node = assembler._get_node_template(loader_template_name)
|
| 97 |
+
ipadapter_loader_node['inputs']['model'] = current_model_connection
|
| 98 |
+
ipadapter_loader_node['inputs']['preset'] = item_data['preset']
|
| 99 |
+
if loader_type == 'FaceID':
|
| 100 |
+
ipadapter_loader_node['inputs']['lora_strength'] = item_data.get('lora_strength', 0.6)
|
| 101 |
+
assembler.workflow[ipadapter_loader_id] = ipadapter_loader_node
|
| 102 |
+
|
| 103 |
+
encoder_id = assembler._get_unique_id()
|
| 104 |
+
encoder_node = assembler._get_node_template("IPAdapterEncoder")
|
| 105 |
+
encoder_node['inputs']['weight'] = item_data['weight']
|
| 106 |
+
encoder_node['inputs']['ipadapter'] = [ipadapter_loader_id, 1]
|
| 107 |
+
encoder_node['inputs']['image'] = [image_scaler_id, 0]
|
| 108 |
+
assembler.workflow[encoder_id] = encoder_node
|
| 109 |
+
|
| 110 |
+
pos_embed_outputs.append([encoder_id, 0])
|
| 111 |
+
neg_embed_outputs.append([encoder_id, 1])
|
| 112 |
+
|
| 113 |
+
pos_combiner_id = assembler._get_unique_id()
|
| 114 |
+
pos_combiner_node = assembler._get_node_template("IPAdapterCombineEmbeds")
|
| 115 |
+
pos_combiner_node['inputs']['method'] = final_settings.get('final_combine_method', 'concat')
|
| 116 |
+
for i, conn in enumerate(pos_embed_outputs):
|
| 117 |
+
pos_combiner_node['inputs'][f'embed{i+1}'] = conn
|
| 118 |
+
assembler.workflow[pos_combiner_id] = pos_combiner_node
|
| 119 |
+
|
| 120 |
+
neg_combiner_id = assembler._get_unique_id()
|
| 121 |
+
neg_combiner_node = assembler._get_node_template("IPAdapterCombineEmbeds")
|
| 122 |
+
neg_combiner_node['inputs']['method'] = final_settings.get('final_combine_method', 'concat')
|
| 123 |
+
for i, conn in enumerate(neg_embed_outputs):
|
| 124 |
+
neg_combiner_node['inputs'][f'embed{i+1}'] = conn
|
| 125 |
+
assembler.workflow[neg_combiner_id] = neg_combiner_node
|
| 126 |
|
| 127 |
+
final_loader_type = 'FaceID' if 'FACEID' in final_settings.get('final_preset', '') else 'Unified'
|
| 128 |
+
final_loader_template_name = "IPAdapterUnifiedLoader"
|
| 129 |
+
if final_loader_type == 'FaceID':
|
| 130 |
+
final_loader_template_name = "IPAdapterUnifiedLoaderFaceID"
|
| 131 |
+
|
| 132 |
+
final_loader_id = assembler._get_unique_id()
|
| 133 |
+
final_loader_node = assembler._get_node_template(final_loader_template_name)
|
| 134 |
+
final_loader_node['inputs']['model'] = current_model_connection
|
| 135 |
+
final_loader_node['inputs']['preset'] = final_settings.get('final_preset', 'STANDARD (medium strength)')
|
| 136 |
+
if final_loader_type == 'FaceID':
|
| 137 |
+
final_loader_node['inputs']['lora_strength'] = final_settings.get('final_lora_strength', 0.6)
|
| 138 |
+
assembler.workflow[final_loader_id] = final_loader_node
|
| 139 |
+
|
| 140 |
+
apply_embeds_id = assembler._get_unique_id()
|
| 141 |
+
apply_embeds_node = assembler._get_node_template("IPAdapterEmbeds")
|
| 142 |
+
apply_embeds_node['inputs']['weight'] = final_settings.get('final_weight', 1.0)
|
| 143 |
+
apply_embeds_node['inputs']['embeds_scaling'] = final_settings.get('final_embeds_scaling', 'V only')
|
| 144 |
+
apply_embeds_node['inputs']['model'] = [final_loader_id, 0]
|
| 145 |
+
apply_embeds_node['inputs']['ipadapter'] = [final_loader_id, 1]
|
| 146 |
+
apply_embeds_node['inputs']['pos_embed'] = [pos_combiner_id, 0]
|
| 147 |
+
apply_embeds_node['inputs']['neg_embed'] = [neg_combiner_id, 0]
|
| 148 |
+
assembler.workflow[apply_embeds_id] = apply_embeds_node
|
| 149 |
+
|
| 150 |
+
assembler.workflow[end_node_id]['inputs']['model'] = [apply_embeds_id, 0]
|
| 151 |
+
print(f"IPAdapter Unified injector applied. Redirected '{end_node_name}' model input through {len(chain_items)} reference image(s).")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
requirements.txt
CHANGED
|
@@ -22,7 +22,7 @@ alembic
|
|
| 22 |
SQLAlchemy>=2.0.0
|
| 23 |
filelock
|
| 24 |
av>=16.0.0
|
| 25 |
-
comfy-kitchen==0.2.
|
| 26 |
comfy-aimdo==0.4.10
|
| 27 |
requests
|
| 28 |
simpleeval>=1.0.0
|
|
@@ -33,12 +33,13 @@ kornia>=0.7.1
|
|
| 33 |
spandrel
|
| 34 |
pydantic~=2.0
|
| 35 |
pydantic-settings~=2.0
|
| 36 |
-
PyOpenGL
|
| 37 |
-
|
| 38 |
|
| 39 |
|
| 40 |
diffusers
|
| 41 |
protobuf
|
|
|
|
| 42 |
huggingface-hub
|
| 43 |
imageio
|
| 44 |
spaces
|
|
|
|
| 22 |
SQLAlchemy>=2.0.0
|
| 23 |
filelock
|
| 24 |
av>=16.0.0
|
| 25 |
+
comfy-kitchen==0.2.13
|
| 26 |
comfy-aimdo==0.4.10
|
| 27 |
requests
|
| 28 |
simpleeval>=1.0.0
|
|
|
|
| 33 |
spandrel
|
| 34 |
pydantic~=2.0
|
| 35 |
pydantic-settings~=2.0
|
| 36 |
+
PyOpenGL>=3.1.8
|
| 37 |
+
comfy-angle
|
| 38 |
|
| 39 |
|
| 40 |
diffusers
|
| 41 |
protobuf
|
| 42 |
+
insightface
|
| 43 |
huggingface-hub
|
| 44 |
imageio
|
| 45 |
spaces
|