Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ComfyUI reference controlnet support #100

Closed
jax-explorer opened this issue Apr 12, 2024 · 16 comments
Closed

ComfyUI reference controlnet support #100

jax-explorer opened this issue Apr 12, 2024 · 16 comments
Labels
question Further information is requested

Comments

@jax-explorer
Copy link

Why is reference controlnet not supported in ControlNet?

@Kosinkadink
Copy link
Owner

What do you mean?

@jax-explorer
Copy link
Author

https://github.com/Mikubill/sd-webui-controlnet

In Controlnet there is a reference Controlnet, which references a picture, but I don't find it in ComfyUI.

@Kosinkadink
Copy link
Owner

I added ReferenceCN support a couple weeks ago. The input images must be put through the ReferenceCN Preprocessor, with the latents being the same size (h and w) that will be going into the KSampler.

I also improved on the auto1111 implementation by adding a true strength control. The ref_weight is the same as auto1111's controlnet strength, the style_fidelity is the same as auto1111's style_fidelity, and the strength of the controlnet (whether that be on the Apply ControlNet node or on the strength inputs on the finetune node) is granular control over the strength. The finetune node also allows you to choose separate values for attn and adain.

image
image

@Kosinkadink Kosinkadink added the question Further information is requested label Apr 12, 2024
@jax-explorer
Copy link
Author

@Kosinkadink It's really awesome, a lot of times ReferenceCN is very useful and a lot of people think that IPadapter can replace it, but they are totally different. I've used the node before but it reported an error, I think there was a problem with some of the width and height settings, I'll try it again soon, thanks for the code.

@jax-explorer
Copy link
Author

I tried this ReferenceCN and it doesn't seem to do anything, here is my test workflow
截屏2024-04-17 20 44 02

@Kosinkadink
Copy link
Owner

I can't replicate your issue. Can you confirm that if you bypass the Apply Advanced ControlNet that the output image does not change (which would mean no ref stuff happens)? Just tested both the KSampler and KSampler (Advanced) and they both work fine for me.
image

(this second image here contains the workflow that you can drag into ComfyUI to load)
ref_testworkflow

@jax-explorer
Copy link
Author

It serves some purpose, but does not achieve character consistency. It still doesn't look like there's a good program for role consistency.
截屏2024-04-18 00 28 17
截屏2024-04-18 00 28 54

@Kosinkadink
Copy link
Owner

Kosinkadink commented Apr 18, 2024

The comfy implementation works basically identically to auto1111. Can you send me links to the exact models you're using, the exact workflow, and the exact input images? I will try to run your stuff on my end.

ReferenceCN will never be exact as it's just the nature of how it works, but I want to confirm its working as intended on your end.

@jax-explorer
Copy link
Author

You are treating the open source project very positively and this is commendable.

ok, I am using the model https://civitai.com/models/7240/meinamix and the input images are: https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/905ade32-70b9-42e0-9d83-4b3393aee020/original=true/81EB23FAB3E910AC5695CBA24FB09EB43E3D7EBA968E908AA0F3F6A81550F736.jpeg "positive_prompt": "high resolution, masterpiece", "negative_prompt":"(worst quality, low quality:1.4), monochrome, zombie, (interlocked fingers:1.2),
"negative_prompt": "(worst quality, low quality:1.4), monochrome, zombie, (interlocked fingers:1.2)", I'll post the full workflow later, but the information described above should suffice.

Thank you for your positive response.

@MoonMoon82
Copy link

Does anyone else got an issue with it now?
grafik

!!! Exception during processing!!! 'NoneType' object has no attribute '__get__'
Traceback (most recent call last):
  File "E:\StableDiffusion\ComfyUI_windows_portable\ComfyUI\custom_nodes\ComfyUI-Advanced-ControlNet\adv_control\control_reference.py", line 63, in refcn_sample
    injection_holder = InjectionBasicTransformerBlockHolder(block=module, idx=i)
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\StableDiffusion\ComfyUI_windows_portable\ComfyUI\custom_nodes\ComfyUI-Advanced-ControlNet\adv_control\control_reference.py", line 433, in __init__
    self.original_forward = block._forward
                            ^^^^^^^^^^^^^^
  File "E:\StableDiffusion\ComfyUI_windows_portable\python_embeded\Lib\site-packages\torch\nn\modules\module.py", line 1709, in __getattr__
    raise AttributeError(f"'{type(self).__name__}' object has no attribute '{name}'")
