CNN : La Vision par Ordinateur
Maîtrisez les réseaux convolutifs (CNN) : convolutions, pooling, architectures classiques (LeNet, ResNet) et transfer learning avec PyTorch.
Pourquoi les CNN ?
Dans le cours précédent, nous avons classé des chiffres MNIST en aplatissant chaque image en un vecteur de 784 pixels. Cette approche a un défaut majeur : elle détruit la structure spatiale de l''image. Le pixel (0,0) n''a aucune raison d''être traité comme voisin du pixel (0,27).
Les Convolutional Neural Networks (CNN) résolvent ce problème en utilisant des filtres qui glissent sur l''image et préservent les relations spatiales entre pixels voisins.
MLP vs CNN sur des images
| Aspect | MLP (Dense) | CNN |
|---|---|---|
| Entrée | Vecteur aplati | Image 2D/3D |
| Paramètres | Énormes (chaque pixel connecté) | Peu (filtres partagés) |
| Structure spatiale | Perdue | Préservée |
| MNIST | ~97% | ~99.5% |
| ImageNet | Inutilisable | 80%+ |
L''Opération de Convolution
Principe
Un filtre (ou kernel) est une petite matrice (typiquement 3×3 ou 5×5) qui glisse sur l''image. À chaque position, il effectue une multiplication élément par élément puis une somme.
Image (5×5) Filtre (3×3) Sortie (3×3)
1 0 1 0 1 1 0 1 4 3 4
0 1 0 1 0 * 0 1 0 = 2 4 3
1 0 1 0 1 1 0 1 4 3 4
0 1 0 1 0
1 0 1 0 1
Chaque filtre apprend à détecter un pattern spécifique :
- Filtre de bords horizontaux
- Filtre de bords verticaux
- Filtre de coins
- Filtre de textures
Le réseau apprend les filtres tout seul. Vous définissez le nombre et la taille des filtres, mais leurs valeurs sont ajustées pendant l''entraînement par rétropropagation.
Paramètres importants
| Paramètre | Rôle | Valeur typique |
|---|---|---|
| Kernel size | Taille du filtre | 3×3 |
| Stride | Pas de déplacement | 1 |
| Padding | Bordure ajoutée | "same" ou "valid" |
| Filters | Nombre de filtres | 32, 64, 128 |
Pooling : Réduire les Dimensions
Après la convolution, on applique un pooling pour réduire la taille spatiale tout en gardant l''information importante.
Max Pooling (le plus utilisé)
On découpe la feature map en blocs (2×2) et on garde la valeur maximale de chaque bloc.
Entrée (4×4) Max Pool 2×2 Sortie (2×2)
6 2 3 1 6 3
8 4 7 5 → 8 9
1 3 9 2
0 5 4 8
Avantages :
- Réduit le nombre de paramètres (moins de calcul)
- Apporte une légère invariance à la translation (un objet décalé de quelques pixels est toujours détecté)
Architecture d''un CNN Complet
Le réseau a deux parties :
- Extracteur de features (Conv + Pool) : apprend les patterns visuels
- Classifieur (Dense) : utilise ces features pour prédire la classe
Exercice 1 : CNN sur MNIST avec Keras
import numpy as np
from tensorflow import keras
from tensorflow.keras import layers
# Charger MNIST
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
# Normaliser et ajouter la dimension canal (28, 28) → (28, 28, 1)
x_train = x_train.astype("float32") / 255.0
x_test = x_test.astype("float32") / 255.0
x_train = np.expand_dims(x_train, -1)
x_test = np.expand_dims(x_test, -1)
# Modèle CNN
model = keras.Sequential([
layers.Conv2D(32, kernel_size=3, activation="relu", input_shape=(28, 28, 1)),
layers.MaxPooling2D(pool_size=2),
layers.Conv2D(64, kernel_size=3, activation="relu"),
layers.MaxPooling2D(pool_size=2),
layers.Flatten(),
layers.Dropout(0.3),
layers.Dense(128, activation="relu"),
layers.Dense(10, activation="softmax")
])
model.compile(optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"])
model.summary()
# Entraînement
history = model.fit(x_train, y_train, epochs=5, batch_size=64, validation_split=0.1)
# Évaluation
test_loss, test_acc = model.evaluate(x_test, y_test)
print(f"Précision CNN : {test_acc:.4f}")
Résultat attendu : ~99.2% de précision en seulement 5 epochs, contre ~97% pour le MLP du cours précédent. C''est la puissance des convolutions.
Les Architectures Classiques
LeNet-5 (1998) — Le pionnier
Créé par Yann LeCun pour la reconnaissance de chèques bancaires. 2 couches de convolution, c''est le premier CNN qui a fonctionné à grande échelle.
AlexNet (2012) — La révolution
A remporté le concours ImageNet 2012 avec une marge colossale. C''est le moment où le monde a compris que le Deep Learning allait tout changer.
Innovations : ReLU (au lieu de Sigmoid), Dropout, GPU training.
VGG-16 (2014) — La simplicité
Architecture simple et régulière : que des convolutions 3×3 empilées. 16 couches, 138 millions de paramètres.
Leçon : empiler des petits filtres (3×3) est plus efficace qu''utiliser de grands filtres (7×7).
ResNet (2015) — Les connexions résiduelles
Le problème des réseaux très profonds : le gradient s''évanouit en traversant trop de couches. ResNet résout cela avec des skip connections qui permettent au gradient de "sauter" des couches.
Sortie = F(x) + x (au lieu de juste F(x))
Pourquoi ça marche : Si une couche n''a rien d''utile à apprendre, elle peut simplement laisser passer l''entrée (F(x) = 0, donc sortie = x). Le réseau ne peut jamais être pire en ajoutant une couche.
Résultat : on peut entraîner des réseaux de 152 couches (voire 1000+).
Transfer Learning : Réutiliser un Modèle Pré-entraîné
Entraîner un CNN de zéro sur ImageNet prend des semaines sur des GPU coûteux. Le transfer learning permet de réutiliser un modèle déjà entraîné et de l''adapter à votre problème.
Le principe
- Prendre un modèle pré-entraîné (ResNet, EfficientNet)
- Geler les couches de convolution (elles savent déjà détecter des features visuelles)
- Remplacer la dernière couche par votre classifieur personnalisé
- Entraîner seulement les nouvelles couches
Exercice 2 : Transfer Learning avec ResNet
from tensorflow.keras.applications import ResNet50
from tensorflow.keras import layers, Model
from tensorflow.keras.preprocessing.image import ImageDataGenerator
# Charger ResNet50 pré-entraîné (sans la couche de sortie)
base_model = ResNet50(weights="imagenet", include_top=False, input_shape=(224, 224, 3))
# Geler les couches pré-entraînées
base_model.trainable = False
# Ajouter notre classifieur
inputs = layers.Input(shape=(224, 224, 3))
x = base_model(inputs, training=False)
x = layers.GlobalAveragePooling2D()(x)
x = layers.Dropout(0.3)(x)
x = layers.Dense(128, activation="relu")(x)
outputs = layers.Dense(5, activation="softmax")(x) # 5 classes
model = Model(inputs, outputs)
model.compile(
optimizer="adam",
loss="sparse_categorical_crossentropy",
metrics=["accuracy"]
)
model.summary()
Attention aux dimensions : ResNet attend des images de 224×224 pixels en RGB. Pensez à redimensionner vos images avec ImageDataGenerator ou tf.image.resize.
Quand utiliser le Transfer Learning ?
| Votre dataset | Similaire à ImageNet ? | Stratégie |
|---|---|---|
| Grand (>10k images) | Oui | Fine-tune tout le réseau |
| Grand (>10k images) | Non | Fine-tune les dernières couches |
| Petit (<1k images) | Oui | Geler + entraîner le classifieur |
| Petit (<1k images) | Non | Geler + classifieur + augmentation |
Data Augmentation
Quand on a peu d''images, on peut augmenter artificiellement le dataset en appliquant des transformations aléatoires.
from tensorflow.keras.preprocessing.image import ImageDataGenerator
datagen = ImageDataGenerator(
rotation_range=20, # Rotation jusqu''à 20°
width_shift_range=0.2, # Décalage horizontal
height_shift_range=0.2, # Décalage vertical
horizontal_flip=True, # Miroir horizontal
zoom_range=0.1, # Zoom léger
fill_mode="nearest"
)
Une image de chat retournée horizontalement reste un chat. Mais attention : ne retournez pas verticalement des chiffres (un 6 à l''envers devient un 9).
Pour Aller Plus Loin
- Exercice bonus : classez les 10 catégories de CIFAR-10 (avions, voitures, oiseaux, etc.) avec un CNN
- Transfer Learning : utilisez un modèle pré-entraîné sur le dataset Flowers 102 pour classifier des espèces de fleurs
- Prochain cours : les Transformers, l''architecture qui a révolutionné le NLP et qui conquiert aussi la vision (Vision Transformers)
A Vous de Jouer !
Mettez vos connaissances en pratique en construisant un CNN complet. Placez les bonnes couches dans le bon ordre pour classifier des images CIFAR-10.
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.