2 분 소요

Stable Diffusion (스테이블 디퓨전)

  • 스테이블 디퓨전 : 안정적인 확산

  • 원리 : 이미지에 노이즈를 주고 이를 다시 원상 복구하는 diffusion 모델을 활용. 이미지와 설명으로 학습된 데이터는 여러 차원의 latent space에 존재한다. 이를 노이즈화된 이미지와 사용자의 텍스트 프롬프트를 주면 특정 공간에 있는 이미지를 찾아가는 방식

 

image.png

 

stability.ai 라는 스타트업에서 만든 텍스트에서 이미지를 만들어주는 인공지능으로 무료로 사용가능하다.

 

여기서는 코랩으로 Stable Diffusion을 간단히 사용하는 방법을 알아보고 Stable Diffusion으로 만들어진 다른 딥러닝 모델도 사용해본다.

(중요) 코랩은 GPU로 설정할 것!

 

패키지 설치

!pip install --upgrade -qq git+https://github.com/huggingface/diffusers.git transformers accelerate

 

stable-diffusion-v1-4 모델

모델 불러오기

import torch
from diffusers import StableDiffusionPipeline

# make sure you're logged in with `huggingface-cli login`
pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4", revision="fp16", torch_dtype=torch.float16)
pipe = pipe.to("cuda")

 

이미지 생성

prompt(프롬프트): 이미지를 생성하기 위한 텍스트

prompt = "a photograph of an astronaut riding a horse"
image = pipe(prompt).images[0]  # image here is in [PIL format](https://pillow.readthedocs.io/en/stable/)

image.save(f"astronaut_rides_horse.png")

# or if you're in a google colab you can directly display it with 
image

image.png

 

이미지 여러개 생성

from PIL import Image

def image_grid(imgs, rows, cols):
    assert len(imgs) == rows*cols

    w, h = imgs[0].size
    grid = Image.new('RGB', size=(cols*w, rows*h))
    grid_w, grid_h = grid.size
    
    for i, img in enumerate(imgs):
        grid.paste(img, box=(i%cols*w, i//cols*h))
    return grid
num_images = 3
prompt = ["a photograph of an astronaut riding a horse"] * num_images

images = pipe(prompt).images

grid = image_grid(images, rows=1, cols=3)
grid

image.png

 

이미지 생성 가이드

  • prompt: 이미지를 생성하기 위한 텍스트

  • negative_prompt : 이미지에 묘사되지 말아야 하는 텍스트

  • seed : 시드에 따라 다양한 이미지 생성 (같은 프롬프트여도 시드가 다르면 이미지가 조금 달라짐)

  • num_inference_steps : 추론 단계의 수, 일반적으로 사용하는 단계가 많을수록 품질이 좋아지지만 단계가 많을수록 생성 시간이 길어진다. (기본=50)

  • guidance_scale : 프롬프트에 비슷한 정도, 보통 7~15를 씀, 너무 올리면 깨기도 함

  • gfpgan : 얼굴 보정

 

anything-v3.0 모델

모델 불러오기

from diffusers import StableDiffusionPipeline, DDIMScheduler
import torch

model_id = "Linaqruf/anything-v3.0"
branch_name= "diffusers"

pipe = StableDiffusionPipeline.from_pretrained(
    model_id,
    revision=branch_name,
    torch_dtype=torch.float16)
pipe = pipe.to("cuda")
# NSFW filter disabling
def dummy(images, **kwargs): return images, False 
pipe.safety_checker = dummy
prompt_list = [
    '1girl',
    'blonde hair',
    'long hair',
    'beautiful eyes',
    '((extremely delicate and beautiful girl))',
    '((santa costumes))',
    '((santa hat))',
    '((snowflakes))',
    'colorful',
    'night',
    'lighting',
    'masterpiece',
    'best quality',
    'CG',
    'wallpaper',
    'HDR',
    'high quality',
    'high definition',
    'extremely detailed',
    'looking at viewer',
]

negative_prompt_list = [
    'lowres',
    '(bad anatomy, bad hands:1.1)',
    'text',
    'error',
    'missing fingers',
    'extra digit',
    'fewer digits',
    'cropped',
    'worst quality',
    'low quality',
    'normal quality',
    'jpeg artifacts',
    'signature',
    'watermark',
    'username',
    'blurry',
    'artist name',
    'b&w',
    'weird colors',
    '(cartoon, 3d, bad art, poorly drawn, close up, blurry:1.5)',
    '(disfigured, deformed, extra limbs:1.5)'
]

seed = 42

num_inference_steps = 50 # 25
guidance_scale = 12 # 7.5
width = 768
height = 512

prompt = ', '.join(prompt_list)
negative_prompt = ', '.join(negative_prompt_list)

image = pipe(
    prompt,
    negative_prompt = negative_prompt,
    num_inference_steps = num_inference_steps,
    guidance_scale = guidance_scale,
    width = width,
    height = height,
    generator = torch.Generator('cuda').manual_seed(seed) if seed != 0 else None
).images[0]

image

image.png

prompt = "blue hair, office_lady, ponytail"

image = pipe(
    prompt,
    negative_prompt = negative_prompt,
    num_inference_steps = num_inference_steps,
    guidance_scale = guidance_scale,
    width = width,
    height = height,
    generator = torch.Generator('cuda').manual_seed(seed) if seed != 0 else None
).images[0]

image

image.png

태그:

카테고리:

업데이트:

댓글남기기