invoke-ai / InvokeAI

Invoke is a leading creative engine for Stable Diffusion models, empowering professionals, artists, and enthusiasts to generate and create visual media using the latest AI-driven technologies. The solution offers an industry leading WebUI, and serves as the foundation for multiple commercial products.
https://invoke-ai.github.io/InvokeAI/
Apache License 2.0
23.57k stars 2.43k forks source link

[enhancement]: During generation, keep the last-displayed image in Progress Image cached/visible #4417

Open dwringer opened 1 year ago

dwringer commented 1 year ago

Is there an existing issue for this?

Contact Details

No response

What should this feature add?

It would be nice if the Progress Image node could, during generation, continue showing a cached copy of whatever the last image was that it displayed, so that image remains visible even if it is not saved to the gallery. This way we could always be looking at an image from the current generation while subsequent processing is occurring, rather than the current behavior where the preview image keeps reverting to the last saved image in the gallery in between denoising steps.

To illustrate the issue, consider an upscaling process in which three images are created sequentially from one another, at sizes Small, Medium, and Large. If the Small and Medium images are not saved to gallery, then as soon as each denoising step that creates them finishes, the Progress Image node reverts to displaying the last image in the gallery until the next denoising step begins. So, instead of watching the image develop smoothly from small->medium->large, the viewer watches each size image develop independently and then immediately disappear, replaced by whatever image came out of the previous Invoke.

Feature request opened after discussion with @psychedelicious

Alternatives

Currently the basic workflow can be achieved by enabling "Save to Gallery" on all the intermediate upscaling images so they remain visible as processing continues. However, this may not always be necessary or ideal.

Aditional Content

No response

psychedelicious commented 1 year ago

In your use-case, there's an implicit assumption that the nodes will execute in the desired order and that there are no other image-producing nodes that execute between those upscaling nodes.

If those assumptions are ever false, then the preview would not provide that sequential viewing experience.

I think we already have a good solution - the outputs tab in the inspector panel (bottom left). You can select each node as it finishes to view its outputs (including images). The outputs persist until you click invoke next, and it shows all of them (even ones that don't save to gallery).

dwringer commented 1 year ago

I agree that the current options are solid, but perhaps I oversimplified the use case and left out what I think is still a bit of a distraction. Consider the following simplified use case: an image is generated (not saved to gallery), then a depth processor is used to extract a depth map from that image, and finally a new image is made from that depth map (saved to gallery). The progress image will show the first image being generated, but then, during the 5-10 seconds that the depth map is extracted from it, the progress image will be showing the top gallery image, which will be from the last generation.

Ex: consider two separate times hitting "Invoke": Invoke1, and Invoke2, with each Invoke having three rough phases (ImageA, DepthMap, ImageB). During Invoke2, the Progress Image shows ImageA develop. But then, during DepthMap, Progress Image reverts to showing ImageB from Invoke1. Then, after the depth map is extracted, Progress Image returns to showing ImageB from Invoke2 as it develops.

Progress Image Display during Invoke2: Invoke2.ImageA -> Invoke1.ImageB -> Invoke2.ImageA

I agree that looking at the node outputs themselves can show the user what they want to see, but to me the gap in between is jarring and kind of negates the utility of the Progress Image node for me unless I save all the intermediates to the gallery. Ultimately a very minor consideration in any case, just something I thought I would raise as a potential way to streamline the user experience.

dwringer commented 1 year ago

Maybe another way that I could and should have said all that is just that I think it would be nice if the progress image would not snap back to the top gallery image until generation is complete, but instead cache whatever it is currently showing to keep showing it when it doesn't have anything else to show until the generation is done.

Edit: I admit that's also less than ideal because if the user does save an image to the gallery during generation then they do possibly want to keep looking at it.

whosawhatsis commented 11 months ago

What about a node that you pass an image to, and it displays that image in the node editor, rather than showing whatever in-progress image is in progress at the moment? This way, you could designate points in your workflow where you want to see an intermediate image, and it would be shown there whenever it is ready (regardless of execution order), and stay visible until the next iteration starts. That's how I expected either the "current image" or "show image" node to behave, but neither of them works that way (It looks like "show image" might do something similar by opening the image in an external app? This is useless if you're not running invoke on your local machine, though...).