ComfyUI 왕초보 가이드 11 / 29장 · 기준: ComfyUI 0.34.0 / 프런트엔드 1.49.6 · Windows x64 / NVIDIA RTX Portable. 다른 버전에서는 메뉴와 노드 표시가 다를 수 있습니다.
이 장의 실습 자료 ZIP 내려받기 (6.4MB)
JSON·입력 PNG·본문 원본 이미지를 담았습니다. 압축을 푼 뒤 본문에 적힌 파일을 선택하세요. 모델과 프로그램은 포함하지 않습니다. 본문의 WebP는 가벼운 표시용 사본이며, PNG의 작업 정보·투명도와 원본 픽셀 비교에는 ZIP 안의 PNG를 사용하세요.
얼굴과 배경을 보존하면서 니트를 파란색으로 다시 생성하고, 목선·어깨 경계를 확인합니다.
1. 만들 결과
얼굴과 배경을 보존하면서 니트를 파란색으로 다시 생성하고, 목선·어깨 경계를 확인합니다.
인페인팅은 선택한 부분을 다시 생성하는 작업입니다. 마스크(MASK)는 수정 범위를 표시한 지도입니다. 이 실습에서는 흰색=수정, 검정=원본 유지, 회색=원본과 생성 그림을 섞는 경계입니다. RGBA는 색상 RGB에 투명도(alpha)를 더한 이미지입니다. 제공 파일의 투명한 부분을 LoadImage가 흰 MASK로 읽습니다. 색깔로 표시된 마스크 편집기의 덮개와 이 흑백 값은 구별하세요.
마스크를 다듬는 설정의 뜻
| 값 | 쉽게 읽기 |
|---|---|
| expand=24 | 선택 범위를 24픽셀 넓혀 빠진 옷 가장자리까지 포함합니다. |
| tapered_corners=true | 선택이 모서리 방향으로 네모나게 퍼지는 것을 줄이는 옵션입니다. |
| blur_radius=9 / sigma=3 | 경계를 흐리게 계산하는 주변 범위 / 흐림의 퍼짐 정도입니다. 두 값 모두 마스크 경계에 영향을 줍니다. |
| red 채널 | 흑백 마스크 이미지의 빨강 성분을 읽습니다. 흑백에서는 RGB 값이 같으므로 색을 빨갛게 칠한다는 뜻이 아닙니다. |
2. 준비물
ComfyUI를 실행한 상태에서 시작합니다. 아래 모델이 이미 같은 폴더에 있으면 다시 받을 필요가 없습니다.
| 모델 | 공식 파일·다운로드 위치 | 설치 폴더 안에 넣을 곳 | 선택할 노드 | 처음 사용 |
|---|---|---|---|---|
| SDXL Base 1.0 | sd_xl_base_1.0.safetensors | ComfyUI\models\checkpoints | 체크포인트 로드 | 4장 |
| 역할 | 파일 | 정확한 이름 |
|---|---|---|
| 실습 JSON | 실습 JSON 내려받기 (ZIP) | ch11-soft-mask-knit.json |
| 입력 PNG | 입력 PNG 내려받기 (ZIP) | ch05_first_portrait_v2_00001_.png |
| 입력 PNG | 입력 PNG 내려받기 (ZIP) | ch11_knit_mask_r02_rgba.png |
파일 링크는 이 장의 실습 자료 ZIP으로 연결됩니다. 한 번 내려받아 압축을 푼 뒤 표에 적힌 JSON·PNG 파일을 선택하세요. JSON은 Ctrl+O로 열고, 입력 PNG는 해당 LoadImage에서 업로드합니다.
이번 기본 JSON이 저장할 파일
설치 폴더의 ComfyUI/output 아래에 다음 접두사로 저장됩니다. 뒤에는 자동 번호와 .png가 붙습니다. 이미 같은 이름이 있으면 번호가 올라갑니다.
guide/ch11_soft_mask_mask_00001_.pngguide/ch11_soft_mask_decoded_00001_.pngguide/ch11_soft_mask_final_00001_.png
세 종류의 PNG 구별하기
| 파일 | 역할 |
|---|---|
| ch05_first_portrait_v2_00001_.png | 원본 이미지 로드 → IMAGE |
| ch11_knit_mask_r02_rgba.png | 마스크 이미지 로드 → MASK. 알파로 선택 범위를 전달 |
| ch11_soft_mask_mask_00001_.png | 이번 실행에서 저장할 흑백 확인 그림. 관찰용이며 RGBA 입력 대신 넣지 않음 |
RGBA의 MASK → 확장·흐림 → 생성 범위 / 최종 합성 범위로 분기
3. 따라 하기
- 실습 JSON과 원본 PNG,
ch11_knit_mask_r02_rgba.png를 받습니다. JSON을 새 작업에서 열고 두 이미지 로드에 각각 업로드합니다. - 체크포인트는 SDXL Base로 선택합니다. 원본 이미지 → VAE 인코드로 원래 의상 정보를 잠재 데이터에 남깁니다. 이 새 구성은 선택 부분을 회색으로 지우는 VAEEncodeForInpaint를 쓰지 않습니다.
- 마스크 범위 넓히기(GrowMask)에서 expand=24, tapered_corners=true를 확인합니다. 기존 선택에서 빠진 가장자리까지 포함하는 값입니다. 다른 사진에 무조건 24를 적용하지 마세요.
- 마스크를 이미지로 바꾼 뒤 ImageBlur에서 blur_radius=9, sigma=3으로 경계를 부드럽게 합니다. 이어 ImageToMask의 red 채널로 다시 MASK를 만듭니다.
- 부드러운 MASK를 SetLatentNoiseMask와 최종 합성의 mask에 함께 연결합니다. SetLatentNoiseMask는 잠재 데이터에서 생성할 범위를 지정합니다. 원본 IMAGE는 합성 destination, 디코드 IMAGE는 source입니다.
- seed=20260909 / fixed / 28 steps / CFG 7 / dpmpp_2m / karras / denoise 0.85를 확인하고 실행합니다. MASK, decoded, final 세 그림이 저장됩니다.
- final에서 얼굴과 배경, 목·의상 연결, 양쪽 어깨를 봅니다. 색 변화만 확인하고 끝내지 마세요. 제공 MASK의 검정 바깥쪽은 원본을 쓰고 회색 경계는 두 이미지를 섞습니다.
이번 실습의 설정
| 설정할 노드 | 입력값 |
|---|---|
| 체크포인트 로드 | 체크포인트 = sd_xl_base_1.0.safetensors |
| 이미지 로드 · RGBA 마스크 | 입력 파일 = ch11_knit_mask_r02_rgba.png |
| 이미지 로드 · 입력 사진 | 입력 파일 = ch05_first_portrait_v2_00001_.png |
| 마스크 범위 넓히기 | expand = 24 tapered_corners = true |
| 마스크 경계 부드럽게 | blur_radius = 9 sigma = 3.0 |
| 흐린 그림을 마스크로 | channel = red |
| KSampler | seed = 20260909 생성 후 제어 = fixed steps = 28 CFG = 7.0 sampler = dpmpp_2m scheduler = karras denoise = 0.85 |
| 이미지 저장 · ch11_soft_mask_mask | 파일명 접두사 = guide/ch11_soft_mask_mask |
| 이미지 저장 · ch11_soft_mask_decoded | 파일명 접두사 = guide/ch11_soft_mask_decoded |
| 마스크된 이미지 합성 | x = 0 y = 0 resize_source = false |
| 이미지 저장 · ch11_soft_mask_final | 파일명 접두사 = guide/ch11_soft_mask_final |
입력할 프롬프트 전문
긍정 프롬프트
realistic portrait photo of one adult woman, wearing a (light blue knitted sweater:1.4), blue ribbed crewneck collar, solid pale blue wool garment, natural skin, gray background, soft studio light
부정 프롬프트
text, watermark, blurry, deformed, double neckline, cream collar, beige trim, skin on sweater, plastic skin
직접 구성하기 · 노드 18개와 연결 23개
빈 작업판을 두 번 클릭해 아래 기술 이름으로 검색하고 노드를 추가합니다. 값 입력 뒤, 오른쪽 출력 점을 왼쪽 입력 점으로 끌어 연결하세요. 이름이 같은 노드는 역할·파일명으로 구별합니다.
| 노드 역할 | 검색할 기술 이름 |
|---|---|
| 체크포인트 로드 | CheckpointLoaderSimple |
| 이미지 로드 · RGBA 마스크 | LoadImage |
| 이미지 로드 · 입력 사진 | LoadImage |
| 긍정 프롬프트 | CLIPTextEncode |
| 부정 프롬프트 | CLIPTextEncode |
| VAE 인코드 | VAEEncode |
| 마스크 범위 넓히기 | GrowMask |
| 마스크를 이미지로 | MaskToImage |
| 마스크 경계 부드럽게 | ImageBlur |
| 흐린 그림을 마스크로 | ImageToMask |
| 마스크를 이미지로 변환 | MaskToImage |
| 생성 범위 지정 | SetLatentNoiseMask |
| KSampler | KSampler |
| 이미지 저장 · ch11_soft_mask_mask | SaveImage |
| VAE 디코드 | VAEDecode |
| 이미지 저장 · ch11_soft_mask_decoded | SaveImage |
| 마스크된 이미지 합성 | ImageCompositeMasked |
| 이미지 저장 · ch11_soft_mask_final | SaveImage |
| 순서 | 출발 출력 | 도착 입력 |
|---|---|---|
| 1 | 체크포인트 로드 CLIP → | 긍정 프롬프트 clip |
| 2 | 체크포인트 로드 CLIP → | 부정 프롬프트 clip |
| 3 | 체크포인트 로드 모델 → | KSampler 모델 |
| 4 | 긍정 프롬프트 조건 → | KSampler 긍정 |
| 5 | 부정 프롬프트 조건 → | KSampler 부정 |
| 6 | 생성 범위 지정 잠재 데이터 → | KSampler 잠재 입력 |
| 7 | KSampler 잠재 데이터 → | VAE 디코드 잠재 데이터 |
| 8 | 체크포인트 로드 VAE → | VAE 디코드 vae |
| 9 | VAE 디코드 이미지 → | 이미지 저장 · ch11_soft_mask_decoded 이미지 |
| 10 | 이미지 로드 · 입력 사진 이미지 → | VAE 인코드 이미지 |
| 11 | 체크포인트 로드 VAE → | VAE 인코드 vae |
| 12 | 이미지 로드 · 입력 사진 이미지 → | 마스크된 이미지 합성 바탕 그림(destination) |
| 13 | VAE 디코드 이미지 → | 마스크된 이미지 합성 얹을 그림(source) |
| 14 | 흐린 그림을 마스크로 마스크 → | 마스크된 이미지 합성 마스크 |
| 15 | 마스크된 이미지 합성 이미지 → | 이미지 저장 · ch11_soft_mask_final 이미지 |
| 16 | 흐린 그림을 마스크로 마스크 → | 마스크를 이미지로 변환 마스크 |
| 17 | 마스크를 이미지로 변환 이미지 → | 이미지 저장 · ch11_soft_mask_mask 이미지 |
| 18 | 이미지 로드 · RGBA 마스크 마스크 → | 마스크 범위 넓히기 마스크 |
| 19 | 마스크 범위 넓히기 마스크 → | 마스크를 이미지로 마스크 |
| 20 | 마스크를 이미지로 이미지 → | 마스크 경계 부드럽게 이미지 |
| 21 | 마스크 경계 부드럽게 이미지 → | 흐린 그림을 마스크로 이미지 |
| 22 | VAE 인코드 잠재 데이터 → | 생성 범위 지정 잠재 데이터 |
| 23 | 흐린 그림을 마스크로 마스크 → | 생성 범위 지정 마스크 |
선택 실습 · 마스크 직접 그리기
- 원본 이미지 로드를 별도로 복제하고 그림을 오른쪽 클릭해 Open in MaskEditor | Image Canvas를 엽니다. 원본용 노드는 그대로 유지합니다.
- 왼쪽 마스크 펜을 선택합니다. 이미지에 색을 직접 칠하는 페인트 펜과 구별합니다. 처음에는 두께 70·불투명도 1·경도 1로 니트 안쪽을 채우고, 경계에서는 두께를 줄여 작업합니다.
- 휠로 확대하고 휠 버튼을 누른 채 끌어 화면을 이동합니다. 피부·머리카락을 포함하지 않도록 확인합니다. 지우개와 Ctrl+Z로 선택을 고칩니다.
- 저장(Save) 뒤 복제 노드의 MASK를 GrowMask에 연결해 제공 마스크 입력을 대신합니다. 확장·흐림을 거친 MASK가 생성 범위와 최종 합성으로 가는 경로는 유지합니다.
- 표시 덮개의 색과 실제 MASK 값은 다릅니다. MaskToImage → SaveImage로 실제 선택 범위를 봅니다. 화면의 덮개를 검정으로 표시했다고 MASK가 반전된 것은 아닙니다.

