3-2. ControlNet: 구도를 그림으로 지시하기
"오른팔을 들고 왼쪽을 본다"를 글로 쓰면 모델은 대충만 따른다. ControlNet은 글 대신 그림으로 지시한다. 뼈대 그림, 윤곽선, 깊이 지도를 주면 그 구조대로 그린다. 캐릭터의 자세를 통제하는 핵심 도구다.
프롬프트의 한계
프롬프트는 텍스트 인코더를 지나 벡터가 된다. 그 벡터는 "무엇을" 그릴지는 잘 전하지만 "어디에 어떻게"는 잘 못 전한다. 팔의 각도, 손의 위치, 카메라 높이를 글로 정확히 적을 방법이 없다.
자세는 그림으로 보여 주는 것이 가장 정확하다.
조건 그림
ControlNet에 넣는 그림을 조건 그림이라고 한다. 원하는 구조만 담은 단순한 그림이다.
| 종류 | 생김새 | 통제하는 것 | 잘 맞는 일 |
|---|---|---|---|
| 포즈 (OpenPose) | 관절을 점과 선으로 이은 뼈대 | 사람의 자세 | 캐릭터 포즈 지정 |
| 윤곽선 (Canny) | 흰 선으로 된 가장자리 | 모든 윤곽 | 형태를 정확히 유지 |
| 선화 (Lineart) | 펜으로 그린 듯한 선 | 그림의 선 | 스케치에 색 입히기 |
| 깊이 (Depth) | 가까우면 밝고 멀면 어두운 그림 | 입체 배치 | 구도와 공간감 유지 |
| 노멀 (Normal) | 면이 향하는 방향을 색으로 | 표면의 굴곡 | 입체감, 조명 |
| 낙서 (Scribble) | 대충 그은 선 | 대략의 형태 | 빠른 구도 잡기 |
통제의 세기가 다르다. 윤곽선은 모든 선을 묶어서 자유가 거의 없다. 포즈는 관절 위치만 묶어서 옷, 머리, 체형이 자유롭다. 깊이는 그 중간이다.
조건 그림을 만드는 법
두 가지다.
기존 그림에서 뽑는다. 사진이나 다른 그림을 넣으면 뼈대, 윤곽선, 깊이를 뽑아 주는 모델이 있다. 전처리기라고 부른다. 참고 사진의 자세를 그대로 가져올 때 쓴다.
직접 만든다. 포즈 편집기에서 뼈대를 손으로 움직인다. 3D 프로그램에서 인형을 세우고 깊이 지도를 뽑는다. 원하는 자세를 정확히 만들 수 있다.
원리
ControlNet은 원래 디노이저를 건드리지 않는다. 옆에 붙는 보조 신경망이다.
조건 그림 ─→ [ControlNet] ─┐ (각 단계에 더해 줌)
↓
섞인 잠재 ─→ [디노이저] ─────────→ 방향
SD 1.5와 SDXL용 ControlNet은 이렇게 만든다.
- 디노이저(U-Net)의 앞쪽 절반(줄이는 길)을 복사한다.
- 복사본은 섞인 잠재와 조건 그림을 함께 받는다.
- 복사본의 각 단계 결과를 원래 U-Net의 같은 단계에 더해 준다. 0-4의 스킵 연결 자리다.
- 원래 U-Net은 얼리고 복사본만 학습한다.
학습 데이터는 (그림, 그 그림에서 뽑은 조건 그림, 설명) 묶음이다. 복사본은 "이 조건 그림이 주어지면 원래 모델을 어느 쪽으로 밀어야 그 구조가 나오는가"를 배운다.
0에서 시작하는 연결
중요한 장치가 하나 있다. 복사본의 결과를 더해 주는 연결의 가중치를 0으로 초기화한다.
학습 시작 시점에 더해지는 값이 0이다. 원래 모델의 동작이 전혀 바뀌지 않는다. 학습이 진행되면서 조금씩 영향이 생긴다. 잘 학습된 모델을 망가뜨리지 않고 새 능력을 붙이는 방법이다. 4단계의 LoRA도 같은 생각을 쓴다.
설정
| 설정 | 뜻 |
|---|---|
| 강도 (strength) | ControlNet의 결과를 몇 배로 더할지. 1이 기본. 낮추면 조건을 느슨하게 따른다 |
| 시작과 끝 (start, end) | 전체 걸음 중 어느 구간에만 적용할지 |
시작과 끝이 쓸모 있다. 1-3에서 봤듯이 구도는 앞쪽 걸음에서 정해진다.
- 끝을 0.5~0.7로: 앞쪽에서 자세를 잡아 주고, 뒤쪽에서는 모델이 자유롭게 디테일을 그린다. 조건 그림의 거친 선이 결과에 묻어나는 것을 막는다.
- 강도를 0.6~0.8로: 조건 그림이 정확하지 않을 때. 대략만 따르게 한다.
여러 개를 함께 쓰기
ControlNet을 둘 이상 겹칠 수 있다. 포즈로 자세를 잡고 깊이로 배경의 공간을 잡는 식이다. 각각의 결과가 더해진다.
너무 많이 겹치면 서로 충돌해서 그림이 굳는다. 강도를 나눠 주고, 꼭 필요한 것만 쓴다.
호환성
ControlNet은 디노이저의 구조에 맞춰 만든다. 기반 모델이 같아야 쓸 수 있다(2-2).
- SD 1.5용, SDXL용이 따로다.
- SDXL용은 대체로 SDXL 파생 모델에도 통한다. 다만 애니 계열 모델은 가중치가 멀어져서, 그 계열에 맞춰 만든 것이 더 잘 듣는다.
최신 모델에서는
DiT 계열로 오면서 방식이 다양해졌다.
- 전용 ControlNet: 같은 생각을 DiT에 맞게 옮긴 것. 여러 종류의 조건을 하나로 다루는 통합판도 있다.
- 제어용 LoRA: 조건 그림을 받도록 디노이저를 살짝 고치는 LoRA.
- 모델이 직접 받는다: 편집을 지원하는 모델은 조건 그림을 참조 그림으로 넣고 "이 자세로 그려라"고 지시한다. 별도의 ControlNet이 필요 없다. 3-4에서 다룬다.
방식은 달라도 하는 일은 같다. 구조를 그림으로 지시한다.
캐릭터 작업에서의 쓰임
- 자세 지정: 캐릭터를 원하는 포즈로 세운다. 캐릭터 LoRA(4단계)와 함께 쓰면 "이 캐릭터가 이 자세로"가 된다.
- 자세 묶음 만들기: 뼈대 그림 열 장을 준비해 같은 캐릭터로 열 장을 뽑는다. 게임 캐릭터의 스탠딩 그림 세트가 이렇게 나온다.
- 스케치에서 완성으로: 선화를 넣고 색과 명암을 입힌다.
- 영상의 틀: 영상 모델에도 같은 방법으로 움직임을 지시한다. 6단계에서 다룬다.
해 볼 것
- 같은 뼈대 그림으로 프롬프트만 바꿔 세 장을 뽑는다. 무엇이 유지되고 무엇이 바뀌나?
- 같은 참고 사진에서 포즈, 깊이, 윤곽선을 각각 뽑아 써 본다. 결과가 원본과 얼마나 닮나?
- 윤곽선 ControlNet의 끝을 1.0과 0.5로 바꿔 비교한다.
예상 결과
- 자세는 세 장이 같다. 옷, 머리, 얼굴, 배경은 프롬프트대로 바뀐다.
- 윤곽선이 가장 닮는다. 형태가 거의 그대로다. 깊이는 배치가 같고 세부가 다르다. 포즈는 자세만 같고 나머지는 전부 다르다.
- 1.0은 원본의 선을 끝까지 따라가서 딱딱하다. 0.5는 형태는 같고 선과 질감이 모델의 화풍으로 풀린다.
확인 문제
- ControlNet을 학습할 때 원래 디노이저의 가중치는 어떻게 되나?
- 더해 주는 연결을 0으로 초기화하는 이유는?
- 캐릭터의 옷과 머리 모양은 자유롭게 두고 자세만 묶고 싶다. 어떤 조건 그림을 쓰나?
풀이
- 바뀌지 않는다. 얼려 두고 복사본만 학습한다.
- 학습 시작 때 원래 모델의 동작을 건드리지 않기 위해서다. 영향이 0에서부터 조금씩 생긴다.
- 포즈(뼈대)다. 관절 위치만 묶는다.