GANs et Génération d'Images par IA
Comprenez les réseaux adversariaux génératifs (GANs) et l'évolution vers Stable Diffusion : architecture, entraînement, applications et limites éthiques.
La Génération d''Images : une Révolution
L''IA peut aujourd''hui créer des images photoréalistes, des œuvres d''art, et même des vidéos à partir de texte. Tout a commencé avec les GANs (Generative Adversarial Networks) en 2014.
Les GANs : le Concept Fondamental
L''Idée Géniale de Goodfellow
Ian Goodfellow a eu l''idée des GANs en 2014 : faire s''affronter deux réseaux de neurones qui se rendent mutuellement meilleurs.
Les Deux Joueurs
| Réseau | Rôle | Objectif |
|---|---|---|
| Générateur (G) | Créer de fausses images | Tromper le discriminateur |
| Discriminateur (D) | Détecter les faux | Distinguer vrai du faux |
Analogie : Le générateur est un faussaire qui crée de faux billets. Le discriminateur est un inspecteur de police qui essaie de les détecter. Au fil du temps, le faussaire devient tellement bon que l''inspecteur ne peut plus faire la différence.
Le Jeu Adversarial
L''entraînement alterne entre les deux réseaux :
- Tour du Discriminateur : on lui montre des vraies et fausses images, il apprend à les distinguer
- Tour du Générateur : il essaie de créer des images qui trompent le discriminateur
Epoch 1 : G produit du bruit → D détecte facilement (95%)
Epoch 100 : G produit des formes → D détecte (80%)
Epoch 1000: G produit des visages flous → D hésite (60%)
Epoch 5000: G produit des visages réalistes → D devine au hasard (50%)
Quand D n''est plus capable de distinguer vrai du faux (précision ~50%), le générateur a "gagné".
Architecture d''un GAN (DCGAN)
Le DCGAN (Deep Convolutional GAN) est l''architecture classique :
Générateur
Input : vecteur de bruit z (100 dimensions)
↓
ConvTranspose2d : 100 → 512 canaux, 4×4
BatchNorm + ReLU
↓
ConvTranspose2d : 512 → 256 canaux, 8×8
BatchNorm + ReLU
↓
ConvTranspose2d : 256 → 128 canaux, 16×16
BatchNorm + ReLU
↓
ConvTranspose2d : 128 → 3 canaux, 64×64
Tanh
↓
Output : image RGB 64×64
En PyTorch
import torch
import torch.nn as nn
class Generator(nn.Module):
def __init__(self, latent_dim=100):
super().__init__()
self.net = nn.Sequential(
# Entrée : vecteur latent
nn.ConvTranspose2d(latent_dim, 512, 4, 1, 0, bias=False),
nn.BatchNorm2d(512),
nn.ReLU(True),
# 512 → 256, taille 8×8
nn.ConvTranspose2d(512, 256, 4, 2, 1, bias=False),
nn.BatchNorm2d(256),
nn.ReLU(True),
# 256 → 128, taille 16×16
nn.ConvTranspose2d(256, 128, 4, 2, 1, bias=False),
nn.BatchNorm2d(128),
nn.ReLU(True),
# 128 → 3 (RGB), taille 64×64
nn.ConvTranspose2d(128, 3, 4, 2, 1, bias=False),
nn.Tanh(), # Sortie dans [-1, 1]
)
def forward(self, z):
return self.net(z.view(-1, 100, 1, 1))
class Discriminator(nn.Module):
def __init__(self):
super().__init__()
self.net = nn.Sequential(
# Image 64×64 → 32×32
nn.Conv2d(3, 128, 4, 2, 1, bias=False),
nn.LeakyReLU(0.2, inplace=True),
# 32×32 → 16×16
nn.Conv2d(128, 256, 4, 2, 1, bias=False),
nn.BatchNorm2d(256),
nn.LeakyReLU(0.2, inplace=True),
# 16×16 → 8×8
nn.Conv2d(256, 512, 4, 2, 1, bias=False),
nn.BatchNorm2d(512),
nn.LeakyReLU(0.2, inplace=True),
# 8×8 → 1×1
nn.Conv2d(512, 1, 4, 1, 0, bias=False),
nn.Sigmoid(), # Probabilité [0, 1]
)
def forward(self, img):
return self.net(img).view(-1, 1)
Boucle d''Entraînement
import torch.optim as optim
# Initialisation
G = Generator().cuda()
D = Discriminator().cuda()
criterion = nn.BCELoss()
opt_G = optim.Adam(G.parameters(), lr=0.0002, betas=(0.5, 0.999))
opt_D = optim.Adam(D.parameters(), lr=0.0002, betas=(0.5, 0.999))
for epoch in range(num_epochs):
for real_images, _ in dataloader:
batch_size = real_images.size(0)
real_images = real_images.cuda()
# Labels
real_label = torch.ones(batch_size, 1).cuda()
fake_label = torch.zeros(batch_size, 1).cuda()
# --- Entraîner le Discriminateur ---
z = torch.randn(batch_size, 100).cuda()
fake_images = G(z).detach()
loss_real = criterion(D(real_images), real_label)
loss_fake = criterion(D(fake_images), fake_label)
loss_D = (loss_real + loss_fake) / 2
opt_D.zero_grad()
loss_D.backward()
opt_D.step()
# --- Entraîner le Générateur ---
z = torch.randn(batch_size, 100).cuda()
fake_images = G(z)
loss_G = criterion(D(fake_images), real_label) # On veut tromper D
opt_G.zero_grad()
loss_G.backward()
opt_G.step()
print(f"Epoch {epoch}: Loss_D={loss_D:.4f}, Loss_G={loss_G:.4f}")
L''entraînement des GANs est notoirement instable. Le mode collapse (le générateur ne produit qu''un seul type d''image) et l''oscillation sont des problèmes fréquents. La recherche a produit de nombreuses techniques pour les stabiliser.
De StyleGAN à Stable Diffusion
StyleGAN (2019-2021) : Visages Photoréalistes
StyleGAN a révolutionné la génération de visages en introduisant un style mapping network :
Le vecteur w contrôle le style à chaque résolution :
- Basse résolution → pose, forme du visage
- Moyenne résolution → traits du visage, couleur de peau
- Haute résolution → texture, cheveux, détails
Modèles de Diffusion (2020+) : la Nouvelle Ère
Les modèles de diffusion ont remplacé les GANs pour la génération d''images. Le principe est inversé :
- Forward process : on ajoute progressivement du bruit à une image jusqu''à obtenir du bruit pur
- Reverse process : un réseau de neurones (U-Net) apprend à enlever le bruit étape par étape
Stable Diffusion : l''Architecture
Stable Diffusion fonctionne dans un espace latent compressé (64×64 au lieu de 512×512), ce qui le rend beaucoup plus rapide que les modèles de diffusion classiques.
Stable Diffusion est open source et peut tourner sur un GPU grand public (8 Go VRAM). C''est ce qui a démocratisé la génération d''images IA.
Utiliser Stable Diffusion en Python
Avec la bibliothèque diffusers
from diffusers import StableDiffusionPipeline
import torch
# Charger le modèle
pipe = StableDiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
torch_dtype=torch.float16,
)
pipe = pipe.to("cuda")
# Générer une image
image = pipe(
prompt="Un paysage montagneux au coucher du soleil, style peinture à l''huile",
negative_prompt="flou, déformé, mauvaise qualité",
num_inference_steps=30,
guidance_scale=7.5,
).images[0]
image.save("paysage.png")
Paramètres clés
| Paramètre | Effet | Valeur typique |
|---|---|---|
num_inference_steps | Plus d''étapes = plus de détails (mais plus lent) | 20-50 |
guidance_scale | Fidélité au prompt (haut = plus fidèle) | 5-15 |
negative_prompt | Ce qu''on ne veut PAS dans l''image | "flou, déformé" |
seed | Reproductibilité (même seed = même image) | Entier |
Applications et Cas d''Usage
| Domaine | Application | Exemple |
|---|---|---|
| Art et design | Concept art, illustrations | Midjourney, DALL-E |
| E-commerce | Photos de produits | Essayage virtuel, décors |
| Jeux vidéo | Assets, textures, concept art | Génération de niveaux |
| Architecture | Visualisation de projets | Rendu photo de plans |
| Mode | Création de motifs, prototypage | Designs sur mannequins |
| Médical | Augmentation de données | Scanner synthétiques |
Limites et Éthique
Problèmes techniques
- Anatomie humaine : mains déformées, doigts en trop (en amélioration)
- Texte dans les images : souvent illisible ou déformé
- Cohérence : difficile de maintenir un personnage identique entre images
Problèmes éthiques
La génération d''images IA soulève des questions éthiques majeures :
| Enjeu | Description |
|---|---|
| Deepfakes | Création de fausses photos/vidéos de personnes réelles |
| Copyright | Les modèles entraînés sur des œuvres protégées sans consentement |
| Désinformation | Images réalistes de faux événements |
| Emploi | Impact sur les illustrateurs, photographes, designers |
| Biais | Les modèles reproduisent les biais de leurs données d''entraînement |
Bonnes Pratiques
- Toujours mentionner qu''une image est générée par IA
- Ne pas créer de deepfakes de personnes sans consentement
- Respecter les droits d''auteur des styles d''artistes identifiables
- Utiliser des watermarks ou métadonnées C2PA
Résumé
Points clés à retenir :
- Les GANs utilisent un duel Générateur vs Discriminateur pour apprendre à créer
- StyleGAN a produit les premiers visages indistinguables de vraies photos
- Les modèles de diffusion (ajout puis retrait de bruit) ont supplanté les GANs
- Stable Diffusion est open source et tourne sur un GPU grand public
- Les questions éthiques (deepfakes, copyright, biais) sont cruciales
Specialiste IA — Master Intelligence Artificielle
Diplome d'un Master en Intelligence Artificielle, je travaille au quotidien sur des projets IA en entreprise. J'ai cree IwanttolearnAI pour rendre l'apprentissage de l'IA accessible a tous, gratuitement.
Continuer a apprendre
RNN et LSTM : Modéliser les Séquences
Maîtrisez les réseaux récurrents : pourquoi les RNN oublient, comment les LSTM résolvent le vanishing gradient avec leurs 3 portes, et quand les utiliser face aux Transformers.
Diffusion Models : l'Architecture de Stable Diffusion
Plongez dans l'architecture des modèles de diffusion : forward process, U-Net débruiteur, guidance CLIP et Latent Diffusion. Comprenez ce qui propulse Stable Diffusion, SDXL et Flux.
Reinforcement Learning : Apprendre par l'Erreur
Maîtrisez le reinforcement learning : paradigme Agent/Environment, Q-Learning, DQN sur CartPole, PPO et le lien avec RLHF pour l'alignement des LLMs.