AI IMAGE · CONTROLNET

ComfyUI ControlNet 입문 — 포즈·윤곽을 따라 그리게 하기

junetapa 약 20분

프롬프트를 아무리 다듬어도 인물이 오른손을 들지 왼손을 들지, 건물 모서리가 어느 쪽으로 기울지는 시드에 맡기게 된다. ControlNet은 이 빈칸을 «밑그림»으로 채운다. 사진에서 뽑은 윤곽선이나 사람의 뼈대 그림을 프롬프트 옆에 하나 더 넣으면, 모델이 그 선과 자세를 따라 그린다. 이 글은 2026년 10월 16일에 ComfyUI 본체 저장소(nodes.py · comfy/controlnet.py · comfy/utils.py · comfy_extras/nodes_canny.py · folder_paths.py)의 소스 코드를 직접 내려받아 대조했다. 여기에 ComfyUI 공식 문서 · ControlNet 1.1 README · 전처리 확장 comfyui_controlnet_aux README를 함께 읽어 정리했다. 모델 파일 고르기, 노드 잇는 자리, 밑그림 만들기, 세 칸 조절, 여러 개 겹치기, 안 따라올 때 점검 순서를 차례로 적는다.

이어 읽기

있는 그림을 바탕으로 다시 그리는 denoise는 img2img와 denoise, 그림 일부만 다시 그리는 마스크는 인페인팅 편에 있다. 화풍을 바꾸는 LoRA를 ControlNet과 함께 쓰려면 LoRA 적용과 강도를 본다. ComfyUI가 처음이라면 ComfyUI 입문 실전 가이드부터 읽는다.

ControlNet이 하는 일 — 프롬프트 옆에 밑그림 하나

ControlNet은 2023년 2월 arXiv에 처음 올라온 논문 «Adding Conditional Control to Text-to-Image Diffusion Models»에서 나왔다. 논문 초록의 설명은 이렇다. 이미 학습을 마친 큰 확산 모델(Stable Diffusion 등)은 잠가 두고, 그 모델의 인코딩 층을 바탕으로 다시 써서 윤곽 · 깊이 · 분할 · 사람 자세 같은 «공간 조건»을 배우게 한다. 새로 붙인 부분은 0으로 시작하는 합성곱 층(zero convolution)으로 이어져, 미세 조정 중에 해로운 잡음이 원래 모델을 흐트러뜨리지 않게 한다.

쓰는 쪽에서 보면 결과는 간단하다. 프롬프트가 «무엇을» 그릴지 정한다면, ControlNet에 넣은 밑그림은 «어디에 어떤 모양으로» 그릴지를 붙잡는다. 공식 문서도 ControlNet 이전에는 마음에 들 때까지 시드를 바꿔 가며 반복해야 했고, ControlNet으로는 간단한 스케치 하나로 생성 과정을 이끌 수 있다고 설명한다.

이 시리즈의 앞 편들과 견주면 자리가 분명해진다.

도구무엇을 넘기나무엇이 남나
img2img그림 전체(픽셀)색 · 구도 · 질감이 denoise 비율만큼 남음
인페인팅그림 + 마스크마스크 밖은 그대로, 안만 새로 그림
ControlNet밑그림(윤곽선 · 뼈대 · 깊이)선과 자세만 따르고 색 · 질감은 새로 그림

img2img는 원본의 색까지 끌고 오지만 ControlNet은 선과 자세만 넘긴다. 그래서 «이 사진의 자세로, 전혀 다른 옷과 배경의 인물»을 그릴 때 ControlNet이 맞는다. 둘을 함께 쓰는 것도 가능하다. 공식 문서의 포즈 예제는 1차에서 ControlNet으로 자세를 잡고, 2차에서 낮은 denoise(0.4~0.6 정도)로 다른 체크포인트를 써서 다듬는 두 단계 구성이다.

준비물 — 모델 파일 고르기와 넣을 폴더

파일 이름 읽기

ControlNet 1.1부터는 모델 이름을 «표준 ControlNet 이름 규칙»으로 붙였다. control_v11p_sd15_canny를 쪼개 보면 이렇다.

  • v11 — ControlNet 1.1판이다. README는 1.1이 1.0과 신경망 구조가 똑같다고 밝혔다.
  • p · e — 1.1의 모델 14개 가운데 11개가 정식(production-ready), 3개가 실험판이다. 목록을 보면 정식은 p, 실험판(shuffle · ip2p · tile)은 e가 붙어 있다.
  • f1 — 첫 번째 버그 수정판이다. 깊이 모델은 학습 중간 체크포인트가 잘못 올라갔다가 control_v11f1p_sd15_depth로 바로잡혔다. 타일 모델도 v11u(미완성)가 f1e로 바뀌었고 README는 v11u를 쓰고 있다면 바꾸라고 안내한다.
  • sd15 — Stable Diffusion 1.5용이다. README의 설치 안내도 SD 1.5 모델 파일을 함께 받으라고 적었다.
  • canny · openpose · depth … — 어떤 밑그림을 받도록 학습됐는지다.

