Buckets:

mishig's picture
|
download
raw
8.04 kB
# Outpainting
Outpainting, bir görüntüyü orijinal sınırlarının ötesine uzatarak, orijinal görüntüyü korurken görsel öğeleri eklemenize, değiştirmenize veya düzenlemenize olanak tanır. [Inpainting](../using-diffusers/inpaint)'de olduğu gibi, orijinal görüntüyü (siyah piksellerden oluşan bir maske ile temsil edilir) koruyarak beyaz alanı (bu durumda, orijinal görüntünün dışındaki alan) yeni görsel öğelerle doldurmak istersiniz. Outpainting için [ControlNet](https://hf.co/blog/OzzyGT/outpainting-controlnet) veya [Differential Diffusion](https://hf.co/blog/OzzyGT/outpainting-differential-diffusion) gibi birkaç yöntem bulunmaktadır.
Bu kılavuz, bir inpainting modeli, ControlNet ve ZoeDepth tahminleyicisi kullanarak outpainting yapmayı size gösterecektir.
Başlamadan önce, ZoeDepth tahmincisini kullanabilmek için [controlnet_aux](https://github.com/huggingface/controlnet_aux) kütüphanesinin yüklü olduğundan emin olun.
```py
!pip install -q controlnet_aux
```
## Görsel hazırlama
Önce [BRIA-RMBG-1.4](https://hf.co/spaces/briaai/BRIA-RMBG-1.4) gibi bir Space ile arka planı kaldırarak outpaint yapılacak bir görsel seçerek başlayın.
<iframe src="https://briaai-bria-rmbg-1-4.hf.space" frameborder="0" width="850" height="450"
>
Örneğin, bu ayakkabı çiftinin görselinden arka planı kaldırın.
orijinal görüntü
arka plan kaldırıldı
[Stable Diffusion XL (SDXL)](../api/pipelines/stable_diffusion/stable_diffusion_xl) modelleri 1024x1024 boyutundaki görsellerle en iyi sonucu verir, ancak donanımınızın bunu destekleyecek kadar belleğe sahip olması koşuluyla görseli herhangi bir boyuta yeniden boyutlandırabilirsiniz. Görseldeki şeffaf arka planın da beyaz bir arka planla değiştirilmesi gerekir. Görseli ölçekleyip beyaz bir arka plana yapıştıran bir fonksiyon (aşağıdaki gibi) oluşturun.
```py
import random
import requests
import torch
from controlnet_aux import ZoeDetector
from PIL import Image, ImageOps
from diffusers import (
AutoencoderKL,
ControlNetModel,
StableDiffusionXLControlNetPipeline,
StableDiffusionXLInpaintPipeline,
)
def scale_and_paste(original_image):
aspect_ratio = original_image.width / original_image.height
if original_image.width > original_image.height:
new_width = 1024
new_height = round(new_width / aspect_ratio)
else:
new_height = 1024
new_width = round(new_height * aspect_ratio)
resized_original = original_image.resize((new_width, new_height), Image.LANCZOS)
white_background = Image.new("RGBA", (1024, 1024), "white")
x = (1024 - new_width) // 2
y = (1024 - new_height) // 2
white_background.paste(resized_original, (x, y), resized_original)
return resized_original, white_background
original_image = Image.open(
requests.get(
"https://huggingface.co/datasets/stevhliu/testing-images/resolve/main/no-background-jordan.png",
stream=True,
).raw
).convert("RGBA")
resized_img, white_bg_image = scale_and_paste(original_image)
```
İstenmeyen ek detayların eklenmesini önlemek için, ayakkabıların orijinal görüntüyle tutarlı kalmasını sağlamak ve üretim sırasında ek yönlendirme sunmak üzere ZoeDepth tahmincisini kullanın.
```py
zoe = ZoeDetector.from_pretrained("lllyasviel/Annotators")
image_zoe = zoe(white_bg_image, detect_resolution=512, image_resolution=1024)
image_zoe
```
## Outpaint
Görsel hazır olduğunda, inpainting için eğitilmiş bir SDXL ControlNet olan [controlnet-inpaint-dreamer-sdxl](https://hf.co/destitech/controlnet-inpaint-dreamer-sdxl) ile ayakkabıların etrafındaki beyaz alanda içerik üretebilirsiniz.
Inpainting ControlNet, ZoeDepth modelini ve VAE'yi yükleyip bunları [StableDiffusionXLControlNetPipeline](/docs/diffusers/main/tr/api/pipelines/controlnet_sdxl#diffusers.StableDiffusionXLControlNetPipeline) nesnesine iletin. Ardından, başlangıç görselini outpaint etmek için isteğe bağlı bir `generate_image` fonksiyonu (kolaylık sağlamak amacıyla) oluşturabilirsiniz.
```py
controlnets = [
ControlNetModel.from_pretrained(
"destitech/controlnet-inpaint-dreamer-sdxl", dtype=torch.float16, variant="fp16"
),
ControlNetModel.from_pretrained(
"diffusers/controlnet-zoe-depth-sdxl-1.0", dtype=torch.float16
),
]
vae = AutoencoderKL.from_pretrained("madebyollin/sdxl-vae-fp16-fix", dtype=torch.float16).to("cuda") # or "mps", "xpu", "cpu"
pipeline = StableDiffusionXLControlNetPipeline.from_pretrained(
"SG161222/RealVisXL_V4.0", dtype=torch.float16, variant="fp16", controlnet=controlnets, vae=vae
).to("cuda")
def generate_image(prompt, negative_prompt, inpaint_image, zoe_image, seed: int = None):
if seed is None:
seed = random.randint(0, 2**32 - 1)
generator = torch.Generator(device="cpu").manual_seed(seed)
image = pipeline(
prompt,
negative_prompt=negative_prompt,
image=[inpaint_image, zoe_image],
guidance_scale=6.5,
num_inference_steps=25,
generator=generator,
controlnet_conditioning_scale=[0.5, 0.8],
control_guidance_end=[0.9, 0.6],
).images[0]
return image
prompt = "nike air jordans on a basketball court"
negative_prompt = ""
temp_image = generate_image(prompt, negative_prompt, white_bg_image, image_zoe, 908097)
```
Orijinal görüntüyü başlangıçtaki genişletilmiş (outpainted) görüntünün üzerine yapıştırın. Genişletilmiş arka planı sonraki bir adımda iyileştireceksiniz.
```py
x = (1024 - resized_img.width) // 2
y = (1024 - resized_img.height) // 2
temp_image.paste(resized_img, (x, y), resized_img)
temp_image
```
> [!TIP]
> Bellek azalıyorsa, biraz bellek boşaltmak için şimdi iyi bir zaman!
>
> ```py
> pipeline=None
> torch.cuda.empty_cache()
> ```
Şimdi elinizde başlangıç düzeyinde bir outpainting görseli var; daha iyi kalitede nihai outpainting görselini üretmek için [StableDiffusionXLInpaintPipeline](/docs/diffusers/main/tr/api/pipelines/stable_diffusion/stable_diffusion_xl#diffusers.StableDiffusionXLInpaintPipeline)'ı [RealVisXL](https://hf.co/SG161222/RealVisXL_V4.0) modeliyle yükleyin.
```py
pipeline = StableDiffusionXLInpaintPipeline.from_pretrained(
"OzzyGT/RealVisXL_V4.0_inpainting",
dtype=torch.float16,
variant="fp16",
vae=vae,
).to("cuda") # or "mps", "xpu", "cpu"
```
Son outpainting görüntüsü için bir maske hazırlayın. Orijinal görüntü ile outpainting arka planı arasında daha doğal bir geçiş oluşturmak için maskenin daha iyi birleşmesine yardımcı olmak üzere maskeyi bulanıklaştırın.
```py
mask = Image.new("L", temp_image.size)
mask.paste(resized_img.split()[3], (x, y))
mask = ImageOps.invert(mask)
final_mask = mask.point(lambda p: p > 128 and 255)
mask_blurred = pipeline.mask_processor.blur(final_mask, blur_factor=20)
mask_blurred
```
Daha iyi bir prompt oluşturun ve son outpainting görselini üretmek için `generate_outpaint` fonksiyonuna iletin. Tekrar, orijinal görseli son outpainting arka planının üzerine yapıştırın.
```py
def generate_outpaint(prompt, negative_prompt, image, mask, seed: int = None):
if seed is None:
seed = random.randint(0, 2**32 - 1)
generator = torch.Generator(device="cpu").manual_seed(seed)
image = pipeline(
prompt,
negative_prompt=negative_prompt,
image=image,
mask_image=mask,
guidance_scale=10.0,
strength=0.8,
num_inference_steps=30,
generator=generator,
).images[0]
return image
prompt = "high quality photo of nike air jordans on a basketball court, highly detailed"
negative_prompt = ""
final_image = generate_outpaint(prompt, negative_prompt, temp_image, mask_blurred, 7688778)
x = (1024 - resized_img.width) // 2
y = (1024 - resized_img.height) // 2
final_image.paste(resized_img, (x, y), resized_img)
final_image
```

Xet Storage Details

Size:
8.04 kB
·
Xet hash:
7860dc0ac95a7b051eefcb41a166a64075aeb87d41c51a3c112991ca7b8d7a2c

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.