ComfyUI Canny ControlNet|윤곽으로 얼굴 방향·구도 제어

ComfyUI 왕초보 가이드 16 / 29장 · 기준: ComfyUI 0.34.0 / 프런트엔드 1.49.6 · Windows x64 / NVIDIA RTX Portable. 다른 버전에서는 메뉴와 노드 표시가 다를 수 있습니다.

이 장의 실습 자료 ZIP 내려받기 (4.6MB)
JSON·입력 PNG·본문 원본 이미지를 담았습니다. 압축을 푼 뒤 본문에 적힌 파일을 선택하세요. 모델과 프로그램은 포함하지 않습니다. 본문의 WebP는 가벼운 표시용 사본이며, PNG의 작업 정보·투명도와 원본 픽셀 비교에는 ZIP 안의 PNG를 사용하세요.

빨간 니트 인물을 만들면서, 문장만 사용한 옆모습과 입력 윤곽을 참고한 정면 구도를 비교합니다.

1. 만들 결과

빨간 니트 인물을 만들면서, 문장만 사용한 옆모습과 입력 윤곽을 참고한 정면 구도를 비교합니다.

Canny(캐니)는 밝기가 크게 바뀌는 곳에서 선을 뽑는 필터입니다. 임계값은 어느 정도 뚜렷한 경계를 선으로 남길지 정하는 기준입니다. ControlNet(컨트롤넷)은 윤곽 같은 추가 조건을 새 그림 생성에 반영하는 기능입니다. 사진에서 선을 만드는 전처리와 그 선을 참고해 새 그림을 만드는 생성을 구별합니다.

2. 준비물

ComfyUI를 실행한 상태에서 시작합니다. 아래 모델이 이미 같은 폴더에 있으면 다시 받을 필요가 없습니다.

모델공식 파일·다운로드 위치설치 폴더 안에 넣을 곳선택할 노드처음 사용
SDXL Base 1.0sd_xl_base_1.0.safetensorsComfyUI\models\checkpoints체크포인트 로드4장
SDXL Canny Control-LoRAcontrol-lora-canny-rank256.safetensorsComfyUI\models\controlnet컨트롤넷 모델 로드16장
역할파일정확한 이름
실습 JSON실습 JSON 내려받기 (ZIP) ch16-control-B.json
입력 PNG입력 PNG 내려받기 (ZIP) ch05_first_portrait_v2_00001_.png

파일 링크는 이 장의 실습 자료 ZIP으로 연결됩니다. 한 번 내려받아 압축을 푼 뒤 표에 적힌 JSON·PNG 파일을 선택하세요. JSON은 Ctrl+O로 열고, 입력 PNG는 해당 LoadImage에서 업로드합니다.

이번 기본 JSON이 저장할 파일

설치 폴더의 ComfyUI/output 아래에 다음 접두사로 저장됩니다. 뒤에는 자동 번호와 .png가 붙습니다. 이미 같은 이름이 있으면 번호가 올라갑니다.

  • guide/ch16_control_B_edges_00001_.png
  • guide/ch16_control_B_00001_.png

3. 따라 하기

  1. 공식 링크의 control-lora-canny-rank256.safetensors를 ComfyUI/models/controlnet에 넣습니다. 이름에 LoRA가 있어도 15장의 loras 폴더와 다릅니다. 이미 있으면 다음 단계로 갑니다.
  2. B JSON과 입력 PNG를 받습니다. Ctrl+O로 JSON을 열고 이미지 로드에서 원본 PNG를 업로드합니다. Base 체크포인트와 Canny 제어 모델을 선택합니다.
  3. Canny의 낮은 임계값=0.1, 높은 임계값=0.2를 확인합니다. 사진 → Canny → 컨트롤넷 적용의 image로 이어집니다. 이 입력에서는 눈·코·턱·어깨선과 니트 무늬도 남습니다.
  4. 컨트롤넷 적용(ControlNetApplyAdvanced)에 두 문장 조건과 제어 모델을 넣고, 여기서 나온 긍정·부정 출력을 KSampler에 연결합니다. 강도=1.0 / 시작=0.0 / 종료=1.0입니다.
  5. seed=20261013 / fixed / 28 steps / CFG 5.5 / dpmpp_2m / karras / denoise 1을 확인하고 실행합니다. ch16_control_B는 인물 결과, ch16_control_B_edges는 윤곽 확인 그림입니다.
기본 실습 뒤 선택 비교·추가 조작
  1. 선택 비교 A JSON은 강도만 0으로 바뀝니다. 나머지 문장·seed·모델·임계값·생성값은 같습니다. A의 옆모습과 B의 정면에 가까운 얼굴·어깨 방향을 비교합니다. 파일명 접두사는 결과를 구별하기 위해 다릅니다.

이번 실습의 설정