sd15가 붙은 파일은 SD 1.5 계열 체크포인트와 짝이다. SDXL용으로는 Stability AI가 Control-LoRA를 냈고, 일반 ControlNet 파일과 같은 폴더에 넣어 똑같이 쓴다고 ComfyUI 예제 문서가 안내한다. Flux · SD 3.5 같은 다른 모델은 그 모델용 ControlNet을 따로 골라야 하며, 이 글은 SD 1.5 기준으로 적는다.

어떤 판을 받나

원래 판은 lllyasviel/ControlNet-v1-1 저장소에 있고, ComfyUI 예제 문서는 «더 작은 fp16 safetensors 판»으로 comfyanonymous/ControlNet-v1-1_fp16_safetensors를 함께 소개한다. fp16 판 control_v11p_sd15_canny_fp16.safetensors는 722,601,100바이트, 약 723MB다. 같은 저장소의 control_lora_rank128_ 판은 135,722,816바이트로 더 작다. 공식 문서의 예제들도 fp16 판(control_v11p_sd15_scribble_fp16 · control_v11p_sd15_openpose_fp16)을 내려받게 한다.

이 fp16 저장소에는 README가 교체를 안내한 control_v11u_sd15_tile_fp16 파일이 아직 남아 있다. 타일 모델이 필요하면 이름에 f1e가 붙은 control_v11f1e_sd15_tile_fp16을 고른다.

넣을 폴더

받은 파일은 ComfyUI/models/controlnet 폴더에 넣는다. 서버 코드는 controlnet 종류 목록을 만들 때 models/controlnet과 models/t2i_adapter 두 폴더를 함께 읽는다. T2I-Adapter 파일을 따로 모아 두고 싶으면 t2i_adapter 폴더에 넣어도 같은 목록에 나온다. ComfyUI를 켠 채 파일을 넣었는데 목록에 안 보이면 화면을 새로 고치거나 ComfyUI를 다시 켠다.

한 가지 숨은 동작이 있다. 파일 이름이 _shuffle이나 _shuffle_fp16으로 끝나면 불러올 때 global_average_pooling 옵션이 자동으로 켜진다. 셔플 모델 파일 이름을 마음대로 바꾸면 이 처리가 빠질 수 있으니 받은 이름 그대로 둔다.

노드 넷으로 잇기

기본 텍스트 → 그림 워크플로에 노드 셋을 더하면 된다. 한국어 화면 이름으로 «컨트롤넷 모델 로드», «이미지 로드», «컨트롤넷 적용»이고, 밑그림을 화면 안에서 만들려면 전처리 노드 하나가 더 붙는다.

ComfyUI ControlNet 기본 연결 — 체크포인트에서 나온 CLIP으로 긍정 · 부정 프롬프트를 인코딩하고, 두 조건을 컨트롤넷 적용 노드에 넣는다. 적용 노드에는 컨트롤넷 모델 로드의 출력과, 이미지 로드에서 밑그림 노드를 거친 그림이 함께 들어간다. 적용 노드의 긍정 · 부정 출력은 KSampler의 positive · negative 칸에 연결한다
컨트롤넷 적용 노드는 프롬프트 인코딩과 KSampler 사이에 들어간다.
  1. 컨트롤넷 모델 로드(Load ControlNet Model)를 놓고 받은 파일을 고른다. 이 노드는 controlnet 폴더 목록에서 파일을 읽고, 올바른 ControlNet이 아니면 «ERROR: controlnet file is invalid and does not contain a valid controlnet model.» 오류를 낸다.
  2. 이미지 로드로 참고 사진이나 이미 만든 밑그림을 올린다.
  3. 컨트롤넷 적용(Apply ControlNet)을 놓는다. 입력은 긍정 조건 · 부정 조건 · 컨트롤넷 · 이미지 넷이 필수이고 vae가 선택이다.
  4. 긍정 · 부정 CLIP Text Encode의 출력을 KSampler 대신 적용 노드의 긍정 · 부정 조건 칸에 꽂는다.
  5. 적용 노드의 긍정 · 부정 출력을 KSampler의 positive · negative 칸에 꽂는다.

