ControlNet 연결과 조절¶
전처리 결과를 실제 워크플로우에 연결하고, 텍스트 조건과 구조 조건의 균형을 잡습니다.
이 장에서 배우는 것¶
- MODEL·CONDITIONING·LATENT 세 흐름이 각각 어디로 가는지
Apply ControlNet이 positive·negative를 함께 받아 함께 내보낸다는 점- guidance와 strength를 따로 비교해 균형을 잡는 방법
- Inpainting과 함께 사용할 때의 연결 순서
연결과 조절 규칙¶
먼저 확인할 세 데이터 흐름¶
| 흐름 | 포함하는 것 | 마지막 연결 |
|---|---|---|
MODEL |
기본 모델, LoRA, IPAdapter 등 모델 수정 | Sampler의 model |
CONDITIONING |
positive·negative 텍스트 조건, Flux guidance, ControlNet 조건 | Sampler의 positive·negative 또는 Guider |
LATENT |
빈 latent 또는 인페인팅할 latent | Sampler의 latent_image |
노드를 화면의 왼쪽이나 오른쪽에 놓는 위치보다 각 출력 타입이 최종 Sampler까지 이어지는지가 중요합니다.
FLUX.1 dev + ControlNet 연결 예¶
다음은 KSampler를 사용하는 기본 연결입니다. 현재 Apply ControlNet은 positive와 negative conditioning을 모두 입력받아 두 conditioning을 다시 출력합니다.
Apply ControlNet은 positive와 negative를 둘 다 받아 둘 다 내보냅니다. 한쪽만 KSampler로 이으면 조건이 어긋납니다.
CLIPTextEncodeFlux의 guidance 입력을 사용하는 경우 별도 FluxGuidance 없이 그 출력 conditioning을 Apply ControlNet.positive에 연결합니다. ControlNet에 따라 전용 적용 노드나 필수 VAE 입력이 있을 수 있으므로 모델 제공자의 워크플로우를 우선합니다.
핵심 규칙¶
| 규칙 | 설명 |
|---|---|
| 1 | KSampler에는 최종 MODEL·positive/negative CONDITIONING·LATENT를 연결합니다 |
| 2 | Apply ControlNet의 positive·negative 출력을 모두 다음 노드 또는 Sampler에 전달합니다 |
| 3 | InpaintModelConditioning을 사용하면 positive·negative conditioning과 latent 출력을 함께 사용합니다 |
| 4 | 텍스트 조건은 guidance, 구조 조건은 ControlNet strength와 start/end를 각각 비교합니다 |
| 5 | 한 번에 변수 하나만 바꾸고 Seed를 고정해 비교합니다 |
| 6 | 수정된 MODEL·CONDITIONING 출력이 중간에서 끊기지 않았는지 확인합니다 |
텍스트와 구조 균형 조절¶
기본 연결은 하나로 유지하고 값만 바꿉니다. 먼저 ControlNet 모델 제공자가 제시한 strength를 기준값으로 기록합니다.
| 실험 | 고정할 값 | 바꿀 값 | 관찰할 것 |
|---|---|---|---|
| A | ControlNet strength·start/end | Flux guidance | 프롬프트 요소, 과장, 질감 변화 |
| B | guidance·start/end | ControlNet strength | 포즈·윤곽 일치, 경직, 아티팩트 |
| C | guidance·strength | end_percent |
후반 세부 묘사와 구조 유지 |
ControlNet마다 학습 방식과 권장 범위가 달라 범용 “표준 strength”는 없습니다. 제공자가 권장값을 제시하지 않았다면 낮은 값부터 작은 간격으로 올리며 비교합니다.
Inpainting과 함께 사용할 때의 연결 순서
- Text Encode에서 positive·negative conditioning을 준비합니다.
- 두 conditioning과 전처리 이미지를
Apply ControlNet에 연결합니다. Apply ControlNet의 positive·negative 출력을InpaintModelConditioning에 전달합니다.- 원본 이미지·마스크·VAE를
InpaintModelConditioning에 연결합니다. - 여기서 나온 positive·negative conditioning과 latent를 KSampler에 함께 연결합니다.
위 다섯 단계는 마스크 영역을 편집하면서 ControlNet 구조 조건을 함께 넘기는 기본 흐름입니다. 사용 모델이 전용 inpaint 노드나 전용 ControlNet 적용 노드를 제공하면 그 워크플로우를 따릅니다.
전체 스택 — 모든 컴포넌트를 합쳤을 때
%%{init: {"flowchart": {"curve": "linear", "nodeSpacing": 55, "rankSpacing": 70, "padding": 12}, "themeVariables": {"fontSize": "14px"}} }%%
graph LR
TE["Text Encode<br/>positive / negative"] --> FG["FluxGuidance<br/>positive 경로"]
FG --> AC["Apply ControlNet"]
AC --> IMC["InpaintModelConditioning"]
IMG["원본 이미지<br/>+ 마스크 + VAE"] --> IMC
IMC -->|positive / negative| KS[KSampler]
IMC -->|latent| KS
이 표기는 데이터가 흐르는 한 가지 읽기 순서입니다. Text > Control > Inpaint 같은 고정 계층을 뜻하지 않습니다. 각 출력이 KSampler까지 전달되는지와 각 강도·적용 구간을 따로 확인합니다.
트러블슈팅 — 에러와 품질 문제¶
일반 에러¶
| 에러 메시지 | 원인 | 해결 방법 |
|---|---|---|
Out of memory (OOM) |
VRAM 초과 | 1. 해상도와 batch_size 낮추기2. FP16 → FP8 전환 3. t5xxl_fp16 → t5xxl_fp84. GGUF Q6/Q5 사용 5. 실행 플래그 조정 |
IPAdapter 관련 에러는 IPAdapter 문제 해결에 있습니다.
품질 문제¶
| 증상 | 원인 분석 | 해결 방법 |
|---|---|---|
| ControlNet이 구조를 거의 반영하지 않음 | 모델 비호환, 잘못된 전처리, conditioning 연결 누락, strength·적용 구간 문제 | 모델 확인: FLUX와 ControlNet 호환성 확인 전처리 확인: Preprocessor 출력 미리보기 연결 확인: positive·negative 출력이 Sampler까지 이어지는지 확인 값 비교: 제공자 권장값에서 strength만 작은 폭으로 조절 |
| Inpainting 경계 이음새 | 마스크 경계 딱딱함 | 핵심 해결: DifferentialDiffusion 노드를 MODEL 라인에 추가마스크 처리: Feather/Blur 증가 그라데이션: 0.0~1.0 그라데이션 마스크 품질: steps 증가 |
빠른 참조¶
기억법 테이블·파라미터 치트시트 펼치기
기억법 테이블¶
| 개념 | 기억법 | 설명 |
|---|---|---|
| 연결 | "구조를 만들고, 강도를 조절한다" | 전처리 결과·conditioning·latent가 Sampler까지 이어지는지 확인 |
| IPAdapter vs ControlNet | "느낌 vs 형태" | IPAdapter = 분위기, ControlNet = 구조 |
| Differential Diffusion | "검정-회색-흰색 = 유지-중간-교체" | 마스크 밝기에 따라 픽셀별 denoise 강도가 달라짐 |
| Redux vs IPAdapter | "Conditioning vs Model" | Redux는 conditioning 수정, IPAdapter는 model 수정 |
| LoRA vs IPAdapter | "학습 vs 실시간" | LoRA = 사전 학습, IPAdapter = 이미지 참조 |
파라미터 치트시트¶
FluxGuidance와 ControlNet 비교 기록:
FluxGuidance: 3.5에서 비교 시작
ControlNet 모델:
제공자 권장 strength:
실험 strength:
start_percent: 0.0
end_percent: 1.0
Seed / Steps / Sampler:
start_percent=0.0, end_percent=1.0은 전체 구간 적용을 뜻합니다. 텍스트·구조 균형은 연결을 완성한 뒤 위 값을 한 번에 하나씩 바꿔 찾습니다.
Differential Diffusion:
회색 0.5가 "픽셀의 절반이 바뀐다"는 뜻은 아닙니다. 그 픽셀이 샘플링 구간의 일부에서만 갱신된다는 의미입니다.추가 자료¶
공식 문서·모델 다운로드 링크 펼치기
공식 문서¶
| 대상 | 문서 |
|---|---|
| ComfyUI | 공식 예제 및 가이드 |
| Flux | Black Forest Labs 공식 저장소 |
| IPAdapter | IPAdapter Plus 확장 |
| ControlNet | ControlNet 원본 구현 |
모델 다운로드¶
저장소 이름이 곧 링크입니다. 받기 전에 해당 페이지에서 요구하는 인코더와 파일명을 확인하세요.
IPAdapter 모델¶
| 사용처 | 저장소 |
|---|---|
| SD 1.5 · SDXL | h94/IP-Adapter |
| Flux (XLabs) | XLabs-AI/flux-ip-adapter-v2 |
| Flux (InstantX) | InstantX/FLUX.1-dev-IP-Adapter |
Flux 모델¶
| 용도 | 저장소 |
|---|---|
| 범용 생성 | black-forest-labs/FLUX.1-dev |
| 인페인팅·아웃페인팅 | black-forest-labs/FLUX.1-Fill-dev |
| FP8 양자화 | Kijai/flux-fp8 |
| GGUF 양자화 | city96/FLUX.1-dev-gguf |
ControlNet 모델¶
| 제공자 | 저장소 |
|---|---|
| XLabs | XLabs-AI/flux-controlnet-collections |
| InstantX | InstantX/FLUX.1-dev-Controlnet-Union |
완료 기준¶
세 가지를 모두 만족했다면 이 장을 끝냈습니다.
Apply ControlNet의 positive·negative 출력을 모두 Sampler까지 연결했다.- Seed를 고정하고 guidance와 strength를 각각 따로 바꿔 비교했다.
- 범용 표준 strength가 없다는 점과, 제공자 권장값에서 출발해야 하는 이유를 안다.
다음 단계¶
- IPAdapter — 참조 이미지로 스타일 옮기기
- Flux Redux — 참조 기반 변형
- 제어 기법 실전 워크플로우 — 조합 예시
- 05. 문제 해결 — 적용 후 결과가 어긋날 때