설정할 노드입력값
체크포인트 로드체크포인트 = sd_xl_base_1.0.safetensors
빈 잠재 이미지너비 = 1024
높이 = 1024
배치 크기 = 1
이미지 로드 · 입력 사진입력 파일 = ch05_first_portrait_v2_00001_.png
컨트롤넷 모델 로드제어 모델 = control-lora-canny-rank256.safetensors
Canny 경계 필터낮은 임계값 = 0.1
높은 임계값 = 0.2
컨트롤넷 적용강도 = 1.0
시작 = 0.0
종료 = 1.0
이미지 저장 · ch16_control_B_edges파일명 접두사 = guide/ch16_control_B_edges
KSamplerseed = 20261013
생성 후 제어 = fixed
steps = 28
CFG = 5.5
sampler = dpmpp_2m
scheduler = karras
denoise = 1.0
이미지 저장 · ch16_control_B파일명 접두사 = guide/ch16_control_B
입력할 프롬프트 전문

긍정 프롬프트

side profile studio photograph of one adult woman facing left, nose pointing to the left edge of the image, only one eye visible, shoulder-length dark brown hair, solid red turtleneck sweater, head and shoulders, plain light gray background, soft diffused studio light, realistic photography

부정 프롬프트

front view, facing camera, text, watermark, illustration, distorted face, duplicate person, hands in frame, blurry, low quality, patterned clothes
직접 구성하기 · 노드 12개와 연결 15개

빈 작업판을 두 번 클릭해 아래 기술 이름으로 검색하고 노드를 추가합니다. 값 입력 뒤, 오른쪽 출력 점을 왼쪽 입력 점으로 끌어 연결하세요. 이름이 같은 노드는 역할·파일명으로 구별합니다.

노드 역할검색할 기술 이름
체크포인트 로드CheckpointLoaderSimple
빈 잠재 이미지EmptyLatentImage
이미지 로드 · 입력 사진LoadImage
컨트롤넷 모델 로드ControlNetLoader
긍정 프롬프트CLIPTextEncode
부정 프롬프트CLIPTextEncode
Canny 경계 필터Canny
컨트롤넷 적용ControlNetApplyAdvanced
이미지 저장 · ch16_control_B_edgesSaveImage
KSamplerKSampler
VAE 디코드VAEDecode
이미지 저장 · ch16_control_BSaveImage
순서출발 출력도착 입력
1체크포인트 로드
CLIP →
긍정 프롬프트
clip
2체크포인트 로드
CLIP →
부정 프롬프트
clip
3체크포인트 로드
모델 →
KSampler
모델
4컨트롤넷 적용
긍정 →
KSampler
긍정
5컨트롤넷 적용
부정 →
KSampler
부정
6빈 잠재 이미지
잠재 데이터 →
KSampler
잠재 입력
7KSampler
잠재 데이터 →
VAE 디코드
잠재 데이터
8체크포인트 로드
VAE →
VAE 디코드
vae
9VAE 디코드
이미지 →
이미지 저장 · ch16_control_B
이미지
10긍정 프롬프트
조건 →
컨트롤넷 적용
긍정
11부정 프롬프트
조건 →
컨트롤넷 적용
부정
12컨트롤넷 모델 로드
컨트롤넷 →
컨트롤넷 적용
컨트롤넷
13Canny 경계 필터
이미지 →
컨트롤넷 적용
이미지
14이미지 로드 · 입력 사진
이미지 →
Canny 경계 필터
이미지
15Canny 경계 필터
이미지 →
이미지 저장 · ch16_control_B_edges
이미지
선택 실습 · Canny 임계값 하나씩 바꾸기

같은 입력 사진에서 낮은 임계값 또는 높은 임계값 하나만 바꾼 실제 전처리 결과입니다. SDXL이나 ControlNet 모델 없이 3개 노드로 실행할 수 있습니다. 새 인물 생성 결과와 구별하세요.

  1. 아래 조건의 JSON을 새 탭에서 열고 준비물의 원본 인물 PNG를 이미지 로드에 업로드합니다.
  2. LoadImage → Canny → SaveImage 연결을 확인합니다. 낮은 값은 높은 값보다 작게 두세요.
  3. 실행 후 ComfyUI/output/guide의 ch16_edges 번호가 붙은 PNG를 봅니다. 기준 결과와 같은 배율로 비교하세요.
기본 · 낮음 0.1 / 높음 0.2. 눈·코·턱·어깨와 니트 무늬가 남습니다.
기본 · 낮음 0.1 / 높음 0.2. 눈·코·턱·어깨와 니트 무늬가 남습니다. 그림을 누르면 큰 화면으로 열립니다.

이 조건 JSON 내려받기 (ZIP)

낮은 값만 변경 · 낮음 0.05 / 높음 0.2. 기준보다 약한 경계의 연결을 더 허용합니다.
낮은 값만 변경 · 낮음 0.05 / 높음 0.2. 기준보다 약한 경계의 연결을 더 허용합니다. 그림을 누르면 큰 화면으로 열립니다.

