InvokeAI/docs/features/OUTPAINTING.md
Lincoln Stein 9141132a5c enhance outcropping with ability to direct contents of new regions
This commit does several things that improve the customizability of the CLI `outcrop` command:

1. When outcropping an image you can now add a `--new_prompt` option, to specify a new prompt to be applied to the outpainted region instead of the prompt used to generate the image.
2. Similarly you can provide a new seed using `--seed` (or `-S`). A seed less than zero will pick one randomly.
3. The metadata written into the outcropped file is now more informative about what was previously stored.
4. This PR also fixes the crash that happened when trying to outcrop an image  that does not contain InvokeAI metadata.

Other changes:

- add error checking suggested by @Kyle0654
- add special case in invoke.py to allow -1 to be passed as seed.
  This now only occurs for postprocessing commands. Previously, -1
  caused previous seed to be used, and this still applies to generate
  operations.
2022-11-11 20:34:21 +00:00

6.9 KiB

title
Outpainting

:octicons-paintbrush-16: Outpainting

Outpainting and outcropping

Outpainting is a process by which the AI generates parts of the image that are outside its original frame. It can be used to fix up images in which the subject is off center, or when some detail (often the top of someone's head!) is cut off.

InvokeAI supports two versions of outpainting, one called "outpaint" and the other "outcrop." They work slightly differently and each has its advantages and drawbacks.

Outpainting

Outpainting is the same as inpainting, except that the painting occurs in the regions outside of the original image. To outpaint using the invoke.py command line script, prepare an image in which the borders to be extended are pure black. Add an alpha channel (if there isn't one already), and make the borders completely transparent and the interior completely opaque. If you wish to modify the interior as well, you may create transparent holes in the transparency layer, which img2img will paint into as usual.

Pass the image as the argument to the -I switch as you would for regular inpainting:

invoke> a stream by a river -I /path/to/transparent_img.png

You'll likely be delighted by the results.

Tips

  1. Do not try to expand the image too much at once. Generally it is best to expand the margins in 64-pixel increments. 128 pixels often works, but your mileage may vary depending on the nature of the image you are trying to outpaint into.

  2. There are a series of switches that can be used to adjust how the inpainting algorithm operates. In particular, you can use these to minimize the seam that sometimes appears between the original image and the extended part. These switches are:

switch default description
--seam_size SEAM_SIZE 0 Size of the mask around the seam between original and outpainted image
--seam_blur SEAM_BLUR 0 The amount to blur the seam inwards
--seam_strength STRENGTH 0.7 The img2img strength to use when filling the seam
--seam_steps SEAM_STEPS 10 The number of steps to use to fill the seam.
--tile_size TILE_SIZE 32 The tile size to use for filling outpaint areas

Outcrop

The outcrop extension gives you a convenient !fix postprocessing command that allows you to extend a previously-generated image in 64 pixel increments in any direction. You can apply the module to any image previously-generated by InvokeAI. Note that it works with arbitrary PNG photographs, but not currently with JPG or other formats. Outcropping is particularly effective when combined with the runwayML custom inpainting model.

Consider this image:

![curly_woman](../assets/outpainting/curly.png)

Pretty nice, but it's annoying that the top of her head is cut off. She's also a bit off center. Let's fix that!

invoke> !fix images/curly.png --outcrop top 128 right 64 bottom 64

This is saying to apply the outcrop extension by extending the top of the image by 128 pixels, and the right and bottom of the image by 64 pixels. You can use any combination of top|left|right|bottom, and specify any number of pixels to extend. You can also abbreviate --outcrop to -c.

The result looks like this:

![curly_woman_outcrop](../assets/outpainting/curly-outcrop-2.png)

The new image is larger than the original (576x704) because 64 pixels were added to the top and right sides. You will need enough VRAM to process an image of this size.

Outcropping non-InvokeAI images

You can outcrop an arbitrary image that was not generated by InvokeAI, but your results will vary. The inpainting-1.5 model is highly recommended, but if not feasible, then you may be able to improve the output by conditioning the outcropping with a text prompt that describes the scene using the --new_prompt argument:

invoke> !fix images/vacation.png --outcrop top 128 --new_prompt "family vacation"

You may also provide a different seed for outcropping to use by passing -S<seed>. A negative seed will generate a new random seed.

A number of caveats:

  1. Although you can specify any pixel values, they will be rounded up to the nearest multiple of 64. Smaller values are better. Larger extensions are more likely to generate artefacts. However, if you wish you can run the !fix command repeatedly to cautiously expand the image.

  2. The extension is stochastic, meaning that each time you run it you'll get a slightly different result. You can run it repeatedly until you get an image you like. Unfortunately !fix does not currently respect the -n (--iterations) argument.

  3. Your results will be much better if you use the inpaint-1.5 model released by runwayML and installed by default by scripts/preload_models.py. This model was trained specifically to harmoniously fill in image gaps. The standard model will work as well, but you may notice color discontinuities at the border.

  4. When using the inpaint-1.5 model, you may notice subtle changes to the area within the original image. This is because the model performs an encoding/decoding on the image as a whole. This does not occur with the standard model.

Outpaint

The outpaint extension does the same thing, but with subtle differences. Starting with the same image, here is how we would add an additional 64 pixels to the top of the image:

invoke> !fix images/curly.png --out_direction top 64

(you can abbreviate --out_direction as -D.

The result is shown here:

![curly_woman_outpaint](../assets/outpainting/curly-outpaint.png)

Although the effect is similar, there are significant differences from outcropping:

  • You can only specify one direction to extend at a time.
  • The image is not resized. Instead, the image is shifted by the specified number of pixels. If you look carefully, you'll see that less of the lady's torso is visible in the image.
  • Because the image dimensions remain the same, there's no rounding to multiples of 64.
  • Attempting to outpaint larger areas will frequently give rise to ugly ghosting effects.
  • For best results, try increasing the step number.
  • If you don't specify a pixel value in -D, it will default to half of the whole image, which is likely not what you want.

!!! tip

Neither `outpaint` nor `outcrop` are perfect, but we continue to tune
and improve them. If one doesn't work, try the other. You may also
wish to experiment with other `img2img` arguments, such as `-C`, `-f`
and `-s`.