AI IMAGE · FACE DETAIL

ComfyUI 얼굴 보정 — FaceDetailer 크기와 마스크

junetapa 2026. 10. 30 업데이트 약 16분

전신 구도는 마음에 드는데 작게 나온 얼굴만 뭉개졌다면, 시드를 바꿔 전체를 다시 뽑기보다 얼굴 조각만 다시 그리는 편이 빠르다. ComfyUI에서 그 일을 맡는 노드가 Impact Pack의 FaceDetailer로, 감지 모델이 찾은 얼굴 주변을 잘라 확대해 다시 그린 뒤 원래 크기로 줄여 마스크를 따라 붙여 넣는다. 다만 guide_size를 높인 만큼 얼굴이 커지는 것은 아니다. 코드가 max_size로 잘라낸 이미지의 크기를 제한하기 때문이다. 얼굴 크기와 주변 여백을 함께 봐야 하는 이유가 여기에 있다.

이 글은 공식 문서 범위로 정리했다. 2026년 10월 30일 제작자 저장소의 README와 소스 코드를 받아 대조했으며, 확인한 Impact Pack의 설정 파일은 V8.28.3을 가리킨다. 실제 생성 결과나 속도를 측정한 후기는 아니다. 이미 만든 가상 캐릭터 그림을 고치는 경우를 전제로, 연결할 노드와 모델, 크기 계산, 마스크, 결과가 그대로일 때의 원인을 다룬다.

이어 읽기

손으로 영역을 칠하는 ComfyUI 인페인팅에서 자동 감지로 넘어오는 편이다. 전체 그림의 크기를 키우는 목적이라면 이미지 업스케일 편이 이어진다.

ComfyUI 얼굴 보정, 필요한 노드부터 연결하기

FaceDetailer의 감지와 재생성은 서로 다른 모델이 맡는다. bbox_detector는 얼굴 위치를 찾고, model·clip·vae와 프롬프트 조건은 그 안을 다시 그리는 데 쓰인다. 감지 모델만 받아서는 그림을 다시 만들 수 없고, 생성 체크포인트만 연결해서도 얼굴 위치를 찾을 수 없다. README도 FaceDetailer를 «얼굴 감지용 Detector 노드와 이미지 보정용 Detailer 노드를 합친 것»으로 설명한다. 노드 하나에 두 일이 묶여 있을 뿐, 필요한 모델 파일은 두 종류라는 뜻이다.

먼저 Manager에서 ComfyUI Impact Pack을 설치하고, YOLO 감지를 쓸 경우 ComfyUI Impact Subpack도 별도로 설치한다. README는 V8.0부터 Subpack을 자동 설치하지 않는다고 적었다. 따라서 FaceDetailer는 검색되는데 UltralyticsDetectorProvider가 없으면, 생성 모델을 다시 받기 전에 Subpack의 설치 여부를 볼 차례다. 재생성 노드와 감지 모델을 불러오는 노드가 서로 다른 묶음에 있다는 뜻이다.

본체와의 호환 조건도 있다. README의 V8.24 공지는 DifferentialDiffusion의 구조 변경 때문에 ComfyUI 0.3.63 이상이 필요하다고 적었다. 노드가 아예 불러와지지 않는다면 마스크 설정을 조정하기 전에 시작 오류와 본체 판 번호를 대조할 근거가 된다.

작은 추상 로봇이 흰 작업대에서 위치를 찾는 돋보기 도구와 빈 그림 조각을 다듬는 붓 도구를 나란히 놓은 장면 — 얼굴 감지와 부분 재생성이 다른 역할이라는 개념
찾는 도구와 다시 그리는 도구를 함께 준비한다.

감지 모델 폴더와 소켓을 맞춘다

얼굴 감지 파일의 예로 face_yolov8m.pt가 있다. Subpack README가 연결한 제작자 모델 카드는 이 파일의 대상을 평면 그림과 실사 형태의 얼굴로 적는다. 이 글에서는 실존 인물 사진을 예로 쓰지 않는다. 같은 카드의 손 감지 모델이나 사람 전체 감지 모델과 파일 이름이 비슷하므로, 얼굴을 고치려는 경우에는 대상이 face인 항목인지부터 본다. 모델 카드의 성능 수치를 특정 그림의 감지 성공률로 옮겨 읽을 근거는 없다.

