Section 01객체 편집·스타일 전이
Stable Diffusion은 이미지를 생성할 뿐 아니라 편집하고, 한 이미지의 스타일을 다른 이미지로 전이할 수 있다. 그 과정을 떠받치는 세 도구가 있다.
CLIPSeg — CLIP 기반 이미지 분할. 텍스트 프롬프트나 참조 이미지로 이미지를 분할한다. 대량 레이블 데이터가 필요한 전통적 분할 모델과 달리, 학습 데이터가 거의 없어도 인상적인 결과를 낸다. "이 그림의 배경" 같은 설명을 주면 대상 객체의 마스크를 돌려준다.
Rembg — 이미지 배경을 완벽하게 제거하는 도구.
IP-Adapter — 한 이미지에서 다른 이미지로 스타일을 전이한다.
from transformers import CLIPSegProcessor, CLIPSegForImageSegmentation processor = CLIPSegProcessor.from_pretrained( "CIDAS/clipseg-rd64-refined") model = CLIPSegForImageSegmentation.from_pretrained( "CIDAS/clipseg-rd64-refined") # 모델은 logits 를 반환 — torch.sigmoid() 로 그레이스케일 마스크 생성
Section 02PNG에 새기는 생성 데이터
이미지로 돌아와 개선하거나 같은 프롬프트로 새 이미지를 만들려는데, 정확한 프롬프트·추론 단계·가이던스 스케일을 찾을 수 없다면? 해법은 생성 메타데이터를 이미지 파일에 함께 저장하는 것이다. PNG 형식이 이를 가능하게 한다.
PNG는 무손실 압축의 래스터 형식이다. 파일은 8바이트 서명(89 50 4E 47 0D 0A 1A 0A)과 일련의 청크로 구성된다. 각 청크는 길이(4B)·유형(4B, IHDR·IDAT·tEXt 등)·데이터(가변)·CRC(4B)로 이루어진다.
이 구조 덕분에 기존 디코더와의 호환성을 깨지 않고 새 청크 유형을 추가할 수 있다 — 이미지에 거의 무제한의 메타데이터를 삽입할 수 있다. tEXt 청크에 생성 매개변수를 JSON으로 새겨두면, 나중에 그대로 추출해 재현할 수 있다.
Section 03Gradio 웹 UI
지금까지는 Jupyter Notebook과 Python 코드만 썼다. 비기술 사용자가 써 보게 하려면 대화형 UI가 필요하다. Gradio는 머신러닝 모델을 위한 아름다운 웹 인터페이스를 쉽게 만드는 Python 라이브러리다. A1111 Stable Diffusion WebUI도 Gradio를 쓴다.
import gradio as gr def generate(prompt): return pipe(prompt).images[0] demo = gr.Interface( fn = generate, inputs = gr.Textbox(label="Prompt"), outputs = gr.Image() ) demo.launch()
| 특성 | 설명 |
|---|---|
| 사용하기 쉬움 | 몇 줄의 코드로 대화형 웹 인터페이스 생성 |
| 유연함 | 간단한 슬라이더부터 복잡한 챗봇까지 |
| 확장 가능 | 모양과 기능을 자유롭게 커스터마이즈 |
| 오픈소스 | 프로젝트에 기여하거나 자유롭게 사용 |
Gradio의 독특한 점은 인터페이스를 Python 노트북에 임베드하거나 독립 웹 페이지로 표시할 수 있다는 것이다. gr.Blocks로 입력·출력·진행 표시줄을 조합해 완전한 Stable Diffusion WebUI를 구축할 수 있다.
Section 04LoRA 전이 학습
모델을 커스터마이즈하는 길은 여럿이다 — UNet 전체 잠금 해제, Textual Inversion 학습, UNet을 잠그고 LoRA 학습, ControlNet 학습, adapter 학습. 책은 샘플 코드를 나열하는 대신, 학습의 핵심 개념을 짚는다 — 그러면 어떤 저장소의 코드든 읽고 직접 쓸 수 있다.
for epoch in range(num_epochs): for i, x in enumerate(x_input): y_pred = model(x) # forward loss = loss_fn(y_pred, y_output[i]) # loss 계산 optimizer.zero_grad() # gradient 초기화 loss.backward() # backward — gradient 계산 optimizer.step() # 매개변수 갱신
optimizer.zero_grad()는 backward pass에서 계산된 gradient를 0으로 재설정한다. 이것을 빠뜨리면 gradient 값이 샘플 사이로 이월되어 학습이 망가진다. 단순한 단일 레이어 모델도 SD LoRA 훈련에 필요한 모든 요소 — forward, loss, backward, step — 를 그대로 담고 있다. 여러 GPU 훈련에는 Hugging Face의 Accelerate를, LoRA 매개변수 구성에는 PEFT를 쓴다.
Section 05Stable Diffusion 너머
2016년 AlphaGo가 이세돌을 이겼을 때, 그것은 이정표였다. 하지만 AlphaGo는 바둑에 특화돼 있어 다른 도메인으로 지식을 전이하지 못했고, 왜 그런 결정을 내렸는지 설명하기 어려웠다. CNN 기반 이미지 분류 모델과 같은 한계 — 미리 정의된 데이터셋의 범위 안에서만 작동한다.
2017년 "Attention Is All You Need"의 Transformer가 판을 바꿨다. 미리 정의된 레이블 없이, 다음 토큰 자체가 학습 레이블이 된다. 데이터에 존재하는 패턴을 명시적 안내 없이 학습한다. Stable Diffusion도 UNet 안에 attention을 통합해, 데이터 범위의 제한 없이 모든 이미지-캡션 쌍을 학습에 쓸 수 있다.