핵심은 ControlNet이 모델(MODEL) 줄이 아니라 조건(CONDITIONING) 줄에 끼어든다는 점이다. LoRA가 모델과 CLIP을 고쳐 내보내는 것과 다르다. 코드를 보면 적용 노드는 긍정 · 부정 조건 하나하나에 «control» 항목을 붙여 돌려줄 뿐 모델에는 손대지 않는다. 그래서 체크포인트 → LoRA → KSampler로 가는 모델 줄은 그대로 두고, 프롬프트 줄에만 노드를 끼우면 된다.

vae 칸은 비워 둬도 SD 1.5용 ControlNet 1.1 모델은 돈다. 다만 밑그림을 잠재 공간으로 바꿔서 받는 일부 모델은 VAE가 꼭 필요하다. 그런 모델에 VAE를 안 꽂으면 실행 때 «WARNING: no VAE provided to the controlnet apply node when this controlnet requires one.» 경고가 먼저 뜨고, 이어서 «This Controlnet needs a VAE but none was provided, please use a ControlNetApply node with a VAE input and connect it.» 오류로 멈춘다. 이 문구가 보이면 체크포인트의 VAE 출력을 적용 노드의 vae 칸에 잇는다.

구형 노드와 헷갈리지 않기

남이 만든 예전 워크플로를 열면 입력이 «조건» 하나뿐인 «컨트롤넷 적용 (구형)»(영어 화면 Apply ControlNet (DEPRECATED))이 보일 때가 있다. 소스 코드는 이 노드에 DEPRECATED 표시를 달아 두었고, 공식 문서는 기본 검색과 노드 목록에서 보이지 않으며 새 노드를 쓰라고 권한다. 구형 노드는 강도 칸만 있고 시작 · 종료 퍼센트가 없다. 새로 짤 때는 긍정 · 부정 두 칸을 받는 새 노드를 쓴다. 워크플로를 PNG로 불러오는 법은 워크플로 불러오기 편에 있다.

밑그림 만들기 — Canny는 기본, 포즈는 확장

가장 많이 막히는 곳이 여기다. ComfyUI 예제 문서는 적용 노드가 일반 사진을 깊이 그림이나 윤곽선 그림으로 바꿔 주지 않는다고 분명히 적었다. 참고 사진을 이미지 로드에서 적용 노드로 곧장 꽂으면, 윤곽선 모델은 사진을 윤곽선 그림으로 착각한 채 엉뚱한 모양을 따라간다. 모델 종류에 맞는 밑그림으로 먼저 바꿔야 한다.

밑그림 종류와 ControlNet 1.1 모델 파일의 짝 — 윤곽선은 기본 노드 Canny 경계 필터와 canny 모델, 사람 자세는 확장 노드 OpenPose · DWPose와 openpose 모델, 깊이는 확장 노드 MiDaS · Zoe와 f1p depth 모델, 낙서는 Scribble 계열과 scribble 모델, 선화는 Lineart 계열과 lineart 모델이 짝이다
밑그림을 만드는 노드와 모델 파일은 짝을 맞춘다.

공식 문서도 지금의 기본 노드(Comfy Core)에는 전처리기가 다 들어 있지 않아 실제로는 확장 노드가 필요할 수 있다고 안내하며, ComfyUI ControlNet aux와 ComfyUI-Advanced-ControlNet을 꼽는다.

윤곽선 — Canny 경계 필터(기본 노드)

윤곽선 밑그림은 확장 없이 만들 수 있다. 기본 노드 «Canny 경계 필터»(영어 화면 Detect Edges (Canny) · image/filters 분류)가 이미지 하나를 받아 경계선만 뽑은 흑백 그림을 내보낸다. 연결은 이미지 로드 → Canny 경계 필터 → 컨트롤넷 적용의 이미지 칸이고, 모델은 control_v11p_sd15_canny를 고른다.

칸은 두 개다. 낮은 임계값 기본 0.4, 높은 임계값 기본 0.8이고 둘 다 0.01~0.99 사이에서 0.01씩 움직인다. 두 값은 «선으로 볼 만큼 밝기가 바뀌는 정도»를 정하는 문턱이다. Canny 경계 검출의 일반적인 방식대로, 높은 임계값을 넘는 곳은 확실한 경계로 잡고 낮은 임계값과 높은 임계값 사이는 확실한 경계에 이어질 때만 선으로 남긴다. 그래서 두 값을 낮추면 잔선이 늘고, 올리면 굵은 윤곽만 남는다. 밑그림에 잔선이 너무 많으면 모델이 배경 무늬까지 따라 그리므로, Canny 경계 필터 출력에 Preview Image를 하나 달아 밑그림부터 눈으로 보고 값을 고른다. ControlNet 1.1 README는 Canny 모델을 «무작위 임계값»으로 만든 데이터로 학습했다고 적었으니, 정답 값이 따로 있는 것은 아니다.

