기본 노드 작성하기
사전 요구사항
설정하기
노드 정의하기
src/nodes.py의 끝에 다음 코드를 추가하세요:
src/nodes.py
사용자 정의 노드의 기본 구조는 여기에서 자세히 설명되어 있습니다.
CATEGORY, 노드를 새 노드 메뉴 어디에 배치할지 지정하는 항목, INPUT_TYPES, 노드가 어떤 입력을 받을지 정의하는 클래스 메서드(자세한 내용은 뒤에 참조), RETURN_TYPES, 노드가 어떤 출력을 내놓을지 정의하는 항목, 그리고 FUNCTION, 노드가 실행될 때 호출될 함수 이름이 포함되어야 합니다.
메인 함수
메인 함수인choose_image는 INPUT_TYPES에서 정의한 명명된 인자를 받으며, RETURN_TYPES에서 정의한 대로 튜플을 반환합니다. 이미지를 다루므로 내부적으로 torch.Tensor로 저장되며,
[B,H,W,C] 형태의 torch.Tensor이며, 여기서 B는 배치 크기이고 C는 채널 수입니다—RGB의 경우 3입니다. 이러한 텐서를 반복하면 [H,W,C] 형태의 B개의 텐서를 얻게 됩니다. .flatten() 메서드는 이를 1차원 텐서로 바꾸며 길이는 H*W*C가 됩니다. torch.mean()는 평균값을 계산하고 .item()은 단일 값 텐서를 파이썬의 float로 변환합니다.
images[brightest]는[H,W,C]형태의 텐서를 반환합니다.unsqueeze는 이 경우 0번째 차원에 길이 1의 차원을 삽입해[B,H,W,C]형태로 만들어줍니다—여기서B=1: 단일 이미지입니다.return (result,)에서 뒤에 오는 쉼표는 튜플을 반환하도록 하기 위해 필수적입니다.
노드 등록하기
Comfy가 새 노드를 인식하려면 패키지 수준에서 접근 가능해야 합니다.src/nodes.py의 끝에 있는 NODE_CLASS_MAPPINGS 변수를 수정하세요. 변경 사항을 보려면 ComfyUI를 다시 시작해야 합니다.
src/nodes.py
ComfyUI가 사용자 정의 노드를 어떻게 발견하고 로드하는지 자세한 설명은 노드 라이프사이클 문서를 참조하세요.
옵션 추가하기
그 노드는 조금 지루할 수 있으니 몇 가지 옵션을 추가해볼까요? 가장 밝은 이미지나 가장 붉은, 가장 푸른, 가장 녹색 이미지를 선택할 수 있는 위젯을 추가해보겠습니다.INPUT_TYPES를 다음과 같이 수정하세요:
R 값을 모든 세 색상의 평균값으로 나눈 것으로 비교적 단순하게 정의하겠습니다. 따라서:
UI 조정하기
시각적 피드백을 좀 더 주고 싶다면 작은 텍스트 메시지를 보내 표시해보겠습니다.서버에서 메시지 전송하기
이를 위해서는 Python 코드에 두 줄을 추가해야 합니다:choose_image 메서드의 끝에 프론트엔드로 메시지를 보내는 코드를 추가하세요(send_sync는 고유한 메시지 유형과 딕셔너리를 필요로 합니다):
클라이언트 확장 작성하기
클라이언트에 Javascript를 추가하려면 사용자 정의 노드 디렉토리에web/js 하위 디렉토리를 만들고, __init__.py의 끝을 수정해 Comfy에 이를 알리도록 WEB_DIRECTORY를 내보내세요:
web/js 하위 디렉토리에 .js 파일로 저장되므로, image_selector/web/js/imageSelector.js를 아래 코드로 생성하세요. (자세한 내용은 클라이언트 측 코딩을 참조하세요.)
setup() 메서드에서 전송하는 메시지 유형에 대한 리스너를 추가한 것입니다. 이는 우리가 보낸 딕셔너리를 읽습니다(이 딕셔너리는 event.detail에 저장됩니다).
Comfy 서버를 중지했다가 다시 시작하고 웹페이지를 새로고침한 뒤 워크플로우를 실행하세요.
완성된 예제
완성된 예제는 여기에서 확인할 수 있습니다. 예제 워크플로우 JSON 파일을 다운로드하거나 아래에서 볼 수 있습니다: