Update README.md
This commit is contained in:
@@ -1,10 +1,10 @@
|
||||
# ComfyUI_AdvancedRefluxControl
|
||||
# ComfyUI_AdvancedReduxControl
|
||||
|
||||
As many of you might noticed, the recently released Reflux model is rather a model for generating multiple variants of an image, but it does not allow for changing an image based on a prompt.
|
||||
As many of you might noticed, the recently released Redux model is rather a model for generating multiple variants of an image, but it does not allow for changing an image based on a prompt.
|
||||
|
||||
If you use Reflux with an Image and add a prompt, your prompt is just ignored. In general, there is no strength slider or anything in Reflux to control how much the coniditioning image should determine the final outcome of your image.
|
||||
If you use Redux with an Image and add a prompt, your prompt is just ignored. In general, there is no strength slider or anything in Redux to control how much the coniditioning image should determine the final outcome of your image.
|
||||
|
||||
For this purpose I wrote this little custom node that allows you change the strength of the Reflux effect.
|
||||
For this purpose I wrote this little custom node that allows you change the strength of the Redux effect.
|
||||
|
||||
## Changelog
|
||||
|
||||
@@ -18,26 +18,26 @@ I used the following pexel image as an example conditioning image: [[https://www
|
||||
|
||||
Lets say we want to have a similar image, but as comic/cartoon. The prompt I use is "comic, cartoon, vintage comic"
|
||||
|
||||
Using Reflux on Flux1-dev I obtain the following image.
|
||||
Using Redux on Flux1-dev I obtain the following image.
|
||||
|
||||
**original Reflux setting**
|
||||
**original Redux setting**
|
||||

|
||||
|
||||
As you can see, the prompt is vastly ignored. Using the custom node and "medium" setting I obtain
|
||||
|
||||
**Reflux medium strength**
|
||||
**Redux medium strength**
|
||||

|
||||
|
||||
Lets do the same with anime. The prompt is "anime drawing in anime style. Studio Ghibli, Makoto Shinkai."
|
||||
|
||||
As the anime keyword has a strong effect in Flux, we see a better prompt following on default than with comics.
|
||||
|
||||
**original Reflux setting**
|
||||
**original Redux setting**
|
||||

|
||||
|
||||
Still, its far from perfect. With "medium" setting we get an image that is much closer to anime or studio Ghibli.
|
||||
|
||||
**Reflux medium strength**
|
||||
**Redux medium strength**
|
||||

|
||||
|
||||
|
||||
@@ -48,17 +48,17 @@ Mixing both together and using the anime prompt above gives me
|
||||

|
||||
|
||||
Finally, we try a very challenging prompt: "Marble statues, sculptures, stone statues. stone and marble texture. Two sculptures made out of marble stone.". As you can see, I repeated the prompt multiple times to increase its strength.
|
||||
But despite the repeats, the default Reflux workflow will just give us the input image refluxed - our prompt is totally ignored.
|
||||
But despite the repeats, the default Redux workflow will just give us the input image Reduxed - our prompt is totally ignored.
|
||||
|
||||
**original Reflux setting**
|
||||
**original Redux setting**
|
||||

|
||||
|
||||
With medium we get an image back that looks more like porcelain instead of marble, but at least the two women are sculptures now.
|
||||
|
||||
**Reflux medium strength**
|
||||
**Redux medium strength**
|
||||

|
||||
|
||||
Further decreasing the Reflux strength will transform the woman into statues finally, but it will also further decrease their likeness to the conditioning image. In almost all my experiments, it was better to repeat multiple seeds with the "medium" setting instead of further decreasing the strength.
|
||||
Further decreasing the Redux strength will transform the woman into statues finally, but it will also further decrease their likeness to the conditioning image. In almost all my experiments, it was better to repeat multiple seeds with the "medium" setting instead of further decreasing the strength.
|
||||
|
||||
# Masked Conditioning Images
|
||||
|
||||
@@ -103,7 +103,7 @@ I was told that the images above for some reason do not contain the workflow. So
|
||||
This workflow is a replacement for the ComfyUI StyleModelApply node. It has a single option that controls the influence of the conditioning image on the generation. The example images are all generated with the "medium" strength option. However, when using masking, you might have to use "strongest" or "strong" instead.
|
||||
|
||||
|
||||
### StyleModelApplyAdvanced
|
||||
### ReduxAdvanced
|
||||
|
||||
This node allows for more customization. As input it gets the conditioning (prompt), the Redux style model, the CLIP vision model and optionally(!) the mask. Its parameters are:
|
||||
|
||||
@@ -118,38 +118,38 @@ This node allows for more customization. As input it gets the conditioning (prom
|
||||
|
||||
The node outputs the conditioning, as well as the cropped and resized image and its mask. You neither need the image nor the mask, they are just for debugging. Play around with the cropping option and use the "Image preview" node to see how it effects the cropped image and mask.
|
||||
|
||||
## Short background on Reflux
|
||||
## Short background on Redux
|
||||
|
||||
Reflux works in two steps. First there is a Clip Vision model that crops your input image into square aspect ratio and reduce its size to 384x384 pixels. It splits this image into 27x27 small patches and each patch is projected into CLIP space.
|
||||
Redux works in two steps. First there is a Clip Vision model that crops your input image into square aspect ratio and reduce its size to 384x384 pixels. It splits this image into 27x27 small patches and each patch is projected into CLIP space.
|
||||
|
||||
Reflux itself is just a very small linear function that projects these clip image patches into the T5 latent space. The resulting tokens are then added to your T5 prompt.
|
||||
Redux itself is just a very small linear function that projects these clip image patches into the T5 latent space. The resulting tokens are then added to your T5 prompt.
|
||||
|
||||
Intuitively, Reflux is translating your conditioning input image into "a prompt" that is added at the end of your own prompt.
|
||||
Intuitively, Redux is translating your conditioning input image into "a prompt" that is added at the end of your own prompt.
|
||||
|
||||
So why is Reflux dominating the final prompt? It's because the user prompt is usually very short (255 or 512 tokens). Reflux, in contrast, adds 729 new tokens to your prompt. This might be 3 times as much as your original prompt. Also, the Reflux prompt might contain much more information than a user written prompt that just contains the word "anime".
|
||||
So why is Redux dominating the final prompt? It's because the user prompt is usually very short (255 or 512 tokens). Redux, in contrast, adds 729 new tokens to your prompt. This might be 3 times as much as your original prompt. Also, the Redux prompt might contain much more information than a user written prompt that just contains the word "anime".
|
||||
|
||||
So there are two solutions here: Either we shrink the strength of the Reflux prompt, or we shorten the Reflux prompt.
|
||||
So there are two solutions here: Either we shrink the strength of the Redux prompt, or we shorten the Redux prompt.
|
||||
|
||||
The next sections are a bit chaotic: I changed the method several times and many stuff I tried is outdated already. The only and best technique I found so far is described in **Interpolation methods**.
|
||||
|
||||
## Controling Reflux with Token downsampling
|
||||
To shrink the Reflux prompt and increase the influence of the user prompt, we can use a simple trick: We take the 27x27 image patches and split them into 9x9 blocks, each containing 3x3 patches. We then merge all 3x3 tokens into one by averaging their latent embeddings. So instead of having a very long prompt with 27x27=729 tokens we now only have 9x9=81 tokens. So our newly added prompt is much smaller than the user provided prompt and, thus, have less influence on the image generation.
|
||||
## Controling Redux with Token downsampling
|
||||
To shrink the Redux prompt and increase the influence of the user prompt, we can use a simple trick: We take the 27x27 image patches and split them into 9x9 blocks, each containing 3x3 patches. We then merge all 3x3 tokens into one by averaging their latent embeddings. So instead of having a very long prompt with 27x27=729 tokens we now only have 9x9=81 tokens. So our newly added prompt is much smaller than the user provided prompt and, thus, have less influence on the image generation.
|
||||
|
||||
Downsampling is what happens when you use the "medium" setting. Of all three techniques I tried to decrease the Reflux effect, downsampling worked best. ~~However, there are no further customization options. You can only downsample to 81 tokens (downsampling more is too much)~~.
|
||||
Downsampling is what happens when you use the "medium" setting. Of all three techniques I tried to decrease the Redux effect, downsampling worked best. ~~However, there are no further customization options. You can only downsample to 81 tokens (downsampling more is too much)~~.
|
||||
|
||||
## Interpolation methods
|
||||
|
||||
Instead of averaging over small blocks of tokens, we can use a convolution function to shrink our 27x27 images patches to an arbitrary size. There are different functions available which most of you probably know from image resizing (its the same procedure). The averaging method above is "area", but there are also other methods available such as "bicubic".
|
||||
|
||||
## Controling Reflux with Token merging
|
||||
## Controling Redux with Token merging
|
||||
|
||||
The idea here is to shrink the Reflux prompt length by merging similar tokens together. Just think about large part of your input image contain more or less the same stuff anyways, so why having always 729 tokens? My implementation here is extremely simple and stupid and not very efficient, but anyways: I just go over all Reflux tokens and merge two tokens if their cosine similarity is above a user defined threshold.
|
||||
The idea here is to shrink the Redux prompt length by merging similar tokens together. Just think about large part of your input image contain more or less the same stuff anyways, so why having always 729 tokens? My implementation here is extremely simple and stupid and not very efficient, but anyways: I just go over all Redux tokens and merge two tokens if their cosine similarity is above a user defined threshold.
|
||||
|
||||
Even a threshold like 0.9 is already removing half of the Reflux tokens. A threshold of 0.8 is often reducing the Reflux tokens so much that they are in similar length as the user prompt.
|
||||
Even a threshold like 0.9 is already removing half of the Redux tokens. A threshold of 0.8 is often reducing the Redux tokens so much that they are in similar length as the user prompt.
|
||||
|
||||
I would start with a threshold of 0.8. If the image is blurry, increase the value a bit. If there is no effect of your prompt, decrease the threshold slightly.
|
||||
|
||||
## Controling Reflux with Token downscaling
|
||||
## Controling Redux with Token downscaling
|
||||
|
||||
We can also just multiply the tokens by a certain strength value. As lower the strength, as closer the values are to zero. This is similar to prompt weighting which was quite popular for earlier stable diffusion versions, but never really worked that well for T5. Nevertheless, this technique seem to work well enough for flux.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user