Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

mooni

[생성형 AI] Stable Diffusion 모델로 이미지 생성하기 본문

AI.ML

[생성형 AI] Stable Diffusion 모델로 이미지 생성하기

mooni_ 2025. 3. 24. 22:03

 

* 생성형 AI란 무엇인가?

생성형 AI는 기존 데이터의 분포를 학습하여 새로운 데이터를 생성하는 기술

인공지능 모델은 크게 판별형(Discriminative)생성형(Generative)으로 구분할 수 있다.

판별형 모델은 주어진 입력 데이터를 분류하거나 예측하는 데 중점을 두는 반면, 생성형 모델은 새로운 데이터를 생성하는 데 목적이 있다.

 

* 판별형 AI의 예

판별형 모델은 입력이 어떤 클래스에 속하는지를 판단한다. 예를 들어, 고양이와 강아지의 사진을 학습한 모델에 새로운 사진을 입력하면, 이 사진이 고양이인지 강아지인지를 판별해준다. 대표적인 알고리즘으로는 로지스틱 회귀, 서포트 벡터 머신(SVM), 분류형 신경망 등이 있다.

 

* 생성형 AI의 예

생성형 모델은 “고양이가 우주복을 입고 있는 장면”이라는 문장을 입력하면, 실제 존재하지 않던 그 이미지를 만들어낼 수 있다. 이처럼 생성형 AI는 기존 데이터를 학습하여 그 분포를 이해하고, 그와 유사한 새로운 데이터를 생성할 수 있는 능력을 갖추고 있다.

 


* Stable Diffusion의 작동 원리

Stable Diffusion은 대표적인 텍스트 기반 이미지 생성 모델로, 사용자가 입력한 문장(프롬프트)을 바탕으로 해당하는 이미지를 생성한다. 

 

* Diffusion 과정

  1. 랜덤한 노이즈 이미지 생성 : 모델은 무작위로 생성한 노이즈 이미지를 출발점으로 삼는다.
  2. 텍스트 인코딩 : 입력된 문장을 텍스트 인코더(CLIP 모델 등)를 통해 임베딩 벡터로 변환한다.
  3. 조건부 노이즈 제거 (U-Net) : 텍스트 임베딩을 조건으로 활용하여, 여러 단계에 걸쳐 노이즈를 점차 제거하며 이미지 형태로 복원한다. 이 과정에는 U-Net 기반 신경망이 사용된다.
  4. 이미지 디코딩 (VAE Decoder) : 노이즈 제거가 완료된 latent 이미지를 VAE(Variational Autoencoder) 디코더를 통해 실제 이미지로 변환한다.

 


0. 환경

* Colab에서 진행

* 런타임 유형 GPU로 변경 필수!

 

1. pip 라이브러리 설치

!pip install --quiet diffusers transformers accelerate safetensors deep-translator

 

 

2. 모델 불러와서 설정하기

# 모델 불러오기 및 설정
from diffusers import StableDiffusionPipeline
import torch

# GPU 사용 가능 여부 확인
device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"현재 디바이스: {device}")

# 사전학습된 Stable Diffusion 모델 로드
pipe = StableDiffusionPipeline.from_pretrained(
    "runwayml/stable-diffusion-v1-5",
    torch_dtype=torch.float16 if device == "cuda" else torch.float32,
)
pipe = pipe.to(device)

 

 

3. 텍스트 프롬프트로 이미지 생성하기

# 텍스트로 이미지 생성
from deep_translator import GoogleTranslator
from IPython.display import display

# 한국어 프롬프트 입력
kr_prompt = "바다와 모래사장, 실사화 스타일"
en_prompt = GoogleTranslator(source='ko', target='en').translate(kr_prompt)
print(f"번역된 프롬프트: {en_prompt}")

# 영어 프롬프트로 이미지 생성
image = pipe(en_prompt).images[0]

# 결과 이미지 출력
display(image)

 

 

4. 결과

왼쪽이 Input, 오른쪽이 output

 

 

5. 추가로

# 시드 고정
generator = torch.manual_seed(42)

# 영어 프롬프트로 이미지 생성
image = pipe(en_prompt, generator=generator).images[0]

# 결과 이미지 출력
display(image)

- seed를 고정해준다면 같은 프롬프트에 매번 같은 결과값을 받을 수 있다.