ControlNet
ControlNet은 텍스트-이미지 확산 모델에 공간 제어 기능을 추가하여 에지 맵, 깊이 맵, 포즈 스켈레톤으로 레이아웃을 조정합니다. 작동 방식과 코드를 알아봅니다.
ControlNet은 Stable Diffusion과 같은 사전 학습 텍스트-이미지 디퓨전 모델에 공간 제어 기능을 추가하는 신경망 아키텍처입니다. 텍스트 프롬프트와 함께 에지 맵, 깊이 맵, 사람 자세 스켈레톤, 분할 맵 같은 조건 이미지를 입력받습니다. 생성된 이미지는 해당 구조를 따르고 프롬프트는 콘텐츠와 스타일을 결정합니다. 예를 들어 "은색 갑옷을 입은 기사"라는 프롬프트에 자세 스켈레톤을 결합하면 정확히 해당 자세를 취한 기사가 생성됩니다. Stanford University의 Lvmin Zhang, Anyi Rao, Maneesh Agrawala는 2023년 텍스트-이미지 디퓨전 모델에 조건부 제어 추가에서 ControlNet을 소개했으며, 이 논문은 ICCV 2023 최우수 논문상인 Marr Prize를 공동 수상했습니다. 기본 모델의 가중치를 고정하므로 ControlNet은 모델이 이미 학습한 내용을 손상하지 않고 제어 기능을 추가합니다.
ControlNet 작동 방식#
Stable Diffusion은 잠재 표현의 노이즈를 제거하는 과정을 반복해 U-Net으로 이미지를 생성합니다. ControlNet은 U-Net을 고정하고 인코더의 학습 가능한 복사본을 만듭니다. 이 복사본에는 12개의 인코딩 블록과 중간 블록이 포함됩니다. 먼저 소형 합성곱 네트워크가 512×512 조건 이미지를 잠재 표현에 맞는 64×64 특징 맵으로 변환합니다. 학습 가능한 복사본은 잠재 표현과 조건 특징을 함께 처리하며, 출력을 고정된 U-Net의 12개 스킵 연결과 중간 블록에 더합니다. 그 결과 고정된 디코더가 제어 신호를 받습니다.
복사본은 영점 합성곱을 통해서만 고정된 모델에 연결됩니다. 영점 합성곱은 가중치와 편향이 0에서 시작하는 1×1 합성곱입니다. 첫 번째 학습 단계에서 영점 합성곱은 0을 출력하므로 결합된 모델은 원본 모델과 정확히 동일하게 동작하며 사전 학습 레이어에 무작위 노이즈가 전달되지 않습니다. 출력 영점 합성곱은 입력이 0이 아니기 때문에 0이 아닌 가중치 그래디언트를 받습니다. 따라서 첫 번째 업데이트에서 값이 0에서 벗어나고 제어 신호가 그때부터 커집니다. 다음 PyTorch 코드에 블록 하나가 나와 있습니다.
import copy
import torch
from torch import nn
# A frozen block from the pretrained model and a trainable copy of it
torch.manual_seed(0)
locked = nn.Conv2d(64, 64, 3, padding=1).requires_grad_(False)
trainable = copy.deepcopy(locked).requires_grad_(True)
# Zero convolutions: 1x1 convolutions whose weights and biases start at zero
zero_in, zero_out = nn.Conv2d(64, 64, 1), nn.Conv2d(64, 64, 1)
for conv in (zero_in, zero_out):
nn.init.zeros_(conv.weight)
nn.init.zeros_(conv.bias)
x = torch.randn(1, 64, 32, 32) # features entering the block
condition = torch.randn(1, 64, 32, 32) # encoded edge, depth, or pose map
y = locked(x) + zero_out(trainable(x + zero_in(condition)))
# At step 0 the output equals the frozen block's, and only the outer zero conv gets a gradient
print(torch.equal(y, locked(x)))
y.sum().backward()
print(f"zero_in grad: {zero_in.weight.grad.norm():.1f}, zero_out grad: {zero_out.weight.grad.norm():.1f}")True과 zero_in grad: 0.0, zero_out grad: 2040.6을 출력합니다. 블록의 출력은 고정된 모델의 출력과 동일하고, 입력이 0이 아니므로 바깥쪽 영점 합성곱은 그래디언트를 받으며, 바깥쪽 합성곱이 0에서 벗어나면 안쪽 합성곱도 학습을 시작합니다.
조건 유형#
원 논문에서는 Canny 에지, 깊이 맵, 표면 법선 맵, M-LSD 직선, HED 소프트 에지, ADE20K 분할 맵, OpenPose 사람 자세, 사용자 스케치에 각각 별도의 ControlNet을 학습했습니다. 각 조건 이미지는 참조 사진에 사전 구축 모델을 적용해 추출합니다. 예를 들어 OpenCV의 Canny 에지 검출기나 깊이 추정 네트워크를 사용할 수 있으며, 각각 고유한 강도를 지정해 여러 ControlNet을 동시에 적용할 수 있습니다. Ultralytics YOLO26 자세 추정 모델은 이러한 자세 조건을 추출하며, 사람마다 COCO 키포인트 17개를 예측하여 빈 캔버스에 스켈레톤으로 그릴 수 있습니다.
import cv2
import numpy as np
from ultralytics import YOLO
# 사람마다 키포인트 17개를 예측하는 YOLO26 자세 모델을 불러옵니다
model = YOLO("yolo26n-pose.pt")
results = model("https://ultralytics.com/images/bus.jpg")
result = results[0]
# 사진 크기의 검은색 캔버스에 스켈레톤만 그립니다
skeletons = result.plot(img=np.zeros_like(result.orig_img), boxes=False)
cv2.imwrite("pose_condition.png", skeletons)저장된 이미지에는 각 사람의 팔다리가 검은 배경 위에 색 선으로 표시되며, 사진의 색상, 질감, 배경은 제거됩니다.
ControlNet과 관련 방법 비교#
- LoRA: 소량의 가중치를 추가해 파인튜닝함으로써 모델에 새로운 스타일, 캐릭터, 객체를 학습시킵니다. LoRA는 모델이 그리는 대상을 바꾸고 ControlNet은 대상의 위치를 고정하므로 두 기법을 함께 사용하는 경우가 많습니다.
- T2I-Adapter: 약 7,700만 개의 파라미터를 사용하는 더 가벼운 대안으로, 인코더 전체 복사본을 실행하는 대신 고정된 U-Net의 인코더 특징에 조건 특징을 추가합니다. 생성 시 서로 다른 조건용 어댑터를 결합할 수 있습니다.
- 이미지-이미지 생성: 입력 사진을 노이즈 처리한 복사본에서 노이즈 제거를 시작하므로 출력에 해당 사진의 색상과 대략적인 배치가 반영됩니다. ControlNet은 에지와 같이 추출된 구조만 제약하고 색상과 질감은 프롬프트에 맡깁니다.
- 이미지 인페인팅: 이미지의 마스크된 부분을 나머지 영역에 맞게 다시 생성합니다. 인페인팅은 바뀌는 영역을 제어하고 ControlNet은 생성되는 내용의 구조를 제어합니다.
실제 적용 사례#
- 아키텍처 및 인테리어 디자인: 방의 스케치, CAD 선 도면, M-LSD 선 맵을 사용하면 동일한 기하 구조를 유지하면서 다양한 소재와 스타일의 사실적인 렌더링을 생성할 수 있습니다.
- 캐릭터 아트 및 애니메이션: 자세 스켈레톤을 사용하면 스타일이 달라져도 캐릭터의 자세가 고정되며, 참조 비디오에서 추출한 프레임별 자세는 일관된 애니메이션 시퀀스를 생성하는 데 사용됩니다.
- 제품 및 마케팅 이미지: 제품 사진의 깊이 맵이나 에지 맵은 형태와 배치를 유지하면서 프롬프트에 따라 배경, 조명, 주변 환경을 바꿉니다.
- 합성 데이터: 분할 맵이나 자세로 이미지를 생성하면 레이아웃을 생성 전에 지정했기 때문에 레이블을 미리 알 수 있는 새 학습 이미지를 만들 수 있습니다.
ControlNet 학습#
학습에는 이미지 쌍과 조건 맵이 필요하며, 캡션이 포함된 이미지 데이터셋에 조건 추출기를 적용해 자동으로 생성할 수 있습니다. 고정된 가중치는 그래디언트 업데이트가 필요하지 않으므로 ControlNet 학습의 각 반복에는 ControlNet 없이 Stable Diffusion을 최적화할 때보다 GPU 메모리가 약 23% 더 필요하고 시간이 34% 더 걸립니다. 논문에서는 이미지가 50,000장 미만인 데이터셋부터 100만 장이 넘는 데이터셋까지 안정적으로 학습할 수 있다고 보고합니다. 학습 중에는 "급격한 수렴"도 나타납니다. 모델이 수천 단계 동안 조건을 무시하다가 갑자기 조건을 따르기 시작하며, 보통 10,000회 이내의 최적화 단계에서 발생합니다. 논문 사례에서는 6,133단계에서 나타났습니다.