사람 자세 — OpenPose · DWPose(확장 노드)

포즈 밑그림은 사진 속 사람의 관절을 찾아 막대 인형처럼 이은 «뼈대 그림»이다. 공식 문서는 OpenPose를 카네기멜런대가 만든 다인원 자세 추정 시스템으로 소개하며, 몸 18 · 얼굴 70 · 손 21 · 발 6개의 키포인트를 잡는다고 설명한다. ControlNet 1.1 README는 openpose 모델이 몸 · 손 · 얼굴의 여러 조합으로 학습됐지만, 쓰는 쪽에는 «Openpose»(몸만)와 «Openpose Full»(몸 + 손 + 얼굴) 두 가지만 주기를 권한다.

이 뼈대 그림을 사진에서 뽑는 노드는 기본 노드에 없다. 많이 쓰는 확장은 comfyui_controlnet_aux다. README는 이 저장소가 ControlNet 밑그림(hint image)을 만드는 전처리 노드만 담는다고 밝히고, 설치는 ComfyUI Manager로 하기를 권한다. 2026년 10월 16일 GitHub에서 확인한 마지막 커밋은 2026-10-11이고 라이선스는 Apache-2.0이다.

이 확장의 표를 보면 포즈 쪽 노드는 둘이다.

  • OpenPose Estimator — 몸 · 손 · 얼굴 감지를 칸으로 켜고 끈다. 셋을 다 켜면 README 표의 openpose_full과 같다.
  • DWPose Estimator — 다른 방식의 자세 추정기로 표에서는 dw_openpose_full에 해당한다. 기본으로는 CPU에서 돌아 느리며, TorchScript나 ONNXRuntime 체크포인트로 바꾸면 빨라진다고 README Q&A가 안내한다.

둘 다 짝이 되는 모델은 control_v11p_sd15_openpose다. 연결은 이미지 로드 → OpenPose(또는 DWPose) Estimator → 컨트롤넷 적용의 이미지 칸이다.

이미 뼈대 그림이 있으면 전처리 노드가 필요 없다. 공식 문서의 포즈 예제도 뼈대 그림을 바로 이미지 로드로 올리고, «직접 만든 OpenPose 뼈대 그림을 써도 된다»고 적었다. 같은 이유로 공식 예제들은 전처리를 마친 그림을 내려받게 해 두었다.

참고 사진은 권리부터

밑그림으로 쓰는 사진이 남의 작품이거나 실존 인물이라면 뼈대만 뽑아도 원본의 구도 · 자세를 옮기는 셈이다. 공유하거나 판매할 그림이라면 직접 찍은 사진, 직접 그린 뼈대, 쓰임새가 허락된 자료로 밑그림을 만든다.

다른 밑그림

같은 확장에는 깊이(MiDaS · Zoe 등 → control_v11f1p_sd15_depth), 부드러운 윤곽(HED · PiDiNet → softedge), 선화(Lineart → lineart), 낙서(Scribble → scribble), 직선(M-LSD → mlsd) 노드가 짝지어 있다. 이 노드들을 하나로 모은 «AIO Aux Preprocessor»는 고르기 편하지만 각 전처리기의 임계값 칸을 바꿀 수 없으니, 값을 손대려면 개별 노드를 쓴다.

세 칸 조절 — 강도 · 시작 퍼센트 · 종료 퍼센트

컨트롤넷 적용 노드의 숫자 칸은 셋이다. 강도(strength)는 기본 1.0에 0~10 범위, 시작 퍼센트(start_percent)는 기본 0.0, 종료 퍼센트(end_percent)는 기본 1.0이며 0.001 단위로 움직인다.

시작 · 종료 퍼센트가 ControlNet이 끼어드는 구간을 정하는 방식 — 0.0에서 1.0은 처음부터 끝까지 따르고, 0.0에서 0.6은 앞부분에서만 구도와 자세를 잡은 뒤 모델에 맡기며, 0.2에서 1.0은 큰 틀을 모델이 먼저 잡은 뒤 따른다. 강도 0이면 노드가 입력 조건을 그대로 돌려줘 ControlNet이 없는 것과 같다
시작 · 종료 퍼센트는 ControlNet이 끼어드는 샘플링 구간이다.