제공 입력에서 만들어지는 부드러운 MASK 보기

4. 정상 결과 확인
파란 니트가 보이고 얼굴은 원본과 유지되는지 확인합니다. 목선에 피부 조각이나 크림색 띠가 생기면 완료로 보지 말고 아래 문제 해결을 확인하세요. 마스크가 정확히 0인 곳은 원본을 보존하며 회색 경계는 섞입니다.

5. 자주 생기는 문제
| 상황 | 확인할 곳 |
|---|---|
| 얼굴이나 배경도 달라져요 | 두 이미지 로드의 역할, SetLatentNoiseMask 연결, 최종 합성의 destination·source·mask를 확인합니다. |
| 목선이 번지거나 피부에 파란색이 묻어요 | 마스크 확장 범위가 피부까지 들어갔는지 확인합니다. 제공 마스크와 달리 그렸다면 결과도 달라집니다. mask 확인 그림과 원본을 함께 보세요. |
| 흑백 그림을 넣었는데 MASK가 비어요 | 입력은 RGBA 마스크 PNG입니다. 저장된 불투명 흑백 MASK 그림은 관찰용입니다. |
| 목선에 피부 조각이나 테두리가 남아요 | 마스크의 흰 부분이 필요한 옷 경계를 포함하는지, 피부까지 넓어지지 않았는지 확인합니다. 마스크 확대만 반복하지 말고 제공 RGBA 입력과 확장·흐림 값, 최종 합성의 바탕·얹을 그림을 함께 확인합니다. |
공통 오류와 용어는 용어·문제 해결에서 찾을 수 있습니다.
공식 참고 자료
준비 단계에서 PC 정보가 헷갈린다면 GPU·메모리 등 내 컴퓨터 사양 확인 방법을 함께 참고하세요. 이 장의 결과와 작업 JSON을 보관한 뒤 다음 실습으로 넘어가면 다시 비교하기 쉽습니다.