From 6ad009403b4564ef4cd5a9661399a669993a4de9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9A=93=E7=AB=A5?= Date: Tue, 11 Mar 2025 22:53:41 +0800 Subject: [PATCH] modify comfyui workflow --- README.md | 81 +- assets/comfyui/snapshot.jpg | Bin 0 -> 48534 bytes config/ace_plus_fft.yaml | 10 +- model_convert.py | 194 +++ workflow/ComfyUI-ACE_Plus/__init__.py | 14 + .../ComfyUI-ACE_Plus/ace_plus_fft_node.py | 348 ++++++ .../config/ace_plus_fft_processor.yaml | 25 + ...E_Plus_FFT_workflow_controlpreprocess.json | 1021 ++++++++++++++++ .../ACE_Plus_FFT_workflow_no_preprocess.json | 1021 ++++++++++++++++ ...lus_FFT_workflow_reference_generation.json | 1009 ++++++++++++++++ ..._workflow_referenceediting_generation.json | 1069 +++++++++++++++++ 11 files changed, 4767 insertions(+), 25 deletions(-) create mode 100644 assets/comfyui/snapshot.jpg create mode 100644 model_convert.py create mode 100644 workflow/ComfyUI-ACE_Plus/__init__.py create mode 100644 workflow/ComfyUI-ACE_Plus/ace_plus_fft_node.py create mode 100644 workflow/ComfyUI-ACE_Plus/config/ace_plus_fft_processor.yaml create mode 100644 workflow_example_fft/ACE_Plus_FFT_workflow_controlpreprocess.json create mode 100644 workflow_example_fft/ACE_Plus_FFT_workflow_no_preprocess.json create mode 100644 workflow_example_fft/ACE_Plus_FFT_workflow_reference_generation.json create mode 100644 workflow_example_fft/ACE_Plus_FFT_workflow_referenceediting_generation.json diff --git a/README.md b/README.md index 0efbc83..28f0f9f 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,5 @@

- -

++: Instruction-Based Image Creation and Editing
via Context-Aware Content Filling