AttributeError: 'BasicTransformerBlock' object has no attribute '_forward'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "E:\StableDiffusion\ComfyUI_windows_portable\ComfyUI\execution.py", line 151, in recursive_execute
    output_data, output_ui = get_output_data(obj, input_data_all)
                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\StableDiffusion\ComfyUI_windows_portable\ComfyUI\execution.py", line 81, in get_output_data
    return_values = map_node_over_list(obj, input_data_all, obj.FUNCTION, allow_interrupt=True)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\StableDiffusion\ComfyUI_windows_portable\ComfyUI\execution.py", line 74, in map_node_over_list
    results.append(getattr(obj, func)(**slice_dict(input_data_all, i)))
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\StableDiffusion\ComfyUI_windows_portable\ComfyUI\nodes.py", line 1344, in sample
    return common_ksampler(model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent_image, denoise=denoise)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\StableDiffusion\ComfyUI_windows_portable\ComfyUI\nodes.py", line 1314, in common_ksampler
    samples = comfy.sample.sample(model, noise, steps, cfg, sampler_name, scheduler, positive, negative, latent_image,
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\StableDiffusion\ComfyUI_windows_portable\ComfyUI\custom_nodes\ComfyUI-Impact-Pack\modules\impact\sample_error_enhancer.py", line 9, in informative_sample
    return original_sample(*args, **kwargs)  # This code helps interpret error messages that occur within exceptions but does not have any impact on other operations.
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\StableDiffusion\ComfyUI_windows_portable\ComfyUI\custom_nodes\ComfyUI-AnimateDiff-Evolved\animatediff\sampling.py", line 313, in motion_sample
    return orig_comfy_sample(model, noise, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\StableDiffusion\ComfyUI_windows_portable\ComfyUI\custom_nodes\ComfyUI-Advanced-ControlNet\adv_control\control_reference.py", line 134, in refcn_sample
    model.model.diffusion_model.forward = reference_injections.diffusion_model_orig_forward.__get__(model.model.diffusion_model, type(model.model.diffusion_model))
                                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute '__get__'

Prompt executed in 0.17 seconds

@SSA4
Copy link

SSA4 commented May 19, 2024

I get the samer error too. The Reference Only seems to be broken.

@Kosinkadink
Copy link
Owner

I'll take a look in a few hours. On the surface nothing changed that should have broken it, but could be an odd side effect of the recent uncond_multiplier hacky implementation.

@amiibot
Copy link

amiibot commented May 19, 2024

何改变应该会破坏它,但这可能是

so do I.It can not work

Does anyone else got an issue with it now? grafik

!!! Exception during processing!!! 'NoneType' object has no attribute '__get__'
Traceback (most recent call last):
  File "E:\StableDiffusion\ComfyUI_windows_portable\ComfyUI\custom_nodes\ComfyUI-Advanced-ControlNet\adv_control\control_reference.py", line 63, in refcn_sample
    injection_holder = InjectionBasicTransformerBlockHolder(block=module, idx=i)
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\StableDiffusion\ComfyUI_windows_portable\ComfyUI\custom_nodes\ComfyUI-Advanced-ControlNet\adv_control\control_reference.py", line 433, in __init__
    self.original_forward = block._forward
                            ^^^^^^^^^^^^^^
  File "E:\StableDiffusion\ComfyUI_windows_portable\python_embeded\Lib\site-packages\torch\nn\modules\module.py", line 1709, in __getattr__
    raise AttributeError(f"'{type(self).__name__}' object has no attribute '{name}'")
AttributeError: 'BasicTransformerBlock' object has no attribute '_forward'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "E:\StableDiffusion\ComfyUI_windows_portable\ComfyUI\execution.py", line 151, in recursive_execute
    output_data, output_ui = get_output_data(obj, input_data_all)
                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\StableDiffusion\ComfyUI_windows_portable\ComfyUI\execution.py", line 81, in get_output_data
    return_values = map_node_over_list(obj, input_data_all, obj.FUNCTION, allow_interrupt=True)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\StableDiffusion\ComfyUI_windows_portable\ComfyUI\execution.py", line 74, in map_node_over_list
    results.append(getattr(obj, func)(**slice_dict(input_data_all, i)))
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\StableDiffusion\ComfyUI_windows_portable\ComfyUI\nodes.py", line 1344, in sample
    return common_ksampler(model, seed, steps, cfg, sampler_name, scheduler, positive, negative, latent_image, denoise=denoise)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\StableDiffusion\ComfyUI_windows_portable\ComfyUI\nodes.py", line 1314, in common_ksampler
    samples = comfy.sample.sample(model, noise, steps, cfg, sampler_name, scheduler, positive, negative, latent_image,
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\StableDiffusion\ComfyUI_windows_portable\ComfyUI\custom_nodes\ComfyUI-Impact-Pack\modules\impact\sample_error_enhancer.py", line 9, in informative_sample
    return original_sample(*args, **kwargs)  # This code helps interpret error messages that occur within exceptions but does not have any impact on other operations.
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\StableDiffusion\ComfyUI_windows_portable\ComfyUI\custom_nodes\ComfyUI-AnimateDiff-Evolved\animatediff\sampling.py", line 313, in motion_sample
    return orig_comfy_sample(model, noise, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\StableDiffusion\ComfyUI_windows_portable\ComfyUI\custom_nodes\ComfyUI-Advanced-ControlNet\adv_control\control_reference.py", line 134, in refcn_sample
    model.model.diffusion_model.forward = reference_injections.diffusion_model_orig_forward.__get__(model.model.diffusion_model, type(model.model.diffusion_model))
                                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'NoneType' object has no attribute '__get__'

Prompt executed in 0.17 seconds

It seems to be caused by a comfyui version update, I have two copies of comfyui and it doesn't report an error on the cd07340d version, while the latest version gives an error.

@Kosinkadink
Copy link
Owner

I've found the source of the bug - it is indeed due to the latest commit to ComfyUI. When I get home in a few hours, I'll make an update that will make RefCN work with both older and current ComfyUI

@ikcikoR
Copy link

ikcikoR commented May 19, 2024

Can confirm the bug is happening and reverting by just a single commit currently fixes it.

@Kosinkadink
Copy link
Owner

RefCN attn is now compatible with newest ComfyUI, while maintaining backwards compatibility with previous ComfyUI versions.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
question Further information is requested
Projects
None yet
Development

No branches or pull requests

6 participants