Section 01업스케일 용어
Stable Diffusion이 만든 초기 창작물은 아직 최고 품질이 아닐 수 있다. 이미지를 향상하고 해상도를 키우기 전에, 세 가지 관련 용어를 구분해야 한다.
| 용어 | 방식 |
|---|---|
| 이미지 보간 | 기존 픽셀로 새 픽셀 값을 근사 — 최근접 이웃, 이중선형, 쌍삼차, Lanczos |
| 이미지 업스케일 | 해상도를 키우는 모든 기술을 포괄하는 넓은 용어 |
| 이미지 초해상도 | 딥러닝으로 고주파 패턴을 학습해, 품질 손실·아티팩트를 최소화하며 향상 |
초해상도 솔루션은 크게 세 부류다 — ESRGAN 같은 GAN 기반, SwinIR 같은 Swin Transformer 기반, 그리고 Stable Diffusion 기반. 이 장은 SD 업스케일러에 집중한다. SD는 프롬프트로 초해상도 과정을 지시하며 추가 디테일을 채울 수 있기 때문이다.
Section 02img2img 초해상도
Stable Diffusion은 텍스트만이 아니라 이미지를 시작점으로 쓸 수 있다. 노이즈 제거 강도(denoising strength)를 0.3 같은 낮은 값으로 두면, 초기 이미지의 특징과 스타일이 최종 결과에 유지된다. 이 속성을 이용해 SD를 업스케일러로 쓴다.
text2img_pipe = StableDiffusionPipeline.from_pretrained(
"stablediffusionapi/deliberate-v2",
torch_dtype = torch.float16).to("cuda:0")
raw_image = text2img_pipe(
prompt = "a realistic photo of beautiful woman face",
negative_prompt = "NSFW, bad anatomy",
height = 256, width = 256,
generator = torch.Generator("cuda").manual_seed(3)
).images[0]
Section 03ControlNet이란
ControlNet은 추가 조건으로 디퓨전 모델을 제어하는 신경망 플러그인이다. 2023년 Lvmin Zhang과 Maneesh Agrawala의 논문 "Adding Conditional Control to Text-to-Image Diffusion Models"에서 소개됐다.
"제어"라는 면에서 Textual Inversion·LoRA·img2img를 떠올릴 수 있지만, ControlNet을 다르게 만드는 것은 UNet 디퓨전 과정에서 직접 작동한다는 점이다.
| 방법 | 작동 단계 | 사용 시나리오 |
|---|---|---|
| Textual Embedding | 텍스트 인코더 | 새 스타일·개념·얼굴 추가 |
| LoRA | UNet·CLIP 가중치 병합 | 스타일·개념 집합 추가 |
| Image-to-Image | 초기 latent 제공 | 이미지 수정·스타일 추가 |
| ControlNet | UNet과 함께 노이즈 제거에 참여 | 형태·포즈·콘텐츠 세부 제어 |
Section 04ControlNet 사용법
전형적인 흐름은 이렇다 — SD로 이미지를 생성하고, 객체의 Canny 윤곽을 추출한 뒤, ControlNet의 도움으로 그 윤곽을 따라 새 이미지를 만든다. Canny는 1986년 John F. Canny가 개발한 엣지 감지 알고리즘이다.
from controlnet_aux import CannyDetector from diffusers import ControlNetModel, StableDiffusionControlNetPipeline canny = CannyDetector() image_canny = canny(image, 30, 100) # 하한·상한 임계값 canny_controlnet = ControlNetModel.from_pretrained( 'takuma104/control_v11', subfolder='control_v11p_sd15_canny', torch_dtype=torch.float16) cn_pipe = StableDiffusionControlNetPipeline.from_pretrained( "stablediffusionapi/deliberate-v2", torch_dtype = torch.float16, controlnet = canny_controlnet).to("cuda")
controlnet_conditioning_scale=[0.5, 0.5]처럼 각 모델에 스케일을 준다. 스케일 합이 2를 넘지 않도록 한다. 너무 높으면 원하지 않는 이미지가 나온다. SD v1.5용 ControlNet은 canny·depth·openpose·tile 등 14종, SDXL용도 별도로 제공된다.
Section 05zero convolution
ControlNet은 신경망 블록에 추가 조건을 주입해 작동한다. 학습 단계에서 대상 UNet 블록의 학습 가능한 복사본(trainable copy)을 ControlNet 블록으로 가져온다. 가우시안으로 초기화하는 일반 신경망과 달리, ControlNet은 SD 기본 모델의 사전 학습 가중치를 활용한다. 기본 모델 매개변수 대부분은 동결되고, 추가된 ControlNet 구성 요소만 처음부터 학습된다.
∂y/∂w = x · ∂y/∂x = w · ∂y/∂b = 1