이는 ComfyUI 기본 구현을 위한 사용자 정의 노드입니다.
나의 기여는 ComfyUI 적용으로 제한되며 모든 공로는 논문 작성자에게 돌아갑니다.
2024년 5월 16일. 다른 노드와의 호환성을 개선하기 위한 내부 재작업. RAUNet이 구현되었습니다.
2024년 5월 12일. CutForInpaint 노드, 예시 참조.
2024년 5월 11일. 이미지 일괄 처리가 구현되었습니다. AnimateDiff vid2vid 작업 흐름에 BrushNet을 추가할 수도 있지만 함께 작동하지는 않습니다. 서로 다른 모델이고 둘 다 UNet 패치를 시도합니다. 몇 가지 예시를 더 추가했습니다.
2024년 5월 6일. PowerPaint v2 모델이 구현되었습니다. 업데이트 후에는 워크플로가 작동하지 않을 수 있습니다. 당황하지 말 것! BrushNode의 end_at
매개변수를 확인하고, 1이면 큰 숫자로 변경하세요. 아래 사용법 섹션에서 매개변수에 대해 읽어보세요.
2024년 5월 2일. BrushNet SDXL이 출시되었습니다. 하지만 긍정적인 조건과 부정적인 조건이 필요하므로 작업 흐름이 약간 변경됩니다. 예를 참조하세요.
2024년 4월 28일. 또 다른 재작업으로 불편을 끼쳐드려 죄송합니다. 그러나 이제 BrushNet은 ComfyUI의 기본입니다. 유명한 cubiq의 IPAdapter Plus가 이제 BrushNet과 연동됩니다! 바랍니다... :) 발견한 버그를 신고해 주세요.
2024년 4월 18일. 완전한 재작업으로 더 이상 맞춤형 diffusers
라이브러리가 없습니다. LoRA 모델을 사용하는 것이 가능합니다.
2024년 4월 11일. 초기 커밋.
repo를 custom_nodes
디렉터리에 복제하고 요구 사항을 설치합니다.
git clone https://github.com/nullquant/ComfyUI-BrushNet.git
pip install -r requirements.txt
BrushNet의 체크포인트는 여기에서 다운로드할 수 있습니다.
segmentation_mask_brushnet_ckpt
의 체크포인트는 사전 분할이 있는 BrushData에 대해 훈련된 체크포인트를 제공합니다(마스크는 동일한 모양의 객체를 가짐). random_mask_brushnet_ckpt
는 무작위 마스크 모양에 대한 보다 일반적인 ckpt를 제공합니다.
segmentation_mask_brushnet_ckpt
및 random_mask_brushnet_ckpt
에는 SD 1.5 모델용 BrushNet이 포함되어 있고 SDXL용 segmentation_mask_brushnet_ckpt_sdxl_v0
및 random_mask_brushnet_ckpt_sdxl_v0
이 포함되어 있습니다.
diffusion_pytorch_model.safetensors
파일을 models/inpaint
폴더에 배치해야 합니다. extra_model_paths.yaml
에 inpaint
폴더를 지정할 수도 있습니다.
PowerPaint의 경우 세 개의 파일을 다운로드해야 합니다. 여기의 diffusion_pytorch_model.safetensors
와 pytorch_model.bin
모두 models/inpaint
폴더에 배치되어야 합니다.
또한 SD1.5 텍스트 인코더 모델 model.safetensors
가 필요합니다. 여기에서 가져오거나 다른 곳에서 가져갈 수 있습니다. fp16 버전을 사용할 수도 있습니다. models/clip
폴더에 위치해야 합니다.
이것은 내 models/inpaint
폴더의 구조입니다:
당신은 다를 수 있습니다.
다음은 의도된 워크플로의 예입니다. 예제의 워크플로는 'example' 디렉터리에서 찾을 수 있습니다.
작업 흐름
작업 흐름
작업 흐름
때때로 추론과 VAE로 인해 이미지가 손상되므로 인페인트 이미지를 원본 워크플로와 혼합해야 합니다. 첫 번째 이미지에서 인페인팅 후 흐릿하고 깨진 텍스트를 볼 수 있으며 이를 복구하는 방법을 알 수 있습니다.
작업 흐름
ControlNet 캐니 에지
작업 흐름
작업 흐름
업스케일하려면 BrushNet이 아닌 기본 모델을 사용해야 합니다. 컨디셔닝의 경우에도 마찬가지입니다. BrushNet과 KSampler 간의 잠재 확장은 작동하지 않거나 이상한 결과를 제공합니다. 이러한 제한은 BrushNet의 구조와 UNet 계산에 대한 영향으로 인해 발생합니다.
작업 흐름
OOM 문제가 있는 경우 AnimateDiff-Evolved의 Evolved Sampling을 사용할 수 있습니다.
작업 흐름
컨텍스트 옵션에서 context_length를 VRAM에 로드할 수 있는 이미지 수로 설정합니다. 이미지는 이 크기의 청크로 처리됩니다.
작업 흐름
큰 이미지로 작업하고 인페인트 마스크가 작은 경우 이미지의 일부를 잘라서 작업한 다음 다시 블렌딩하는 것이 좋습니다. 이러한 워크플로를 위한 노드를 만들었습니다. 예를 참조하세요.
작업 흐름
작업 흐름
물체를 완전히 제거하는 것이 어려운 경우가 많습니다. 특히 물체가 전면에 있는 경우에는 더욱 그렇습니다.
다음과 같이 부정적인 프롬프트에 개체 설명을 추가하고 빈 장면을 설명해야 합니다.
dtype
, 기본값은 torch.float16
입니다. BrushNet의 torch.dtype입니다. 오래된 GPU 또는 NVIDIA 16 시리즈 카드를 가지고 있다면 torch.float32
로 전환해보세요. scale
, 기본값은 1.0: BrushNet의 "강도"입니다. BrushNet의 출력은 원래 unet의 잔차에 추가되기 전에 scale
로 곱해집니다.start_at
, 기본값은 0: BrushNet이 적용을 시작하는 단계입니다.end_at
, 기본값은 10000: BrushNet이 적용을 중지하는 단계입니다.다음은 이 두 개의 마지막 매개변수를 사용하는 예입니다.
CLIP
: PowerPaintCLIPLoader 노드에서 전달되어야 하는 PowerPaint CLIP입니다.fitting
: PowerPaint 피팅 정도.function
: PowerPaint 함수, 자세한 내용은 해당 페이지를 참조하세요.save_memory
: 이 옵션이 설정되면 Attention 모듈은 입력 텐서를 조각으로 분할하여 Attention을 여러 단계로 계산합니다. 이는 속도를 낮추는 대신 일부 메모리를 절약하는 데 유용합니다. VRAM이 부족하거나 Mac에서 Error: total bytes of NDArray > 2**32
발생하는 경우 이 옵션을 max
로 설정해 보세요.특정 네트워크 기능을 사용할 때 PowerPaint 작성자는 프롬프트에 문구를 추가할 것을 권장합니다.
empty scene blur
empty scene
empty scene
많은 ComfyUI 사용자는 사용자 정의 텍스트 생성 노드, CLIP 노드 및 기타 다양한 조건을 사용합니다. 이 노드를 모두 깨뜨리고 싶지 않아서 프롬프트 업데이트를 추가하지 않고 대신 사용자에게 의존했습니다. 또한 내 자신의 실험에 따르면 프롬프트에 이러한 추가 사항이 꼭 필요한 것은 아닙니다.
잠재 이미지는 BrushNet 노드에서 가져올 수도 있고 아닐 수도 있지만 원본 이미지와 크기가 동일해야 합니다(잠재 공간에서 8로 나눔).
BrushNet 및 PowerPaint 노드의 positive
및 negative
조건은 모두 내부 계산에 사용되지만 단순히 출력에 복사됩니다.
구조상 모든 워크플로우와 노드가 BrushNet에서 작동하는 것은 아닙니다. 또한 모델 변경 사항을 BrushNet 노드 이후가 아닌 이전에 배치합니다. BrushNet 추론 후 이미지 작업을 위해 모델이 필요한 경우 기본 1을 사용하세요(아래 고급 예시 참조).
du_start
, 기본값은 0: 다운샘플/업샘플 크기 조정이 적용되기 시작하는 단계입니다.du_end
, 기본값은 4: 다운샘플/업샘플 크기 조정 적용이 중지되는 단계입니다.xa_start
, 기본값은 4: CrossAttention 크기 조정이 적용되기 시작하는 단계입니다.xa_end
, 기본값은 10: CrossAttention 크기 조정 적용이 중지되는 단계입니다.예제와 설명은 여기를 참조하세요.
BrushNet에는 몇 가지 제한 사항이 있습니다(논문에 따르면).
불행하게도 BrushNet 코드의 특성으로 인해 일부 노드는 동일한 ComfyUI 기능을 패치하려고 하기 때문에 이러한 노드와 호환되지 않습니다.
알려진 비호환 노드 목록입니다.
코드는 다음을 기반으로 합니다.