AI 기초가 부족한 비전공자라면? 유일한 아이펠만의 눈높이별 과정 선택
#인공지능 

Stable Diffusion 활용 이미지 생성 팁

Stable Diffusion은 강력한 텍스트-이미지 생성 AI 모델입니다.몇 가지 팁을 알아두면 Stable Diffusion 모델의 성능을 효과적으로 최대한 이끌어낼 수 있습니다. 어떤 팁 들이 있는 지 함께 살펴보겠습니다.

2024-03-27 | 김정은

Stable Diffusion은 강력한 텍스트-이미지 생성 AI 모델입니다.
몇 가지 팁을 알아두면 Stable Diffusion 모델의 성능을 효과적으로 최대한 이끌어낼 수 있습니다.
프롬프트 엔지니어링과 전략적 기법을 통해 독창적이고 품질 높은 이미지를 생성할 수 있습니다.
어떤 팁 들이 있는 지 함께 살펴보겠습니다.

Stable Diffusion 활용 팁 

1. 프롬프트 엔지니어링 기술 활용하기

  • 자세하고 구체적인 프롬프트를 작성하는 것이 중요
  • 맨 앞에 위치한 단어 순으로 중요도가 높음
  • break는 이미지 생성 과정을 일시 중지하고 현재까지의 진행 상황을 확인할 수 있게 해주는 기능.
    특정 스텝에서 중간 결과를 출력하거나, 생성 과정에 개입하여 새로운 조건을 추가할 수 있음
  • 주요 피사체, 스타일, 컨셉 등을 포함시켜 프롬프트 작성
  • 예: “고대 그리스 신화에 등장하는 페가수스를 아크릴 회화 스타일로 그린 그림”

import torch
from diffusers import StableDiffusionPipeline

# 모델 로드 - 사전 학습된 Stable Diffusion 모델을 로드합니다.
pipe = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")

# 프롬프트 설정
prompt = "고대 그리스 신화에 등장하는 페가수스를 아크릴 회화 스타일로 그린 그림"
negative_prompt = "낙서, 과장된"

# 이미지 생성 - 프롬프트와 부정적 프롬프트를 사용하여 이미지를 생성합니다.
image = pipe(prompt, negative_prompt=negative_prompt)[:1]

# break 지점 설정 image.cuda_break(10) # 10번째 스텝에서 중간 결과 출력

# 프롬프트 피드백을 통한 개선 - 새로운 프롬프트로 이미지를 재생성하여 프롬프트 엔지니어링 효과를 봅니다.
new_prompt = "긴 목, 날개 달린 말, 구름 배경의 아크릴 회화 스타일 페가수스 그림"
new_image = pipe(new_prompt, negative_prompt=negative_prompt)[:1]

2. 이미지 가중치 전략

  • 기존 이미지의 일부 영역을 강조하여 새로운 이미지 생성 가능
  • 가중치 매개변수를 통해 해당 영역에 집중하도록 설정
  • (단어) 괄호 한 개는 1.2의 가중치, 괄호 세 개까지 쓸 수 있으며 세 개의 괄호는 1.6의 가중치를 가짐
  • (단어 : 가중치) 로 가중치 범위 설정 가능
  •  – 0.1부터 2까지의 범위 내에서 가중치로 설정 가능
  • 예: 배경은 유지하되 피사체의 모습을 바꾸거나 디테일 강화

import cv2
import numpy as np

# 초기 이미지 로드
init_image = cv2.imread("abstract_image.jpg")

# 관심 영역 마스크 생성
mask = np.zeros_like(init_image) # 이미지 크기 0 마스크
x, y, r = 200, 200, 100 # 마스크 중심 좌표(x, y), 반지름(r)
cv2.circle(mask, (x, y), r, (1, 1, 1), -1) # 마스크에 흰색 원
# 초기 이미지와 동일한 크기의 0 마스크를 만들고, 지정한 위치에 흰색 원을 그립니다.

# 프롬프트 설정
prompt = "분홍색 장미 한 송이"

# 이미지 생성 (영역 가중치 적용)
# 프롬프트, 초기 이미지, 마스크 이미지를 사용하여 새로운 이미지를 생성합니다.
pipe = ...
new_image = pipe(prompt, init_image=init_image, mask_image=mask)[:1]

image_prompt = init_image | mask
new_image = pipe(prompt, image_prompt)[:1]
# 버티컬 배트(|)를 사용하여 텍스트 프롬프트와 이미지 프롬프트를 구분합니다.

3. 부정적 프롬프트 활용

  • 원치 않는 결과를 방지하기 위해 부정적 키워드 추가
  • 예: “불분명한, 흐린, 낙서, 과장된”

# 프롬프트와 부정적 프롬프트를 사용하여 이미지를 생성합니다.
# 부정적 프롬프트는 원치 않는 결과를 방지합니다.
prompt = "해질녘 평화로운 호수 풍경"
negative_prompt = "흐림, 번짐, 깨짐, 과장"

# 이미지 생성
pipe = ...
image = pipe(prompt, negative_prompt=negative_prompt)[:1]

4. 초기 시드값 설정

  • 초기 시드값을 지정하여 일관된 스타일의 이미지 생성 가능
  • 시드값 고정 후 파라미터를 조정하며 원하는 결과 탐색

# 프롬프트 설정
prompt = "판타지 스타일의 중세 기사 초상화"

# 초기 시드값을 지정하여 일관된 스타일의 이미지를 생성할 수 있습니다.
seed = 12345
generator = torch.manual_seed(seed)

# 이미지 생성
pipe = ...
image1 = pipe(prompt, generator=generator, cfg_scale=7.0)[:1]

# 같은 시드값을 사용하되, cfg_scale 하이퍼파라미터 값을 변경하여 이미지를 다시 생성합니다.
image2 = pipe(prompt, generator=generator, cfg_scale=10.0)[:1]

5. 체인 프롬프트 및 반복적 프롬프팅

  • 단계별로 프롬프트를 구성하여 복잡한 이미지 생성
  • 생성된 이미지를 기반으로 피드백 및 새 프롬프트 제공

체인프롬프트에 대해서 더 알고 싶으신 분들은 이 글을 참고해주세요!

6. 모델 하이퍼파라미터 튜닝

  • 다양한 하이퍼파라미터 값을 테스트하며 결과 개선
  • 예: CFG* 스케일, 단계 수, 샘플러 등

*CFG는 Classifier Free Guidance의 약자로, Stable Diffusion 모델에서 생성된 이미지의 품질과 다양성을 조절하기 위해 사용되는 하이퍼파라미터입니다.
CFG 스케일 값이 높을수록 모델은 프롬프트에 더 의존하여 이미지를 생성하게 됩니다. 다시 말해, 프롬프트와 관련 있는 부분은 강조되고 그렇지 않은 부분은 약화됩니다.
반대로 CFG 값이 낮으면 모델이 프롬프트에 크게 의존하지 않고 더 다양하고 창의적인 이미지를 생성합니다.

이렇게 실제 Python 코드 예시를 추가하여 각 Stable Diffusion 활용 팁을 구체적으로 구현하는 방법을 보여줄 수 있습니다.
코드에는 diffusers 라이브러리와 OpenCV 등 필요한 패키지를 import하고, StableDiffusionPipeline을 로드하는 과정부터 상세히 다루었습니다.
위의 코드를 참고하여 직접 실습해볼 수 있으니 시도해보시는건 어떨까요? 감사합니다.