Subpack이 안내하는 기본 폴더는 bbox 모델의 경우 ComfyUI/models/ultralytics/bbox, 분할 모델의 경우 ComfyUI/models/ultralytics/segm이다. 위 얼굴 파일을 bbox 폴더에 두면 Provider의 목록에는 bbox/face_yolov8m.pt 형태로 나타나는 구조다. 코드가 모델 파일 이름 앞에 bbox/ 또는 segm/를 붙여 목록을 만들기 때문이다. 메뉴의 접두사는 폴더 종류를 표시하는 것이므로 파일 이름에 다시 붙여 저장할 필요가 없다.

기존 생성 그래프에서는 VAE Decode의 IMAGE를 FaceDetailer의 image로 보낸다. 체크포인트에서 나온 MODEL·CLIP·VAE와 프롬프트 인코딩의 positive·negative를 해당 입력에 연결하고, Provider의 BBOX_DETECTOR를 bbox_detector에 잇는다. 완성된 전체 그림은 FaceDetailer의 image 출력에서 Preview Image나 Save Image로 보낸다. 기존 이미지 파일을 고치는 경우에는 Load Image를 시작점으로 쓸 수 있지만, 재생성에 쓸 모델과 조건은 별도로 연결해야 한다.

cropped_refined는 보정한 잘린 이미지의 목록이며, image는 합성된 전체 이미지다. 연결 후 작은 얼굴 조각만 저장된다면 먼저 Save Image에 어느 출력을 꽂았는지 본다. 입력 원본도 따로 미리 보기에 남겨 두면, 얼굴이 좋아졌는지와 주변까지 달라졌는지를 같은 구도로 비교하기 쉽다.

수동 설치를 선택한다면 의존성을 설치하는 파이썬 환경도 맞아야 한다. Subpack README는 ComfyUI가 실행되는 환경 안에 설치하라고 적고, 포터블은 내장 파이썬을 사용한 뒤 ComfyUI를 재시작하도록 안내한다. 다른 파이썬에 패키지를 넣은 상태는 모델 폴더를 옮겨도 풀리지 않는다. 이 글의 작업에서는 설치나 실행을 하지 않았으며, 여기까지는 독자가 자기 환경에서 연결할 흐름이다.

FaceDetailer 연결 도해 — 설치: ComfyUI Impact Pack과 Impact Subpack. 입력: image(VAE Decode의 IMAGE), 생성 입력(MODEL · CLIP · VAE와 positive · negative), bbox_detector(Provider의 BBOX_DETECTOR)가 FaceDetailer로 들어간다. 출력: image는 합성된 전체 이미지로 Preview Image나 Save Image로, cropped_refined는 보정한 잘린 이미지의 목록
감지 입력과 생성 입력을 나눠 연결하고, 전체 결과는 image에서 받는다 — 2026년 10월 30일 Impact Pack · Subpack 기준.

FaceDetailer 크기 설정 — guide_size만 올리면 생기는 일

얼굴이 작을 때 중요한 것은 원본 전체의 해상도보다 재생성할 얼굴에 얼마만큼의 작업 공간을 주느냐다. FaceDetailer의 기본값은 guide_size=512, guide_size_for=bbox, max_size=1024다. 여기서 bbox는 감지한 얼굴의 사각형이고, crop_region은 그 주변까지 포함해 잘라낸 이미지다. 같은 크기 설정이라도 어느 영역을 기준으로 삼는지에 따라 확대 배율이 달라진다.

guide_size_for=bbox이면 코드가 guide_size를 얼굴 사각형의 짧은 변으로 나눠 배율을 구한다. crop_region이면 잘라낸 이미지의 짧은 변으로 나눈다. 따라서 bbox 모드는 얼굴 쪽을 기준으로 작업 크기를 정하려는 설정이고, crop_region 모드는 주변을 포함한 조각 전체가 기준이다. 어느 쪽도 최종 저장 이미지의 가로·세로를 직접 지정하는 칸은 아니다.

작은 추상 로봇이 작은 정사각형 타일을 둘러싼 큰 빈 액자를 확대경 아래 놓고 살피는 장면 — 얼굴 상자와 주변을 포함한 잘라내기 영역의 크기 차이 개념
얼굴 상자와 잘라낸 이미지 전체는 크기 계산의 기준이 다르다.

주변 여백이 커지면 상한에 먼저 닿는다

