본문 바로가기
AI2024년 11월 10일6분 읽기

Stable Diffusion ControlNet으로 이미지 정밀 제어

YS
김영삼
조회 188

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

아직 댓글이 없습니다.
Ctrl+Enter로 등록