Estos son nodos personalizados para la implementación nativa de ComfyUI de
Mi contribución se limita a la adaptación de ComfyUI y todo el crédito va a los autores de los artículos.
16 de mayo de 2024. Reelaboración interna para mejorar la compatibilidad con otros nodos. Se implementa RAUNet.
12 de mayo de 2024. Nodo CutForInpaint, ver ejemplo.
11 de mayo de 2024. Se implementa el lote de imágenes. Incluso puedes agregar BrushNet al flujo de trabajo AnimateDiff vid2vid, pero no funcionan juntos: son modelos diferentes y ambos intentan parchear UNet. Se agregaron algunos ejemplos más.
6 de mayo de 2024. Se implementa el modelo PowerPaint v2. Después de la actualización, su flujo de trabajo probablemente no funcionará. ¡No entrar en pánico! Verifique el parámetro end_at
de BrushNode, si es igual a 1, cámbielo a un número grande. Lea sobre los parámetros en la sección Uso a continuación.
2 de mayo de 2024. BrushNet SDXL está disponible. Sin embargo, necesita un condicionamiento positivo y negativo, por lo que el flujo de trabajo cambia un poco; consulte el ejemplo.
28 de abril de 2024. Otra revisión, disculpe las molestias. Pero ahora BrushNet es nativo de ComfyUI. ¡IPAdapter Plus del famoso cubiq ahora funciona con BrushNet! Espero... :) Por favor, informe cualquier error que haya encontrado.
18 de abril de 2024. Reelaboración completa, no más biblioteca diffusers
personalizados. Es posible utilizar modelos LoRA.
11 de abril de 2024. Confirmación inicial.
Clona el repositorio en el directorio custom_nodes
e instala los requisitos:
git clone https://github.com/nullquant/ComfyUI-BrushNet.git
pip install -r requirements.txt
Los puntos de control de BrushNet se pueden descargar desde aquí.
El punto de control en segmentation_mask_brushnet_ckpt
proporciona puntos de control entrenados en BrushData, que tiene segmentación previa (las máscaras tienen la misma forma que los objetos). random_mask_brushnet_ckpt
proporciona un ckpt más general para la forma de máscara aleatoria.
segmentation_mask_brushnet_ckpt
y random_mask_brushnet_ckpt
contienen BrushNet para modelos SD 1.5, mientras que segmentation_mask_brushnet_ckpt_sdxl_v0
y random_mask_brushnet_ckpt_sdxl_v0
para SDXL.
Debes colocar los archivos diffusion_pytorch_model.safetensors
en tu carpeta models/inpaint
. También puede especificar la carpeta inpaint
en su extra_model_paths.yaml
.
Para PowerPaint debes descargar tres archivos. Tanto diffusion_pytorch_model.safetensors
como pytorch_model.bin
desde aquí deben colocarse en su carpeta models/inpaint
.
También necesita el modelo de codificador de texto SD1.5 model.safetensors
. Puedes tomarlo desde aquí o desde otro lugar. También puedes usar la versión fp16. Debe colocarse en su carpeta models/clip
.
Esta es una estructura de mi carpeta models/inpaint
:
El tuyo puede ser diferente.
A continuación se muestra un ejemplo del flujo de trabajo previsto. El flujo de trabajo para el ejemplo se puede encontrar dentro del directorio 'ejemplo'.
flujo de trabajo
flujo de trabajo
flujo de trabajo
A veces, la inferencia y VAE rompen la imagen, por lo que es necesario combinar la imagen inpaint con el flujo de trabajo original. Puedes ver el texto borroso y roto después de pintar en la primera imagen y cómo supongo que debo repararlo.
flujo de trabajo
Ventaja astuta de ControlNet
flujo de trabajo
flujo de trabajo
Para mejorar, debe utilizar el modelo base, no BrushNet. Lo mismo ocurre con el condicionamiento. La ampliación latente entre BrushNet y KSampler no funcionará o le dará resultados extraños. Estas limitaciones se deben a la estructura de BrushNet y su influencia en los cálculos de UNet.
flujo de trabajo
Si tiene problemas con OOM, puede utilizar Evolved Sampling de AnimateDiff-Evolved:
flujo de trabajo
En Opciones de contexto, establezca context_length en el número de imágenes que se pueden cargar en VRAM. Las imágenes se procesarán en fragmentos de este tamaño.
flujo de trabajo
Cuando trabaja con una imagen grande y su máscara de pintura es pequeña, es mejor cortar parte de la imagen, trabajar con ella y luego volver a fusionarla. Creé un nodo para dicho flujo de trabajo, ver ejemplo.
flujo de trabajo
flujo de trabajo
A menudo es difícil retirar completamente el objeto, especialmente si está en la parte frontal:
Deberías intentar agregar una descripción del objeto al mensaje negativo y describir una escena vacía, como aquí:
dtype
, por defecto es torch.float16
. El tipo torch.d de BrushNet. Si tiene una GPU antigua o una tarjeta de la serie NVIDIA 16, intente cambiar a torch.float32
. scale
, el valor predeterminado es 1.0: la "fuerza" de BrushNet. Las salidas de BrushNet se multiplican por scale
antes de agregarlas al residuo en la unidad original.start_at
, el valor predeterminado es 0: paso en el que BrushNet comienza a aplicarse.end_at
, el valor predeterminado es 10000: paso en el que BrushNet deja de aplicarse.A continuación se muestran ejemplos de uso de estos dos últimos parámetros.
CLIP
: CLIP de PowerPaint que debe pasarse desde el nodo PowerPaintCLIPLoader.fitting
: Grado de ajuste de PowerPaint.function
: función PowerPaint, consulte su página para obtener más detalles.save_memory
: si se establece esta opción, el módulo de atención divide el tensor de entrada en porciones para calcular la atención en varios pasos. Esto es útil para ahorrar algo de memoria a cambio de una disminución de la velocidad. Si se queda sin VRAM o aparece Error: total bytes of NDArray > 2**32
en Mac, intente configurar esta opción al max
.Al utilizar determinadas funciones de red, los autores de PowerPaint recomiendan agregar frases al mensaje:
empty scene blur
empty scene
empty scene
Muchos de los usuarios de ComfyUI utilizan nodos de generación de texto personalizados, nodos CLIP y muchos otros condicionamientos. No quiero romper todos estos nodos, por lo que no agregué actualizaciones rápidas y, en cambio, confío en los usuarios. Además, mis propios experimentos muestran que estas adiciones al mensaje no son estrictamente necesarias.
La imagen latente puede ser del nodo BrushNet o no, pero debe tener el mismo tamaño que la imagen original (dividida por 8 en el espacio latente).
Tanto el condicionamiento positive
como negative
en los nodos BrushNet y PowerPaint se utilizan para el cálculo interno, pero luego simplemente se copian en la salida.
Tenga en cuenta que no todos los flujos de trabajo y nodos funcionarán con BrushNet debido a su estructura. También coloque los cambios del modelo antes de los nodos BrushNet, no después. Si necesita un modelo para trabajar con la imagen después de la inferencia de BrushNet, use la base uno (consulte el ejemplo exclusivo a continuación).
du_start
, el valor predeterminado es 0: paso en el que comienza a aplicarse el cambio de tamaño de reducción/aumento de muestra.du_end
, el valor predeterminado es 4: paso en el que deja de aplicarse el cambio de tamaño de reducción/aumento de muestra.xa_start
, el valor predeterminado es 4: paso en el que comienza a aplicarse el cambio de tamaño de CrossAttention.xa_end
, el valor predeterminado es 10: paso en el que el cambio de tamaño de CrossAttention deja de aplicarse.Para ver ejemplos y explicaciones, consulte aquí.
BrushNet tiene algunas limitaciones (del artículo):
Desafortunadamente, debido a la naturaleza del código BrushNet, algunos nodos no son compatibles con estos, ya que estamos intentando parchear las mismas funciones de ComfyUI.
Lista de nodos incompatibles conocidos.
El código se basa en