bbox_crop_factor의 기본값은 3.0이다. make_crop_region은 bbox의 폭과 높이에 각각 이 값을 곱해 주변 영역을 잡고, 원본 이미지의 경계 안으로 위치와 범위를 보정한다. 이 영역은 모델에게 얼굴 주변의 맥락을 보여 주는 조각이다. 마스크 자체를 넓히는 bbox_dilation과 역할이 다르므로, 주변이 더 필요하다는 이유와 보정 영역을 더 넓혀야 한다는 이유를 나눠 생각할 수 있다.

그다음 max_size가 개입한다. 확대 예정인 crop_region의 어느 변이든 max_size를 넘으면, 코드는 긴 변을 상한에 맞추도록 배율을 다시 낮춘다. 얼굴 기준으로 배율을 잡았더라도 주변을 포함한 조각이 먼저 상한에 닿을 수 있다는 뜻이다. 그래서 guide_size만 올리고 잘라내기 배수와 max_size를 그대로 두면 얼굴의 실제 작업 크기가 기대만큼 늘지 않을 수 있다.

가상의 숫자로 코드 식을 따라가 보면 차이가 분명하다. 그림 가운데에서 64×64픽셀 얼굴이 감지됐다고 하자. 기본값 bbox_crop_factor 3.0이면 잘라낸 조각은 192×192픽셀이고, guide_size 512를 얼굴 짧은 변 64로 나눈 배율은 8이다. 그대로 키우면 조각이 1536픽셀이 되어 max_size 1024를 넘으므로, 배율은 1024÷1536을 곱한 약 5.33으로 줄고 얼굴 쪽 작업 크기는 512가 아니라 약 341픽셀이 된다. 같은 얼굴에서 bbox_crop_factor만 2.0으로 낮추면 조각은 128×128픽셀, 8배 확대 결과가 1024픽셀로 상한을 넘지 않아 얼굴이 512픽셀로 다시 그려진다.

식을 정리하면 얼굴 크기는 지워진다. 정사각형 얼굴의 한 변을 s라 하면 조각은 3s, 배율은 512/s라서 확대한 조각은 언제나 1536픽셀로 계산된다. 그림 가장자리에 걸려 조각이 잘리지 않는 한, 기본값에서는 얼굴이 작든 크든 상한에 걸린다는 뜻이다. 얼굴을 guide_size만큼 키우고 싶다면 guide_size × bbox_crop_factor가 max_size 이하인지부터 보면 된다. 생성 품질을 잰 결과가 아니라 코드 계산을 따라간 예시다.

크기를 조정할 때는 FaceDetailer의 잘린 결과와 실행 기록을 함께 보는 편이 낫다. 코드는 감지한 bbox 크기, crop region 크기, 확대 배율과 결과 크기를 기록한다. 얼굴 영역이 충분히 잡혔는데도 디테일이 적다면 guide_size의 숫자만 보기보다 상한 때문에 배율이 줄었는지 읽을 수 있다. 배경을 과하게 포함한 crop이라면 필요한 맥락이 남는 범위에서 배수를 줄이는 것도 비교할 선택지다.

재생성이 끝난 조각은 원래 crop_region 크기로 축소된 뒤 붙는다. FaceDetailer를 거쳐도 전체 그림의 크기를 키우는 목적은 별도로 남는다. 이 차이는 ComfyUI 업스케일 사용법과 연결된다. 원본 크기에서 얼굴을 고친 결과와, 전체를 확대한 결과를 섞어 비교하면 어느 단계가 좋아졌는지 알기 어렵다. 비교할 때는 같은 표시 배율로 얼굴과 그 주변을 함께 보는 것이 좋다.

또한 force_inpaint는 크기 상한을 풀어 주는 옵션이 아니다. 기본값은 enabled이며, 꺼 둔 경우에는 얼굴의 폭과 높이가 모두 guide_size 이상이면 처리를 건너뛴다. 확대 배율이 커지지 않는 경우에도 건너뛰는 조건이 있다. 켜 둔 경우 해당 분기에서 원래 crop 크기로 재생성을 진행할 수 있지만, 얼굴을 더 크게 확대하도록 max_size를 해제하는 기능으로 읽으면 안 된다.