강도 — 출력에 곱하는 수

코드에서 강도가 하는 일은 단순하다. ControlNet이 단계마다 계산한 값을 원래 모델에 더하기 전에 강도를 곱한다. 1.0이면 학습된 그대로, 0.5면 절반만 섞는다. 강도를 0으로 두면 적용 노드는 아예 아무것도 붙이지 않고 들어온 조건을 그대로 돌려준다. 노드를 지우지 않고 ControlNet을 잠시 끄고 싶을 때 쓸 수 있다.

밑그림이 지나치게 그대로 찍혀 나오면 강도를 내리고, 자세가 자꾸 흐트러지면 올린다. 칸은 10까지 열려 있지만 기본값이 1.0이니 그 근처에서 0.1 단위로 움직여 본다. 어느 값이 맞는지는 모델 · 밑그림 · 프롬프트마다 달라 이 글에서 숫자를 정하지 않는다.

시작 · 종료 퍼센트 — 끼어드는 구간

시작 · 종료 퍼센트는 샘플링의 어느 구간에서 ControlNet을 쓸지 정한다. 공식 문서의 예를 그대로 옮기면 시작 0.2는 확산 과정의 20%가 지난 뒤부터, 종료 0.8은 80%에서 적용을 멈춘다는 뜻이다. 코드는 실행 직전에 두 퍼센트를 모델의 시간 단계 값으로 바꿔 두고, 단계마다 지금 시간 단계가 그 구간 밖이면 ControlNet 출력을 넣지 않는다. 단계 번호가 아니라 진행 비율이라서 KSampler의 steps를 20에서 30으로 바꿔도 같은 비율 구간이 유지된다.

확산 모델은 일반적으로 잡음이 많은 앞부분에서 큰 구도가 정해지고, 뒷부분에서 세부가 다듬어진다. 그래서 쓰임새는 대체로 이렇게 나뉜다.

  • 자세만 잡고 나머지는 자유롭게 — 종료를 0.5~0.7 정도로 당긴다. 뼈대는 앞부분에서 자리를 잡고, 옷 주름 · 손가락 같은 세부는 모델이 그린다.
  • 큰 틀은 모델에 맡기고 윤곽만 맞추기 — 시작을 0.1~0.3 정도로 늦춘다.
  • 밑그림을 최대한 그대로 — 기본값(0.0 → 1.0)에 강도 1.0.

이 범위는 출발점일 뿐 실측한 최적값이 아니다. 한 칸씩 바꿔 보며 비교하려면 시드를 고정해야 차이가 보인다. 시드를 고정하고 칸 하나만 바꾸는 법은 시드 고정과 CFG 편에 있다.

속도에 드는 값

ComfyUI 예제 문서는 ControlNet 모델이 샘플링 단계마다 한 번씩 돌기 때문에 생성 속도를 눈에 띄게 늦추고, T2I-Adapter는 전체에서 한 번만 돌아 속도에 거의 영향이 없다고 설명한다. T2I-Adapter 파일도 같은 컨트롤넷 모델 로드 노드로 불러 똑같이 쓴다. 종료 퍼센트를 당기면 그 뒤 단계에서는 ControlNet 계산을 건너뛰므로 구간을 줄이는 것도 시간을 아끼는 방법이다.

여러 개 겹치기와 밑그림 크기

사슬처럼 잇기

포즈와 윤곽을 함께 쓰고 싶으면 컨트롤넷 적용 노드를 하나 더 놓고 앞 노드의 긍정 · 부정 출력을 뒤 노드의 긍정 · 부정 입력에 잇는다. 공식 문서는 이렇게 사슬처럼 이어 여러 ControlNet을 겹치는 법을 안내하고, 왼쪽 인물은 포즈로 · 오른쪽 고양이는 낙서로 잡는 예제를 보여 준다.

코드를 보면 뒤 노드는 조건에 이미 붙어 있던 ControlNet을 «앞 ControlNet»으로 기억해 두고, 단계마다 앞 ControlNet의 출력과 자기 출력을 더해 모델에 넘긴다. 둘의 영향은 더해지므로 강도를 각각 1.0으로 두면 한쪽만 쓸 때보다 세게 걸린다. 공식 문서도 각 ControlNet의 강도로 영향을 나눠 조절하라고 적었다. 두 개를 겹칠 때는 각각 0.5~0.8 정도에서 시작해 맞춰 가는 편이 안전하다.

