ComfyUI 왕초보 가이드 28 / 29장 · 기준: ComfyUI 0.34.0 / 프런트엔드 1.49.6 · Windows x64 / NVIDIA RTX Portable. 다른 버전에서는 메뉴와 노드 표시가 다를 수 있습니다.
이 장의 실습 자료 ZIP 내려받기 (7.2MB)
JSON·입력 PNG·본문 원본 이미지를 담았습니다. 압축을 푼 뒤 본문에 적힌 파일을 선택하세요. 모델과 프로그램은 포함하지 않습니다. 본문의 WebP는 가벼운 표시용 사본이며, PNG의 작업 정보·투명도와 원본 픽셀 비교에는 ZIP 안의 PNG를 사용하세요.
포즈로 팔·다리 자세를, Canny로 옷과 몸의 윤곽을 함께 참고해 새 이미지를 만듭니다.
1. 만들 결과
27장의 포즈와 16장의 Canny를 한 작업에서 사용합니다. 같은 참고 사진에서 만든 두 지도로 양팔을 옆 위로 펼친 자세와 내려온 상의 밑단을 참고하고, 남색 상의는 문장으로 주황색으로 바꿉니다.


이 실습은 원본 사진의 일부를 고치는 인페인트가 아니라 두 제어 정보를 참고한 새 이미지 생성입니다. 얼굴 동일성, 손가락 하나하나, 원본과 정확히 같은 옷을 보존하는 예제가 아닙니다. 두 제어를 더한다고 자동으로 품질이 좋아지지는 않습니다.
| 용어 | 쉬운 뜻·예 |
|---|---|
| ControlNet · 제어 모델 | 문장만으로 지정하기 어려운 구조를 지도에서 받아 생성에 반영합니다. 포즈 모델은 관절 지도, Canny 모델은 윤곽 지도를 받습니다. |
| Canny · 윤곽 추출 | 사진에서 밝기 차이가 큰 경계를 흰 선으로 표시합니다. 사람의 외곽뿐 아니라 머리카락·옷 주름도 선에 포함될 수 있습니다. |
| 조건 · CONDITIONING | 무엇을 만들지 생성기에 전달하는 신호입니다. 긍정 조건은 원하는 모습, 부정 조건은 피할 표현을 담습니다. 이 신호에 제어 정보를 추가합니다. |
| 포트 · 입력과 출력 | 노드 가장자리의 연결점입니다. 오른쪽 출력 점에서 왼쪽 입력 점으로 선을 끌어 연결합니다. 이름과 신호 종류가 맞아야 합니다. |
| 지도 정렬 | 두 지도에서 사람이 같은 위치·비율에 있는 상태입니다. 같은 사진을 사용해도 한쪽만 자르거나 늘리면 정렬이 어긋납니다. |
| strength / 적용 구간 | strength는 조건의 영향 강도, start_percent·end_percent는 생성 과정 중 사용할 구간입니다. 강도 0.65는 윤곽 정확도 65%라는 뜻이 아닙니다. |
2. 준비물
새 모델이나 노드 설치는 필요 없습니다. 16·27장에서 준비한 아래 세 모델을 사용합니다. 포즈 지도는 27장의 실제 추출 결과를 그대로 제공하므로 SDPose 추출을 다시 실행할 필요가 없습니다.
| 모델 | 공식 파일·다운로드 위치 | 설치 폴더 안에 넣을 곳 | 선택할 노드 | 처음 사용 |
|---|---|---|---|---|
| SDXL Base 1.0 | sd_xl_base_1.0.safetensors | ComfyUI\models\checkpoints | 체크포인트 로드 | 4장 |
| SDXL용 포즈 ControlNet | xinsir-openpose-sdxl-1.0.safetensors | ComfyUI\models\controlnet | 컨트롤넷 모델 로드 | 27장 |
| SDXL Canny Control-LoRA | control-lora-canny-rank256.safetensors | ComfyUI\models\controlnet | 컨트롤넷 모델 로드 | 16장 |
| 기본 실습 파일 | 용도 |
|---|---|
| 기본 워크플로 · ch28-combined.json (ZIP) | 노드 15개가 연결된 일반 JSON. Ctrl+O로 엽니다. |
| 입력 사진 · ch28-reference.png (ZIP) | Canny 윤곽을 추출할 사진입니다. |
| 입력 지도 · ch28-pose-map.png (ZIP) | 같은 사진에서 실제 추출한 포즈 지도입니다. |
입력 PNG 두 개를 ComfyUI/input에 넣거나 각각의 LoadImage 노드에서 업로드합니다. JSON은 노드·연결·설정을 저장하는 파일이며 모델과 입력 사진을 모두 포함하지 않습니다. 링크가 글이나 그림으로만 열리면 오른쪽 클릭 → 다른 이름으로 링크 저장으로 .json·.png 확장명을 유지합니다.
3. 따라 하기
A. 같은 사진의 포즈와 윤곽 준비하기
- Ctrl+O로
ch28-combined.json을 엽니다. 이미 연결된 기본 파일로 시작합니다. 오른쪽 아래 보기 맞춤을 누르면 전체 그룹을 볼 수 있고, 마우스 휠로 필요한 부분을 확대합니다. - 27장 참고 사진 · 윤곽 추출용에서
ch28-reference.png, 같은 사진의 포즈 지도에서ch28-pose-map.png를 선택합니다. 목록에 없으면 각 노드의 업로드할 파일 선택으로 지정합니다. - 사진에서 Canny 윤곽 추출의 low_threshold는
0.1, high_threshold는0.2를 유지합니다. 두 값은 어떤 밝기 경계를 선으로 뽑을지 정하는 문턱값입니다. 제어 강도와 다른 설정이므로 기본 비교에서는 바꾸지 않습니다. - 두 입력은 모두
1024×1024입니다. 한쪽만 자르거나 회전하지 않습니다. 포즈 지도에는 색 선, Canny에는 흰 윤곽선이 들어가며 서로 바꾸어 연결하지 않습니다.