이때 원래 crop 자체가 상한보다 크면 원래 크기로 진행하는 분기도 생긴다. max_size를 어떤 입력에서도 지켜지는 메모리 한도처럼 받아들이지 말아야 하는 이유다. 이 글에서 설명한 상한은 확대 배율을 계산하는 경로의 제한이다.

FaceDetailer 크기 도해 — 기본값 guide_size 512 · bbox 기준 · max_size 1024 · bbox_crop_factor 3.0. 64×64픽셀 얼굴은 crop_factor 3.0에서 조각 192×192픽셀, 배율 8이면 1536픽셀로 상한을 넘어 배율 약 5.33 · 얼굴 약 341픽셀. crop_factor 2.0이면 조각 128×128픽셀, 8배 확대 1024픽셀로 상한 안 · 얼굴 512픽셀. 아래 칸: guide_size × bbox_crop_factor가 max_size 이하인지 본다
얼굴 기준 배율 뒤에 잘라낸 조각 전체에 상한이 걸린다 — 2026년 10월 30일 Impact Pack core.py · utils.py 기준 계산 예시.
인용 — ltdrdata. ComfyUI-Impact-Pack README

The MASK output of FaceDetailer provides a visualization of where the detected and enhanced areas are.

FaceDetailer의 MASK 출력은 감지하고 보정한 영역이 어디인지 시각화한다는 뜻이다. 얼굴이 그대로이거나 주변까지 바뀌었을 때는 결과 이미지와 이 마스크를 함께 볼 이유가 있다.

ComfyUI 얼굴 보정 마스크 — 범위와 경계가 다른 설정

감지한 얼굴을 다시 그릴 때는 어디를 손댈지와 어떤 경계로 붙일지를 따로 정한다. FaceDetailer의 noise_mask 기본값은 enabled다. 코드에서는 이 옵션이 켜져 있으면 잘린 마스크를 재생성 함수에 넘기고, 꺼져 있으면 그 자리에 마스크를 넘기지 않는다. 주변을 포함한 crop 전체를 작업할 것인지, 감지 영역을 따라 노이즈를 제한할 것인지에 관여하는 설정이다.

그런데 재생성 마스크를 꺼도 합성 단계의 마스크가 함께 사라지는 구조는 아니다. 보정한 이미지를 원본에 붙일 때는 별도로 만든 마스크를 사용한다. 따라서 noise_mask를 껐다는 사실만으로 «사각형 crop 전체가 그대로 원본을 덮는다»고 단정할 수 없다. 재생성에서 보는 범위와 최종 이미지에 드러나는 범위가 다르다는 점을 알아 두면 설정 이름을 훨씬 덜 헷갈린다.

작은 추상 로봇이 반투명 도형 틀로 작은 타일의 가운데를 가리고 가장자리를 부드러운 붓으로 다듬는 장면 — 재생성 범위와 합성 경계를 따로 다루는 개념
안쪽을 다시 그리는 범위와 원본에 붙이는 경계를 나눠 본다.

feather와 noise_mask_feather는 쓰이는 단계가 다르다

feather의 기본값은 5이고, noise_mask_feather의 입력 기본값은 20이다. 이름이 닮았지만 소스의 경로가 다르다. DetailerForEach는 feather로 합성용 마스크를 흐리게 한 뒤, 보정 이미지를 붙여 넣을 때 사용한다. enhance_detail은 noise_mask_feather로 재생성에 넘길 노이즈 마스크를 흐리게 한다. 경계가 어색하다는 증상 하나로 두 값을 같은 기능처럼 바꿀 수 없는 이유다.

noise_mask_feather에는 처리 조건도 붙는다. 값이 양수이고 모델 옵션에 denoise_mask_function이 없으면 코드가 Differential Diffusion을 적용한다. 단순히 마지막 합성 테두리만 흐리는 옵션이라고 이해하면 이 경로를 놓친다. 원본에 붙인 테두리가 도드라지는 문제는 합성 마스크를, 재생성되는 부분과 보존되는 부분의 전환은 노이즈 마스크 경로를 중심으로 살펴볼 수 있다. 이것은 코드의 역할을 나눈 설명이며 수치별 품질 보장은 아니다.