ControlNet이 하나 늘 때마다 모델 파일을 하나 더 불러오고 단계마다 계산도 하나 더 돈다. SD 1.5 fp16 파일 하나가 약 723MB이므로 메모리가 빠듯한 그래픽카드라면 겹치는 개수를 줄인다. 모델별 메모리는 모델별 VRAM 편을 본다.

밑그림 크기와 비율

밑그림 크기를 Empty Latent Image의 폭 · 높이와 똑같이 맞출 필요는 없다. ControlNet은 실행 때 밑그림을 잠재 이미지 크기의 8배(픽셀 크기)로 자동으로 맞춘다. 이때 쓰는 방식이 «center» 자르기라는 점은 알아 둘 만하다. 가로세로 비율이 다르면 긴 쪽의 양 끝을 똑같이 잘라 비율을 맞춘 뒤 크기를 바꾼다. 세로로 긴 전신 사진의 뼈대를 정사각형 512×512 그림에 넣으면 머리와 발끝이 잘려 나간 뼈대를 따라 그리게 된다.

그래서 밑그림은 만들 그림과 같은 비율로 준비한다. 세로 그림을 만들 거라면 Empty Latent Image도 세로로 두거나, 밑그림을 미리 같은 비율로 잘라 둔다. 크기를 바꿀 때 쓰는 방식은 nearest-exact라서 아주 작은 밑그림을 크게 늘리면 선이 계단처럼 굵어질 수 있다. 밑그림은 만들 그림과 비슷하거나 큰 해상도로 뽑는다.

잘 안 따라올 때 점검 순서

ControlNet을 걸었는데 결과가 밑그림과 상관없어 보이면 위에서부터 차례로 본다.

  1. KSampler가 적용 노드의 출력을 받고 있나. CLIP Text Encode가 KSampler에 바로 꽂혀 있으면 적용 노드는 계산만 하고 쓰이지 않는다. 적용 노드의 긍정 · 부정 출력선이 KSampler까지 이어졌는지 본다.
  2. 밑그림이 밑그림인가. 참고 사진을 그대로 넣지 않았는지, 전처리 노드 출력에 Preview Image를 달아 윤곽선 · 뼈대가 제대로 나왔는지 본다.
  3. 밑그림과 모델 파일이 짝인가. 뼈대 그림에 canny 모델, 윤곽선에 openpose 모델을 걸면 따라오지 않는다.
  4. 체크포인트와 모델 세대가 맞나. sd15 파일은 SD 1.5 계열 체크포인트와 짝이다. SDXL 체크포인트에 sd15 ControlNet을 걸었는지 본다.
  5. 강도 · 구간. 강도가 0이거나 너무 낮지 않은지, 시작 퍼센트가 종료 퍼센트보다 크게 들어가지 않았는지 본다.
  6. 비율. 밑그림 비율이 Empty Latent Image와 달라 중요한 부분이 잘리지 않았는지 본다.

빨간 테두리와 함께 실행이 아예 거절된다면 파일 이름이 목록에 없는 경우가 많다. 남의 워크플로에 적힌 ControlNet 파일이 내 controlnet 폴더에 없으면 «Value not in list» 오류가 난다. 읽는 법은 오류 메시지 읽는 법 편에 있다. comfyui_controlnet_aux를 설치한 뒤 ComfyUI가 켜지지 않으면 업데이트 뒤 안 켜질 때 편의 커스텀 노드 가르기 순서를 따른다. 설치는 됐는데 일부 노드만 안 보인다면, README 설명대로 이 확장은 불러오지 못한 노드를 건너뛰고 나머지만 올리므로 명령 창 기록에서 실패한 노드를 찾는다.

자주 묻는 것

ControlNet 모델 파일은 어느 폴더에 넣나요?

ComfyUI/models/controlnet 폴더에 넣습니다. ComfyUI는 controlnet 목록을 만들 때 models/controlnet과 models/t2i_adapter 두 폴더를 함께 읽으므로 T2I-Adapter 파일은 t2i_adapter 폴더에 두어도 됩니다. 켜 둔 채 넣었는데 컨트롤넷 모델 로드 노드의 목록에 안 보이면 화면을 새로 고치거나 ComfyUI를 다시 켭니다.

참고 사진을 바로 컨트롤넷 적용에 넣으면 안 되나요?