참고용 Canny 지도 PNG (ZIP) 도 제공합니다. 기본 JSON은 입력 사진에서 이 지도를 직접 계산하므로 따로 업로드하지 않아도 됩니다. 이번 두 지도는 같은 사진에서 왔습니다. 인터넷에서 찾은 다른 자세의 포즈 지도와 임의로 섞지 않습니다.
B. 두 제어 조건을 차례로 연결하기
ControlNet 적용 노드는 ControlNetApplyAdvanced 두 개입니다. 첨부 파일에서는 제목을 A · 포즈 적용, B · Canny 추가로 붙였습니다. 다음 연결을 살펴보세요. 직접 연결할 때는 오른쪽 출력 점을 같은 이름의 왼쪽 입력 점으로 끌어 놓습니다.
문장 긍정·부정 → A · 포즈 적용 → B · Canny 추가 → KSampler
포즈 지도 + 포즈 모델 → A / Canny 지도 + Canny 모델 → B
SDXL Base MODEL → KSampler → VAE 복원 → 완성 이미지
| 출발 출력 | 도착 입력 | 역할 |
|---|---|---|
| 긍정 문장 CONDITIONING / 부정 문장 CONDITIONING | A의 positive / negative | 만들 모습과 피할 표현을 넣습니다. |
| 포즈 로더 CONTROL_NET / 포즈 LoadImage IMAGE | A의 control_net / image | 관절 지도를 읽을 포즈 모델과 지도입니다. |
| A의 positive / negative | B의 positive / negative | 포즈를 포함한 조건에 Canny 정보를 덧붙입니다. 두 선을 모두 연결합니다. |
| Canny 로더 CONTROL_NET / Canny 노드 IMAGE | B의 control_net / image | 윤곽을 읽을 모델과 실제 추출한 선 지도입니다. |
| B의 positive / negative | KSampler의 positive / negative | 두 제어 조건을 함께 생성에 사용합니다. |
| SDXL Base의 MODEL / VAE | KSampler의 model / VAEDecode의 vae | 그림 생성과 이미지 복원은 기존 SDXL Base가 담당합니다. |
KSampler를 A 출력에만 연결하면 B의 Canny 조건은 빠집니다. 문장 노드에서 KSampler로 바로 연결하면 두 제어를 모두 건너뜁니다. Apply 노드의 선택 입력 vae는 이 조합에서는 비워 두고, SDXL VAE는 VAEDecode에 연결합니다.
C. 기본값으로 한 장 생성하기
- A · SDXL 포즈 모델에
xinsir-openpose-sdxl-1.0.safetensors, B · SDXL Canny 모델에control-lora-canny-rank256.safetensors, SDXL Base · 생성 모델에sd_xl_base_1.0.safetensors를 선택합니다. - A · 포즈 적용은 strength
1.0, start_percent0.0, end_percent1.0입니다. B · Canny 추가는 strength0.65, start_percent0.0, end_percent0.65입니다. - 긍정 문장은 주황색 긴팔 상의·회색 운동 바지·흰 운동화를 입은 성인 한 명을 설명합니다. 팔 자세는 문장으로 강요하지 않고 지도에서 전달합니다. 비교를 위해 문장을 그대로 둡니다.
- 두 지도와 같은 1024×1024 EmptyLatentImage는 width·height
1024, batch_size1입니다. 두 제어로 한 번 생성 KSampler는 아래 값을 유지합니다. - 상단 배치 수 1에서 실행을 누릅니다. 제어 지도 · Canny 저장에는 선 지도, 완성 · 포즈와 윤곽에는 주황색 옷의 인물이 나옵니다. 선 지도만 나왔다면 최종 생성까지 끝난 것은 아닙니다.
- 완성 PNG는
ComfyUI/output/guide/ch28_combined_…png, Canny 지도는ComfyUI/output/guide/ch28_combined_canny_…png입니다. 완성 이미지에서 양팔 방향과 상의 밑단을 확인합니다.
| 항목 | 기본값 |
|---|---|
| seed / 생성 후 제어 | 2026102702 / fixed |
| steps / CFG | 30 / 5 |
| sampler / scheduler | dpmpp_2m / karras |
| denoise | 1.0 · 빈 LATENT에서 새로 생성 |
| 생성 크기 / 배치 | 1024×1024 / 1 |
| 포즈 strength / start / end | 1.0 / 0.0 / 1.0 |
| Canny strength / start / end | 0.65 / 0.0 / 0.65 |
Canny의 end_percent 0.65는 생성의 앞부분에 윤곽 조건을 사용하고 뒷부분에는 그 추가 제어를 멈추는 설정입니다. 강도를 서서히 0으로 낮춘다는 뜻도, 결과 이미지의 65%를 잘라 쓴다는 뜻도 아닙니다. 포즈는 끝까지 유지합니다. KSampler denoise와 두 strength는 서로 다른 역할이므로 한꺼번에 바꾸지 않습니다.

