ControlNet이란?
ControlNet은 Stable Diffusion에 추가적인 조건 입력을 제공하여 이미지 생성을 정밀하게 제어하는 기술입니다. 텍스트 프롬프트만으로는 어려운 구도, 포즈, 구조를 입력 이미지로 지정할 수 있어, 디자이너와 아티스트에게 강력한 도구가 됩니다.
ControlNet 모델 종류
| 모델 | 입력 | 용도 |
|---|---|---|
| Canny | 엣지 맵 | 윤곽선 유지 |
| OpenPose | 포즈 스켈레톤 | 인체 포즈 지정 |
| Depth | 깊이 맵 | 3D 구조 유지 |
| Scribble | 손그림 스케치 | 러프 스케치 → 완성 |
| Seg | 세그멘테이션 맵 | 영역별 내용 지정 |
| Lineart | 라인아트 | 일러스트 채색 |
| IP-Adapter | 참조 이미지 | 스타일/캐릭터 일관성 |
Python API로 ControlNet 사용
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel
from diffusers import UniPCMultistepScheduler
import torch
from PIL import Image
import cv2
import numpy as np
# Canny 엣지 감지
def get_canny_image(image_path, low=100, high=200):
image = cv2.imread(image_path)
image = cv2.Canny(image, low, high)
image = Image.fromarray(image)
return image
# ControlNet 모델 로드
controlnet = ControlNetModel.from_pretrained(
"lllyasviel/sd-controlnet-canny",
torch_dtype=torch.float16
)
# 파이프라인 구성
pipe = StableDiffusionControlNetPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
controlnet=controlnet,
torch_dtype=torch.float16
).to("cuda")
pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config)
pipe.enable_model_cpu_offload()
# 이미지 생성
canny_image = get_canny_image("input.jpg")
result = pipe(
prompt="a beautiful modern house, architectural photography, 4k, detailed",
negative_prompt="blurry, low quality, distorted",
image=canny_image,
num_inference_steps=30,
controlnet_conditioning_scale=0.8,
guidance_scale=7.5,
).images[0]
result.save("output.jpg")
Multi-ControlNet: 여러 조건 동시 적용
from diffusers import ControlNetModel, StableDiffusionControlNetPipeline
controlnets = [
ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-openpose", torch_dtype=torch.float16),
ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-depth", torch_dtype=torch.float16),
]
pipe = StableDiffusionControlNetPipeline.from_pretrained(
"runwayml/stable-diffusion-v1-5",
controlnet=controlnets,
torch_dtype=torch.float16
).to("cuda")
result = pipe(
prompt="anime girl in a garden, masterpiece",
image=[pose_image, depth_image],
controlnet_conditioning_scale=[1.0, 0.5],
num_inference_steps=30,
).images[0]
WebUI에서 ControlNet 활용 팁
controlnet_conditioning_scale을 0.5~0.8로 설정하면 자연스럽고, 1.0은 엄격한 제어입니다- Preprocessor와 Model이 일치해야 합니다 (Canny preprocessor + Canny model)
- Multi-ControlNet으로 포즈 + 깊이를 동시 적용하면 정확도가 크게 향상됩니다
- Control Mode의 Balanced/My prompt/ControlNet 설정으로 프롬프트와 제어 이미지의 우선순위를 조절합니다
- SDXL용 ControlNet은
diffusers/controlnet-canny-sdxl-1.0등 별도 모델을 사용합니다
댓글 0