감지 상자 쪽의 bbox_dilation도 별개다. 기본값은 10이며, 이 글의 Ultralytics bbox 경로는 양수일 때 감지 마스크를 팽창시키는 함수를 부른다. 반면 crop_factor는 주변을 어디까지 잘라 모델에 보여 줄지를 정한다. 머리카락이나 귀 주변까지 바뀌었다면 crop의 넓이만 보지 말고 실제 mask 출력의 모양을 먼저 볼 수 있다. 합성 테두리를 흐린 범위까지 함께 읽어야 «얼굴만»이라는 말의 실제 범위가 드러난다.

SAM은 기본 연결에 꼭 필요한 입력이 아니다. sam_model_opt와 segm_detector_opt는 모두 선택 입력이고, 코드는 SAM이 연결되면 bbox 결과와 SAM 마스크를 교차시킨다. SAM이 없을 때에만 그다음 segm 분기로 간다. 따라서 둘을 연결했다고 두 분할 마스크가 순서대로 모두 적용되는 것은 아니다. 처음에는 bbox 감지 결과부터 보고, 얼굴 모양을 따라 범위를 좁혀야 할 이유가 있을 때 선택 입력을 추가하면 달라진 원인을 찾기 쉽다.

Provider가 내는 출력 타입만 보고 분할 모델이 들어 있다고 판단해서도 안 된다. bbox 파일을 골랐을 때 Provider는 실제 bbox 감지기와 NO_SEGM_DETECTOR를 반환한다. 얼굴 모양을 따르는 세밀한 마스크를 원한다면 선택한 모델의 종류와 연결 경로까지 맞아야 한다. 영역을 직접 정하는 편이 나은 장면은 수동 마스크 인페인팅으로 이어서 다룰 수 있다. 자동 감지가 엉뚱한 얼굴을 골랐다면 손으로 선택할 이유가 분명해진다.

마스크 역할 도해 — noise_mask는 재생성 마스크 전달, feather는 합성 마스크 흐림, noise_mask_feather는 노이즈 마스크 흐림, SAM은 선택 입력이며 segm보다 앞선 분기
범위·재생성 경계·합성 경계를 같은 설정으로 보지 않는다.

FaceDetailer 결과가 그대로일 때, 감지와 재생성을 나눠 읽기

결과에 변화가 없다고 곧바로 steps나 denoise를 높일 일은 아니다. 코드에서 감지된 영역이 없으면 원본 이미지를 그대로 돌려준다. 이 경우에는 다시 그리는 단계까지 도달하지 않았으므로 샘플러 설정을 바꿔도 원인을 건드리지 못한다. 먼저 mask 출력과 잘린 결과를 보고 얼굴이 감지됐는지부터 가르는 것이 순서다.

FaceDetailer의 bbox_threshold 기본값은 0.5다. Subpack은 받은 임계값을 YOLO 호출의 conf에 넘긴다. 이 값은 얼굴을 선명하게 그리는 정도가 아니라 어떤 감지 결과를 받아들일지에 관여한다. 얼굴이 빠졌을 때 임계값을 낮춰 비교할 여지는 있지만, 원하지 않는 부분도 선택되는지 mask와 함께 봐야 한다. 감지 후보가 늘면 DetailerForEach가 후보마다 따로 재생성하고 시드도 입력 시드에 후보 순번을 더해 쓰므로, 엉뚱한 영역이 앞 순서에 끼면 뒤 얼굴들의 시드가 하나씩 밀려 결과까지 달라질 수 있다.

작은 추상 로봇이 빈 타일 쟁반과 타일이 놓인 쟁반을 갈라 놓고 돋보기와 붓을 차례로 살피는 장면 — 감지 실패와 재생성 단계 문제를 나눠 찾는 개념
얼굴을 못 찾은 것인지, 찾고도 건너뛴 것인지부터 가른다.

작은 얼굴이 빠지는 조건과 얼굴이 달라지는 조건

작은 얼굴에는 drop_size가 직접 관여한다. drop_size의 기본값은 10이며, UltraBBoxDetector는 bbox의 폭과 높이가 각각 drop_size보다 커야 후보에 넣는다. 비교가 크거나 같음이 아니라 엄격한 초과라는 점이 코드에 드러난다. 임계값을 낮춰도 아주 작은 얼굴이 계속 빠진다면 이 크기 필터가 남아 있을 수 있다. 감지 신뢰도와 감지 영역의 최소 크기는 서로 다른 문턱이다.