기본 JSON의 전체 프롬프트·설정·연결
| 설정할 노드 | 입력값 |
|---|---|
| 27장 참고 사진 · 윤곽 추출용 · 입력 사진 | 입력 파일 = ch28-reference.png |
| 사진에서 Canny 윤곽 추출 | 낮은 임계값 = 0.1 높은 임계값 = 0.2 |
| 제어 지도 · Canny 저장 · ch28_combined_canny | 파일명 접두사 = guide/ch28_combined_canny |
| 같은 사진의 포즈 지도 · 입력 사진 | 입력 파일 = ch28-pose-map.png |
| A · SDXL 포즈 모델 | 제어 모델 = xinsir-openpose-sdxl-1.0.safetensors |
| B · SDXL Canny 모델 | 제어 모델 = control-lora-canny-rank256.safetensors |
| SDXL Base · 생성 모델 | 체크포인트 = sd_xl_base_1.0.safetensors |
| A · 포즈 적용 | 강도 = 1.0 시작 = 0.0 종료 = 1.0 |
| B · Canny 추가 | 강도 = 0.65 시작 = 0.0 종료 = 0.65 |
| 두 지도와 같은 1024×1024 | 너비 = 1024 높이 = 1024 배치 크기 = 1 |
| 두 제어로 한 번 생성 | seed = 2026102702 생성 후 제어 = fixed steps = 30 CFG = 5.0 sampler = dpmpp_2m scheduler = karras denoise = 1.0 |
| 완성 · 포즈와 윤곽 · ch28_combined | 파일명 접두사 = guide/ch28_combined |
입력할 프롬프트 전문
새 옷·장면 · 긍정
full body studio photograph of one adult woman, front view, standing, wearing a plain orange long sleeve sweatshirt, gray sports trousers and white sneakers, entire body visible from head to shoes, centered, simple light gray background, soft even lighting, realistic anatomy
피할 표현 · 부정
text, watermark, logo, multiple people, extra arms, extra legs, extra fingers, fused limbs, malformed hands, deformed anatomy, cropped head, cropped feet, out of frame, blurry, low quality
현재 작업의 노드·연결 목록 · 노드 15개와 연결 19개
제공 JSON에 이미 들어 있는 노드와 연결입니다. 실수로 선을 바꿨을 때 이 목록과 대조하세요. 이름이 같은 노드는 역할·파일명으로 구별합니다.
| 노드 역할 | 검색할 기술 이름 |
|---|---|
| 27장 참고 사진 · 윤곽 추출용 · 입력 사진 | LoadImage |
| 사진에서 Canny 윤곽 추출 | Canny |
| 제어 지도 · Canny 저장 · ch28_combined_canny | SaveImage |
| 같은 사진의 포즈 지도 · 입력 사진 | LoadImage |
| A · SDXL 포즈 모델 | ControlNetLoader |
| B · SDXL Canny 모델 | ControlNetLoader |
| SDXL Base · 생성 모델 | CheckpointLoaderSimple |
| 새 옷·장면 · 긍정 | CLIPTextEncode |
| 피할 표현 · 부정 | CLIPTextEncode |
| A · 포즈 적용 | ControlNetApplyAdvanced |
| B · Canny 추가 | ControlNetApplyAdvanced |
| 두 지도와 같은 1024×1024 | EmptyLatentImage |
| 두 제어로 한 번 생성 | KSampler |
| 완성 이미지 복원 | VAEDecode |
| 완성 · 포즈와 윤곽 · ch28_combined | SaveImage |
| 순서 | 출발 출력 | 도착 입력 |
|---|---|---|
| 1 | 27장 참고 사진 · 윤곽 추출용 · 입력 사진 이미지 → | 사진에서 Canny 윤곽 추출 이미지 |
| 2 | 사진에서 Canny 윤곽 추출 이미지 → | 제어 지도 · Canny 저장 · ch28_combined_canny 이미지 |
| 3 | SDXL Base · 생성 모델 CLIP → | 새 옷·장면 · 긍정 clip |
| 4 | SDXL Base · 생성 모델 CLIP → | 피할 표현 · 부정 clip |
| 5 | 새 옷·장면 · 긍정 조건 → | A · 포즈 적용 긍정 |
| 6 | 피할 표현 · 부정 조건 → | A · 포즈 적용 부정 |
| 7 | A · SDXL 포즈 모델 컨트롤넷 → | A · 포즈 적용 컨트롤넷 |
| 8 | 같은 사진의 포즈 지도 · 입력 사진 이미지 → | A · 포즈 적용 이미지 |
| 9 | A · 포즈 적용 긍정 → | B · Canny 추가 긍정 |
| 10 | A · 포즈 적용 부정 → | B · Canny 추가 부정 |
| 11 | B · SDXL Canny 모델 컨트롤넷 → | B · Canny 추가 컨트롤넷 |
| 12 | 사진에서 Canny 윤곽 추출 이미지 → | B · Canny 추가 이미지 |
| 13 | SDXL Base · 생성 모델 모델 → | 두 제어로 한 번 생성 모델 |
| 14 | B · Canny 추가 긍정 → | 두 제어로 한 번 생성 긍정 |
| 15 | B · Canny 추가 부정 → | 두 제어로 한 번 생성 부정 |
| 16 | 두 지도와 같은 1024×1024 잠재 데이터 → | 두 제어로 한 번 생성 잠재 입력 |
| 17 | 두 제어로 한 번 생성 잠재 데이터 → | 완성 이미지 복원 잠재 데이터 |
| 18 | SDXL Base · 생성 모델 VAE → | 완성 이미지 복원 vae |
| 19 | 완성 이미지 복원 이미지 → | 완성 · 포즈와 윤곽 · ch28_combined 이미지 |
D. 결과를 비교하고 작업 보관하기
아래 세 이미지는 문장·seed·생성 설정·연결을 유지하고, 각 제어의 strength만 켜거나 끈 결과입니다. 포즈만 썼을 때와 두 개를 썼을 때의 상의 밑단과 머리카락 외곽을 먼저 비교합니다.



