IntermédiaireDeep Learning
14 min de lecture13 vues

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éseauRôleObjectif
Générateur (G)Créer de fausses imagesTromper le discriminateur
Discriminateur (D)Détecter les fauxDistinguer 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 :

  1. Tour du Discriminateur : on lui montre des vraies et fausses images, il apprend à les distinguer
  2. 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é :

  1. Forward process : on ajoute progressivement du bruit à une image jusqu''à obtenir du bruit pur
  2. 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ètreEffetValeur typique
num_inference_stepsPlus d''étapes = plus de détails (mais plus lent)20-50
guidance_scaleFidélité au prompt (haut = plus fidèle)5-15
negative_promptCe qu''on ne veut PAS dans l''image"flou, déformé"
seedReproductibilité (même seed = même image)Entier

Applications et Cas d''Usage

DomaineApplicationExemple
Art et designConcept art, illustrationsMidjourney, DALL-E
E-commercePhotos de produitsEssayage virtuel, décors
Jeux vidéoAssets, textures, concept artGénération de niveaux
ArchitectureVisualisation de projetsRendu photo de plans
ModeCréation de motifs, prototypageDesigns sur mannequins
MédicalAugmentation de donnéesScanner 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 :

EnjeuDescription
DeepfakesCréation de fausses photos/vidéos de personnes réelles
CopyrightLes modèles entraînés sur des œuvres protégées sans consentement
DésinformationImages réalistes de faux événements
EmploiImpact sur les illustrateurs, photographes, designers
BiaisLes 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.