Nous concevons une nouvelle architecture qui peut prendre en charge plus de 10 types de contrôle dans la génération de texte en image et peut générer des images haute résolution visuellement comparables à Midjourney . Le réseau est basé sur l'architecture ControlNet originale, nous proposons deux nouveaux modules pour : 1 Étendre le ControlNet original pour prendre en charge différentes conditions d'image en utilisant le même paramètre réseau. 2 Prend en charge la saisie de plusieurs conditions sans augmenter la charge de calcul, ce qui est particulièrement important pour les concepteurs qui souhaitent modifier l'image en détail, différentes conditions utilisent le même encodeur de condition, sans ajouter de calculs ou de paramètres supplémentaires. Nous effectuons des expériences approfondies sur SDXL et obtenons des performances supérieures tant en termes de capacité de contrôle que de score esthétique. Nous publions la méthode et le modèle à la communauté open source pour que tout le monde puisse en profiter.
Si vous le trouvez utile, donnez-moi une étoile, merci beaucoup !!
La version SDXL ProMax est sortie !!!,Profitez-en !!!
Je suis désolé car les revenus et les dépenses du projet sont difficiles à équilibrer, les ressources GPU sont affectées à d'autres projets qui sont plus susceptibles d'être rentables, la formation SD3 est arrêtée jusqu'à ce que je trouve suffisamment de support GPU, je ferai de mon mieux pour trouver des GPU pour continuer la formation. Si cela vous occasionne des désagréments, je m'en excuse sincèrement. Je tiens à remercier tous ceux qui aiment ce projet, votre soutien est ce qui me permet de continuer
Remarque : nous mettons le modèle promax avec un suffixe promax dans le même référentiel de modèles Huggingface, des instructions détaillées seront ajoutées ultérieurement.
Exemple suivant : résolution 1M --> résolution 9M
Utilisez la formation en seau comme Novelai, peut générer des images haute résolution de n'importe quel rapport d'aspect
Utilisez une grande quantité de données de haute qualité (plus de 1 000 000 d'images), l'ensemble de données couvre une diversité de situations
Utilisez une invite re-sous-titrée comme DALLE.3, utilisez CogVLM pour générer une description détaillée, bonne capacité de suivi d'invite
Utilisez de nombreuses astuces utiles pendant l'entraînement. Y compris, mais sans s'y limiter, l'augmentation de date, la perte multiple, la résolution multiple
Utilisez presque le même paramètre par rapport au ControlNet d'origine. Aucune augmentation évidente des paramètres de réseau ou des calculs.
Prend en charge plus de 10 conditions de contrôle, aucune baisse de performance évidente dans aucune condition par rapport à un entraînement indépendant
Prend en charge la génération de conditions multiples, la fusion de conditions est apprise pendant la formation. Pas besoin de définir des hyperparamètres ou des invites de conception.
Compatible avec d'autres modèles SDXL open source, tels que BluePencilXL, CounterfeitXL. Compatible avec d'autres modèles Lora.
https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0
https://huggingface.co/xinsir/controlnet-scribble-sdxl-1.0
https://huggingface.co/xinsir/controlnet-tile-sdxl-1.0
https://huggingface.co/xinsir/controlnet-canny-sdxl-1.0
[07/06/2024] Sortie ControlNet++
et des modèles pré-entraînés.
[07/06/2024] Libération du code d'inférence (condition unique et condition multiple).
[13/07/2024] Sortie de ProMax ControlNet++
avec fonction d'édition avancée.
ControlNet++ pour radio
ControlNet++ pour Comfyui
publier le code de formation et les conseils de formation.
publier le papier arxiv.
L'un des modèles Controlnet les plus importants, nous utilisons de nombreuses astuces pour entraîner ce modèle, aussi bonnes que https://huggingface.co/xinsir/controlnet-openpose-sdxl-1.0, performances SOTA dans le contrôle de pose. Pour que le modèle openpose atteigne ses meilleures performances, vous devez remplacer la fonction draw_pose dans le package controlnet_aux (comfyui a son propre package controlnet_aux), reportez-vous aux scripts d'inférence pour plus de détails.
L'un des modèles Controlnet les plus importants, Canny est une formation mixte avec Lineart, Anime Lineart, MLSD. Performance robuste face à toutes les lignes fines, le modèle est la clé pour diminuer le taux de déformation, il est recommandé d'utiliser une ligne fine pour redessiner la main/le pied.
L'un des modèles Controlnet les plus importants, le modèle Scribble peut prendre en charge n'importe quelle largeur de ligne et n'importe quel type de ligne. tout aussi bon que https://huggingface.co/xinsir/controlnet-scribble-sdxl-1.0, faites de chacun un peintre d'âme.
Remarque : utilisez le squelette de pose pour contrôler la pose humaine, utilisez une ligne fine pour dessiner les détails de la main/du pied afin d'éviter toute déformation.
Remarque : l'image de profondeur contient des informations détaillées, il est recommandé d'utiliser la profondeur pour l'arrière-plan et d'utiliser le squelette de pose pour le premier plan.
Remarque : Scribble est un modèle de ligne solide, si vous souhaitez dessiner quelque chose avec un contour non strict, vous pouvez l'utiliser. Openpose + Scribble vous donne plus de liberté pour générer votre image initiale, vous pouvez ensuite utiliser une ligne fine pour modifier les détails.
Nous collectons une grande quantité d’images de haute qualité. Les images sont filtrées et annotées sérieusement, les images couvrent un large éventail de sujets, notamment la photographie, l'anime, la nature, le milieu du voyage, etc.
Nous proposons deux nouveaux modules dans ControlNet++, nommés respectivement Condition Transformer et Control Encoder. Nous avons légèrement modifié un ancien module pour améliorer sa capacité de représentation. En outre, nous proposons une stratégie de formation unifiée pour réaliser un contrôle simple et multiple en une seule étape.
Pour chaque condition, nous lui attribuons un identifiant de type de contrôle, par exemple, openpose--(1, 0, 0, 0, 0, 0), profondeur--(0, 1, 0, 0, 0, 0), les conditions multiples seront comme (openpose, profondeur) --(1, 1, 0, 0, 0, 0). Dans l'encodeur de contrôle, l'identifiant du type de contrôle sera converti en intégrations de type de contrôle (en utilisant des intégrations positionnelles sinusoïdales), puis nous utilisons une seule couche linéaire pour projeter les intégrations de type de contrôle afin qu'elles aient la même luminosité avec l'intégration temporelle. Les fonctionnalités de type de contrôle sont ajoutées à l'intégration temporelle pour indiquer différents types de contrôle. Ce paramètre simple peut aider ControlNet à distinguer différents types de contrôle, car l'intégration temporelle a tendance à avoir un effet global sur l'ensemble du réseau. Quelle que soit la condition unique ou multiple, il existe un identifiant de type de contrôle unique qui lui correspond.
Nous étendons ControlNet pour prendre en charge plusieurs entrées de contrôle en même temps en utilisant le même réseau. Le transformateur de condition est utilisé pour combiner différentes fonctionnalités de condition d’image. Il y a deux innovations majeures dans nos méthodes : premièrement, différentes conditions partagent le même encodeur de conditions, ce qui rend le réseau plus simple et plus léger. c'est différent avec d'autres méthodes traditionnelles comme T2I ou UniControlNet. Deuxièmement, nous ajoutons une couche de transformateur pour échanger les informations de l'image d'origine et des images de condition, au lieu d'utiliser directement la sortie du transformateur, nous l'utilisons pour prédire un biais de condition par rapport à la caractéristique de condition d'origine. C'est un peu comme ResNet, et nous avons constaté expérimentalement que ce paramètre peut évidemment améliorer les performances du réseau.
L'encodeur de condition d'origine de ControlNet est une pile d'activations de couche de conv et Silu. Nous ne changeons pas l'architecture de l'encodeur, nous augmentons simplement les canaux de conv pour obtenir un encodeur "gros". Cela peut évidemment augmenter les performances du réseau. La raison en est que nous partageons le même encodeur pour toutes les conditions d’image, cela nécessite donc que l’encodeur ait une capacité de représentation plus élevée. Le réglage d'origine sera bon pour une seule condition mais pas aussi bon pour plus de 10 conditions. Notez que l'utilisation du paramètre d'origine est également acceptable, mais avec un certain sacrifice sur la qualité de génération d'image.
La formation avec une seule condition peut être limitée par la diversité des données. Par exemple, openpose vous oblige à vous entraîner avec des images avec des personnes et mlsd vous oblige à vous entraîner avec des images avec des lignes, ce qui peut affecter les performances lors de la génération d'objets invisibles. En outre, la difficulté de s'entraîner dans différentes conditions est différente, il est difficile de faire converger toutes les conditions en même temps et d'atteindre la meilleure performance dans chaque condition. Enfin, nous aurons tendance à utiliser deux ou plusieurs conditions en même temps, la formation multi-conditions rendra la fusion de différentes conditions plus fluide et augmentera la robustesse du réseau (car une seule condition apprendra des connaissances limitées). Nous proposons une étape de formation unifiée pour réaliser simultanément la convergence optimale à condition unique et la fusion multi-conditions.
ControlNet++ nécessite de transmettre un identifiant de type de contrôle au réseau. Nous fusionnons le contrôle 10+ en 6 types de contrôle, la signification de chaque type est la suivante :
0 -- pose ouverte
1 -- profondeur
2 -- ligne épaisse (gribouillis/hed/softedge/ted-512)
3 -- ligne fine(canny/mlsd/lineart/animelineart/ted-1280)
4 - normal
5 -- segment
Nous recommandons une version python >= 3.8, vous pouvez paramétrer l'environnement virtuel à l'aide de la commande suivante :
conda create -n controlplus python=3.8 conda activer controlplus pip install -r exigences.txt
Vous téléchargez le poids du modèle sur https://huggingface.co/xinsir/controlnet-union-sdxl-1.0. Toute nouvelle version de modèle sera mise sur Huggingface, vous pouvez suivre https://huggingface.co/xinsir pour obtenir les dernières informations sur le modèle.
Nous fournissons des scripts d'inférence pour chaque condition de contrôle. Veuillez vous y référer pour plus de détails.
Il existe des différences de prétraitement. Pour obtenir les meilleures performances de contrôle openpose, procédez comme suit : Recherchez le fichier util.py dans le package controlnet_aux, remplacez la fonction draw_bodypose par le code suivant.
def draw_bodypose(canvas: np.ndarray, keypoints: List[Keypoint]) -> np.ndarray: """ Dessine des points clés et des membres représentant la pose du corps sur une toile donnée. Args: canvas (np.ndarray) : un tableau numpy 3D représentant le canevas (image) sur lequel dessiner les points clés du corps (List[Keypoint]) : Une liste d'objets Keypoint représentant les points clés du corps à dessiner. np.ndarray : Un tableau numpy 3D représentant le canevas modifié avec la pose du corps dessinée Remarque : La fonction s'attend à ce que les coordonnées x et y des points clés soient normalisées entre 0 et 1. """ H, W, C = canevas. forme si max(W, H) < 500 : ratio = 1,0 elif max(W, H) >= 500 et max(W, H) < 1000 : ratio = 2,0 elif max(W, H) >= 1000 et max(W , H) < 2000 : ratio = 3,0 elif max(W, H) >= 2000 et max(W, H) < 3000 : ratio = 4,0 elif max(W, H) >= 3 000 et max(W, H) < 4 000 : ratio = 5,0 elif max(W, H) >= 4 000 et max(W, H) < 5 000 : ratio = 6,0 sinon : rapport = 7,0 largeur de bâton = 4 limbSeq = [ [2, 3], [2, 6], [3, 4], [4, 5], [6, 7], [7, 8], [2, 9], [9, 10], [10, 11], [2, 12], [12, 13], [13, 14], [2, 1], [1, 15], [15, 17], [1, 16], [16, 18], ] couleurs = [[255, 0, 0], [255, 85, 0], [255, 170, 0], [255, 255, 0], [170, 255, 0], [85, 255, 0 ], [0, 255, 0], [0, 255, 85], [0, 255, 170], [0, 255, 255], [0, 170, 255], [0, 85, 255], [0, 0, 255], [85 , 0, 255], [170, 0, 255], [255, 0, 255], [255, 0, 170], [255, 0, 85]] pour (k1_index, k2_index), couleur dans zip(limbSeq, couleurs) : keypoint1 = keypoints[k1_index - 1] keypoint2 = keypoints[k2_index - 1] si keypoint1 est Aucun ou keypoint2 est Aucun : continue Y = np.array([keypoint1.x, keypoint2.x]) * float(W) X = np.array([keypoint1.y, keypoint2.y]) * float(H) mX = np.mean(X) mY = np.mean(Y) longueur = ((X[0] - X[1]) ** 2 + (Y[0] - Y[1]) ** 2) ** 0,5 angle = math.degrees(math.atan2(X[0] - X[1], Y[0] - Y[1])) polygone = cv2.ellipse2Poly((int(mY), int(mX) ), (int(longueur / 2), int(stickwidth * ratio)), int(angle), 0, 360, 1) cv2.fillConvexPoly(canvas, polygon, [int(float(c) * 0.6) for c in color]) pour le point clé, couleur dans zip(points clés, couleurs) : si le point clé est Aucun : continuez x, y = keypoint.x, keypoint.y x = int(x * W) y = int(y * H) cv2.circle(canvas, (int(x), int(y)), int(4 * ratio), couleur, épaisseur=-1) retourner la toile
Pour l'inférence à condition unique, vous devez donner une invite et une image de contrôle, modifier les lignes correspondantes dans le fichier python.
python controlnet_union_test_openpose.py
Pour l'inférence multi-conditions, vous devez vous assurer que votre image_list d'entrée est compatible avec votre type de contrôle, par exemple, si vous souhaitez utiliser openpose et le contrôle de profondeur, image_list --> [controlnet_img_pose, controlnet_img_degree, 0, 0, 0, 0], control_type -- > [1, 1, 0, 0, 0, 0]. Reportez-vous à controlnet_union_test_multi_control.py pour plus de détails.
En théorie, vous n'avez pas besoin de définir l'échelle de conditions pour différentes conditions, le réseau est conçu et formé pour fusionner naturellement différentes conditions. Le paramètre par défaut est 1,0 pour chaque entrée de condition, et il en va de même pour l'entraînement multi-conditions. Cependant, si vous souhaitez augmenter l'effet d'une certaine condition d'entrée, vous pouvez ajuster les échelles de condition dans le module Condition Transformer. Dans ce module, les conditions d'entrée seront ajoutées aux caractéristiques de l'image source avec la prédiction de biais. le multiplier avec une certaine échelle affectera beaucoup (mais peut entraîner un résultat inconnu).
python controlnet_union_test_multi_control.py