Ce sont des nœuds personnalisés pour l'implémentation native de ComfyUI de
Ma contribution se limite à l'adaptation de ComfyUI, et tout le mérite revient aux auteurs des articles.
16 mai 2024. Refonte interne pour améliorer la compatibilité avec d'autres nœuds. RAUNet est implémenté.
12 mai 2024. Nœud CutForInpaint, voir exemple.
11 mai 2024. Le lot d'images est implémenté. Vous pouvez même ajouter BrushNet au flux de travail AnimateDiff vid2vid, mais ils ne fonctionnent pas ensemble - ce sont des modèles différents et tous deux tentent de corriger UNet. Ajout de quelques exemples supplémentaires.
6 mai 2024. Le modèle PowerPaint v2 est implémenté. Après la mise à jour, votre flux de travail ne fonctionnera probablement pas. Ne pas paniquer! Vérifiez le paramètre end_at
de BrushNode, s'il est égal à 1, remplacez-le par un grand nombre. Découvrez les paramètres dans la section Utilisation ci-dessous.
2 mai 2024. BrushNet SDXL est en ligne. Il nécessite cependant un conditionnement positif et négatif, donc le flux de travail change un peu, voir l'exemple.
28 avril 2024. Encore une refonte, désolé pour le dérangement. Mais maintenant, BrushNet est natif de ComfyUI. Le célèbre IPAdapter Plus de cubiq fonctionne désormais avec BrushNet ! J'espère... :) S'il vous plaît, signalez tous les bugs que vous avez trouvés.
18 avril 2024. Refonte complète, plus de bibliothèque diffusers
personnalisés. Il est possible d'utiliser des modèles LoRA.
11 avril 2024. Engagement initial.
Clonez le dépôt dans le répertoire custom_nodes
et installez la configuration requise :
git clone https://github.com/nullquant/ComfyUI-BrushNet.git
pip install -r requirements.txt
Les points de contrôle de BrushNet peuvent être téléchargés à partir d'ici.
Le point de contrôle dans segmentation_mask_brushnet_ckpt
fournit des points de contrôle formés sur BrushData, qui ont une segmentation préalable (les masques ont la même forme d'objets). Le random_mask_brushnet_ckpt
fournit un contrôle plus général pour la forme aléatoire du masque.
segmentation_mask_brushnet_ckpt
et random_mask_brushnet_ckpt
contiennent BrushNet pour les modèles SD 1.5 tandis que segmentation_mask_brushnet_ckpt_sdxl_v0
et random_mask_brushnet_ckpt_sdxl_v0
pour SDXL.
Vous devez placer les fichiers diffusion_pytorch_model.safetensors
dans votre dossier models/inpaint
. Vous pouvez également spécifier le dossier inpaint
dans votre extra_model_paths.yaml
.
Pour PowerPaint, vous devez télécharger trois fichiers. diffusion_pytorch_model.safetensors
et pytorch_model.bin
d'ici doivent être placés dans votre dossier models/inpaint
.
Vous avez également besoin du modèle d'encodeur de texte SD1.5 model.safetensors
. Vous pouvez le prendre d'ici ou d'un autre endroit. Vous pouvez également utiliser la version fp16. Il doit être placé dans votre dossier models/clip
.
Voici une structure de mon dossier models/inpaint
:
Le vôtre peut être différent.
Vous trouverez ci-dessous un exemple du flux de travail prévu. Le workflow de l'exemple se trouve dans le répertoire « exemple ».
flux de travail
flux de travail
flux de travail
Parfois, l'inférence et le VAE cassent l'image, vous devez donc mélanger l'image Inpaint avec l'original : le flux de travail. Vous pouvez voir le texte flou et cassé après l'inpainting dans la première image et comment je suppose le réparer.
flux de travail
L’avantage astucieux de ControlNet
flux de travail
flux de travail
Pour effectuer une mise à l'échelle, vous devez utiliser le modèle de base, pas BrushNet. Il en va de même pour le conditionnement. La mise à l'échelle latente entre BrushNet et KSampler ne fonctionnera pas ou vous donnera des résultats étranges. Ces limitations sont dues à la structure de BrushNet et à son influence sur les calculs UNet.
flux de travail
Si vous rencontrez des problèmes de MOO, vous pouvez utiliser Evolved Sampling d'AnimateDiff-Evolved :
flux de travail
Dans Options contextuelles, définissez context_length sur le nombre d'images pouvant être chargées dans la VRAM. Les images seront traitées en morceaux de cette taille.
flux de travail
Lorsque vous travaillez avec une grande image et que votre masque d'inpaint est petit, il est préférable de couper une partie de l'image, de travailler avec elle, puis de la mélanger. J'ai créé un nœud pour un tel flux de travail, voir exemple.
flux de travail
flux de travail
Il est souvent difficile de retirer complètement l'objet, surtout s'il se trouve à l'avant :
Vous devriez essayer d'ajouter une description d'objet à l'invite négative et de décrire une scène vide, comme ici :
dtype
, la valeur par défaut est torch.float16
. Le torch.dtype de BrushNet. Si vous possédez une ancienne carte GPU ou NVIDIA série 16, essayez de passer à torch.float32
. scale
, par défaut 1,0 : la "force" de BrushNet. Les sorties du BrushNet sont multipliées par scale
avant d'être ajoutées au résidu dans l'unet d'origine.start_at
, par défaut 0 : étape à laquelle BrushNet commence à s'appliquer.end_at
, la valeur par défaut est 10000 : étape à laquelle BrushNet cesse de s'appliquer.Voici des exemples d'utilisation de ces deux derniers paramètres.
CLIP
: CLIP PowerPaint qui doit être transmis depuis le nœud PowerPaintCLIPLoader.fitting
: Degré d’ajustement PowerPaint.function
: Fonction PowerPaint, voir sa page pour plus de détails.save_memory
: Si cette option est définie, le module d'attention divise le tenseur d'entrée en tranches pour calculer l'attention en plusieurs étapes. Ceci est utile pour économiser de la mémoire en échange d'une diminution de la vitesse. Si vous manquez de VRAM ou obtenez Error: total bytes of NDArray > 2**32
sur Mac, essayez de définir cette option sur max
.Lors de l'utilisation de certaines fonctions réseau, les auteurs de PowerPaint recommandent d'ajouter des phrases à l'invite :
empty scene blur
empty scene
empty scene
De nombreux utilisateurs de ComfyUI utilisent des nœuds de génération de texte personnalisés, des nœuds CLIP et de nombreux autres conditionnements. Je ne veux pas casser tous ces nœuds, je n'ai donc pas ajouté de mise à jour rapide et je me suis plutôt appuyé sur les utilisateurs. Mes propres expériences montrent également que ces ajouts à l'invite ne sont pas strictement nécessaires.
L'image latente peut provenir du nœud BrushNet ou non, mais elle doit avoir la même taille que l'image originale (divisée par 8 dans l'espace latent).
Les conditionnements positive
et negative
dans les nœuds BrushNet et PowerPaint sont utilisés pour le calcul à l'intérieur, mais ensuite simplement copiés dans la sortie.
Attention, tous les flux de travail et nœuds ne fonctionneront pas avec BrushNet en raison de sa structure. Placez également les modifications de modèle avant les nœuds BrushNet, pas après. Si vous avez besoin d'un modèle pour travailler avec une image après l'inférence BrushNet, utilisez la base 1 (voir l'exemple haut de gamme ci-dessous).
du_start
, la valeur par défaut est 0 : étape à laquelle le redimensionnement Downsample/Upsample commence à s'appliquer.du_end
, la valeur par défaut est 4 : étape à laquelle le redimensionnement Downsample/Upsample cesse de s'appliquer.xa_start
, la valeur par défaut est 4 : étape à laquelle le redimensionnement CrossAttention commence à s'appliquer.xa_end
, la valeur par défaut est 10 : étape à laquelle le redimensionnement CrossAttention cesse de s'appliquer.Pour des exemples et des explications, veuillez regarder ici.
BrushNet a certaines limites (d'après le document) :
Malheureusement, en raison de la nature du code BrushNet, certains nœuds ne sont pas compatibles avec ceux-ci, car nous essayons de patcher les mêmes fonctions de ComfyUI.
Liste des nœuds incomparables connus.
Le code est basé sur