넣을 수는 있지만 대개 원하는 대로 따라오지 않습니다. 컨트롤넷 적용 노드는 일반 사진을 윤곽선이나 뼈대 그림으로 바꿔 주지 않습니다. 윤곽선 모델에는 Canny 경계 필터를 거친 그림을, 포즈 모델에는 OpenPose나 DWPose로 뽑은 뼈대 그림을 넣습니다. 이미 그런 밑그림이 있다면 그 그림을 바로 넣으면 됩니다.

OpenPose 노드가 노드 목록에 없어요.

OpenPose · DWPose 전처리 노드는 ComfyUI 기본 노드에 들어 있지 않습니다. comfyui_controlnet_aux 같은 확장을 ComfyUI Manager로 설치해야 나타납니다. 기본 노드만으로 바로 쓸 수 있는 밑그림 노드는 Canny 경계 필터입니다.

강도와 시작 · 종료 퍼센트는 어떻게 다른가요?

강도는 ControlNet이 계산한 값에 곱하는 수라서 영향의 세기를 정하고, 0이면 노드가 아무것도 붙이지 않습니다. 시작 · 종료 퍼센트는 샘플링 진행 비율로 ControlNet이 끼어드는 구간을 정하고, 구간 밖 단계에서는 ControlNet 출력을 넣지 않습니다. 자세만 잡고 세부를 자유롭게 하려면 강도보다 종료 퍼센트를 당기는 쪽이 의도에 가깝습니다.

SDXL 체크포인트에 control_v11p_sd15 모델을 써도 되나요?

이름의 sd15는 Stable Diffusion 1.5용이라는 뜻이어서 SDXL 체크포인트와는 짝이 아닙니다. SDXL에는 SDXL용 ControlNet이나 Stability AI의 Control-LoRA를 받아 같은 controlnet 폴더에 넣고 같은 노드로 씁니다. Flux · SD 3.5도 각 모델용 ControlNet을 따로 고릅니다.

ControlNet을 두 개 이상 함께 쓸 수 있나요?

컨트롤넷 적용 노드를 사슬처럼 이어 씁니다. 앞 노드의 긍정 · 부정 출력을 뒤 노드의 긍정 · 부정 입력에 연결하면 됩니다. 두 ControlNet의 영향은 더해지므로 각각의 강도를 1.0보다 낮게 잡고 맞춰 갑니다. 하나 늘 때마다 모델 파일을 더 불러오고 단계마다 계산도 더 돌아 메모리와 시간이 늘어납니다.