감지는 됐는데 처리가 빠졌다면 실행 기록의 문구를 읽을 차례다. segment skip (enough big)은 force_inpaint가 꺼져 있고 bbox 양쪽 변이 guide_size 이상일 때 나온다. segment skip [determined upscale factor=…]는 같은 옵션이 꺼진 상태에서 확대 배율이 1.0 이하로 정해졌을 때 나온다. segment skip [empty mask]는 재생성에 들어가기 전 마스크가 비었을 때의 경로다. 같은 «변화 없음»이라도 손댈 칸이 달라진다.

얼굴은 바뀌었지만 다른 캐릭터처럼 보이는 경우에는 감지 문제와 재생성 결과를 나눠 봐야 한다. FaceDetailer는 잘라낸 이미지를 다시 샘플링하며 denoise와 positive·negative 조건을 사용한다. 원래 얼굴을 알아서 보증하는 복원기가 아니다. 원본 형태를 더 남기고 싶다면 denoise를 낮춘 결과와 비교하고, 얼굴에 맞지 않는 프롬프트 지시가 남아 있는지 살피는 것이 합리적이다. 고정된 추천 구간이나 동일 인물 보장 수치는 이 소스에 없다. 여러 장에 걸쳐 같은 캐릭터 얼굴을 유지하는 문제는 FaceDetailer보다 앞 단계의 일이라 캐릭터 시트 편에서 따로 다뤘다.

비교할 때는 생성 모델·프롬프트·시드를 고정하고 원인을 가르는 설정만 바꾼다. 원본 전체와 잘린 얼굴을 같이 남겨 두면 눈·입만 선명해진 것인지, 얼굴 윤곽이나 주변 질감까지 바뀐 것인지 나눠 볼 수 있다. 시드를 고정하는 방법은 시드와 CFG 편과 이어진다. 단, DetailerForEach는 감지 영역의 순서에 따라 시드에 인덱스를 더하므로, 감지 모델이나 문턱을 바꿔 후보 목록이 달라지면 같은 시드만으로 완전히 같은 비교 조건이 되지는 않는다.

입력 기본값은 시작 위치를 읽는 용도다. steps=20, cfg=8.0, denoise=0.5, cycle=1은 FaceDetailer 입력에 적힌 값이며 모든 체크포인트의 권장 조합은 아니다. 특히 감지 누락을 cycle로 해결하려 하면 문제 단계가 어긋난다. cycle은 재생성 함수 안의 반복이고 감지 필터를 통과시키는 값이 아니기 때문이다. 노드를 갱신한 직후 연결이나 모델 목록이 달라졌다면 업데이트 뒤 되돌리기에서 설치 상태를 점검하는 흐름으로 돌아갈 수 있다.

얼굴 보정 진단 도해 — 감지 영역 없음은 원본 반환, 작은 bbox는 drop_size 필터, 감지 후 건너뛰기는 force_inpaint와 확대 배율, 다른 얼굴은 재생성 조건을 비교하는 흐름
감지·크기 필터·건너뛰기·재생성 결과를 나눠 원인을 찾는다.

자주 묻는 것

FaceDetailer만 설치하면 얼굴 감지까지 되나?

이 글의 YOLO 경로에서는 별도 Impact Subpack과 감지 모델 파일이 필요하다. UltralyticsDetectorProvider는 Impact Pack 본체에 포함되지 않는다. Provider가 안 보이는 경우와 Provider의 모델 목록이 빈 경우는 각각 노드 설치와 파일 경로부터 나눠 볼 수 있다.

guide_size를 올렸는데 얼굴이 별로 커지지 않는 이유는 무엇인가?

확대 배율을 계산한 뒤 crop_region의 긴 변에 max_size 상한을 적용하기 때문이다. 얼굴 주변을 넓게 잘라냈다면 조각 전체가 상한에 먼저 닿을 수 있다. 기본값은 guide_size 512, max_size 1024, bbox_crop_factor 3.0이다. 이 조합에서는 512 × 3.0 = 1536이 1024를 넘으므로, 작은 정사각형 얼굴은 약 341픽셀로 다시 그려진다. 출력 전체의 해상도를 키우는 설정과도 다르다.

SAM 모델을 연결해야만 얼굴을 고칠 수 있나?

sam_model_opt는 선택 입력이다. bbox 감지기를 필수로 받고, SAM이 연결됐을 때 그 결과와 마스크를 교차시키는 구조다. 처음부터 선택 입력을 모두 붙이기보다 bbox가 찾은 범위가 맞는지 먼저 보는 편이 원인을 좁히기 쉽다.