이 조건 JSON 내려받기 (ZIP)

높은 값만 변경 · 낮음 0.1 / 높음 0.4. 강한 경계를 고르는 기준을 높인 결과입니다.
높은 값만 변경 · 낮음 0.1 / 높음 0.4. 강한 경계를 고르는 기준을 높인 결과입니다. 그림을 누르면 큰 화면으로 열립니다.

이 조건 JSON 내려받기 (ZIP)

0.1/0.2는 제공 사진에 맞춘 시작값입니다. 선이 많거나 적다고 무조건 좋은 결과는 아닙니다. 머리·얼굴·어깨처럼 지키려는 모양은 남고 불필요한 무늬는 줄어드는지 보세요. 임계값 변경 두 조건은 각각 기본과 비교합니다.

4. 정상 결과 확인

B에 빨간 니트를 입은 인물 한 명이 있고, 양쪽 눈과 턱·어깨 방향이 입력 윤곽에 가까운지 봅니다. A에서는 왼쪽을 향한 옆모습이 나옵니다. 얼굴 생김새가 바뀌는 것은 오류가 아니며, 윤곽 위치와 색·인물 신원은 구별해서 판단합니다.

B · 제어 강도 1.0, 전체 구간 적용. 옆모습 문장보다 입력 윤곽의 얼굴·어깨 구도가 강하게 반영된 실제 결과입니다.
B · 제어 강도 1.0, 전체 구간 적용. 옆모습 문장보다 입력 윤곽의 얼굴·어깨 구도가 강하게 반영된 실제 결과입니다. 그림을 누르면 큰 화면으로 열립니다.
선택 비교 · 입력 윤곽과 제어 유무
입력 원본 · 카메라 쪽을 보는 얼굴
입력 원본 · 카메라 쪽을 보는 얼굴 그림을 누르면 큰 화면으로 열립니다.
Canny 0.1 / 0.2 · 입력에서 추출한 윤곽
Canny 0.1 / 0.2 · 입력에서 추출한 윤곽 그림을 누르면 큰 화면으로 열립니다.
A · 강도 0. 문장의 왼쪽 옆모습이 반영됨
A · 강도 0. 문장의 왼쪽 옆모습이 반영됨 그림을 누르면 큰 화면으로 열립니다.
B · 강도 1.0. 입력 윤곽에 가까운 얼굴·어깨 방향
B · 강도 1.0. 입력 윤곽에 가까운 얼굴·어깨 방향 그림을 누르면 큰 화면으로 열립니다.

A와 B는 제어 강도만 다릅니다. 눈이 한쪽 또는 양쪽 보이는지, 코가 향하는 방향과 어깨선을 보세요. 옆모습을 요구하는 같은 문장에서도 윤곽 제어의 영향이 보입니다. 실제 작업에서 충돌을 줄이려면 문장과 윤곽이 같은 구도를 요구하도록 맞추면 됩니다.

비교 조건별 JSON
조건JSON
A · 제어 강도 0ch16-control-A.json (ZIP)
기본 윤곽만 만드는 3노드 작업ch16-canny-010-020.json (ZIP)

각 JSON은 별도 탭에서 열고 입력 이미지·모델을 다시 선택하세요. 기본 실습과 선택 비교를 구별해 필요한 조건을 사용합니다.

5. 자주 생기는 문제

상황확인할 곳
B도 옆모습으로 나와요제어 강도 1.0·시작 0.0·종료 1.0인지, KSampler가 컨트롤넷 적용 뒤의 긍정·부정 출력을 받는지 확인합니다. 입력 PNG와 Canny 0.1/0.2도 맞춥니다.
선이 너무 많거나 거의 없어요아래 전처리 비교로 윤곽을 먼저 봅니다. 낮은 값은 약한 경계의 연결, 높은 값은 강한 경계 선택에 관여합니다. 니트 무늬까지 남는 것이 목적이 아니라면 값을 올려 비교하세요.
ControlNet 모델이 목록에 없어요models/controlnet 폴더와 정확한 파일명을 확인하고 노드 정의를 새로고침하거나 ComfyUI를 재시작합니다.
사진 대신 흰 선 그림만 저장돼요전처리 JSON이나 edges 출력인지 확인합니다. 인물 생성은 B JSON의 ch16_control_B 출력입니다.

공통 오류와 용어는 용어·문제 해결에서 찾을 수 있습니다.

공식 참고 자료

준비 단계에서 PC 정보가 헷갈린다면 GPU·메모리 등 내 컴퓨터 사양 확인 방법을 함께 참고하세요. 이 장의 결과와 작업 JSON을 보관한 뒤 다음 실습으로 넘어가면 다시 비교하기 쉽습니다.