참고 자료

  1. ComfyUI 공식 문서. ControlNet in ComfyUI — models/controlnet 폴더, 컨트롤넷 적용 노드 입력 · 출력 표, start_percent 0.2 · end_percent 0.8 예시 설명, 구형 노드가 기본 검색에서 숨겨진 점, 기본 노드에 전처리기가 다 들어 있지 않다는 안내. docs.comfy.org
  2. ComfyUI 공식 문서. Pose ControlNet Usage Example — OpenPose 몸 18 · 얼굴 70 · 손 21 · 발 6 키포인트 설명, 1차 ControlNet · 2차 낮은 denoise로 다듬는 두 단계 예제. docs.comfy.org
  3. ComfyUI 소스 코드 nodes.py — ControlNetLoader가 controlnet 폴더 목록을 읽고 잘못된 파일이면 오류를 내는 부분, ControlNetApplyAdvanced 입력(강도 기본 1.0 · 0~10, 시작 0.0 · 종료 1.0 · 0.001 단위, vae 선택)과 강도 0이면 입력을 그대로 돌려주는 부분, 앞선 ControlNet을 이어 붙이는 부분, 구형 ControlNetApply의 DEPRECATED 표시. github.com
  4. ComfyUI 소스 코드 comfy/controlnet.py — 시작 · 종료 퍼센트를 시간 단계로 바꿔 구간 밖이면 출력을 넣지 않는 부분, 밑그림을 잠재 이미지 크기 × 8로 맞추는 부분(nearest-exact · center), 강도를 출력에 곱하는 부분, 앞 ControlNet 출력과 더하는 부분, VAE가 필요한 모델의 경고 · 오류 문구, 파일 이름이 _shuffle로 끝나면 global_average_pooling을 켜는 부분. github.com
  5. ComfyUI 소스 코드 comfy/utils.py — common_upscale의 center 자르기 — 가로세로 비율이 다르면 긴 쪽 양끝을 잘라 비율을 맞춘 뒤 크기를 바꾸는 부분. github.com
  6. ComfyUI 소스 코드 comfy_extras/nodes_canny.py — Canny 노드의 낮은 임계값 기본 0.4 · 높은 임계값 기본 0.8(0.01~0.99), kornia canny로 경계만 뽑아 흑백 그림으로 내보내는 부분. github.com
  7. ComfyUI 소스 코드 folder_paths.py — controlnet 종류가 models/controlnet과 models/t2i_adapter 두 폴더를 함께 읽는 부분. github.com
  8. ComfyUI_examples. ControlNet and T2I-Adapter Examples — 적용 노드가 일반 사진을 깊이 · 윤곽선 그림으로 바꿔 주지 않는다는 설명, ControlNet은 단계마다 한 번씩 돌고 T2I-Adapter는 한 번만 돈다는 설명, SDXL용 Control-LoRA를 같은 폴더에 넣어 같은 방식으로 쓴다는 안내, 여러 ControlNet 섞기. comfyanonymous.github.io
  9. lllyasviel. ControlNet 1.1 README — 표준 이름 규칙, 모델 14개(정식 11 · 실험 3) 목록, f1 = 버그 수정 1, f1e = 버그 수정 1 · 실험, v11u 타일 모델 교체 안내, OpenPose 1.1이 몸 · 손 · 얼굴 조합을 받고 «Openpose» · «Openpose Full» 두 가지 선택을 권한다는 설명, Canny 학습 데이터가 무작위 임계값이라는 설명. github.com
  10. Hugging Face. comfyanonymous/ControlNet-v1-1_fp16_safetensors — fp16 파일 목록과 크기(control_v11p_sd15_canny_fp16 등 722,601,100바이트 · control_lora_rank128 판 135,722,816바이트), 마지막 수정 2023-08-29. huggingface.co
  11. Fannovel16. comfyui_controlnet_aux README — 밑그림(hint image) 만드는 전처리 노드 모음, ComfyUI Manager 설치 권장, 전처리 노드와 모델 파일 짝 표(Canny Edge · OpenPose · DWPose · MiDaS · Zoe · Scribble · Lineart), AIO Aux Preprocessor는 임계값을 못 바꾼다는 설명, DWPose가 기본으로 CPU를 써서 느리다는 Q&A, Apache-2.0 · 마지막 커밋 2026-10-11(2026-10-16 GitHub API 확인). github.com
  12. Zhang, Rao, Agrawala. Adding Conditional Control to Text-to-Image Diffusion Models (arXiv 2302.05543) — ControlNet이 사전 학습된 확산 모델을 잠가 두고 영(0)으로 시작하는 합성곱(zero convolution)으로 공간 조건(윤곽 · 깊이 · 분할 · 사람 자세)을 더하는 구조라는 초록. arxiv.org
  13. ComfyUI 공식 문서. Mixing ControlNets — 컨트롤넷 적용 노드를 사슬처럼 이어 여러 ControlNet을 겹치는 법, 포즈 + 낙서 예제, 강도로 각자의 영향을 나누는 설명. docs.comfy.org
  14. ComfyUI 프런트엔드 한국어 번역 ko/nodeDefs.json — 컨트롤넷 모델 로드 · 컨트롤넷 적용 · 컨트롤넷 적용 (구형) · Canny 경계 필터 · 이미지 로드 표기와 입력 칸 이름(긍정 조건 · 부정 조건 · 강도 · 시작 퍼센트 · 종료 퍼센트). github.com
이 글의 동작 설명은 2026년 10월 16일에 내려받은 ComfyUI 저장소의 nodes.py · comfy/controlnet.py · comfy/utils.py · comfy_extras/nodes_canny.py · comfy_extras/nodes_controlnet.py · folder_paths.py, ComfyUI 프런트엔드 한국어 번역 파일, ComfyUI 공식 문서(ControlNet · Pose ControlNet · Mixing ControlNets), ComfyUI_examples, ControlNet 1.1 README, comfyui_controlnet_aux README, Hugging Face 파일 목록을 따랐다. 실제 ComfyUI를 띄워 강도 · 구간별 결과나 속도 · 메모리를 재지는 않았으며, 글 속 강도 · 퍼센트 범위는 출발점으로 제시한 값이다. 그림 속 막대 길이는 설명용 비율이다. ComfyUI와 확장 노드는 자주 갱신되므로 노드 이름 · 기본값 · 메뉴 위치는 쓰는 판에서 다시 확인한다. 이 글은 ComfyUI · ControlNet 개발진과 관계없는 개인 블로그의 정리다.
ComfyUI스테이블디퓨전ControlNetOpenPoseAI이미지워크플로
junetapa
junetapa
AI 도구를 직접 굴려 보고 남은 기록을 정리한다.
Twitter Facebook URL 복사