ComfyUI tagger 준비, 확장과 모델 파일의 차이
전체 순서는 다섯 단계다. 한 단계가 확인되면 다음으로 넘어간다.
- 확장
ComfyUI-WD14-Tagger를 설치하고 ComfyUI를 다시 켠다. Load Image노드와 WD14 Tagger 노드를 잇는다.- 모델과 문턱값을 정한다.
- 실행하고
tags결과 칸을 읽는다. - 필요한 단어만 골라 새 프롬프트로 고친다.
설치할 확장 이름은 ComfyUI-WD14-Tagger다. 커스텀 노드는 ComfyUI에 기능을 더하는 외부 확장이다. ComfyUI 공식 문서는 ComfyUI Manager(노드를 검색·설치·업데이트하는 관리 도구)를 통한 설치를 권한다. 수동으로 설치할 때는 ComfyUI가 실제로 쓰는 Python 환경에 의존성(함께 필요한 실행 패키지)을 넣으라고 설명한다. 시스템 Python에만 패키지를 넣으면 ComfyUI에서는 여전히 없다고 나올 수 있다.
이 글의 소스 기준은 조회 시 main의 커밋 9e0a6e700299182fc05c58b62e7ad9f72182a78b이며, 날짜는 2025년 7월 11일이다. 확장의 설명 파일에 적힌 버전은 1.0.1이다. 이 날짜만으로 유지가 끝났다고 보지는 않는다. 다만 화면 모양은 설치한 판에 따라 다를 수 있다.
첫째 단계는 ComfyUI Manager에서 확장 이름과 저장소 주소를 대조해 설치하는 일이다. 잘 됐으면 재시작 뒤 노드 검색에서 WD14 Tagger가 보인다.
Manager로 이미 설치했다면 아래 수동 명령은 건너뛴다. 수동 설치 예시는 Windows 포터블판의 맨 위 폴더(ComfyUI_windows_portable)에서 PowerShell을 연 경우다. 먼저 확장 코드를 받는다.
Set-Location .\ComfyUI\custom_nodes
git clone https://github.com/pythongosssss/ComfyUI-WD14-Tagger
Set-Location .\ComfyUI-WD14-Tagger이어서 포터블판에 들어 있는 Python으로 필요한 패키지를 설치한다.
..\..\..\python_embeded\python.exe -s -m pip install -r requirements.txt이 상대 경로는 지금 폴더가 확장 폴더라는 전제다. 잘 됐으면 설치가 끝나고, ComfyUI를 다시 켠 뒤 노드를 찾을 수 있다. Desktop판이나 직접 만든 가상환경은 위 Python 경로를 쓰지 않는다. 공식 문서는 직접 만든 Python 환경이면 그 환경에서 pip install -r requirements.txt를 실행하라고 적는다.
README는 CPU에서도 빠르게 판독된다며 onnxruntime을 권한다. 그래픽카드용 onnxruntime-gpu도 소개하지만, 문제를 겪는 사람이 많고 작성자가 지원하지 못한다고 적는다. 설정 파일의 실행 장치 순서는 CUDAExecutionProvider 다음 CPUExecutionProvider다. 화면에 패키지가 없다는 오류가 보이면, 모델을 다시 받기 전에 Python 경로가 지금 ComfyUI 환경을 가리켰는지부터 본다.
모델 이름이 보이는 것과 파일이 준비된 것
노드의 기본 모델은 wd-v1-4-moat-tagger-v2다. 설정 파일에는 v3 계열을 포함해 모델 11개가 등록돼 있다. 확장 이름의 WD14를 모델 세대가 고정됐다는 뜻으로 읽지 않는다. 결과를 비교하려면 확장 버전과 고른 모델 이름을 함께 적어 둔다.
README는 빠진 모델을 실행할 때 내려받는다고 설명한다. 코드가 받는 파일은 모델 본체인 model.onnx와 태그 목록인 selected_tags.csv다. ONNX는 학습된 모델을 실행 도구가 읽을 수 있게 담은 형식이고, CSV는 표를 텍스트로 저장한 파일이다. 코드는 같은 이름의 .onnx와 .csv가 둘 다 있을 때만 설치된 모델로 센다.
모델 서버에 연결하지 못하면 ComfyUI를 띄운 콘솔 창에 «Unable to download model»로 시작하는 오류가 남는다. 이 문구는 파일을 직접 받거나 HF_ENDPOINT 환경변수로 다른 주소를 쓰라고 안내한다. 직접 받을 때는 README 방식대로 확장 폴더 안에 models를 만들고, 받은 파일 이름을 모델 이름에 맞춘다. 아래는 기본 모델의 기본 경로 예시다. 별도의 wd14_tagger 모델 경로를 등록한 환경이라면 그 경로를 먼저 쓴다.
ComfyUI/custom_nodes/ComfyUI-WD14-Tagger/models/
wd-v1-4-moat-tagger-v2.onnx
wd-v1-4-moat-tagger-v2.csv잘 됐으면 같은 이름에 확장자만 다른 두 파일이 놓인다. 다른 모델의 CSV를 이름만 바꿔 끼우면 안 된다. 코드가 모델 출력과 목록의 태그를 순서대로 짝짓기 때문에, 이름만 맞춘다고 내용까지 맞지는 않는다.
실행 패키지 조건도 따로 본다. 확장의 requirements.txt에는 버전 범위 없이 onnxruntime만 적혀 있다. 반면 EVA02-Large v3 모델 카드는 onnxruntime >= 1.17.0을 요구한다. 설치가 끝났다는 사실과 고른 모델의 실행 조건을 채웠다는 사실은 별개다. 모든 v3 모델의 조건이 같다는 뜻으로 넓혀 읽지는 않는다.
인용 — SmilingWolf. WD 1.4 MOAT Tagger V2Supports ratings, characters and general tags.
등급·캐릭터·일반 태그를 지원한다는 뜻이다. 모델이 지원하는 범위이며, 확장이 그 항목을 모두 출력한다는 설명은 아니다.
이미지 프롬프트 추출 실행, WD14 기준값 읽기
둘째 단계는 노드 연결이다. Load Image 노드(그림 파일을 불러오는 칸)에 그림을 넣고, 그 노드의 IMAGE 출력을 WD14 Tagger의 image 입력에 잇는다. 노드는 README가 안내한 image 분류 아래 WD14Tagger|pysssss에서 추가한다. 잘 됐으면 입력 그림 미리보기와 두 노드 사이의 선이 보인다.
셋째 단계는 모델과 기준값이다. 아래 값으로 출발한다. 설정 파일에서 읽은 기본값이며, 장비별로 검증한 추천값은 아니다.
model: wd-v1-4-moat-tagger-v2
threshold: 0.35
character_threshold: 0.85
replace_underscore: false
trailing_comma: false
exclude_tags:일반 태그는 threshold, 캐릭터 태그는 character_threshold를 넘을 때 남긴다. 코드의 비교는 «이상»이 아니라 «초과»다. 점수가 문턱과 정확히 같으면 빠진다는 뜻이다. 노드의 두 칸은 0에서 1 사이를 0.05 간격으로 움직인다. 값을 낮추면 더 많은 후보가 통과하지만, 그 후보가 맞는 태그라는 보장은 없다.
0.35를 인식 정확도 35퍼센트로 읽지 않는다. 이 값은 포함 여부를 가르는 점수 문턱이다. MOAT 모델 카드는 검증 기준으로 P=R(정밀도와 재현율이 같아지는 지점) 문턱 0.3771을 적어 둔다. 기본값을 꼭 그 값으로 고치라는 지시는 아니다.
넷째 단계는 실행이다. 잘 됐으면 태거 노드 안에 tags 결과 칸이 생기고 쉼표로 나눈 문자열이 보인다. 글자가 없다면 실행 오류인지, 문턱을 넘은 태그가 없는지부터 가른다. 처음 실행이라면 모델 내려받기가 끝나야 결과가 나온다.
태그를 줄이거나 표기를 바꿀 때
replace_underscore는 밑줄을 공백으로 바꾸는 설정이다. trailing_comma는 결과 끝에 쉼표를 붙일지 정한다. 둘 다 판독을 더 정확하게 만드는 값이 아니라, 복사해 쓸 표기를 정하는 값이다.
exclude_tags는 뺄 태그를 쉼표로 나열하는 칸이다. 소스는 쉼표로 항목을 나누고 앞뒤 공백을 걷은 뒤, 출력 태그와 같은지를 비교한다. 비교 전에 제외 목록은 소문자로 바뀐다. 뜻이 비슷한 태그까지 지워 주지는 않으므로, 실제 결과에 나온 표기를 그대로 옮겨 적는다.
밑줄 설정과 제외 목록은 함께 맞춘다. 밑줄을 공백으로 바꾸는 처리가 먼저 일어난 뒤 제외 비교가 진행된다. 화면에 long hair로 나오는데 제외 목록에 long_hair만 적었다면 빠지지 않는다. 아래는 밑줄을 공백으로 바꾼 상태에서 tree 태그를 빼는 설정 예시다.
replace_underscore: true
exclude_tags: tree결과 칸은 읽기 전용으로 만들어진다. 칸에서 글자를 고치려다 입력이 안 돼도 실행 실패가 아니다. 문자열을 복사해 프롬프트 칸이나 메모에서 고친다.
WD14 결과 칸이 안 보이거나 비어 있을 때
- 노드 검색에 WD14 Tagger가 없을 때 — 확장이 안 불러와진 경우다. 의존성을 ComfyUI가 쓰는 Python에 넣었는지 다시 본다.
- 노드는 실행됐는데 결과 칸이 비어 있을 때 — 문턱을 넘은 태그가 없을 수 있다. threshold를 0.05씩 내려 다시 실행해 본다.
- 모델 받기에 실패하면 — 위의
models폴더에.onnx와.csv를 직접 넣고 ComfyUI를 다시 켠다.
그림과 모델을 그대로 두고 일반 태그 문턱만 바꿔 결과를 비교한다. 새로 들어온 단어가 그림에 실제로 보이는지 표시하고, 캐릭터 문턱은 그대로 둔다. 여러 장을 한 번에 넣으면 그림마다 태그 문자열이 하나씩 나온다.
WD14 tagger 결과, 새 프롬프트로 옮길 때
다섯째 단계는 정리다. 결과를 복사한 뒤, 사용할 대상과 배경을 설명하는 단어만 남긴다. 여기에 원하는 구도와 장면 관계를 문장으로 더해 새 프롬프트를 만든다. 아래는 설명용으로 만든 예시이며, 실제 그림에서 뽑은 결과가 아니다.
태그 후보 예시:
tree, sky, cloud
편집한 프롬프트 예시:
a solitary tree on a hill, clouds gathering behind it앞 목록에서 눈에 보이는 단어를 고르고, 뒤 문장에서 원하는 관계를 적는 방식이다. 뒤 문장이 원본의 숨은 입력이었다는 뜻은 아니다. 잘 됐으면 새 프롬프트로 뽑은 그림에 고른 대상과 배경이 들어간다. 원본의 설정 자체를 찾는 문제는 시드 고정과 CFG에서 따로 다룬다.
태그를 통째로 붙였더니 결과가 복잡해졌다면, 배경을 참고하려던 것인지 인물 속성을 참고하려던 것인지부터 좁힌다. 목적이 다른 태그를 모두 남기면 원하지 않은 요소까지 새 장면의 조건이 된다.
오른쪽 클릭 결과와 노드 결과가 다를 때
README는 그림을 보여 주는 노드(LoadImage·SaveImage·PreviewImage 등)에서 오른쪽 클릭으로 WD14 Tagger를 고르는 빠른 판독도 소개한다. 이 메뉴 경로와 연결한 태거 노드는 설정을 공유하지 않는다.
브라우저 코드는 고른 그림의 주소로 태그 요청을 보낸다. 이 요청에는 태거 노드에서 바꾼 문턱값이나 제외 목록이 실리지 않는다. 서버 쪽 경로는 그림과 모델만 넘겨 판독 함수를 부르므로, 문턱은 함수 기본값 0.35·0.85가 쓰인다. 노드 문턱을 고친 뒤 오른쪽 클릭으로 효과를 비교하면 맞지 않는다. 설정 비교는 같은 태거 노드로 한다.
표기도 다를 수 있다. 노드의 replace_underscore 기본값은 False인데, 오른쪽 클릭이 부르는 함수의 같은 값 기본은 True다. 같은 그림·모델인데 한쪽은 밑줄, 다른 쪽은 공백으로 보일 수 있다. 비교할 때는 어느 경로로 돌렸는지도 적는다.
처음부터 오른쪽 클릭만 쓰면 막히는 곳이 하나 있다. 이 경로는 설치된 모델 가운데 기본 모델이 없으면 목록의 첫 모델을 고르는데, 목록이 비면 고를 것이 없어 오류가 난다. 모델이 아직 없는 첫 실행이라면 태거 노드를 한 번 돌려 모델부터 받는다.
작게 그려진 요소와 사진을 평가하는 범위
판독 전처리는 그림의 긴 변을 모델 입력 크기에 맞춰 조절하고 흰 정사각형 안에 가운데 배치한다. 원래 비율을 지키며 빈 자리를 흰색으로 채우는 처리다. 긴 그림 구석에 작게 있는 소품은 이 축소로 더 작아진다. 태그에 없다고 원본에도 없었다고 볼 수는 없다.
보고 싶은 부분만 잘라 따로 넣으면 그 소품을 크게 보여 줄 수 있다. 다만 주변 배경이 사라져 다른 후보가 나올 수 있다. 전체 그림 결과와 잘라 낸 그림 결과는 서로 다른 입력의 결과로 따로 적는다. 이 효과를 이번 글에서 실측한 것은 아니다.
MOAT 모델 카드는 Danbooru 이미지로 학습했음을 밝힌다. 이 범위를 넘어 사진·제품 이미지·문서 화면까지 같은 품질을 기대할 근거는 없다. 실제 인물 사진에서 나온 캐릭터 이름을 신원 정보로 읽어서도 안 된다. 캐릭터 태그는 후보일 뿐, 사람의 정체를 확인한 결과가 아니다.
남의 그림이나 인물 사진은 사용할 권한과 공개 범위를 확인한 뒤 다룬다. 구도나 윤곽을 따라가려면 ControlNet 포즈·윤곽 입문의 입력 방식도 비교해 본다. 그림 자체를 바탕으로 다시 그리는 흐름은 ComfyUI img2img로 이어진다.
자주 묻는 것
WD14로 원래 네거티브 프롬프트도 찾을 수 있나?
이 확장의 결과는 그림에서 예측한 태그 문자열이다. 작성자가 무엇을 피하려고 네거티브 입력에 적었는지는 출력하지 않는다. 화면에 보이지 않는 요소를 추측해 원래 금지어 목록으로 만드는 방법은 근거가 없다.
캐릭터 이름이 나오면 그 이름이 맞다고 보아도 되나?
캐릭터 태그도 모델 점수가 문턱을 넘겨 남은 후보다. 일반 대상과 나눠 읽고, 실제로 아는 근거와 대조한다. 실제 인물의 신원을 확인하는 기능으로 쓰지 않는다.
그림을 다시 만들려면 태그만 복사하면 되나?
태그 출력에는 원본의 생성 모델과 시드, 샘플러가 들어 있지 않다. 필요한 단어를 새 프롬프트로 고칠 수는 있지만, 그 결과가 원본과 같아지는 조건까지 얻은 것은 아니다.
태그가 비었으면 모델을 다시 받아야 하나?
먼저 실행이 끝났는지, 오류가 있는지, 문턱과 제외 목록이 어떤 값인지 본다. 소스는 일반·캐릭터 문턱을 넘은 항목만 남기므로 빈 결과도 나올 수 있다. 반대로 모델 파일 쌍이 빠졌거나 실행 패키지 문제가 있다면 그 오류부터 푼다.
정리 — 태그는 새 프롬프트를 쓸 재료다
이미지 프롬프트 추출의 첫 판단은 파일 안의 기록을 읽을지, 그림의 요소를 추정할지다. 기록이 없다면 WD14로 단어 후보를 얻을 수 있다. 결과를 읽을 때는 모델 이름, 일반·캐릭터 문턱, 제외한 표기를 함께 적어 둔다. 출력 순서를 중요도로 읽거나 오른쪽 클릭에 노드 설정이 전달됐다고 가정하면 비교가 어긋난다.
태거가 돌려준 단어에서 실제로 보이는 요소를 고르고, 원하는 관계와 구도는 새 문장으로 적는다. 이렇게 나온 결과물은 원래 작성자의 프롬프트 사본이 아니라, 새로 만들 장면을 설명하는 새 초안이다.
참고 자료
- ComfyUI-WD14-Tagger. README — 설치·사용·모델 내려받기·오프라인 파일 이름·여러 장 입력(2026-11-03 확인). github.com
- ComfyUI-WD14-Tagger. wd14tagger.py — 전처리·기준값 비교·태그 순서·괄호 표기·문자열 출력·오른쪽 클릭 경로(2026-11-03 확인). github.com
- ComfyUI-WD14-Tagger. pysssss.json — 기본 모델·기준값·실행 장치 순서·선택 가능한 모델 목록(2026-11-03 확인). github.com
- ComfyUI-WD14-Tagger. web/js/wd14tagger.js — 결과 표시 칸과 오른쪽 클릭 요청 내용(2026-11-03 확인). github.com
- SmilingWolf. WD 1.4 MOAT Tagger V2 — 지원 태그·학습 자료·검증 기준값(2026-11-03 확인). huggingface.co
- SmilingWolf. WD EVA02-Large Tagger v3 — 모델 세대·ONNX 호환 안내·실행 의존성(2026-11-03 확인). huggingface.co
- ComfyUI-WD14-Tagger. requirements.txt — onnxruntime 의존성에 버전 하한이 없음(2026-11-03 확인). github.com
- ComfyUI-WD14-Tagger. pyproject.toml — 확장 버전 표기 1.0.1(2026-11-03 확인). github.com
- Comfy-Org. Custom Nodes — 노드 설치와 ComfyUI 실행 환경 안의 의존성 설치(2026-11-03 확인). github.com
- ComfyUI-WD14-Tagger. 소스 기준 커밋 — 조회 시 main 해시·날짜만 대조(2026-11-03 확인). github.com