Textual Inversion
Textual Inversion est une technique de personnalisation qui enseigne un nouveau concept visuel (objet, style, texture) à un modèle de diffusion text-to-image en optimisant uniquement un vecteur d’embedding textuel, sans modifier les poids du modèle lui-même.
- Type
- Personnalisation par inversion dans l’espace d’embedding
- Créateurs
- Rinon Gal et al. (Tel Aviv University + NVIDIA, 2022)
- Paper
- arXiv:2208.01618 « An Image is Worth One Word » (ICLR 2023)
- Images requises
- 3 à 5 (minimum), 5-10 pour des résultats optimaux
- Taille du fichier
- ~10-100 Ko (.pt ou .safetensors)
- VRAM minimum
- ~4-8 Go
- Modèle modifié ?
- Non, le modèle de diffusion reste gelé
- Outils
- AUTOMATIC1111, Diffusers, ComfyUI, Kohya GUI
Qu’est-ce que Textual Inversion ?
Textual Inversion (parfois appelé simplement « Embedding » dans la communauté Stable Diffusion) est une méthode qui permet d’apprendre un concept visuel personnalisé en trouvant un nouveau vecteur dans l’espace d’embedding du text encoder du modèle. Publiée en août 2022 par Rinon Gal et al. (Tel Aviv University et NVIDIA), la technique est décrite dans le paper « An Image is Worth One Word ».
Le principe fondamental : le modèle de diffusion et son text encoder (CLIP) restent entièrement gelés. Seul un nouveau vecteur d’embedding, associé à un pseudo-mot (par exemple <my-cat>), est optimisé par descente de gradient pour que les images générées avec ce pseudo-mot correspondent visuellement aux 3-5 images fournies.
Ce pseudo-mot devient ensuite utilisable comme n’importe quel autre mot dans un prompt. Vous pouvez écrire « a painting of <my-cat> in the style of Monet » et le modèle comprend exactement de quel chat il s’agit, tout en appliquant un style artistique qu’il connaît déjà.
Comment fonctionne Textual Inversion ?
Pour comprendre Textual Inversion, il faut d’abord comprendre comment un modèle de diffusion text-to-image traite un prompt textuel.
Le pipeline de génération d’image
Quand vous soumettez un prompt à Stable Diffusion, il passe par trois étapes :
Premièrement, le tokenizer découpe le texte en tokens (des indices dans un dictionnaire prédéfini). Chaque token est ensuite converti en un vecteur d’embedding continu, une représentation numérique dans un espace de haute dimension. Enfin, ces embeddings passent par le text encoder CLIP, qui produit les vecteurs de conditionnement utilisés pour guider le processus de débruitage dans le U-Net.
Textual Inversion intervient à l’étape d’embedding : on ajoute un nouveau token au vocabulaire et on optimise son vecteur d’embedding pour qu’il encode les caractéristiques visuelles du concept cible.
Le processus d’optimisation
L’entraînement se déroule comme suit :
On désigne un placeholder (ex. S* ou <my-concept>) comme pseudo-mot pour le concept à apprendre. Le vecteur d’embedding de ce pseudo-mot est initialisé à partir d’un mot existant sémantiquement proche (ex. « cat » si vous apprenez un chat, « painting » si vous apprenez un style). Puis, à chaque step d’entraînement, on reconstruit les images fournies via le processus de diffusion standard, et on calcule la loss entre l’image reconstruite et l’image originale. Seul le vecteur d’embedding du pseudo-mot est mis à jour par le gradient. Le modèle de diffusion, le text encoder, et tous les autres embeddings restent figés.
Un point crucial du paper original : les auteurs démontrent qu’un seul vecteur d’embedding suffit pour capturer des concepts variés et distincts. Cela peut paraître surprenant étant donné la richesse de certains concepts, mais l’espace d’embedding de CLIP est suffisamment expressif pour encoder une quantité considérable d’information visuelle dans un seul vecteur.
L’importance de l’initialisation
Le choix du mot d’initialisation a un impact significatif sur la qualité des résultats. Initialisez toujours avec un mot sémantiquement pertinent :
| Concept cible | Bon mot d’initialisation | Mauvais mot d’initialisation |
|---|---|---|
| Un chat spécifique | cat |
object |
| Un style aquarelle | painting ou watercolor |
photo |
| Un jouet spécifique | toy ou figurine |
landscape |
| Une texture (bois, métal) | texture ou le matériau |
person |
Une bonne initialisation place le vecteur dans une région de l’espace d’embedding déjà pertinente, ce qui accélère la convergence et améliore la qualité finale.
Les avantages de Textual Inversion
Le modèle reste intact
C’est l’avantage majeur par rapport à DreamBooth. Comme aucun poids du modèle n’est modifié, il n’y a aucun risque de language drift (le modèle qui oublie ce que signifient d’autres mots) ni de dégradation de la qualité générale de génération. Vous pouvez empiler autant d’embeddings Textual Inversion que vous voulez sur le même modèle de base sans interférences.
Fichier extrêmement léger
Un embedding Textual Inversion pèse entre 10 et 100 Ko, contre 2-7 Go pour un checkpoint DreamBooth et 1-150 Mo pour un LoRA. C’est le format le plus facile à partager, stocker et distribuer. La bibliothèque communautaire sur Hugging Face (sd-concepts-library) héberge plus de 1 000 embeddings prêts à l’emploi.
Composabilité native
Puisque chaque embedding est un simple mot dans le vocabulaire du modèle, vous pouvez les combiner naturellement dans un prompt. Par exemple : « a <my-cat> sitting on a <vintage-chair> in the style of <watercolor-style> » fonctionne si vous avez entraîné ces trois embeddings séparément. Avec DreamBooth, combiner plusieurs concepts nécessite des techniques complexes de fusion de modèles.
Entraînement accessible
Textual Inversion nécessite beaucoup moins de VRAM que DreamBooth (4-8 Go suffisent) et l’entraînement est plus rapide. Il est possible de l’effectuer sur un GPU grand public ou même gratuitement via Google Colab.
Les limites de Textual Inversion
Fidélité inférieure pour les sujets complexes
C’est la contrepartie directe de ne pas toucher au modèle : toute l’information du concept doit tenir dans un seul vecteur d’embedding. Pour des sujets visuellement complexes (un visage humain avec ses détails subtils, un objet avec des motifs précis), Textual Inversion ne capture pas assez de détails fins. Le paper original de DreamBooth montre des écarts significatifs sur les métriques de fidélité (scores DINO et CLIP-I) en faveur de DreamBooth.
Meilleur pour les styles que pour les sujets
En pratique, Textual Inversion excelle pour capturer des styles artistiques, des textures, ou des concepts esthétiques globaux. Pour des sujets spécifiques (un visage, un objet unique), LoRA ou DreamBooth offrent des résultats supérieurs. Si vous voulez entraîner un style artistique et que vous n’avez pas besoin d’une fidélité pixel-perfect, Textual Inversion est souvent le meilleur choix.
Convergence plus lente en steps
Même si chaque step est rapide (car il n’y a qu’un vecteur à optimiser), il faut typiquement 3 000 à 5 000 steps pour obtenir un embedding de qualité, ce qui représente un temps d’entraînement de 30 minutes à 2 heures selon le GPU. Par comparaison, un DreamBooth complet converge souvent en 400-1 200 steps, mais chaque step est bien plus lent.
Le cas EasyNegative et les embeddings négatifs
Un usage très populaire de Textual Inversion, souvent méconnu des débutants : les embeddings négatifs. L’idée est d’entraîner un embedding non pas sur ce que vous voulez générer, mais sur ce que vous voulez éviter. L’embedding est ensuite utilisé dans le prompt négatif.
L’exemple le plus célèbre est EasyNegative, un embedding entraîné sur un ensemble d’images considérées comme étant de mauvaise qualité (mains déformées, visages incohérents, artefacts). En l’ajoutant au prompt négatif, le modèle apprend à éviter ces défauts. D’autres embeddings négatifs populaires incluent bad_prompt, ng_deepnegative, et bad-hands-5.
Cette approche fonctionne parce que le prompt négatif dans Stable Diffusion guide le modèle pour s’éloigner des concepts décrits. Un embedding entraîné pour représenter « mauvaise qualité » est une manière plus précise d’exprimer cette idée qu’une simple description textuelle comme « bad quality, deformed hands ».
.safetensors ou .pt dans le dossier embeddings/ de votre installation AUTOMATIC1111 ou Forge. Puis ajoutez le nom de l’embedding dans votre prompt négatif.
Comparatif des techniques de personnalisation
Textual Inversion n’existe pas dans le vide. Voici comment elle se situe par rapport aux autres méthodes de personnalisation pour les modèles de diffusion :
| Critère | Textual Inversion | DreamBooth | LoRA |
|---|---|---|---|
| Ce qui est modifié | 1 vecteur d’embedding | Tout le U-Net (+ CLIP optionnel) | Matrices low-rank dans les couches |
| Taille du fichier | 10-100 Ko | 2-7 Go | 1-150 Mo |
| VRAM minimum | 4-8 Go | 12-24 Go | 6-12 Go |
| Fidélité sujet | Moyenne | Excellente | Bonne à très bonne |
| Fidélité style | Bonne à très bonne | Très bonne | Bonne |
| Risque de language drift | Aucun | Élevé (sans prior preservation) | Faible |
| Combinaison de concepts | Naturelle (dans le prompt) | Difficile | Empilement possible |
| Meilleur pour | Styles, textures, prompts négatifs | Visages, objets spécifiques | Polyvalent, bon compromis |
Le verdict : Textual Inversion est la technique la plus légère et la plus sûre pour personnaliser un modèle. C’est le choix idéal pour les styles, les textures, et les embeddings négatifs. Mais dès que vous avez besoin de capturer les détails fins d’un sujet spécifique, LoRA offre un bien meilleur rapport fidélité/coût. Et DreamBooth reste le champion de la fidélité absolue pour les cas exigeants.
Guide pratique : entraîner un embedding avec AUTOMATIC1111
L’interface AUTOMATIC1111 intègre nativement l’entraînement Textual Inversion. Voici la procédure pas à pas.
Étape 1 : Préparer les images
Rassemblez 5 à 10 images de votre concept. Pour un objet ou un visage, variez les angles et les éclairages. Pour un style artistique, incluez des images représentatives de ce style avec des sujets variés. Toutes les images doivent être de bonne qualité, sans watermark, et idéalement carrées (512×512 pour SD 1.5, 1024×1024 pour SDXL).
Étape 2 : Créer l’embedding
Dans l’onglet Train > Create embedding :
Donnez un nom à votre embedding (ce sera le trigger word, ex. my-cat). Sélectionnez le nombre de vecteurs par token : 1 pour les concepts simples, 2-4 pour les concepts complexes (au prix d’une consommation de tokens plus élevée dans le prompt). Choisissez un mot d’initialisation sémantiquement proche du concept.
Étape 3 : Prétraiter les images
Dans l’onglet Train > Preprocess images, indiquez le dossier source et le dossier de destination. Activez le recadrage automatique et, si vous entraînez un objet, activez « Use BLIP caption as filename » pour générer automatiquement des légendes descriptives.
Étape 4 : Lancer l’entraînement
Paramètres recommandés pour un premier entraînement :
| Paramètre | Valeur recommandée (objet) | Valeur recommandée (style) |
|---|---|---|
| Learning rate | 5e-3 à 5e-2 | 5e-3 à 5e-2 |
| Max steps | 3 000-5 000 | 5 000-8 000 |
| Template | subject.txt ou subject_filewords.txt |
style.txt |
| Save every N steps | 500 | 500 |
| Vecteurs par token | 1-2 | 2-4 |
Loss: nan dans la console, l’embedding est corrompu irréversiblement. Cela arrive quand le learning rate est trop élevé. Recommencez avec un learning rate réduit. Sauvegardez fréquemment pour ne pas perdre votre progression.
Étape 5 : Utiliser l’embedding
Après l’entraînement, le fichier d’embedding se trouve dans le dossier embeddings/. Il suffit d’utiliser le nom du pseudo-mot dans votre prompt :
Prompt : a beautiful painting of my-cat sitting on a windowsill, sunset, oil on canvas
Negative : bad quality, blurry, deformedEntraîner avec Diffusers (Python)
Pour les développeurs, la bibliothèque Diffusers de Hugging Face fournit un script d’entraînement complet :
export MODEL_NAME="stable-diffusion-v1-5/stable-diffusion-v1-5"
export DATA_DIR="./my_images"
accelerate launch textual_inversion.py
--pretrained_model_name_or_path=$MODEL_NAME
--train_data_dir=$DATA_DIR
--learnable_property="object"
--placeholder_token="<my-concept>"
--initializer_token="cat"
--resolution=512
--train_batch_size=1
--gradient_accumulation_steps=4
--max_train_steps=3000
--learning_rate=5.0e-04
--scale_lr
--lr_scheduler="constant"
--lr_warmup_steps=0
--output_dir="textual_inversion_output"Le paramètre --learnable_property accepte « object » (pour un sujet) ou « style » (pour un style artistique), ce qui adapte le template de prompt utilisé pendant l’entraînement.
Pour charger l’embedding entraîné lors de l’inférence :
from diffusers import StableDiffusionPipeline
import torch
pipe = StableDiffusionPipeline.from_pretrained(
"stable-diffusion-v1-5/stable-diffusion-v1-5",
torch_dtype=torch.float16
).to("cuda")
pipe.load_textual_inversion("./textual_inversion_output")
image = pipe("A <my-concept> in a forest").images[0]
image.save("result.png")Textual Inversion multi-vecteurs
Une extension de la technique originale consiste à utiliser plusieurs vecteurs d’embedding pour un seul concept. Au lieu d’encoder toute l’information dans un seul vecteur, on utilise 2, 4, voire 8 vecteurs concaténés. Cela augmente la capacité de représentation et améliore la fidélité, surtout pour les concepts visuellement riches.
Le compromis : chaque vecteur supplémentaire consomme un token dans la limite du prompt (77 tokens pour CLIP dans SD 1.5). Un embedding à 8 vecteurs consomme 8 tokens sur 77, ce qui laisse moins de place pour le reste du prompt. En pratique, 2-4 vecteurs offrent un bon équilibre entre expressivité et budget de tokens.
Où trouver des embeddings prêts à l’emploi
Plusieurs plateformes hébergent des embeddings Textual Inversion entraînés par la communauté :
Civitai est la plus grande plateforme communautaire avec des milliers d’embeddings classés par type (style, objet, prompt négatif). Filtrez par type « Textual Inversion » dans les résultats. Hugging Face héberge la bibliothèque officielle sd-concepts-library avec plus de 1 000 embeddings, tous testés et documentés. Ces deux sources couvrent l’immense majorité des besoins.
Textual Inversion + Pivotal Tuning
Une évolution importante de la technique originale est le « Pivotal Tuning » : on entraîne d’abord un embedding via Textual Inversion classique, puis on utilise cet embedding comme point d’ancrage pour un fine-tuning plus poussé (LoRA ou DreamBooth). Cette approche en deux étapes combine la stabilité de Textual Inversion avec la puissance des méthodes de fine-tuning, et produit des résultats supérieurs à chaque méthode utilisée seule.
Plusieurs implémentations intègrent cette approche : Kohya GUI permet d’activer l’optimisation de l’embedding textuel en parallèle de l’entraînement LoRA ou DreamBooth.
Questions fréquentes sur Textual Inversion
Quelle est la différence entre Textual Inversion et un embedding ?
Ce sont la même chose. Dans la communauté Stable Diffusion, les termes « Textual Inversion » et « Embedding » sont utilisés de manière interchangeable. Textual Inversion est le nom de la technique (telle que décrite dans le paper de Gal et al.), et « embedding » désigne le fichier résultant (.pt ou .safetensors) qui contient le vecteur appris. Quand vous téléchargez un « embedding » sur Civitai, c’est un fichier de Textual Inversion.
Textual Inversion fonctionne-t-il avec SDXL et FLUX ?
Avec SDXL, Textual Inversion fonctionne mais est moins couramment utilisé qu’avec SD 1.5, car LoRA offre de bien meilleurs résultats pour un effort à peine supérieur. Avec FLUX, Textual Inversion n’est pas la méthode recommandée : la communauté privilégie massivement LoRA et DreamBooth. Les embeddings entraînés sur SD 1.5 ne sont pas compatibles avec SDXL ou FLUX, car les text encoders sont différents.
Combien de temps faut-il pour entraîner un Textual Inversion ?
Sur un GPU type RTX 3060 (12 Go), comptez environ 30 à 90 minutes pour 3 000-5 000 steps. Sur un GPU plus puissant (RTX 4090, A100), cela descend à 10-30 minutes. L’entraînement est nettement plus léger que DreamBooth car seul un vecteur d’embedding est optimisé. Sur Google Colab (GPU T4 gratuit), prévoyez 1 à 2 heures.
Qu’est-ce que EasyNegative et comment l’utiliser ?
EasyNegative est un embedding Textual Inversion entraîné sur des images de mauvaise qualité. En l’ajoutant dans votre prompt négatif, le modèle s’éloigne de ces défauts (mains déformées, visages incohérents, artefacts). Pour l’utiliser : téléchargez le fichier depuis Civitai, placez-le dans le dossier embeddings/ de votre interface, puis ajoutez EasyNegative dans le champ de prompt négatif.
Textual Inversion est-il encore pertinent face à LoRA ?
LoRA a largement supplanté Textual Inversion pour la personnalisation de sujets spécifiques, grâce à sa fidélité supérieure. Mais Textual Inversion conserve trois niches solides : les embeddings négatifs (EasyNegative, bad-hands, etc.) qui restent omniprésents dans les workflows de la communauté, l’apprentissage de styles globaux avec un overhead minimal, et la combinaison avec d’autres techniques (pivotal tuning). Pour un débutant qui découvre la personnalisation, Textual Inversion reste aussi un excellent point d’entrée grâce à sa simplicité.