Estes são nós personalizados para implementação nativa do ComfyUI de
Minha contribuição limita-se à adaptação do ComfyUI, e todo o crédito vai para os autores dos artigos.
16 de maio de 2024. Retrabalho interno para melhorar a compatibilidade com outros nós. RAUNet é implementado.
12 de maio de 2024. Nó CutForInpaint, veja o exemplo.
11 de maio de 2024. O lote de imagens foi implementado. Você pode até adicionar BrushNet ao fluxo de trabalho AnimateDiff vid2vid, mas eles não funcionam juntos - são modelos diferentes e ambos tentam corrigir o UNet. Adicionados mais alguns exemplos.
6 de maio de 2024. O modelo PowerPaint v2 é implementado. Após a atualização, seu fluxo de trabalho provavelmente não funcionará. Não entrar em pânico! Verifique o parâmetro end_at
do BrushNode, se for igual a 1, altere para algum número grande. Leia sobre os parâmetros na seção Uso abaixo.
2 de maio de 2024. BrushNet SDXL está no ar. Porém, ele precisa de condicionamento positivo e negativo, então o fluxo de trabalho muda um pouco, veja o exemplo.
28 de abril de 2024. Outra reformulação, desculpe pelo transtorno. Mas agora o BrushNet é nativo do ComfyUI. O IPAdapter Plus da famosa cubiq agora está trabalhando com BrushNet! Espero... :) Por favor, reporte quaisquer bugs que encontrar.
18 de abril de 2024. Retrabalho completo, sem mais biblioteca diffusers
personalizados. É possível usar modelos LoRA.
11 de abril de 2024. Confirmação inicial.
Clone o repositório no diretório custom_nodes
e instale os requisitos:
git clone https://github.com/nullquant/ComfyUI-BrushNet.git
pip install -r requirements.txt
Os pontos de verificação do BrushNet podem ser baixados aqui.
O checkpoint em segmentation_mask_brushnet_ckpt
fornece checkpoints treinados em BrushData, que possui segmentação prévia (as máscaras têm o mesmo formato dos objetos). O random_mask_brushnet_ckpt
fornece um ckpt mais geral para o formato aleatório da máscara.
segmentation_mask_brushnet_ckpt
e random_mask_brushnet_ckpt
contém BrushNet para modelos SD 1.5 enquanto segmentation_mask_brushnet_ckpt_sdxl_v0
e random_mask_brushnet_ckpt_sdxl_v0
para SDXL.
Você deve colocar os arquivos diffusion_pytorch_model.safetensors
em sua pasta models/inpaint
. Você também pode especificar a pasta inpaint
em extra_model_paths.yaml
.
Para o PowerPaint você deve baixar três arquivos. Ambos diffusion_pytorch_model.safetensors
e pytorch_model.bin
daqui devem ser colocados em sua pasta models/inpaint
.
Além disso, você precisa do modelo de codificador de texto SD1.5 model.safetensors
. Você pode tirar daqui ou de outro lugar. Você também pode usar a versão fp16. Ele deve ser colocado na sua pasta models/clip
.
Esta é uma estrutura da minha pasta models/inpaint
:
O seu pode ser diferente.
Abaixo está um exemplo do fluxo de trabalho pretendido. O fluxo de trabalho do exemplo pode ser encontrado no diretório 'exemplo'.
fluxo de trabalho
fluxo de trabalho
fluxo de trabalho
Às vezes, a inferência e o VAE quebram a imagem, então você precisa mesclar a imagem pintada com o original: fluxo de trabalho. Você pode ver o texto borrado e quebrado após a pintura na primeira imagem e como devo repará-lo.
fluxo de trabalho
Borda astuta do ControlNet
fluxo de trabalho
fluxo de trabalho
Para aumentar a escala, você deve usar o modelo básico, não o BrushNet. O mesmo se aplica ao condicionamento. O upscaling latente entre BrushNet e KSampler não funcionará ou fornecerá resultados estranhos. Essas limitações se devem à estrutura do BrushNet e à sua influência nos cálculos da UNet.
fluxo de trabalho
Se você tiver problemas de OOM, poderá usar o Evolved Sampling do AnimateDiff-Evolved:
fluxo de trabalho
Em Context Options, defina context_length como o número de imagens que podem ser carregadas na VRAM. As imagens serão processadas em pedaços desse tamanho.
fluxo de trabalho
Quando você trabalha com uma imagem grande e sua máscara de pintura é pequena, é melhor cortar parte da imagem, trabalhar com ela e depois mesclar novamente. Criei um nó para esse fluxo de trabalho, veja exemplo.
fluxo de trabalho
fluxo de trabalho
Muitas vezes é difícil remover completamente o objeto, especialmente se ele estiver na frente:
Você deve tentar adicionar uma descrição do objeto ao prompt negativo e descrever a cena vazia, como aqui:
dtype
, o padrão é torch.float16
. O torch.dtype do BrushNet. Se você tiver uma GPU antiga ou uma placa NVIDIA série 16, tente mudar para torch.float32
. scale
, o padrão é 1.0: A "força" do BrushNet. As saídas do BrushNet são multiplicadas por scale
antes de serem adicionadas ao resíduo na unet original.start_at
, o padrão é 0: etapa na qual o BrushNet começa a ser aplicado.end_at
, o padrão é 10000: etapa na qual o BrushNet para de ser aplicado.Aqui estão exemplos de uso desses dois últimos parâmetros.
CLIP
: PowerPaint CLIP que deve ser passado do nó PowerPaintCLIPLoader.fitting
: Grau de ajuste PowerPaint.function
: função PowerPaint, consulte sua página para obter detalhes.save_memory
: Se esta opção estiver definida, o módulo de atenção divide o tensor de entrada em fatias para calcular a atenção em várias etapas. Isso é útil para economizar memória em troca de uma diminuição na velocidade. Se você ficar sem VRAM ou receber Error: total bytes of NDArray > 2**32
no Mac, tente definir esta opção como max
.Ao usar certas funções de rede, os autores do PowerPaint recomendam adicionar frases ao prompt:
empty scene blur
empty scene
empty scene
Muitos usuários do ComfyUI usam nós de geração de texto personalizados, nós CLIP e muitos outros condicionamentos. Não quero quebrar todos esses nós, então não adicionei atualização imediata e, em vez disso, confio nos usuários. Além disso, meus próprios experimentos mostram que essas adições ao prompt não são estritamente necessárias.
A imagem latente pode ser do nó BrushNet ou não, mas deve ter o mesmo tamanho da imagem original (dividida por 8 no espaço latente).
O condicionamento positive
e negative
nos nós BrushNet e PowerPaint são usados para cálculo interno, mas simplesmente copiados para a saída.
Esteja ciente de que nem todos os fluxos de trabalho e nós funcionarão com BrushNet devido à sua estrutura. Coloque também as alterações do modelo antes dos nós BrushNet, não depois. Se você precisar que o modelo trabalhe com a imagem após a inferência do BrushNet, use a base um (veja o exemplo Upscale abaixo).
du_start
, o padrão é 0: etapa na qual o redimensionamento Downsample/Upsample começa a ser aplicado.du_end
, o padrão é 4: etapa na qual o redimensionamento Downsample/Upsample para de ser aplicado.xa_start
, o padrão é 4: etapa na qual o redimensionamento CrossAttention começa a ser aplicado.xa_end
, o padrão é 10: etapa na qual o redimensionamento CrossAttention para de ser aplicado.Para exemplos e explicação, veja aqui.
BrushNet tem algumas limitações (do artigo):
Infelizmente, devido à natureza do código BrushNet, alguns nós não são compatíveis com estes, pois estamos tentando corrigir as mesmas funções do ComfyUI.
Lista de nós não compartimentáveis conhecidos.
O código é baseado em