두 개의 역할이 완전히 분리되는 것은 아닙니다. 이번 Canny 지도에도 사람의 전체 자세가 들어 있어 Canny만으로도 비슷한 자세가 나옵니다. 함께 쓴 결과가 모든 항목에서 더 우수하다는 증거로 해석하지 않습니다. 기본 결과의 목표는 서로 맞는 두 조건을 연결해 자세와 윤곽을 함께 참고하는 것입니다.
완성 결과 PNG (ZIP) 와 일반 JSON (ZIP) 을 제공합니다. 값을 바꿨다면 그래프 → 내보내기로 ch28-my-combined.json을 보관합니다. 다시 열 때는 참고 사진·포즈 PNG와 세 모델을 다시 선택할 수 있어야 합니다. 다른 사진을 쓸 때는 27장 A단계에서 그 사진의 포즈 지도를 새로 추출하고 두 입력을 함께 바꿉니다.
선택 실습 1 · 한 제어씩 끄고 역할 확인하기
| 워크플로 | 포즈 / Canny | 볼 곳 |
|---|---|---|
| ch28-pose-only.json (ZIP) | 1.0 / 0 | 관절 자세는 전달되지만 머리카락·옷 외곽이 원본과 얼마나 달라지는지 |
| ch28-canny-only.json (ZIP) | 0 / 0.65 | 윤곽 지도 자체에도 팔·다리 모양이 포함되는지 |
Ctrl+O로 비교 JSON을 열고 기본과 같은 두 PNG·모델을 선택해 실행합니다. strength 0은 해당 조건을 사용하지 않는 대조 설정입니다. 노드를 지우거나 연결을 바꿀 필요는 없습니다. 포즈만 전체 PNG (ZIP) · Canny만 전체 PNG (ZIP) . 기본으로 돌아갈 때는 ch28-combined.json을 다시 엽니다.
선택 실습 2 · Canny 강도와 종료 시점을 하나씩 바꾸기
먼저 기본 파일을 복사하고, 포즈는 1.0·시작 0·종료 1로 고정합니다. 아래 비교는 기본과 저장 접두사 외에 표시된 값 하나만 다릅니다. 두 비교를 연달아 누적하지 말고 매번 기본 파일에서 시작합니다.
| 실험 | 바꾸는 값 | JSON |
|---|---|---|
| 윤곽 강도 낮추기 | Canny strength 0.65 → 0.30, end는 0.65 유지 | ch28-softer.json (ZIP) |
| 윤곽을 끝까지 사용 | Canny end_percent 0.65 → 1.0, strength는 0.65 유지 | ch28-full-range.json (ZIP) |