@@ -41,13 +39,11 @@ The original intention behind the design of ACE++ was to unify reference image generation, local editing, and controllable generation into a single framework, and to enable one model to adapt to a wider range of tasks. -A more versatile model is often capable of handling more complex tasks. We have already released three LoRA models, -focusing on portraits, objects, and regional editing, with the expectation that each would demonstrate strong adaptability -within their respective domains. Undoubtedly, this presents certain challenges. - -We are currently training a fully fine-tuned model, which has now entered the final stage of quality tuning. -We are confident it will be released soon. This model will support a broader range of capabilities and is -expected to empower community developers to build even more interesting applications. +A more versatile model is often capable of handling more complex tasks. "We have released three LoRA models for +specific vertical domains and a more versatile FFT model. Users can flexibly utilize these models and their +combinations for their own scenarios. Furthermore, many community members have found that using them +in conjunction with Redux modules significantly improves performance. We believe there are many more +use cases to explore. ## 📢 News - [x] **[2025.01.06]** Release the code and models of ACE++. @@ -55,7 +51,22 @@ expected to empower community developers to build even more interesting applicat - [x] **[2025.01.16]** Release the training code for lora. - [x] **[2025.02.15]** Collection of workflows in Comfyui. - [x] **[2025.02.15]** Release the config for fully fine-tuning. -- [x] **[2025.03.03]** Release a unified fft model for ACE++, support more image to image tasks. [HuggingFace](https://huggingface.co/ali-vilab/ACE_Plus/tree/main) +- [x] **[2025.03.03]** Release a unified fft model for ACE++, support more image to image tasks. +- [x] **[2025.03.11]** Release the comfyui workflow and the fp8 +version stored in [ms](https://www.modelscope.cn/models/iic/ACE_Plus/file/view/master?fileName=ace_plus_fft_fp8.safetensors&status=2) and [hf](https://huggingface.co/ali-vilab/ACE_Plus/blob/main/ace_plus_fft_fp8.safetensors) for ACE++ FFT model. + +- We sincerely apologize +for the delayed responses and updates regarding ACE++ issues. +Further development of the ACE model through post-training on the FLUX model must be suspended. +We have identified several significant challenges in post-training on the FLUX foundation. +The primary issue is the high degree of heterogeneity between the training dataset and the FLUX model, +which results in highly unstable training. Moreover, FLUX-Dev is a distilled model, and the influence of its original negative prompts on its final performance is uncertain. +As a result, subsequent efforts will be focused on post-training the ACE model using the Wan series of foundational models. + +- We have been busy with other projects recently. Our new work in the video domain, [VACE](https://ali-vilab.github.io/VACE-Page/), +has also been released, and we welcome you to continue following our work. + + ## 🔥The unified fft model for ACE++ Fully finetuning a composite model with ACE’s data to support various editing and reference generation tasks through an instructive approach. @@ -66,6 +77,42 @@ To address this issue, we introduced 64 additional channels in the channel dimen One issue with this approach is that it changes the input channel number of the FLUX-Fill-Dev model from 384 to 448. The specific configuration can be referenced in the [configuration file](config/ace_plus_fft.yaml). + +We used tools from [stella](https://gist.github.com/Stella2211/10f5bd870387ec1ddb9932235321068e)(this is really a great work) to convert the fft-fp16 model to fft-fp8. The updated models are available on [ms](https://www.modelscope.cn/models/iic/ACE_Plus/file/view/master?fileName=ace_plus_fft_fp8.safetensors&status=2) and [hf](https://huggingface.co/ali-vilab/ACE_Plus/blob/main/ace_plus_fft_fp8.safetensors). The results of the fp8 model will differ from the fp16 model. We have not yet performed a rigorous comparison, so users should be aware of this. + +### ComfyUI Workflow + +Copy the workflow/ComfyUI-ACE_Plus folder into ComfyUI’s custom_nodes directory. Launch ComfyUI, and we have provided four example workflows in workflow_example_fft with the following explanations. + +We provide a parameter to adjust the GPU memory usage. As shown in the figure below, max_seq_length controls the length of the token sequence during inference, thereby controlling the model's inference memory consumption. The range of this value is from 1024 to 5120, and it correspondingly affects the clarity of the generated image. The smaller the value, the lower the image clarity. + + + + + + + + + + + + + + + + + + + + + + + + + +
WorkflowDescription
ACE_Plus_FFT_workflow_no_preprocess.jsonUse the preprocessed images, such as depth and contour, as input, or the super-resolution.
ACE_Plus_FFT_workflow_controlpreprocess.jsonControllable image-to-image translation capability.
ACE_Plus_FFT_workflow_reference_generation.jsonReference image generation capability for portrait or subject.
ACE_Plus_FFT_workflow_referenceediting_generation.jsonReference image editing capability
+ + ### Examples
@@ -270,10 +317,6 @@ Additionally, many bloggers have published tutorials on how to use it, which are
-## 🔥 ACE Models -ACE++ provides a comprehensive toolkit for image editing and generation to support various applications. We encourage developers to choose the appropriate model based on their own scenarios and to fine-tune their models using data from their specific scenarios to achieve more stable results. - - ### ACE++ Portrait @@ -435,9 +478,7 @@ python infer_lora.py The relevant commands for fft models are as follows: ```bash export FLUX_FILL_PATH="hf://black-forest-labs/FLUX.1-Fill-dev" -export ACE_PLUS_FFT_MODEL="ms://iic/ACE_Plus@ace_plus_fft.safetensors.safetensors" -# Use the model from huggingface -# export "ACE_PLUS_FFT_MODEL=hf://ali-vilab/ACE_Plus@ace_plus_fft.safetensors" +export ACE_PLUS_FFT_MODEL="ms://iic/ACE_Plus@ace_plus_fft.safetensors.safetensors" python infer_fft.py ``` @@ -456,11 +497,11 @@ The required fields include the following six, with their explanations as follow All parameters related to training are stored in 'train_config/ace_plus_lora.yaml'. To run the training code, execute the following command. ```bash -export FLUX_FILL_PATH="hf://black-forest-labs/FLUX.1-Fill-dev" +export FLUX_FILL_PATH="{path to FLUX.1-Fill-dev}" python run_train.py --cfg train_config/ace_plus_lora.yaml # Training from fft model -export FLUX_FILL_PATH="hf://black-forest-labs/FLUX.1-Fill-dev" -export ACE_PLUS_FFT_MODEL="ms://iic/ACE_Plus@ace_plus_fft.safetensors.safetensors" +export FLUX_FILL_PATH="{path to FLUX.1-Fill-dev}" +export ACE_PLUS_FFT_MODEL="path to ace_plus_fft.safetensors.safetensors" python run_train.py --cfg train_config/ace_plus_fft.yaml ``` diff --git a/assets/comfyui/snapshot.jpg b/assets/comfyui/snapshot.jpg new file mode 100644 index 0000000000000000000000000000000000000000..60f6e16653dbaace0f27fb87765d82718529f1f1 GIT binary patch literal 48534 zcmbTdbzD@>|3A7k(jeVRr!*{$N-RhVNSBh*wZPH>(j_1*Eg&Eu-5t{1u^>qAk}E85 z*Z2GL`Tp+x-GA==4LtVDbDEhb@4oBG}#r z08m#4a037UTmU8-EdUEuLv;bjqS5_NT?vg7fbq|LbO0dI9)S6uJ{qX&-+~(LpJ)EP zqJKgEZx6KSFBtz*-~HS5;TRyHW#{7Q;$i3F$}G$;0FZbNQpfx|BC7mTXZxp0GRqLV zlmMv3+z)>A`3Uhm@SzJpii@_37L9@S6o5{OhCzz<&<9{b&5VWiPxe5&$|H1_nAN1{T)eY0v^t?Ep+tEV3tp3fPaeEpeW@kqd<+<>RtEuj!`H znS!wjTe*im!lR_3rlDnH=iubx77-N_mjFt>c&VtQtO8QieXXZ&@W#-{`t3U#TRVFP z4^J;|AF!`q*oW|l$d6Ic$tj;w)6zd@WEK<_6_=ELEi13B`%&M}*woz8)7#fSFgP?k zGCeapH@~pBw7dn~-ubn=_j~^Ues+Fwd3BBWbMqG$8UW*8Sg7BBk^OJDNKv@ZF)=YP zasJ{$L-+X$oD>u5i6Azaf;Nt&+vBG~A-Lqvlk#i2AF&AQz$mQTr|>9QMYh=Bf1&+@ z?Ef3E(ElT3{{!rQ;aUN_0HFU!L`HPT|zhd_`k5jaB({_tXx9FbO~eJDcQbVQwqpGuFdz~!6V%`of&I5{49@pFYs27WS1woKYe(io z%0AMX2Y@EL_EZ!EYkr*d{-4?Y89^%~ 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','{image}', '{caption}', '{mask}', '{ref_image}', '{image1}', '{image2}', '{image3}', '{image4}', '{image5}', '{image6}', '{image7}', '{image8}', '{image9}' ] # MAX_LENGTH DESCRIPTION: max length of input TYPE: int default: 77 MAX_LENGTH: 512 @@ -138,11 +138,11 @@ MODEL: # HF_MODEL_CLS DESCRIPTION: huggingface cls in transfomer TYPE: NoneType default: None HF_MODEL_CLS: CLIPTextModel # MODEL_PATH DESCRIPTION: model folder path TYPE: NoneType default: None - MODEL_PATH: ${FLUX_FILL_PATH}@text_encoder/ + MODEL_PATH: ${FLUX_FILL_PATH}/text_encoder/ # HF_TOKENIZER_CLS DESCRIPTION: huggingface cls in transfomer TYPE: NoneType default: None HF_TOKENIZER_CLS: CLIPTokenizer # TOKENIZER_PATH DESCRIPTION: tokenizer folder path TYPE: NoneType default: None - TOKENIZER_PATH: ${FLUX_FILL_PATH}@tokenizer/ + TOKENIZER_PATH: ${FLUX_FILL_PATH}/tokenizer/ # MAX_LENGTH DESCRIPTION: max length of input TYPE: int default: 77 MAX_LENGTH: 77 # OUTPUT_KEY DESCRIPTION: output key TYPE: str default: 'last_hidden_state' diff --git a/model_convert.py b/model_convert.py new file mode 100644 index 0000000..bf9cd92 --- /dev/null +++ b/model_convert.py @@ -0,0 +1,194 @@ +# Copy from https://gist.github.com/Stella2211/10f5bd870387ec1ddb9932235321068e +# This is a great work. +import json +from pathlib import Path +import torch +from tqdm import tqdm +import struct +from typing import Dict, Any +import sys + +# input file +if(len(sys.argv) < 3): + print("Usage: mem_eff_fp8_convert.py {fp16 model path} {output path}") + sys.exit(1) + +path = sys.argv[1] +output =sys.argv[2] +model_file = Path(path) + +class MemoryEfficientSafeOpen: + # does not support metadata loading + def __init__(self, filename): + self.filename = filename + self.header, self.header_size = self._read_header() + self.file = open(filename, "rb") + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.file.close() + + def keys(self): + return [k for k in self.header.keys() if k != "__metadata__"] + + def get_tensor(self, key): + if key not in self.header: + raise KeyError(f"Tensor '{key}' not found in the file") + + metadata = self.header[key] + offset_start, offset_end = metadata["data_offsets"] + + if offset_start == offset_end: + tensor_bytes = None + else: + # adjust offset by header size + self.file.seek(self.header_size + 8 + offset_start) + tensor_bytes = self.file.read(offset_end - offset_start) + + return self._deserialize_tensor(tensor_bytes, metadata) + + def _read_header(self): + with open(self.filename, "rb") as f: + header_size = struct.unpack(" Dict[str, str]: + validated = {} + for key, value in metadata.items(): + if not isinstance(key, str): + raise ValueError(f"Metadata key must be a string, got {type(key)}") + if not isinstance(value, str): + print(f"Warning: Metadata value for key '{key}' is not a string. Converting to string.") + validated[key] = str(value) + else: + validated[key] = value + return validated + + header = {} + offset = 0 + if metadata: + header["__metadata__"] = validate_metadata(metadata) + for k, v in tensors.items(): + if v.numel() == 0: # empty tensor + header[k] = {"dtype": _TYPES[v.dtype], "shape": list(v.shape), "data_offsets": [offset, offset]} + else: + size = v.numel() * v.element_size() + header[k] = {"dtype": _TYPES[v.dtype], "shape": list(v.shape), "data_offsets": [offset, offset + size]} + offset += size + + hjson = json.dumps(header).encode("utf-8") + hjson += b" " * (-(len(hjson) + 8) % _ALIGN) + + with open(filename, "wb") as f: + f.write(struct.pack(" self.max_aspect_ratio: + image[0] = T.CenterCrop([int(self.max_aspect_ratio * W), W])(image[0]) + elif W / H > self.max_aspect_ratio: + image[0] = T.CenterCrop([H, int(self.max_aspect_ratio * H)])(image[0]) + return image[0] + + def trans_pil_tensor(self, pil_image): + transform = T.Compose([ + T.ToTensor() + ]) + tensor_image = transform(pil_image) + return tensor_image + + def edit_preprocess(self, processor, device, edit_image, edit_mask): + + if edit_image is None or processor is None: + return edit_image + if not SCEPTER: + raise ImportError(f'Please install scepter to use edit processor {processor} by ' + f'runing "pip install scepter" in the conda env') + processor = Config(cfg_dict=processor, load=False) + processor = ANNOTATORS.build(processor).to(device) + edit_image = Image.fromarray(np.array(edit_image[0] * 255).astype(np.uint8)).convert('RGB') + new_edit_image = processor(np.asarray(edit_image)) + + del processor + new_edit_image = Image.fromarray(new_edit_image) + if edit_mask is not None: + edit_mask = np.where(edit_mask > 0.5, 1, 0) * 255 + edit_mask = Image.fromarray(np.array(edit_mask[0]).astype(np.uint8)).convert('L') + + if new_edit_image.size != edit_image.size: + edit_image = T.Resize((edit_image.size[1], edit_image.size[0]), + interpolation=T.InterpolationMode.BILINEAR, + antialias=True)(new_edit_image) + + image = Image.composite(new_edit_image, edit_image, edit_mask) + + return self.trans_pil_tensor(image).unsqueeze(0).permute(0, 2, 3, 1) + + def preprocess(self, + reference_image=None, + edit_image=None, + edit_mask=None, + use_reference=True, + task_type=None, + height=1024, + width=1024, + keep_pixels_rate=0.8, + max_seq_length=4096): + self.max_seq_len = max_seq_length + if not use_reference and edit_image is not None: + reference_image = None + if edit_mask is not None and edit_image is not None: + iH, iW = edit_image.shape[1:3] + mH, mW = edit_mask.shape[1:3] + if iH != mH or iW != mW: + edit_mask = torch.ones(edit_image.shape[:3]) + + if task_type != 'repainting': + repainting_scale = 0 + else: + repainting_scale = 1 + if task_type in self.task_list: + edit_image = self.edit_preprocess(self.task_list[task_type]['ANNOTATOR'], 0, + edit_image, edit_mask) + if reference_image is not None: + reference_image = self.image_check(reference_image) - 0.5 + if edit_image is not None: + edit_image = self.image_check(edit_image) - 0.5 + # for reference generation + if edit_image is None: + edit_image = torch.zeros([3, height, width]) + edit_mask = torch.ones([1, height, width]) + else: + if edit_mask is None: + _, eH, eW = edit_image.shape + edit_mask = np.ones((eH, eW)) + else: + edit_mask = np.asarray(edit_mask)[0] + edit_mask = np.where(edit_mask > 0.5, 1, 0) + edit_mask = edit_mask.astype( + np.float32) if np.any(edit_mask) else np.ones_like(edit_mask).astype( + np.float32) + edit_mask = torch.tensor(edit_mask).unsqueeze(0) + + edit_image = edit_image * (1 - edit_mask * repainting_scale) + + out_h, out_w = edit_image.shape[-2:] + + assert edit_mask is not None + if reference_image is not None: + _, H, W = reference_image.shape + _, eH, eW = edit_image.shape + if not True: + # align height with edit_image + scale = eH / H + tH, tW = eH, int(W * scale) + reference_image = T.Resize((tH, tW), interpolation=T.InterpolationMode.BILINEAR, antialias=True)( + reference_image) + else: + # padding + if H >= keep_pixels_rate * eH: + tH = int(eH * keep_pixels_rate) + scale = tH / H + tW = int(W * scale) + reference_image = T.Resize((tH, tW), interpolation=T.InterpolationMode.BILINEAR, antialias=True)( + reference_image) + rH, rW = reference_image.shape[-2:] + delta_w = 0 + delta_h = eH - rH + padding = (delta_w // 2, delta_h // 2, delta_w - (delta_w // 2), delta_h - (delta_h // 2)) + reference_image = T.Pad(padding, fill=0, padding_mode="constant")(reference_image) + edit_image = torch.cat([reference_image, edit_image], dim=-1) + edit_mask = torch.cat([torch.zeros([1, reference_image.shape[1], reference_image.shape[2]]), edit_mask], + dim=-1) + slice_w = reference_image.shape[-1] + else: + slice_w = 0 + + H, W = edit_image.shape[-2:] + scale = min(1.0, math.sqrt(self.max_seq_len * 2 / ((H / self.d) * (W / self.d)))) + rH = int(H * scale) // self.d * self.d + rW = int(W * scale) // self.d * self.d + slice_w = int(slice_w * scale) // self.d * self.d + + edit_image = T.Resize((rH, rW), interpolation=T.InterpolationMode.NEAREST_EXACT, antialias=True)(edit_image) + edit_mask = T.Resize((rH, rW), interpolation=T.InterpolationMode.NEAREST_EXACT, antialias=True)(edit_mask) + + change_image = edit_image * edit_mask + edit_image = edit_image * (1 - edit_mask) + edit_image = edit_image.unsqueeze(0).permute(0, 2, 3, 1) + change_image = change_image.unsqueeze(0).permute(0, 2, 3, 1) + slice_w = slice_w if slice_w < 30 else slice_w + 30 + + return edit_image + 0.5, change_image + 0.5, edit_mask, out_h, out_w, slice_w diff --git a/workflow/ComfyUI-ACE_Plus/config/ace_plus_fft_processor.yaml b/workflow/ComfyUI-ACE_Plus/config/ace_plus_fft_processor.yaml new file mode 100644 index 0000000..5ed1e09 --- /dev/null +++ b/workflow/ComfyUI-ACE_Plus/config/ace_plus_fft_processor.yaml @@ -0,0 +1,25 @@ +PREPROCESSOR: + - TYPE: repainting + REPAINTING_SCALE: 1.0 + ANNOTATOR: + - TYPE: no_preprocess + REPAINTING_SCALE: 0.0 + ANNOTATOR: + - TYPE: contour_repainting + REPAINTING_SCALE: 0.0 + ANNOTATOR: + NAME: InfoDrawContourAnnotator + INPUT_NC: 3 + OUTPUT_NC: 1 + N_RESIDUAL_BLOCKS: 3 + SIGMOID: True + PRETRAINED_MODEL: "ms://iic/scepter_annotator@annotator/ckpts/informative_drawing_contour_style.pth" + - TYPE: depth_repainting + REPAINTING_SCALE: 0.0 + ANNOTATOR: + NAME: MidasDetector + PRETRAINED_MODEL: "ms://iic/scepter_annotator@annotator/ckpts/dpt_hybrid-midas-501f0c75.pt" + - TYPE: recolorizing + REPAINTING_SCALE: 0.0 + ANNOTATOR: + NAME: GrayAnnotator \ No newline at end of file diff --git a/workflow_example_fft/ACE_Plus_FFT_workflow_controlpreprocess.json b/workflow_example_fft/ACE_Plus_FFT_workflow_controlpreprocess.json new file mode 100644 index 0000000..b814e13 --- /dev/null +++ b/workflow_example_fft/ACE_Plus_FFT_workflow_controlpreprocess.json @@ -0,0 +1,1021 @@ +{ + "last_node_id": 378, + "last_link_id": 674, + "nodes": [ + { + "id": 290, + "type": "VAELoader", + "pos": [ + -3938.71923828125, + 1587.7381591796875 + ], + "size": [ + 315, + 58 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 441, + 599 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAELoader" + }, + "widgets_values": [ + "ae.safetensors" + ] + }, + { + "id": 289, + "type": "DualCLIPLoader", + "pos": [ + -3938.109619140625, + 1719.1380615234375 + ], + "size": [ + 315, + 106 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 439, + 440 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "DualCLIPLoader" + }, + "widgets_values": [ + "clip_l.safetensors", + "t5xxl_fp16.safetensors", + "flux" + ] + }, + { + "id": 292, + "type": "CLIPTextEncode", + "pos": [ + -3877.987548828125, + 1898.810302734375 + ], + "size": [ + 400, + 200 + ], + "flags": { + "collapsed": true + }, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 440 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 598 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "" + ], + "color": "#322", + "bgcolor": "#533" + }, + { + "id": 295, + "type": "DifferentialDiffusion", + "pos": [ + -3905.315673828125, + 2370.018798828125 + ], + "size": [ + 203.87991333007812, + 28.94829559326172 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 610 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 438 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "DifferentialDiffusion" + }, + "widgets_values": [] + }, + { + "id": 323, + "type": "Note", + "pos": [ + -4520.6875, + 2339.823974609375 + ], + "size": [ + 454.2545166015625, + 174.908447265625 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [], + "outputs": [], + "properties": {}, + "widgets_values": [ + "ACE_Plus Model download: https://huggingface.co/ali-vilab/ACE_Plus/blob/main/ace_plus_fft.safetensors" + ], + "color": "#332922", + "bgcolor": "#593930" + }, + { + "id": 294, + "type": "FluxGuidance", + "pos": [ + -3108.354736328125, + 1719.18017578125 + ], + "size": [ + 210, + 58 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "conditioning", + "type": "CONDITIONING", + "link": 446 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 597 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "FluxGuidance" + }, + "widgets_values": [ + 50 + ] + }, + { + "id": 287, + "type": "VAEDecode", + "pos": [ + -3103.54833984375, + 1858.2403564453125 + ], + "size": [ + 210, + 46 + ], + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 442 + }, + { + "name": "vae", + "type": "VAE", + "link": 441 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 652 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + }, + "widgets_values": [] + }, + { + "id": 373, + "type": "ImageCrop", + "pos": [ + -3154.792236328125, + 2000.0208740234375 + ], + "size": [ + 315, + 130 + ], + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 652 + }, + { + "name": "width", + "type": "INT", + "link": 655, + "widget": { + "name": "width" + } + }, + { + "name": "height", + "type": "INT", + "link": 656, + "widget": { + "name": "height" + } + }, + { + "name": "x", + "type": "INT", + "link": 657, + "widget": { + "name": "x" + } + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 658 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ImageCrop" + }, + "widgets_values": [ + 512, + 512, + 0, + 0 + ] + }, + { + "id": 374, + "type": "PreviewImage", + "pos": [ + -2758.914306640625, + 1791.9202880859375 + ], + "size": [ + 297.7324523925781, + 332.22821044921875 + ], + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 658 + } + ], + "outputs": [], + "properties": { + "Node name for S&R": "PreviewImage" + }, + "widgets_values": [], + "color": "#232", + "bgcolor": "#353" + }, + { + "id": 291, + "type": "CLIPTextEncode", + "pos": [ + -3557.567626953125, + 1652.6763916015625 + ], + "size": [ + 389.0423278808594, + 213.64186096191406 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 439 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 446 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "{image} Beautiful female portrait, Robot with smooth White transparent carbon shell, rococo detailing, Natural lighting, Highly detailed, Cinematic, 4K." + ], + "color": "#232", + "bgcolor": "#353" + }, + { + "id": 364, + "type": "ACEPlusConditioning", + "pos": [ + -3943.033447265625, + 1970.2298583984375 + ], + "size": [ + 280, + 160 + ], + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "link": 597 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 598 + }, + { + "name": "vae", + "type": "VAE", + "link": 599 + }, + { + "name": "ucpixels", + "type": "IMAGE", + "link": 606 + }, + { + "name": "cpixels", + "type": "IMAGE", + "link": 669 + }, + { + "name": "mask", + "type": "MASK", + "link": 670 + } + ], + "outputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "links": [ + 600 + ], + "slot_index": 0 + }, + { + "name": "negative", + "type": "CONDITIONING", + "links": [ + 601 + ], + "slot_index": 1 + }, + { + "name": "latent", + "type": "LATENT", + "links": [ + 602 + ], + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "ACEPlusConditioning" + }, + "widgets_values": [ + false + ] + }, + { + "id": 371, + "type": "MaskPreview+", + "pos": [ + -4240.89990234375, + 2142.49609375 + ], + "size": [ + 210, + 246 + ], + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "mask", + "type": "MASK", + "link": 673 + } + ], + "outputs": [], + "properties": { + "Node name for S&R": "MaskPreview+" + }, + "widgets_values": [] + }, + { + "id": 378, + "type": "LoadImage", + "pos": [ + -4928.19287109375, + 1814.857666015625 + ], + "size": [ + 315, + 314 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 671 + ] + }, + { + "name": "MASK", + "type": "MASK", + "links": [ + 672 + ], + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "1_1_fft_recolor.webp", + "image" + ], + "color": "#432", + "bgcolor": "#653" + }, + { + "id": 372, + "type": "PreviewImage", + "pos": [ + -4582.751953125, + 2105.985595703125 + ], + "size": [ + 210, + 246 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 674 + } + ], + "outputs": [], + "properties": { + "Node name for S&R": "PreviewImage" + }, + "widgets_values": [] + }, + { + "id": 365, + "type": "ACEPlusFFTProcessor", + "pos": [ + -4510.58837890625, + 1658.77001953125 + ], + "size": [ + 261.8648376464844, + 278 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "reference_image", + "type": "IMAGE", + "link": null, + "shape": 7 + }, + { + "name": "edit_image", + "type": "IMAGE", + "link": 671, + "shape": 7 + }, + { + "name": "edit_mask", + "type": "MASK", + "link": 672, + "shape": 7 + } + ], + "outputs": [ + { + "name": "UC_IMAGE", + "type": "IMAGE", + "links": [ + 606, + 611 + ], + "slot_index": 0 + }, + { + "name": "C_IMAGE", + "type": "IMAGE", + "links": [ + 669, + 674 + ], + "slot_index": 1 + }, + { + "name": "MASK", + "type": "MASK", + "links": [ + 670, + 673 + ], + "slot_index": 2 + }, + { + "name": "OUT_H", + "type": "INT", + "links": [ + 656 + ], + "slot_index": 3 + }, + { + "name": "OUT_W", + "type": "INT", + "links": [ + 655 + ], + "slot_index": 4 + }, + { + "name": "SLICE_W", + "type": "INT", + "links": [ + 657 + ], + "slot_index": 5 + } + ], + "properties": { + "Node name for S&R": "ACEPlusFFTProcessor" + }, + "widgets_values": [ + true, + 1024, + 1024, + "contour_repainting", + 0.8, + 3072 + ], + "color": "#223", + "bgcolor": "#335" + }, + { + "id": 286, + "type": "KSampler", + "pos": [ + -3532.909912109375, + 1947.0386962890625 + ], + "size": [ + 317.2386474609375, + 485.9841613769531 + ], + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 438 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 600 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 601 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 602 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 442 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 38616314728576, + "randomize", + 28, + 1, + "euler", + "normal", + 1 + ] + }, + { + "id": 367, + "type": "PreviewImage", + "pos": [ + -4205.70458984375, + 1584.8121337890625 + ], + "size": [ + 210, + 246 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 611 + } + ], + "outputs": [], + "properties": { + "Node name for S&R": "PreviewImage" + }, + "widgets_values": [] + }, + { + "id": 366, + "type": "ACEPlusLoader", + "pos": [ + -3953.21533203125, + 2198.42138671875 + ], + "size": [ + 315, + 82 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 610 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ACEPlusLoader" + }, + "widgets_values": [ + "ace_plus_fft.safetensors", + "default" + ] + } + ], + "links": [ + [ + 438, + 295, + 0, + 286, + 0, + "MODEL" + ], + [ + 439, + 289, + 0, + 291, + 0, + "CLIP" + ], + [ + 440, + 289, + 0, + 292, + 0, + "CLIP" + ], + [ + 441, + 290, + 0, + 287, + 1, + "VAE" + ], + [ + 442, + 286, + 0, + 287, + 0, + "LATENT" + ], + [ + 446, + 291, + 0, + 294, + 0, + "CONDITIONING" + ], + [ + 597, + 294, + 0, + 364, + 0, + "CONDITIONING" + ], + [ + 598, + 292, + 0, + 364, + 1, + "CONDITIONING" + ], + [ + 599, + 290, + 0, + 364, + 2, + "VAE" + ], + [ + 600, + 364, + 0, + 286, + 1, + "CONDITIONING" + ], + [ + 601, + 364, + 1, + 286, + 2, + "CONDITIONING" + ], + [ + 602, + 364, + 2, + 286, + 3, + "LATENT" + ], + [ + 606, + 365, + 0, + 364, + 3, + "IMAGE" + ], + [ + 610, + 366, + 0, + 295, + 0, + "MODEL" + ], + [ + 611, + 365, + 0, + 367, + 0, + "IMAGE" + ], + [ + 652, + 287, + 0, + 373, + 0, + "IMAGE" + ], + [ + 655, + 365, + 4, + 373, + 1, + "INT" + ], + [ + 656, + 365, + 3, + 373, + 2, + "INT" + ], + [ + 657, + 365, + 5, + 373, + 3, + "INT" + ], + [ + 658, + 373, + 0, + 374, + 0, + "IMAGE" + ], + [ + 669, + 365, + 1, + 364, + 4, + "IMAGE" + ], + [ + 670, + 365, + 2, + 364, + 5, + "MASK" + ], + [ + 671, + 378, + 0, + 365, + 1, + "IMAGE" + ], + [ + 672, + 378, + 1, + 365, + 2, + "MASK" + ], + [ + 673, + 365, + 2, + 371, + 0, + "MASK" + ], + [ + 674, + 365, + 1, + 372, + 0, + "IMAGE" + ] + ], + "groups": [ + { + "id": 20, + "title": "ACE_Plus FFT Workflow", + "bounding": [ + -5005.599609375, + 1428.0904541015625, + 2592.630126953125, + 1121.891845703125 + ], + "color": "#3f789e", + "font_size": 40, + "flags": {} + } + ], + "config": {}, + "extra": { + "ds": { + "scale": 0.7627768444385488, + "offset": [ + 5506.346756005007, + -1124.9482467877335 + ] + }, + "ue_links": [], + "groupNodes": {} + }, + "version": 0.4 +} \ No newline at end of file diff --git a/workflow_example_fft/ACE_Plus_FFT_workflow_no_preprocess.json b/workflow_example_fft/ACE_Plus_FFT_workflow_no_preprocess.json new file mode 100644 index 0000000..b683d0b --- /dev/null +++ b/workflow_example_fft/ACE_Plus_FFT_workflow_no_preprocess.json @@ -0,0 +1,1021 @@ +{ + "last_node_id": 378, + "last_link_id": 674, + "nodes": [ + { + "id": 372, + "type": "PreviewImage", + "pos": [ + -4405.0244140625, + 2036.48388671875 + ], + "size": [ + 210, + 246 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 671 + } + ], + "outputs": [], + "properties": { + "Node name for S&R": "PreviewImage" + }, + "widgets_values": [] + }, + { + "id": 290, + "type": "VAELoader", + "pos": [ + -3826.618408203125, + 1603.526611328125 + ], + "size": [ + 315, + 58 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 441, + 599 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAELoader" + }, + "widgets_values": [ + "ae.safetensors" + ] + }, + { + "id": 289, + "type": "DualCLIPLoader", + "pos": [ + -3826.0087890625, + 1734.926513671875 + ], + "size": [ + 315, + 106 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 439, + 440 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "DualCLIPLoader" + }, + "widgets_values": [ + "clip_l.safetensors", + "t5xxl_fp16.safetensors", + "flux" + ] + }, + { + "id": 292, + "type": "CLIPTextEncode", + "pos": [ + -3765.88671875, + 1914.5987548828125 + ], + "size": [ + 400, + 200 + ], + "flags": { + "collapsed": true + }, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 440 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 598 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "" + ], + "color": "#322", + "bgcolor": "#533" + }, + { + "id": 295, + "type": "DifferentialDiffusion", + "pos": [ + -3793.21484375, + 2385.80712890625 + ], + "size": [ + 203.87991333007812, + 28.94829559326172 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 610 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 438 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "DifferentialDiffusion" + }, + "widgets_values": [] + }, + { + "id": 323, + "type": "Note", + "pos": [ + -4408.5859375, + 2355.6123046875 + ], + "size": [ + 454.2545166015625, + 174.908447265625 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [], + "outputs": [], + "properties": {}, + "widgets_values": [ + "ACE_Plus Model download: https://huggingface.co/ali-vilab/ACE_Plus/blob/main/ace_plus_fft.safetensors" + ], + "color": "#332922", + "bgcolor": "#593930" + }, + { + "id": 294, + "type": "FluxGuidance", + "pos": [ + -2996.25390625, + 1734.9686279296875 + ], + "size": [ + 210, + 58 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "conditioning", + "type": "CONDITIONING", + "link": 446 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 597 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "FluxGuidance" + }, + "widgets_values": [ + 50 + ] + }, + { + "id": 287, + "type": "VAEDecode", + "pos": [ + -2991.447509765625, + 1874.02880859375 + ], + "size": [ + 210, + 46 + ], + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 442 + }, + { + "name": "vae", + "type": "VAE", + "link": 441 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 652 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + }, + "widgets_values": [] + }, + { + "id": 373, + "type": "ImageCrop", + "pos": [ + -3042.69140625, + 2015.809326171875 + ], + "size": [ + 315, + 130 + ], + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 652 + }, + { + "name": "width", + "type": "INT", + "link": 655, + "widget": { + "name": "width" + } + }, + { + "name": "height", + "type": "INT", + "link": 656, + "widget": { + "name": "height" + } + }, + { + "name": "x", + "type": "INT", + "link": 657, + "widget": { + "name": "x" + } + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 658 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ImageCrop" + }, + "widgets_values": [ + 512, + 512, + 0, + 0 + ] + }, + { + "id": 374, + "type": "PreviewImage", + "pos": [ + -2646.8134765625, + 1807.708740234375 + ], + "size": [ + 297.7324523925781, + 332.22821044921875 + ], + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 658 + } + ], + "outputs": [], + "properties": { + "Node name for S&R": "PreviewImage" + }, + "widgets_values": [], + "color": "#232", + "bgcolor": "#353" + }, + { + "id": 371, + "type": "MaskPreview+", + "pos": [ + -4157.91162109375, + 2039.6533203125 + ], + "size": [ + 210, + 246 + ], + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "mask", + "type": "MASK", + "link": 672 + } + ], + "outputs": [], + "properties": { + "Node name for S&R": "MaskPreview+" + }, + "widgets_values": [] + }, + { + "id": 286, + "type": "KSampler", + "pos": [ + -3420.80908203125, + 1962.8271484375 + ], + "size": [ + 317.2386474609375, + 485.9841613769531 + ], + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 438 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 600 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 601 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 602 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 442 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 10000002, + "fixed", + 28, + 1, + "euler", + "normal", + 1 + ] + }, + { + "id": 291, + "type": "CLIPTextEncode", + "pos": [ + -3445.466796875, + 1668.46484375 + ], + "size": [ + 389.0423278808594, + 213.64186096191406 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 439 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 446 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "{image} features a close-up of a young, furry tiger cub on a rock. The tiger, which appears to be quite young, has distinctive orange, black, and white striped fur, typical of tigers. The cub's eyes have a bright and curious expression, and its ears are perked up, indicating alertness. The cub seems to be in the act of climbing or resting on the rock. The background is a blurred grassland with trees, but the focus is on the cub, which is vividly colored while the rest of the image is in grayscale, drawing attention to the tiger's details. The photo captures a moment in the wild, depicting the charming and tenacious nature of this young tiger, as well as its typical interaction with the environment." + ], + "color": "#232", + "bgcolor": "#353" + }, + { + "id": 366, + "type": "ACEPlusLoader", + "pos": [ + -3841.114501953125, + 2214.209716796875 + ], + "size": [ + 315, + 82 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 610 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ACEPlusLoader" + }, + "widgets_values": [ + "ace_plus_fft.safetensors", + "default" + ] + }, + { + "id": 367, + "type": "PreviewImage", + "pos": [ + -4066.84521484375, + 1397.3804931640625 + ], + "size": [ + 210, + 246 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 611 + } + ], + "outputs": [], + "properties": { + "Node name for S&R": "PreviewImage" + }, + "widgets_values": [] + }, + { + "id": 364, + "type": "ACEPlusConditioning", + "pos": [ + -3830.9326171875, + 1986.018310546875 + ], + "size": [ + 280, + 160 + ], + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "link": 597 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 598 + }, + { + "name": "vae", + "type": "VAE", + "link": 599 + }, + { + "name": "ucpixels", + "type": "IMAGE", + "link": 606 + }, + { + "name": "cpixels", + "type": "IMAGE", + "link": 669 + }, + { + "name": "mask", + "type": "MASK", + "link": 670 + } + ], + "outputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "links": [ + 600 + ], + "slot_index": 0 + }, + { + "name": "negative", + "type": "CONDITIONING", + "links": [ + 601 + ], + "slot_index": 1 + }, + { + "name": "latent", + "type": "LATENT", + "links": [ + 602 + ], + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "ACEPlusConditioning" + }, + "widgets_values": [ + false + ] + }, + { + "id": 365, + "type": "ACEPlusFFTProcessor", + "pos": [ + -4398.48681640625, + 1674.5584716796875 + ], + "size": [ + 261.8648376464844, + 278 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "reference_image", + "type": "IMAGE", + "link": null, + "shape": 7 + }, + { + "name": "edit_image", + "type": "IMAGE", + "link": 673, + "shape": 7 + }, + { + "name": "edit_mask", + "type": "MASK", + "link": 674, + "shape": 7 + } + ], + "outputs": [ + { + "name": "UC_IMAGE", + "type": "IMAGE", + "links": [ + 606, + 611 + ], + "slot_index": 0 + }, + { + "name": "C_IMAGE", + "type": "IMAGE", + "links": [ + 669, + 671 + ], + "slot_index": 1 + }, + { + "name": "MASK", + "type": "MASK", + "links": [ + 670, + 672 + ], + "slot_index": 2 + }, + { + "name": "OUT_H", + "type": "INT", + "links": [ + 656 + ], + "slot_index": 3 + }, + { + "name": "OUT_W", + "type": "INT", + "links": [ + 655 + ], + "slot_index": 4 + }, + { + "name": "SLICE_W", + "type": "INT", + "links": [ + 657 + ], + "slot_index": 5 + } + ], + "properties": { + "Node name for S&R": "ACEPlusFFTProcessor" + }, + "widgets_values": [ + true, + 1024, + 1024, + "no_preprocess", + true, + 3072 + ], + "color": "#223", + "bgcolor": "#335" + }, + { + "id": 378, + "type": "LoadImage", + "pos": [ + -4816.09130859375, + 1830.6461181640625 + ], + "size": [ + 315, + 314 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 673 + ] + }, + { + "name": "MASK", + "type": "MASK", + "links": [ + 674 + ], + "slot_index": 1 + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "sr_tiger.png", + "image" + ], + "color": "#432", + "bgcolor": "#653" + } + ], + "links": [ + [ + 438, + 295, + 0, + 286, + 0, + "MODEL" + ], + [ + 439, + 289, + 0, + 291, + 0, + "CLIP" + ], + [ + 440, + 289, + 0, + 292, + 0, + "CLIP" + ], + [ + 441, + 290, + 0, + 287, + 1, + "VAE" + ], + [ + 442, + 286, + 0, + 287, + 0, + "LATENT" + ], + [ + 446, + 291, + 0, + 294, + 0, + "CONDITIONING" + ], + [ + 597, + 294, + 0, + 364, + 0, + "CONDITIONING" + ], + [ + 598, + 292, + 0, + 364, + 1, + "CONDITIONING" + ], + [ + 599, + 290, + 0, + 364, + 2, + "VAE" + ], + [ + 600, + 364, + 0, + 286, + 1, + "CONDITIONING" + ], + [ + 601, + 364, + 1, + 286, + 2, + "CONDITIONING" + ], + [ + 602, + 364, + 2, + 286, + 3, + "LATENT" + ], + [ + 606, + 365, + 0, + 364, + 3, + "IMAGE" + ], + [ + 610, + 366, + 0, + 295, + 0, + "MODEL" + ], + [ + 611, + 365, + 0, + 367, + 0, + "IMAGE" + ], + [ + 652, + 287, + 0, + 373, + 0, + "IMAGE" + ], + [ + 655, + 365, + 4, + 373, + 1, + "INT" + ], + [ + 656, + 365, + 3, + 373, + 2, + "INT" + ], + [ + 657, + 365, + 5, + 373, + 3, + "INT" + ], + [ + 658, + 373, + 0, + 374, + 0, + "IMAGE" + ], + [ + 669, + 365, + 1, + 364, + 4, + "IMAGE" + ], + [ + 670, + 365, + 2, + 364, + 5, + "MASK" + ], + [ + 671, + 365, + 1, + 372, + 0, + "IMAGE" + ], + [ + 672, + 365, + 2, + 371, + 0, + "MASK" + ], + [ + 673, + 378, + 0, + 365, + 1, + "IMAGE" + ], + [ + 674, + 378, + 1, + 365, + 2, + "MASK" + ] + ], + "groups": [ + { + "id": 20, + "title": "ACE_Plus FFT Workflow", + "bounding": [ + -4893.498046875, + 1443.87890625, + 2592.630126953125, + 1121.891845703125 + ], + "color": "#3f789e", + "font_size": 40, + "flags": {} + } + ], + "config": {}, + "extra": { + "ds": { + "scale": 0.7627768444385488, + "offset": [ + 5506.346756005007, + -1125.36817628918 + ] + }, + "ue_links": [], + "groupNodes": {} + }, + "version": 0.4 +} \ No newline at end of file diff --git a/workflow_example_fft/ACE_Plus_FFT_workflow_reference_generation.json b/workflow_example_fft/ACE_Plus_FFT_workflow_reference_generation.json new file mode 100644 index 0000000..00b3d64 --- /dev/null +++ b/workflow_example_fft/ACE_Plus_FFT_workflow_reference_generation.json @@ -0,0 +1,1009 @@ +{ + "last_node_id": 376, + "last_link_id": 672, + "nodes": [ + { + "id": 290, + "type": "VAELoader", + "pos": [ + -3826.618408203125, + 1603.526611328125 + ], + "size": [ + 315, + 58 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 441, + 599 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAELoader" + }, + "widgets_values": [ + "ae.safetensors" + ] + }, + { + "id": 289, + "type": "DualCLIPLoader", + "pos": [ + -3826.0087890625, + 1734.926513671875 + ], + "size": [ + 315, + 106 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 439, + 440 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "DualCLIPLoader" + }, + "widgets_values": [ + "clip_l.safetensors", + "t5xxl_fp16.safetensors", + "flux" + ] + }, + { + "id": 292, + "type": "CLIPTextEncode", + "pos": [ + -3765.88671875, + 1914.5987548828125 + ], + "size": [ + 400, + 200 + ], + "flags": { + "collapsed": true + }, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 440 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 598 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "" + ], + "color": "#322", + "bgcolor": "#533" + }, + { + "id": 364, + "type": "ACEPlusConditioning", + "pos": [ + -3830.9326171875, + 1986.018310546875 + ], + "size": [ + 280, + 160 + ], + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "link": 597 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 598 + }, + { + "name": "vae", + "type": "VAE", + "link": 599 + }, + { + "name": "ucpixels", + "type": "IMAGE", + "link": 606 + }, + { + "name": "cpixels", + "type": "IMAGE", + "link": 669 + }, + { + "name": "mask", + "type": "MASK", + "link": 670 + } + ], + "outputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "links": [ + 600 + ], + "slot_index": 0 + }, + { + "name": "negative", + "type": "CONDITIONING", + "links": [ + 601 + ], + "slot_index": 1 + }, + { + "name": "latent", + "type": "LATENT", + "links": [ + 602 + ], + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "ACEPlusConditioning" + }, + "widgets_values": [ + false + ] + }, + { + "id": 295, + "type": "DifferentialDiffusion", + "pos": [ + -3793.21484375, + 2385.80712890625 + ], + "size": [ + 203.87991333007812, + 28.94829559326172 + ], + "flags": {}, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 610 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 438 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "DifferentialDiffusion" + }, + "widgets_values": [] + }, + { + "id": 294, + "type": "FluxGuidance", + "pos": [ + -2996.25390625, + 1734.9686279296875 + ], + "size": [ + 210, + 58 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "conditioning", + "type": "CONDITIONING", + "link": 446 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 597 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "FluxGuidance" + }, + "widgets_values": [ + 50 + ] + }, + { + "id": 287, + "type": "VAEDecode", + "pos": [ + -2991.447509765625, + 1874.02880859375 + ], + "size": [ + 210, + 46 + ], + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 442 + }, + { + "name": "vae", + "type": "VAE", + "link": 441 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 652 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + }, + "widgets_values": [] + }, + { + "id": 373, + "type": "ImageCrop", + "pos": [ + -3042.69140625, + 2015.809326171875 + ], + "size": [ + 315, + 130 + ], + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 652 + }, + { + "name": "width", + "type": "INT", + "link": 655, + "widget": { + "name": "width" + } + }, + { + "name": "height", + "type": "INT", + "link": 656, + "widget": { + "name": "height" + } + }, + { + "name": "x", + "type": "INT", + "link": 657, + "widget": { + "name": "x" + } + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 658 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ImageCrop" + }, + "widgets_values": [ + 512, + 512, + 0, + 0 + ] + }, + { + "id": 374, + "type": "PreviewImage", + "pos": [ + -2646.8134765625, + 1807.708740234375 + ], + "size": [ + 297.7324523925781, + 332.22821044921875 + ], + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 658 + } + ], + "outputs": [], + "properties": { + "Node name for S&R": "PreviewImage" + }, + "widgets_values": [], + "color": "#232", + "bgcolor": "#353" + }, + { + "id": 366, + "type": "ACEPlusLoader", + "pos": [ + -3841.114501953125, + 2214.209716796875 + ], + "size": [ + 315, + 82 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 610 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ACEPlusLoader" + }, + "widgets_values": [ + "ace_plus_fft.safetensors", + "default" + ] + }, + { + "id": 371, + "type": "MaskPreview+", + "pos": [ + -4157.91162109375, + 2039.6533203125 + ], + "size": [ + 210, + 246 + ], + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "mask", + "type": "MASK", + "link": 672 + } + ], + "outputs": [], + "properties": { + "Node name for S&R": "MaskPreview+" + }, + "widgets_values": [] + }, + { + "id": 286, + "type": "KSampler", + "pos": [ + -3420.80908203125, + 1962.8271484375 + ], + "size": [ + 317.2386474609375, + 485.9841613769531 + ], + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 438 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 600 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 601 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 602 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 442 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 3999647, + "fixed", + 28, + 1, + "euler", + "normal", + 1 + ] + }, + { + "id": 376, + "type": "LoadImage", + "pos": [ + -4823.74267578125, + 1608.7518310546875 + ], + "size": [ + 315, + 314 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 664 + ], + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "human_1.jpg", + "image" + ] + }, + { + "id": 323, + "type": "Note", + "pos": [ + -4408.5859375, + 2355.6123046875 + ], + "size": [ + 454.2545166015625, + 174.908447265625 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [], + "outputs": [], + "properties": {}, + "widgets_values": [ + "ACE_Plus Model download: https://huggingface.co/ali-vilab/ACE_Plus/blob/main/ace_plus_fft.safetensors" + ], + "color": "#332922", + "bgcolor": "#593930" + }, + { + "id": 291, + "type": "CLIPTextEncode", + "pos": [ + -3445.466796875, + 1668.46484375 + ], + "size": [ + 389.0423278808594, + 213.64186096191406 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 439 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 446 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "Maintain the facial features, A girl is wearing a neat police uniform and sporting a badge. She is smiling with a friendly and confident demeanor. The background is blurred, featuring a cartoon logo." + ], + "color": "#232", + "bgcolor": "#353" + }, + { + "id": 367, + "type": "PreviewImage", + "pos": [ + -4078.7978515625, + 1388.28564453125 + ], + "size": [ + 210, + 246 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 611 + } + ], + "outputs": [], + "properties": { + "Node name for S&R": "PreviewImage" + }, + "widgets_values": [] + }, + { + "id": 372, + "type": "PreviewImage", + "pos": [ + -4405.0244140625, + 2036.48388671875 + ], + "size": [ + 210, + 246 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 671 + } + ], + "outputs": [], + "properties": { + "Node name for S&R": "PreviewImage" + }, + "widgets_values": [] + }, + { + "id": 365, + "type": "ACEPlusFFTProcessor", + "pos": [ + -4398.48681640625, + 1674.5584716796875 + ], + "size": [ + 261.8648376464844, + 278 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "reference_image", + "type": "IMAGE", + "link": 664, + "shape": 7 + }, + { + "name": "edit_image", + "type": "IMAGE", + "link": null, + "shape": 7 + }, + { + "name": "edit_mask", + "type": "MASK", + "link": null, + "shape": 7 + } + ], + "outputs": [ + { + "name": "UC_IMAGE", + "type": "IMAGE", + "links": [ + 606, + 611 + ], + "slot_index": 0 + }, + { + "name": "C_IMAGE", + "type": "IMAGE", + "links": [ + 669, + 671 + ], + "slot_index": 1 + }, + { + "name": "MASK", + "type": "MASK", + "links": [ + 670, + 672 + ], + "slot_index": 2 + }, + { + "name": "OUT_H", + "type": "INT", + "links": [ + 656 + ], + "slot_index": 3 + }, + { + "name": "OUT_W", + "type": "INT", + "links": [ + 655 + ], + "slot_index": 4 + }, + { + "name": "SLICE_W", + "type": "INT", + "links": [ + 657 + ], + "slot_index": 5 + } + ], + "properties": { + "Node name for S&R": "ACEPlusFFTProcessor" + }, + "widgets_values": [ + true, + 1024, + 1024, + "repainting", + true, + 3072 + ], + "color": "#223", + "bgcolor": "#335" + } + ], + "links": [ + [ + 438, + 295, + 0, + 286, + 0, + "MODEL" + ], + [ + 439, + 289, + 0, + 291, + 0, + "CLIP" + ], + [ + 440, + 289, + 0, + 292, + 0, + "CLIP" + ], + [ + 441, + 290, + 0, + 287, + 1, + "VAE" + ], + [ + 442, + 286, + 0, + 287, + 0, + "LATENT" + ], + [ + 446, + 291, + 0, + 294, + 0, + "CONDITIONING" + ], + [ + 597, + 294, + 0, + 364, + 0, + "CONDITIONING" + ], + [ + 598, + 292, + 0, + 364, + 1, + "CONDITIONING" + ], + [ + 599, + 290, + 0, + 364, + 2, + "VAE" + ], + [ + 600, + 364, + 0, + 286, + 1, + "CONDITIONING" + ], + [ + 601, + 364, + 1, + 286, + 2, + "CONDITIONING" + ], + [ + 602, + 364, + 2, + 286, + 3, + "LATENT" + ], + [ + 606, + 365, + 0, + 364, + 3, + "IMAGE" + ], + [ + 610, + 366, + 0, + 295, + 0, + "MODEL" + ], + [ + 611, + 365, + 0, + 367, + 0, + "IMAGE" + ], + [ + 652, + 287, + 0, + 373, + 0, + "IMAGE" + ], + [ + 655, + 365, + 4, + 373, + 1, + "INT" + ], + [ + 656, + 365, + 3, + 373, + 2, + "INT" + ], + [ + 657, + 365, + 5, + 373, + 3, + "INT" + ], + [ + 658, + 373, + 0, + 374, + 0, + "IMAGE" + ], + [ + 664, + 376, + 0, + 365, + 0, + "IMAGE" + ], + [ + 669, + 365, + 1, + 364, + 4, + "IMAGE" + ], + [ + 670, + 365, + 2, + 364, + 5, + "MASK" + ], + [ + 671, + 365, + 1, + 372, + 0, + "IMAGE" + ], + [ + 672, + 365, + 2, + 371, + 0, + "MASK" + ] + ], + "groups": [ + { + "id": 20, + "title": "ACE_Plus FFT Workflow", + "bounding": [ + -4893.498046875, + 1443.87890625, + 2592.630126953125, + 1121.891845703125 + ], + "color": "#3f789e", + "font_size": 40, + "flags": {} + } + ], + "config": {}, + "extra": { + "ds": { + "scale": 0.7627768444385488, + "offset": [ + 5506.346756005007, + -1125.36817628918 + ] + }, + "ue_links": [], + "groupNodes": {} + }, + "version": 0.4 +} \ No newline at end of file diff --git a/workflow_example_fft/ACE_Plus_FFT_workflow_referenceediting_generation.json b/workflow_example_fft/ACE_Plus_FFT_workflow_referenceediting_generation.json new file mode 100644 index 0000000..73429f6 --- /dev/null +++ b/workflow_example_fft/ACE_Plus_FFT_workflow_referenceediting_generation.json @@ -0,0 +1,1069 @@ +{ + "last_node_id": 376, + "last_link_id": 672, + "nodes": [ + { + "id": 290, + "type": "VAELoader", + "pos": [ + -3826.618408203125, + 1603.526611328125 + ], + "size": [ + 315, + 58 + ], + "flags": {}, + "order": 0, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "VAE", + "type": "VAE", + "links": [ + 441, + 599 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAELoader" + }, + "widgets_values": [ + "ae.safetensors" + ] + }, + { + "id": 289, + "type": "DualCLIPLoader", + "pos": [ + -3826.0087890625, + 1734.926513671875 + ], + "size": [ + 315, + 106 + ], + "flags": {}, + "order": 1, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "CLIP", + "type": "CLIP", + "links": [ + 439, + 440 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "DualCLIPLoader" + }, + "widgets_values": [ + "clip_l.safetensors", + "t5xxl_fp16.safetensors", + "flux" + ] + }, + { + "id": 292, + "type": "CLIPTextEncode", + "pos": [ + -3765.88671875, + 1914.5987548828125 + ], + "size": [ + 400, + 200 + ], + "flags": { + "collapsed": true + }, + "order": 7, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 440 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 598 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "" + ], + "color": "#322", + "bgcolor": "#533" + }, + { + "id": 364, + "type": "ACEPlusConditioning", + "pos": [ + -3830.9326171875, + 1986.018310546875 + ], + "size": [ + 280, + 160 + ], + "flags": {}, + "order": 14, + "mode": 0, + "inputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "link": 597 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 598 + }, + { + "name": "vae", + "type": "VAE", + "link": 599 + }, + { + "name": "ucpixels", + "type": "IMAGE", + "link": 606 + }, + { + "name": "cpixels", + "type": "IMAGE", + "link": 669 + }, + { + "name": "mask", + "type": "MASK", + "link": 670 + } + ], + "outputs": [ + { + "name": "positive", + "type": "CONDITIONING", + "links": [ + 600 + ], + "slot_index": 0 + }, + { + "name": "negative", + "type": "CONDITIONING", + "links": [ + 601 + ], + "slot_index": 1 + }, + { + "name": "latent", + "type": "LATENT", + "links": [ + 602 + ], + "slot_index": 2 + } + ], + "properties": { + "Node name for S&R": "ACEPlusConditioning" + }, + "widgets_values": [ + false + ] + }, + { + "id": 295, + "type": "DifferentialDiffusion", + "pos": [ + -3793.21484375, + 2385.80712890625 + ], + "size": [ + 203.87991333007812, + 28.94829559326172 + ], + "flags": {}, + "order": 8, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 610 + } + ], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 438 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "DifferentialDiffusion" + }, + "widgets_values": [] + }, + { + "id": 294, + "type": "FluxGuidance", + "pos": [ + -2996.25390625, + 1734.9686279296875 + ], + "size": [ + 210, + 58 + ], + "flags": {}, + "order": 10, + "mode": 0, + "inputs": [ + { + "name": "conditioning", + "type": "CONDITIONING", + "link": 446 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 597 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "FluxGuidance" + }, + "widgets_values": [ + 50 + ] + }, + { + "id": 287, + "type": "VAEDecode", + "pos": [ + -2991.447509765625, + 1874.02880859375 + ], + "size": [ + 210, + 46 + ], + "flags": {}, + "order": 16, + "mode": 0, + "inputs": [ + { + "name": "samples", + "type": "LATENT", + "link": 442 + }, + { + "name": "vae", + "type": "VAE", + "link": 441 + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 652 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "VAEDecode" + }, + "widgets_values": [] + }, + { + "id": 373, + "type": "ImageCrop", + "pos": [ + -3042.69140625, + 2015.809326171875 + ], + "size": [ + 315, + 130 + ], + "flags": {}, + "order": 17, + "mode": 0, + "inputs": [ + { + "name": "image", + "type": "IMAGE", + "link": 652 + }, + { + "name": "width", + "type": "INT", + "link": 655, + "widget": { + "name": "width" + } + }, + { + "name": "height", + "type": "INT", + "link": 656, + "widget": { + "name": "height" + } + }, + { + "name": "x", + "type": "INT", + "link": 657, + "widget": { + "name": "x" + } + } + ], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 658 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ImageCrop" + }, + "widgets_values": [ + 512, + 512, + 0, + 0 + ] + }, + { + "id": 374, + "type": "PreviewImage", + "pos": [ + -2646.8134765625, + 1807.708740234375 + ], + "size": [ + 297.7324523925781, + 332.22821044921875 + ], + "flags": {}, + "order": 18, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 658 + } + ], + "outputs": [], + "properties": { + "Node name for S&R": "PreviewImage" + }, + "widgets_values": [], + "color": "#232", + "bgcolor": "#353" + }, + { + "id": 366, + "type": "ACEPlusLoader", + "pos": [ + -3841.114501953125, + 2214.209716796875 + ], + "size": [ + 315, + 82 + ], + "flags": {}, + "order": 2, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "MODEL", + "type": "MODEL", + "links": [ + 610 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "ACEPlusLoader" + }, + "widgets_values": [ + "ace_plus_fft.safetensors", + "default" + ] + }, + { + "id": 371, + "type": "MaskPreview+", + "pos": [ + -4157.91162109375, + 2039.6533203125 + ], + "size": [ + 210, + 246 + ], + "flags": {}, + "order": 13, + "mode": 0, + "inputs": [ + { + "name": "mask", + "type": "MASK", + "link": 672 + } + ], + "outputs": [], + "properties": { + "Node name for S&R": "MaskPreview+" + }, + "widgets_values": [] + }, + { + "id": 286, + "type": "KSampler", + "pos": [ + -3420.80908203125, + 1962.8271484375 + ], + "size": [ + 317.2386474609375, + 485.9841613769531 + ], + "flags": {}, + "order": 15, + "mode": 0, + "inputs": [ + { + "name": "model", + "type": "MODEL", + "link": 438 + }, + { + "name": "positive", + "type": "CONDITIONING", + "link": 600 + }, + { + "name": "negative", + "type": "CONDITIONING", + "link": 601 + }, + { + "name": "latent_image", + "type": "LATENT", + "link": 602 + } + ], + "outputs": [ + { + "name": "LATENT", + "type": "LATENT", + "links": [ + 442 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "KSampler" + }, + "widgets_values": [ + 3999647, + "fixed", + 28, + 1, + "euler", + "normal", + 1 + ] + }, + { + "id": 376, + "type": "LoadImage", + "pos": [ + -4823.74267578125, + 1608.7518310546875 + ], + "size": [ + 315, + 314 + ], + "flags": {}, + "order": 3, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 664 + ], + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": null + } + ], + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "human_1.jpg", + "image" + ] + }, + { + "id": 323, + "type": "Note", + "pos": [ + -4408.5859375, + 2355.6123046875 + ], + "size": [ + 454.2545166015625, + 174.908447265625 + ], + "flags": {}, + "order": 4, + "mode": 0, + "inputs": [], + "outputs": [], + "properties": {}, + "widgets_values": [ + "ACE_Plus Model download: https://huggingface.co/ali-vilab/ACE_Plus/blob/main/ace_plus_fft.safetensors" + ], + "color": "#332922", + "bgcolor": "#593930" + }, + { + "id": 291, + "type": "CLIPTextEncode", + "pos": [ + -3445.466796875, + 1668.46484375 + ], + "size": [ + 389.0423278808594, + 213.64186096191406 + ], + "flags": {}, + "order": 6, + "mode": 0, + "inputs": [ + { + "name": "clip", + "type": "CLIP", + "link": 439 + } + ], + "outputs": [ + { + "name": "CONDITIONING", + "type": "CONDITIONING", + "links": [ + 446 + ], + "slot_index": 0 + } + ], + "properties": { + "Node name for S&R": "CLIPTextEncode" + }, + "widgets_values": [ + "Maintain the facial features, A girl is wearing a neat police uniform and sporting a badge. She is smiling with a friendly and confident demeanor. The background is blurred, featuring a cartoon logo." + ], + "color": "#232", + "bgcolor": "#353" + }, + { + "id": 367, + "type": "PreviewImage", + "pos": [ + -4078.7978515625, + 1388.28564453125 + ], + "size": [ + 210, + 246 + ], + "flags": {}, + "order": 11, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 611 + } + ], + "outputs": [], + "properties": { + "Node name for S&R": "PreviewImage" + }, + "widgets_values": [] + }, + { + "id": 372, + "type": "PreviewImage", + "pos": [ + -4405.0244140625, + 2036.48388671875 + ], + "size": [ + 210, + 246 + ], + "flags": {}, + "order": 12, + "mode": 0, + "inputs": [ + { + "name": "images", + "type": "IMAGE", + "link": 671 + } + ], + "outputs": [], + "properties": { + "Node name for S&R": "PreviewImage" + }, + "widgets_values": [] + }, + { + "id": 365, + "type": "ACEPlusFFTProcessor", + "pos": [ + -4398.48681640625, + 1674.5584716796875 + ], + "size": [ + 261.8648376464844, + 278 + ], + "flags": {}, + "order": 9, + "mode": 0, + "inputs": [ + { + "name": "reference_image", + "type": "IMAGE", + "link": 664, + "shape": 7 + }, + { + "name": "edit_image", + "type": "IMAGE", + "link": 668, + "shape": 7 + }, + { + "name": "edit_mask", + "type": "MASK", + "link": 667, + "shape": 7 + } + ], + "outputs": [ + { + "name": "UC_IMAGE", + "type": "IMAGE", + "links": [ + 606, + 611 + ], + "slot_index": 0 + }, + { + "name": "C_IMAGE", + "type": "IMAGE", + "links": [ + 669, + 671 + ], + "slot_index": 1 + }, + { + "name": "MASK", + "type": "MASK", + "links": [ + 670, + 672 + ], + "slot_index": 2 + }, + { + "name": "OUT_H", + "type": "INT", + "links": [ + 656 + ], + "slot_index": 3 + }, + { + "name": "OUT_W", + "type": "INT", + "links": [ + 655 + ], + "slot_index": 4 + }, + { + "name": "SLICE_W", + "type": "INT", + "links": [ + 657 + ], + "slot_index": 5 + } + ], + "properties": { + "Node name for S&R": "ACEPlusFFTProcessor" + }, + "widgets_values": [ + true, + 1024, + 1024, + "repainting", + true, + 3072 + ], + "color": "#223", + "bgcolor": "#335" + }, + { + "id": 299, + "type": "LoadImage", + "pos": [ + -4826.8291015625, + 2025.3966064453125 + ], + "size": [ + 315, + 314.0001220703125 + ], + "flags": {}, + "order": 5, + "mode": 0, + "inputs": [], + "outputs": [ + { + "name": "IMAGE", + "type": "IMAGE", + "links": [ + 668 + ], + "slot_index": 0 + }, + { + "name": "MASK", + "type": "MASK", + "links": [ + 667 + ], + "slot_index": 1 + } + ], + "title": "Edit Image", + "properties": { + "Node name for S&R": "LoadImage" + }, + "widgets_values": [ + "clipspace/clipspace-mask-466991.7999999523.png [input]", + "image" + ], + "color": "#432", + "bgcolor": "#653" + } + ], + "links": [ + [ + 438, + 295, + 0, + 286, + 0, + "MODEL" + ], + [ + 439, + 289, + 0, + 291, + 0, + "CLIP" + ], + [ + 440, + 289, + 0, + 292, + 0, + "CLIP" + ], + [ + 441, + 290, + 0, + 287, + 1, + "VAE" + ], + [ + 442, + 286, + 0, + 287, + 0, + "LATENT" + ], + [ + 446, + 291, + 0, + 294, + 0, + "CONDITIONING" + ], + [ + 597, + 294, + 0, + 364, + 0, + "CONDITIONING" + ], + [ + 598, + 292, + 0, + 364, + 1, + "CONDITIONING" + ], + [ + 599, + 290, + 0, + 364, + 2, + "VAE" + ], + [ + 600, + 364, + 0, + 286, + 1, + "CONDITIONING" + ], + [ + 601, + 364, + 1, + 286, + 2, + "CONDITIONING" + ], + [ + 602, + 364, + 2, + 286, + 3, + "LATENT" + ], + [ + 606, + 365, + 0, + 364, + 3, + "IMAGE" + ], + [ + 610, + 366, + 0, + 295, + 0, + "MODEL" + ], + [ + 611, + 365, + 0, + 367, + 0, + "IMAGE" + ], + [ + 652, + 287, + 0, + 373, + 0, + "IMAGE" + ], + [ + 655, + 365, + 4, + 373, + 1, + "INT" + ], + [ + 656, + 365, + 3, + 373, + 2, + "INT" + ], + [ + 657, + 365, + 5, + 373, + 3, + "INT" + ], + [ + 658, + 373, + 0, + 374, + 0, + "IMAGE" + ], + [ + 664, + 376, + 0, + 365, + 0, + "IMAGE" + ], + [ + 667, + 299, + 1, + 365, + 2, + "MASK" + ], + [ + 668, + 299, + 0, + 365, + 1, + "IMAGE" + ], + [ + 669, + 365, + 1, + 364, + 4, + "IMAGE" + ], + [ + 670, + 365, + 2, + 364, + 5, + "MASK" + ], + [ + 671, + 365, + 1, + 372, + 0, + "IMAGE" + ], + [ + 672, + 365, + 2, + 371, + 0, + "MASK" + ] + ], + "groups": [ + { + "id": 20, + "title": "ACE_Plus FFT Workflow", + "bounding": [ + -4893.498046875, + 1443.87890625, + 2592.630126953125, + 1121.891845703125 + ], + "color": "#3f789e", + "font_size": 40, + "flags": {} + } + ], + "config": {}, + "extra": { + "ds": { + "scale": 0.7627768444385488, + "offset": [ + 5506.346756005007, + -1125.36817628918 + ] + }, + "ue_links": [], + "groupNodes": {} + }, + "version": 0.4 +} \ No newline at end of file