원래 얼굴과 같은 인물을 보장하나?

코드는 감지한 영역을 생성 모델과 프롬프트 조건으로 다시 샘플링한다. 사라진 얼굴 정보를 그대로 되찾거나 동일성을 보장한다는 뜻은 아니다. 가상 캐릭터에서도 형태가 달라질 수 있으므로 원본과 나란히 비교할 필요가 있다.

정리 — 찾은 영역과 실제 작업 크기를 같이 본다

ComfyUI 얼굴 보정에서 FaceDetailer가 줄여 주는 일은 얼굴 위치를 찾고 그 부분을 다시 그려 합성하는 과정이다. 기본값(guide_size 512 · max_size 1024 · bbox_crop_factor 3.0)에서는 정사각형에 가까운 얼굴이 그림 가장자리에 걸리지 않는 한, 얼굴 크기와 상관없이 조각이 상한에 걸리고, 작은 얼굴은 512가 아니라 약 341픽셀로 다시 그려진다. 연결은 감지 모델과 생성 모델로 나뉘고, 크기는 bbox를 기준으로 잡은 배율에 crop_region의 상한이 다시 걸린다. 주변 여백을 넓히는 설정과 마스크를 넓히는 설정도 서로 다른 단계에 있다.

따라서 결과가 그대로라면 mask와 건너뛰기 기록을, 얼굴은 바뀌었는데 경계가 어색하다면 재생성과 합성 마스크의 경로를 본다. 감지한 영역, 잘라낸 조각, 전체 합성 결과를 나눠 보면 어느 단계에서 원치 않는 변화가 생겼는지 좁혀 갈 수 있다.

ComfyUI 얼굴 보정 대표 그림 — 왼쪽 제목 공간과 오른쪽의 추상 로봇 작업대, 확대경 아래 작은 타일을 다듬어 큰 빈 액자의 같은 자리에 돌려놓는 장면
ComfyUI 얼굴 보정 — FaceDetailer 크기와 마스크

참고 자료

  1. ltdrdata. ComfyUI-Impact-Pack README — V8.0 Subpack 분리, FaceDetailer 원리, MASK 출력 설명(2026-10-30 확인). raw.githubusercontent.com
  2. ltdrdata. ComfyUI-Impact-Subpack README — 감지 모델 폴더, Manager 설치명, 실행 파이썬 환경과 재시작(2026-10-30 확인). raw.githubusercontent.com
  3. ltdrdata. ComfyUI-Impact-Subpack subpack_nodes.py — 모델 목록 접두사, 출력 타입, bbox 모델의 NO_SEGM_DETECTOR(2026-10-30 확인). raw.githubusercontent.com
  4. ltdrdata. ComfyUI-Impact-Pack impact_pack.py — FaceDetailer 입력·기본값·출력, SAM 우선 분기, 감지 없음 처리, 합성 마스크(2026-10-30 확인). raw.githubusercontent.com
  5. ltdrdata. ComfyUI-Impact-Pack core.py — enhance_detail 배율·상한·건너뛰기, 노이즈 마스크, 원래 크기로 축소(2026-10-30 확인). raw.githubusercontent.com
  6. ltdrdata. ComfyUI-Impact-Subpack subcore.py — UltraBBoxDetector의 감지 임계값 전달과 drop_size 제외 조건(2026-10-30 확인). raw.githubusercontent.com
  7. ltdrdata. ComfyUI-Impact-Pack utils.py — make_crop_region의 폭·높이 계산 및 이미지 경계 보정(2026-10-30 확인). raw.githubusercontent.com
  8. ltdrdata. ComfyUI-Impact-Pack config.py — version_code 8 · 28 · 3 = V8.28.3(2026-10-30 확인). raw.githubusercontent.com
  9. Bingsu. adetailer 모델 카드 — face_yolov8m.pt의 얼굴 감지 대상과 손·사람 감지 모델 구별(2026-10-30 확인). huggingface.co
ComfyUIFaceDetailer얼굴보정얼굴뭉개짐ImpactPack인페인팅마스크YOLO스테이블디퓨전AI이미지
junetapa(박준철)
AI 도구를 직접 굴려 보고 남은 기록을 정리한다.
Twitter Facebook URL 복사