Neural Style Transfer (NST) : les algorithmes qui fusionnent contenu et style
Le neural style transfer (NST) est une famille d’algorithmes de deep learning qui utilisent les représentations internes de réseaux de neurones convolutifs (CNN) pour séparer et recombiner le contenu sémantique d’une image avec le style visuel d’une autre, produisant des images artistiquement stylisées.
- Catégorie
- Deep learning appliqué à la vision par ordinateur et à la génération d’images
- Article fondateur
- « A Neural Algorithm of Artistic Style », Gatys, Ecker, Bethge (ArXiv 2015, CVPR 2016)
- Réseau extracteur
- VGG-19 pré-entraîné sur ImageNet (standard), alternatives : VGG-16, ResNet
- Méthodes
- Optimisation itérative (Gatys), Feed-forward (Johnson), AdaIN (Huang), CycleGAN (Zhu)
- Implémentations
- TensorFlow Hub, PyTorch (jcjohnson/neural-style), pytorch-AdaIN, Keras tutorial
- Évolutions
- CIN (multi-style), AdaIN (style arbitraire), CycleGAN (non apparié), diffusion-based
Qu’est-ce que le neural style transfer ?
Le neural style transfer est la sous-catégorie du style transfer qui utilise spécifiquement des réseaux de neurones profonds pour réaliser la transformation. Avant le NST, le transfert de style reposait sur des techniques classiques de traitement d’image (correspondance d’histogrammes, échantillonnage non-paramétrique, statistiques de filtres linéaires). Le NST a rendu possible un transfert de style d’une qualité spectaculaire en exploitant les représentations hiérarchiques apprises par les CNN profonds.
L’insight fondamentale de Gatys et al. : dans un CNN de classification pré-entraîné (VGG-19), les activations des différentes couches encodent séparément le « contenu » (structure spatiale, objets) et le « style » (textures, motifs, palette). En optimisant une image pour qu’elle corresponde aux activations de contenu d’une image source et aux corrélations de style (matrices de Gram) d’une autre, on obtient une fusion des deux.
Cette page détaille les algorithmes spécifiques du NST, leurs implémentations et le code associé. Pour une vue d’ensemble plus large du concept de style transfer (y compris les méthodes non-neurales et les outils grand public), consultez notre page style transfer.
L’algorithme de Gatys (optimisation itérative)
L’algorithme original fonctionne par optimisation. On ne modifie pas les poids du réseau VGG-19 (il est figé) : c’est l’image elle-même qui est la variable optimisable.
Extraction des features
On passe trois images à travers VGG-19 : l’image de contenu, l’image de style, et l’image générée (initialisée aléatoirement ou à partir du contenu). VGG-19 comporte 16 couches convolutives et 3 couches fully-connected, organisées en 5 blocs. Pour le NST, on utilise les couches convolutives des différents blocs :
Pour le contenu : la couche conv4_2 est le choix standard. Elle encode les structures sémantiques de haut niveau tout en conservant suffisamment d’information spatiale. Utiliser une couche plus profonde (conv5_2) perd les détails spatiaux ; une couche plus basse (conv2_2) force une correspondance trop littérale pixel par pixel.
Pour le style : les couches conv1_1, conv2_1, conv3_1, conv4_1, conv5_1 (première couche de chaque bloc). Utiliser plusieurs couches capture le style à toutes les échelles : textures fines (couches basses) et structures de motifs plus globales (couches hautes). Les cinq couches reçoivent un poids égal dans l’article original.
Content loss
La content loss est simplement l’erreur quadratique entre les feature maps de l’image générée et celles de l’image de contenu à la couche choisie :
L_content = (1/2) × Σ(F_ij - P_ij)²Où F et P sont les feature maps de l’image générée et de l’image de contenu respectivement à la couche l, avec i indexant le filtre et j la position spatiale.
Style loss et matrices de Gram
La style loss compare les matrices de Gram des feature maps. Pour une couche l avec N_l filtres et des feature maps de taille M_l (= hauteur × largeur), la matrice de Gram G de taille N_l × N_l est :
G_ij = Σ_k F_ik × F_jkLa style loss sur une couche est la différence au carré entre les matrices de Gram de l’image générée (G) et de l’image de style (A), normalisée :
E_l = 1/(4 × N_l² × M_l²) × Σ(G_ij - A_ij)²La style loss totale somme les contributions de toutes les couches sélectionnées, pondérées par des coefficients w_l.
Processus d’optimisation
La perte totale est L_total = α × L_content + β × L_style. On optimise typiquement avec L-BFGS (plus efficace que SGD pour ce type de problème) pendant 300 à 1000 itérations. Le ratio α/β contrôle l’équilibre : un ratio élevé préserve plus de contenu, un ratio faible applique plus de style.
L’implémentation de référence en Torch par Justin Johnson (jcjohnson/neural-style) supporte le multi-GPU, la génération multi-échelle, et le mélange de plusieurs styles. C’est cette implémentation qui a été utilisée pour les résultats à haute résolution (3620 × 1905 pixels sur 4 GPU Pascal Titan X).
# Implémentation Torch originale (jcjohnson/neural-style)
th neural_style.lua -style_image starry_night.jpg
-content_image photo.jpg
-style_weight 100 -content_weight 5
-image_size 512 -num_iterations 1000
-gpu 0 -backend cudnn
# Implémentation TensorFlow (VainF)
python3 transfer_gatys_tf.py --content_img photo.jpg
--style_img starry_night.jpg --lr_rate 1 --epoch 3000style_weight / content_weight. Commencez par 100/5 (style dominant), puis ajustez. Le -style_scale contrôle la taille des motifs transférés : un scale plus petit produit des motifs plus fins et détaillés. Pour le mélange de styles, spécifiez -style_blend_weights pour contrôler la proportion de chaque style.
NST par réseau feed-forward (Johnson et al.)
L’approche de Johnson et al. (2016, « Perceptual Losses for Real-Time Style Transfer and Super-Resolution ») résout le problème de vitesse en pré-entraînant un réseau de transformation spécifique à chaque style.
Architecture
Le réseau de transformation est un encodeur-décodeur convolutif avec des blocs résiduels au milieu. L’encodeur réduit la résolution spatiale via des convolutions stridées (pas de pooling). Le décodeur restaure la résolution via des convolutions transposées (ou upsampling + convolution). Les blocs résiduels au centre permettent des transformations complexes sans perte d’information.
Le réseau de perte (VGG-16 ou VGG-19) est figé et sert uniquement à calculer la perceptual loss pendant l’entraînement. À l’inférence, seul le réseau de transformation est utilisé, d’où la vitesse.
Perceptual loss
Au lieu de comparer les pixels directement, on compare les features extraites par le VGG. La content loss et la style loss sont calculées de la même manière que chez Gatys, mais appliquées au réseau de transformation via backpropagation. Une total variation loss supplémentaire lisse la sortie pour éviter les artefacts de haute fréquence.
L’entraînement se fait sur le dataset MS-COCO (80 000 images) pour un seul style, pendant environ 2 époques (40 000 itérations avec batch size 4). Le résultat : un réseau qui transforme n’importe quelle image dans ce style en un seul passage forward (environ 0,015 seconde par image).
Instance Normalization : l’ingrédient secret
Ulyanov et al. (2016) ont découvert que remplacer la Batch Normalization par l’Instance Normalization (IN) dans le réseau de transformation améliorait drastiquement la qualité visuelle. L’IN normalise chaque feature map individuellement (par canal et par image), ce qui supprime les statistiques spécifiques à l’image d’entrée et produit un style plus uniforme.
Dumoulin et al. (Google AI, 2017) ont étendu cette idée avec la Conditional Instance Normalization (CIN) : les paramètres affines de l’IN (gamma et beta) sont conditionnés par le style choisi. Un seul réseau peut encoder 32 styles simultanément, chaque style correspondant à un jeu de paramètres gamma/beta différent. L’interpolation entre ces paramètres permet de mélanger des styles en continu.
AdaIN : le style transfer arbitraire en détail
L’Adaptive Instance Normalization (Huang et Belongie, Cornell, ICCV 2017) est l’avancée qui a rendu le NST arbitraire et rapide simultanément. Avec plus de 3 600 citations, c’est l’un des articles les plus influents du domaine.
La formule AdaIN
AdaIN prend les features du contenu x et les features du style y, et aligne simplement la moyenne et la variance par canal :
AdaIN(x, y) = σ(y) × ((x - μ(x)) / σ(x)) + μ(y)Où μ et σ sont la moyenne et l’écart-type calculés spatialement (par canal). On normalise d’abord x (comme une Instance Normalization classique), puis on applique les statistiques de y comme paramètres affines. Il n’y a aucun paramètre apprenable dans la couche AdaIN.
Architecture complète
L’architecture est un encodeur-décodeur asymétrique :
Encodeur (figé) : Les premières couches de VGG-19, de l’entrée jusqu’à relu4_1. Il extrait les features du contenu et du style. Le VGG est normalisé (les poids sont divisés par leur norme) pour une meilleure stabilité numérique.
Couche AdaIN : Aligne les statistiques des features du contenu sur celles du style. Le résultat t = AdaIN(f(c), f(s)) est le « target » qui encode le contenu de c avec le style de s dans l’espace des features.
Décodeur (entraîné) : Un réseau miroir de l’encodeur qui reconvertit les features en image. Utilise l’upsampling par plus proche voisin (pas de convolutions transposées, pour éviter les artefacts de damier). Aucune couche de normalisation dans le décodeur (l’IN dans le décodeur « effacerait » le style transféré par AdaIN).
Fonction de perte
Le décodeur est entraîné avec une combinaison de content loss et style loss. La content loss utilise les features AdaIN elles-mêmes comme cible (pas les features du contenu original). La style loss compare les moyennes et variances par canal des features de l’image générée avec celles du style, à travers plusieurs couches de VGG.
Contrôles à l’exécution
Interpolation contenu/style : On interpole entre les features du contenu et les features après AdaIN : t = α × AdaIN(f(c), f(s)) + (1-α) × f(c). Un α = 1 donne le style complet ; un α = 0 reproduit le contenu original.
Interpolation de styles : On peut mélanger les statistiques de plusieurs styles via une moyenne pondérée de leurs moyennes et variances.
Masquage spatial : Un masque binaire permet d’appliquer des styles différents au premier plan et à l’arrière-plan, en utilisant les statistiques de style appropriées pour chaque zone.
# Implémentation PyTorch AdaIN (naoto0804/pytorch-AdaIN)
# Style transfer de base
python test.py --content input/content/photo.jpg
--style input/style/starry_night.jpg
# Traitement par lots (toutes les combinaisons)
python test.py --content_dir input/content/
--style_dir input/style/
# Contrôle de l'intensité du style (alpha)
python test.py --content photo.jpg --style starry_night.jpg --alpha 0.5
# Style transfer vidéo (implémentation Torch)
th testVid.lua -contentDir frames/ -style style.jpg -outputDir output/CycleGAN : le NST non apparié
CycleGAN (Zhu, Park, Isola, Efros, UC Berkeley, ICCV 2017) aborde le style transfer sous un angle différent : au lieu de transférer le style d’une seule image, il apprend à transformer des images d’un domaine entier vers un autre, sans nécessiter de paires correspondantes (unpaired).
Principe
CycleGAN apprend deux générateurs simultanément : G transforme les images du domaine X vers le domaine Y, et F fait l’inverse (Y vers X). Deux discriminateurs (DX et DY) évaluent le réalisme des images générées dans chaque domaine. La clé est la « cycle consistency loss » : si on transforme une image de X en Y puis de Y en X, on doit retrouver l’image originale, c’est-à-dire F(G(x)) ≈ x et G(F(y)) ≈ y.
Cette contrainte de cycle empêche les générateurs de produire n’importe quoi : ils doivent conserver suffisamment d’information pour permettre la reconstruction inverse.
Applications au style transfer
CycleGAN a été démontré sur plusieurs tâches de transfert de style : photos vers peintures de Monet/Van Gogh/Cézanne/Ukiyo-e, transfert de saison (été vers hiver), transfiguration d’objets (chevaux vers zèbres). Le générateur utilise l’architecture de Johnson et al. (encodeur-résiduel-décodeur) et le discriminateur utilise PatchGAN (classification par patch NxN au lieu de l’image entière).
Limite importante : CycleGAN fonctionne bien pour les changements de couleur et de texture, mais échoue sur les transformations géométriques (chiens vers chats, par exemple). De plus, comme tout GAN, CycleGAN hallucine du contenu : il peut ajouter des nuages dans un ciel ou supprimer des éléments. C’est pourquoi son utilisation en imagerie médicale nécessite une extrême prudence.
CycleGAN-Turbo
L’évolution récente img2img-turbo (pix2pix-turbo et CycleGAN-Turbo) exploite le modèle StableDiffusion-Turbo pré-entraîné pour des traductions image-à-image en un seul pas (one-step). Le temps d’inférence chute à 0,29 seconde sur A6000 (ou 0,11 seconde sur A100) pour une image 512×512, avec des résultats supérieurs au CycleGAN classique grâce aux priors puissants du modèle de diffusion pré-entraîné.
Comparaison détaillée des méthodes NST
| Méthode | Auteurs / Année | Approche | Vitesse (512px) | Styles | Qualité |
|---|---|---|---|---|---|
| Gatys et al. | Gatys, Ecker, Bethge / 2015 | Optimisation itérative (L-BFGS, 300-1000 iter.) | Minutes | Arbitraire (une image par exécution) | Référence |
| Johnson et al. | Johnson, Alahi, Fei-Fei / 2016 | Réseau feed-forward, perceptual loss | ~0,015 sec | 1 style par réseau | Bonne (léger drop vs Gatys) |
| CIN | Dumoulin et al. (Google) / 2017 | Conditional Instance Normalization | ~0,015 sec | 32 styles (fixés) | Bonne |
| AdaIN | Huang, Belongie (Cornell) / 2017 | Adaptive Instance Normalization | ~0,02 sec (~15 FPS) | Arbitraire | Très bonne (compétitive avec Gatys) |
| CycleGAN | Zhu, Park, Isola, Efros (Berkeley) / 2017 | GAN non apparié + cycle consistency | ~0,05 sec | 1 domaine par réseau | Bonne (domain transfer) |
| CycleGAN-Turbo | Zhu et al. / 2024 | StableDiffusion-Turbo one-step | 0,11-0,29 sec | Paires de domaines | Supérieure au CycleGAN |
Implémentations de référence
jcjohnson/neural-style (Torch/Lua)
L’implémentation originale et la plus complète de l’algorithme de Gatys. Supporte le multi-GPU, la génération multi-échelle, le mélange de styles avec pondération, le contrôle de l’échelle du style, et les modèles VGG-19, VGG-16 et NIN. Les résultats haute résolution de l’article (3620 × 1905) ont été produits avec cette implémentation.
naoto0804/pytorch-AdaIN (PyTorch)
L’implémentation PyTorch non officielle d’AdaIN la plus utilisée. Deux fichiers de poids à télécharger (decoder.pth et vgg_normalized.pth), une commande pour l’inférence. Supporte le traitement par lots, le contrôle alpha, et la génération de toutes les combinaisons contenu/style.
TensorFlow Hub
Le modèle magenta/arbitrary-image-stylization-v1-256 est un modèle de style transfer arbitraire basé sur l’article de Ghiasi et al. Utilisable en trois lignes de Python. Un modèle TensorFlow Lite est disponible pour le déploiement mobile (iOS/Android). Le tutoriel officiel TensorFlow couvre les deux approches (optimisation Gatys et modèle feed-forward).
junyanz/pytorch-CycleGAN-and-pix2pix (PyTorch)
L’implémentation officielle de CycleGAN et pix2pix par les auteurs. Structure modulaire avec templates pour créer ses propres modèles et datasets. Datasets pré-packagés disponibles (monet2photo, horse2zebra, apple2orange, summer2winter). L’entraînement nécessite un GPU avec au minimum 8 Go de VRAM. Le dépôt est aussi le point d’entrée vers CycleGAN-Turbo et CUT (Contrastive Unpaired Translation).
Keras (tutoriel officiel)
La documentation Keras propose un tutoriel complet d’implémentation du NST avec AdaIN, couvrant l’architecture, l’entraînement et l’inférence. Bon point de départ pour comprendre le code pas à pas.
Extensions et variantes
Style transfer photoréaliste
Les méthodes standard produisent des artefacts de « peinture » (distorsions de texture) qui cassent le photoréalisme. Les méthodes photoréalistes ajoutent des contraintes de lissage (smoothing loss basée sur un graphe de Laplace de l’image) pour préserver les structures photographiques. WCT² et PhotoWCT utilisent le whitening and coloring transform au lieu des matrices de Gram pour un transfert plus subtil.
Style transfer 3D
L’extension du NST aux objets et scènes 3D est un domaine actif. Les approches récentes appliquent le style transfer aux représentations neurales de scènes (NeRF, Gaussian Splatting), permettant de styliser une scène 3D entière de manière cohérente depuis n’importe quel angle de vue.
Style transfer audio
Le concept d’AdaIN a été étendu à l’audio : aligner les statistiques spectrales d’un signal audio sur celles d’un style de référence. Les applications incluent le transfert de timbre musical et la transformation de voix.
Stéganographie par NST
Des travaux récents (Luo et al., 2026) explorent l’utilisation du neural style transfer pour la stéganographie robuste dans les réseaux sociaux : cacher de l’information dans des images stylisées de manière à résister aux transformations appliquées par les plateformes (compression, redimensionnement).
NST créatif (CSFer)
Au-delà de l’imitation, CSFer (Creative Style transFer) introduit un réseau de permutation neurale (PerNet) pour réarranger les features d’un style existant et générer des styles nouveaux. Le résultat est évalué par des métriques de nouveauté, de surprise et de valeur esthétique, reflétant les critères fondamentaux de la créativité. Cette approche « plug-and-play » peut s’intégrer dans n’importe quel pipeline NST existant.
Limites techniques
Limites des matrices de Gram
Les matrices de Gram capturent les corrélations de second ordre entre features, mais ignorent les statistiques d’ordre supérieur. Elles sont aussi insensibles à l’arrangement spatial des textures : un damier et un motif aléatoire avec les mêmes statistiques locales produisent la même matrice de Gram. Des alternatives comme le Maximum Mean Discrepancy (MMD) ou le Wasserstein distance offrent des comparaisons de distributions plus riches, mais au prix d’une complexité accrue.
Manque de contrôle sémantique
Le NST standard applique le style uniformément sans comprendre la sémantique de la scène. La couleur du ciel peut être appliquée à un visage. Des approches « semantically-aware » utilisent des masques de segmentation pour appliquer le style de manière contextuelle (le style du ciel au ciel, le style de l’herbe à l’herbe), mais nécessitent une segmentation préalable.
Incapacité géométrique
Le NST classique transfère les textures et les couleurs, mais pas les déformations géométriques. Il ne peut pas transformer une photo en style cubiste (qui implique une réorganisation spatiale des formes) de manière authentique. Les approches basées sur les modèles de diffusion commencent à combler cette lacune grâce à leur capacité de génération plus flexible.
Cohérence temporelle en vidéo
Le NST frame par frame produit du flickering. Les solutions incluent des pertes de cohérence temporelle (basées sur l’optical flow entre frames consécutives), des mécanismes de propagation de features, et le post-filtrage temporel. Le modèle Video de DeOldify a montré que le NoGAN training peut produire une stabilité temporelle remarquable même sans modélisation temporelle explicite.
Impact et héritage du NST
Le neural style transfer a eu un impact bien au-delà de la stylisation d’images. L’AdaIN est devenu un composant fondamental de StyleGAN (et StyleGAN2, StyleGAN3), qui utilise le même principe d’injection de style par normalisation adaptative pour contrôler la génération de visages haute qualité. Le concept de perceptual loss est devenu standard pour l’entraînement de modèles de super-résolution, d’image restoration et d’inpainting. CycleGAN a ouvert la voie à toute une famille de méthodes de traduction d’images non appariée.
Plus fondamentalement, le NST a démontré que les représentations internes des CNN encodent des informations sémantiquement riches et manipulables, ce qui a alimenté la recherche sur l’interprétabilité des réseaux de neurones et le « feature visualization ».
Questions fréquentes sur le neural style transfer
Pourquoi VGG-19 est-il utilisé plutôt qu’un réseau plus récent comme ResNet ?
VGG-19 a une architecture simple et régulière (empilement de convolutions 3×3 + pooling) qui produit des feature maps avec une bonne hiérarchie de représentations visuelles. Les réseaux avec des connexions résiduelles (ResNet) et des convolutions 1×1 perturbent les statistiques des features d’une manière qui rend les matrices de Gram moins représentatives du style visuel. Des expériences avec AlexNet, par exemple, montrent des résultats significativement moins bons. Cela dit, des travaux récents (SWAG, 2025) démontrent qu’on peut utiliser ResNet efficacement en appliquant des transformations de lissage d’activation (activation smoothing) qui restaurent la qualité des matrices de Gram.
Combien de temps faut-il pour styliser une image ?
Cela dépend de la méthode. L’optimisation itérative (Gatys) prend de 30 secondes à plusieurs minutes sur GPU selon la résolution et le nombre d’itérations. Les réseaux feed-forward (Johnson) traitent une image en environ 0,015 seconde. AdaIN est similaire (environ 0,02 seconde, soit ~15 FPS en 512×512). CycleGAN-Turbo atteint 0,11 seconde sur A100. Sur CPU, multipliez ces temps par 50 à 100. Sur smartphone avec un modèle TF Lite optimisé, comptez 3 à 10 secondes selon le processeur neural.
Peut-on entraîner son propre modèle de style transfer ?
Oui. Pour l’approche feed-forward (Johnson), entraînez un réseau de transformation sur MS-COCO avec l’image de style comme référence (environ 2 heures sur un GPU moderne). Pour CycleGAN, collectez 200 à 300 images de chaque domaine (votre style cible et des photos), puis entraînez pendant 100 à 200 époques (12 à 24 heures sur un GPU). Pour AdaIN, le décodeur est déjà entraîné et fonctionne avec n’importe quel style sans ré-entraînement. Les implémentations de référence (pytorch-CycleGAN-and-pix2pix, pytorch-AdaIN) incluent le code d’entraînement complet.
Le neural style transfer est-il toujours pertinent face aux modèles de diffusion ?
Oui, pour des raisons complémentaires. Les modèles de diffusion (Stable Diffusion + ControlNet, LoRA) offrent un contrôle stylistique plus flexible et des résultats plus « créatifs ». Mais le NST classique reste supérieur en vitesse (AdaIN en temps réel vs plusieurs secondes pour la diffusion), en reproductibilité (résultat déterministe vs stochastique), et en préservation du contenu (le NST ne modifie pas la structure spatiale). Pour les applications industrielles (filtres mobiles, traitement vidéo, design itératif), le NST reste le choix pragmatique. Les modèles de diffusion sont préférés quand on veut une transformation plus profonde ou plus créative.
Quelle est la différence entre neural style transfer et les filtres IA de Stable Diffusion ?
Le NST classique utilise un CNN pré-entraîné (VGG-19) comme extracteur de features et manipule directement les statistiques de ces features pour transférer un style. Le processus est relativement bien compris mathématiquement (matrices de Gram, perceptual loss). Les modèles de diffusion (Stable Diffusion) fonctionnent différemment : ils débruitent itérativement une image en espace latent, guidés par des conditions textuelles ou visuelles. Le « style » est encodé dans les poids du modèle (via fine-tuning, LoRA, ou des embeddings textuels) plutôt que extrait d’une image de référence. Les deux approches sont complémentaires : le NST est plus rapide et plus contrôlable, la diffusion est plus puissante et plus flexible.