낮은 강도는 형태를 자유롭게 바꾸는 데 도움이 될 수 있지만 원본 윤곽 보존에는 불리할 수 있습니다. 종료 시점을 늘려도 모든 세부가 더 정확해지는 것은 아닙니다. 위 결과는 차이를 읽는 대조 예제이며 앞주머니나 작은 장식을 기본 실습의 성공 목표로 삼지 않습니다. 원하지 않은 변화가 생기면 기본값으로 돌아가 한 값씩 조정하세요. 강도 0.30 PNG (ZIP) · 종료 1.0 PNG (ZIP)
4. 정상 결과 확인
| 확인할 것 | 완성 기준 |
|---|---|
| 두 지도 | 같은 크기·위치에 한 사람이 있고 어깨·팔꿈치·손목·발목의 방향이 서로 맞습니다. |
| 두 조건의 경로 | 긍정·부정 모두 문장 → A → B → KSampler 순서로 연결되어 있습니다. 지도와 모델의 종류도 짝이 맞습니다. |
| 포즈 목표 | 양팔이 옆 위로 펼쳐져 있고, 머리·손·발이 화면 안에 있는 한 사람입니다. 팔·다리가 추가되거나 몸과 분리되지 않았는지 봅니다. |
| 윤곽 목표 | 상의 밑단이 내려오고 소매·몸통 외곽이 참고 사진의 형태를 대체로 따릅니다. 포즈만 결과처럼 상의가 크게 올라간 경우와 구별합니다. |
| 문장 목표 | 주황색 상의, 회색 바지, 흰 신발입니다. 참고의 남색을 그대로 복사해야 성공하는 것이 아닙니다. |
| 판단 범위 | 대표 결과는 주요 자세와 의복 윤곽을 보여 줍니다. 손가락 세부와 얼굴 동일성, 원본 선과 픽셀 단위의 일치는 보장하지 않습니다. 확대해서 중요한 부분은 따로 판단합니다. |
5. 자주 생기는 문제
| 증상 | 확인할 곳·해결 |
|---|---|
| 두 개를 연결했는데 하나만 반영돼요 | KSampler가 B의 두 출력을 받는지 봅니다. B의 입력도 문장이 아니라 A의 긍정·부정 출력이어야 합니다. 두 strength가 0보다 큰지 확인합니다. |
| 팔이 겹치거나 몸이 찌그러져요 | 포즈와 Canny가 다른 자세·위치·비율을 요구하는지 먼저 봅니다. 같은 참고 사진에서 지도를 다시 만들고, 한쪽만 잘랐는지도 확인합니다. 강도만 높여 입력 충돌을 해결하지 않습니다. |
| 새 옷을 요구해도 예전 외곽이 강하게 남아요 | Canny는 소매·밑단도 따라가게 합니다. 포즈는 유지하고 Canny strength만 낮추거나, 기본으로 돌아온 뒤 end_percent만 줄여 봅니다. 옷 형태를 크게 바꿀 목적이면 포즈만 쓰는 편이 맞을 수 있습니다. |
| 강도를 낮췄더니 주머니가 생겼어요 | 윤곽 제약이 약해져 원본에 없던 옷 세부가 생길 수 있습니다. 선택 비교의 강도 0.30 결과가 그 예입니다. 원본 윤곽이 목표라면 기본 0.65로 돌아가고 seed·문장은 함께 바꾸지 않습니다. |
| 모델 목록에 파일이 없어요 | SDXL Base는 models/checkpoints, 두 제어 모델은 models/controlnet입니다. 편집 → 노드 정의 새로고침 후 각 로더에서 선택합니다. 그래도 목록이 갱신되지 않으면 작업을 저장하고 F5로 새로고침합니다. |
| 크기 오류나 모델 호환 오류가 나요 | SDXL Base와 SDXL용 두 제어 모델을 쓰는지 봅니다. SD1.5용 파일을 섞지 않습니다. 파일명에 openpose·canny가 있다는 것만으로 호환성이 같지는 않습니다. |
| 손가락·얼굴이 원본과 달라요 | 포즈와 윤곽만으로 정확한 동일 인물·손가락을 보존하지 않습니다. 원본과 다른 세부를 실패 없이 복사한 것처럼 판단하지 않습니다. 필요한 부분 수정은 22·25장의 인페인트 절차로 목적을 따로 정합니다. |
| 더 느리거나 GPU 메모리가 부족해요 | 두 제어 모델을 쓰면 계산·메모리 부담이 늘 수 있습니다. 배치 수 1에서 다른 GPU 작업을 정리합니다. 크기를 줄일 때는 두 지도와 출력의 비율을 함께 유지하며 다시 판단합니다. |
| 선 지도만 저장됐어요 | Canny 저장과 최종 이미지 저장은 서로 다른 출력입니다. KSampler·VAEDecode가 끝났는지, 최종 SaveImage가 VAEDecode에 연결됐는지 확인합니다. |
공식 참고 자료
ComfyUI · 여러 ControlNet 조건 연결. 공식 예제의 모델 조합과 이 장의 SDXL 포즈+Canny 조합은 다르므로 모델 파일을 섞지 않습니다. 이 장의 기본값과 비교 이미지는 위 첨부 JSON의 실제 실행 결과입니다.
준비 단계에서 PC 정보가 헷갈린다면 GPU·메모리 등 내 컴퓨터 사양 확인 방법을 함께 참고하세요. 이 장의 결과와 작업 JSON을 보관한 뒤 다음 실습으로 넘어가면 다시 비교하기 쉽습니다.