👁️ ViT (Vision Transformer) — Quand les Transformers envahissent la vision ! 🖼️⚡
📖 Définition
ViT = appliquer des Transformers aux images en les traitant comme du texte ! Au lieu de convolutions, ViT découpe l'image en patchs (comme des mots), les aplatit, et les traite avec un pur mécanisme d'attention. C'est comme lire une image comme une phrase !
Principe :
- Patch embedding : découpe l'image en patchs 16x16 (comme des mots)
- Position encoding : chaque patch sait où il est
- Pure attention : pas de convolution, que des couches Transformer
- Classification token : token spécial [CLS] pour la prédiction
- Révolution : prouve que Transformers > CNN en vision ! 🎯
⚡ Avantages / Inconvénients / Limites
✅ Avantages
- Scalabilité : plus gros = meilleur (comme NLP Transformers)
- Contexte global : voit toute l'image d'un coup via attention
- Transfer learning : pré-entraîne une fois, fine-tune partout
- Unification architecture : même modèle pour vision + texte
- Moins d'inductive bias : apprend des données, pas d'hypothèses hard-codées
❌ Inconvénients
- Data hungry : besoin de 100M+ images (bien plus que CNN)
- Coût computationnel : complexité quadratique en nombre de patchs
- Nul sur petits datasets : sans pré-entraînement, pire que CNN
- Ignore structure 2D : traite patchs comme séquence 1D (perd info spatiale)
- Taille modèle : ViT-Large = 307M paramètres
⚠️ Limites
- Nécessite pré-entraînement massif : ImageNet pas suffisant, besoin JFT-300M
- Détails fins : galère vs CNN sur haute résolution
- Position encoding : extrapolation vers résolutions différentes difficile
- Pas translation equivariance : contrairement CNN, pas shift-invariant naturellement
- Boîte noire : encore plus dur à interpréter que CNN
🛠️ Tutorial pratique : Mon cas réel
📊 Setup
- Modèle : ViT-Base/16 (taille patch 16x16)
- Dataset : ImageNet-1K (1.3M images, 1000 classes)
- Pré-entraînement : JFT-300M (300M images) - poids pré-entraînés empruntés
- Config : 12 couches, 768 hidden dim, 12 têtes attention
- Hardware : 8x A100 GPUs (ViT = GOURMAND !)
📈 Résultats obtenus
CNN baseline (ResNet-50):
- Temps training: 3 jours
- ImageNet accuracy: 76.5%
- Pré-entraîné sur ImageNet seulement
ViT from scratch (ImageNet seulement):
- Temps training: 5 jours
- ImageNet accuracy: 72.1% ❌
- Pire que CNN ! Besoin plus de données
ViT pré-entraîné (JFT-300M):
- Pré-entraînement: 30 jours (pas moi, emprunté)
- Fine-tuning: 12 heures
- ImageNet accuracy: 84.5% ✅ (écrase les CNN!)
ViT-Large (modèle plus gros):
- Pré-entraîné sur JFT-300M
- ImageNet accuracy: 87.8% (dingue!)
- 4x plus paramètres que ViT-Base
🧪 Test en conditions réelles
Photo chat claire:
ResNet-50: "Chat" (92% confiance) ✅
ViT-Base: "Chat" (95% confiance) ✅
ViT voit mieux le contexte global !
Chat occlus (moitié cachée):
ResNet-50: "Chat" (73% confiance) ⚠️
ViT-Base: "Chat" (88% confiance) ✅
Attention globale aide !
Petit dataset (10k images):
ResNet-50: 78% accuracy ✅
ViT from scratch: 45% accuracy ❌
ViT pré-entraîné: 82% accuracy ✅
Attaque adversariale:
ResNet-50: Piégé (89% erreur)
ViT: Légèrement plus robuste (76% erreur)
Encore vulnérable mais mieux que CNN
Verdict : 🚀 ViT = GAME CHANGER (avec pré-entraînement massif !)
💡 Exemples concrets
Comment ViT "voit" une image
Au lieu de scanner avec des filtres comme CNN, ViT lit l'image comme un livre :
Image originale: 224x224x3 (photo chat)
↓
Étape 1: Découper en patchs
- 14x14 patchs de 16x16 pixels chacun
- Chaque patch = 768 dimensions (aplati)
- Résultat: 196 "mots" (patchs)
Étape 2: Ajouter info position
- Patch 1 (haut-gauche): embedding + position_1
- Patch 2: embedding + position_2
- ...
- Patch 196 (bas-droite): embedding + position_196
Étape 3: Ajouter token [CLS]
- Token spécial au début (comme BERT)
- Contiendra représentation image
Étape 4: Couches Transformer (12x)
- Multi-head attention voit TOUS les patchs d'un coup
- Chaque patch fait attention à tous les autres
- Apprend: "patch haut-gauche + bas-droite = tête de chat"
Étape 5: Classification
- Extraire output token [CLS]
- Feed au classifier head
- Output: "Chat" (95% confiance)
Philosophie ViT vs CNN
Pensée CNN 🔍
- Local → Global (construit hiérarchiquement)
- Couches début: bords, textures
- Couches milieu: formes, patterns
- Couches profondes: objets
- Inductive bias: localité, translation equivariance
Pensée ViT 👁️
- Global dès le début (attention sur tous patchs)
- Couche 1: voit déjà toute l'image
- Apprend ce qui est important via attention
- Pas d'hypothèse sur localité
- Pure data-driven (besoin plus de données !)
Variantes ViT populaires
ViT-Base/16 📊
- Taille patch: 16x16
- 12 couches, 768 hidden dim
- 86M paramètres
- Baseline standard
ViT-Large/16 🏆
- Taille patch: 16x16
- 24 couches, 1024 hidden dim
- 307M paramètres
- Performance SOTA
ViT-Huge/14 🦣
- Taille patch: 14x14 (plus de patchs)
- 32 couches, 1280 hidden dim
- 632M paramètres
- Bête absolue
DeiT (Data-efficient ViT) ⚡
- Distillation depuis teacher CNN
- Marche sur ImageNet sans JFT
- 72M paramètres
- Pratique pour les mortels
Swin Transformer 🪟
- Hiérarchique (comme CNN)
- Shifted windows attention
- Meilleur pour tâches denses (détection, segmentation)
- 88M paramètres
📋 Fiche mémo : Architecture ViT
🔍 Composants essentiels
Patch Embedding 🔲
- Divise image en patchs taille fixe
- Standard: 16x16 ou 14x14 pixels
- Aplatit et projette vers dimension embedding
- Comme tokenization pour texte !
Position Embedding 📍
- Encodages position 1D apprenables
- Chaque patch reçoit position unique
- Permet au modèle comprendre layout spatial
- Peut utiliser embeddings position 2D aussi
Transformer Encoder 🤖
- Architecture Transformer standard
- Multi-head self-attention
- Layer normalization + MLP
- Identique encoder BERT
Classification Token [CLS] 🎯
- Préfixé à séquence patchs
- Agrège information de tous patchs
- Représentation finale utilisée pour classification
- Inspiré par BERT
🛠️ Décomposition architecture
Image Input (224x224x3)
↓
Patch Embedding (196 patchs de 16x16)
↓
Ajout token [CLS] + Position Embeddings
↓
┌──────────────────────┐
│ Transformer Encoder │
│ ┌────────────────┐ │
│ │ Multi-Head Attn│ │ × 12 couches
│ │ LayerNorm │ │
│ │ MLP │ │
│ │ LayerNorm │ │
│ └────────────────┘ │
└──────────────────────┘
↓
Extraire token [CLS]
↓
MLP Head (classification)
↓
Output: probabilités classes
⚙️ Configurations typiques
ViT-Base/16
Taille image: 224×224
Taille patch: 16×16
Patchs: 14×14 = 196
Hidden dim: 768
MLP dim: 3072
Couches: 12
Têtes: 12
Paramètres: 86M
ViT-Large/16
Taille image: 224×224
Taille patch: 16×16
Patchs: 196
Hidden dim: 1024
MLP dim: 4096
Couches: 24
Têtes: 16
Paramètres: 307M
💻 Concept simplifié (code minimal)
# Idée ViT en pseudocode ultra-simple
class VisionTransformer:
def __init__(self, image_size=224, patch_size=16):
self.num_patches = (image_size // patch_size) ** 2
def forward(self, image):
"""Traite image via ViT"""
# Étape 1: Découper image en patchs
patches = split_into_patches(image, patch_size=16)
# Image 224x224 → 196 patchs de 16x16
# Étape 2: Aplatir et embedder patchs
patch_embeddings = linear_projection(patches)
# Chaque patch → vecteur 768-dim
# Étape 3: Ajouter token [CLS]
cls_token = learnable_parameter()
embeddings = concat([cls_token, patch_embeddings])
# Étape 4: Ajouter info position
embeddings = embeddings + position_embeddings
# Étape 5: Couches Transformer (comme BERT)
for layer in transformer_layers:
# Tous patchs regardent tous patchs !
embeddings = multi_head_attention(embeddings)
embeddings = feedforward(embeddings)
# Étape 6: Classification
cls_output = embeddings[0] # Extraire token [CLS]
prediction = classifier(cls_output)
return prediction
# Insight clé: Traiter image comme SÉQUENCE de patchs
# CNN: "scanner localement puis construire global"
# ViT: "voir globalement dès début via attention"
L'idée révolutionnaire : Traiter pas les images spécialement ! Découpe en patchs, traite patchs comme mots dans phrase, et utilise le même Transformer que NLP. Résultat : avec assez de données, ça bat les designs CNN faits main ! 🎯
📝 Résumé
ViT = Transformers appliqués vision en découpant images en patchs ! Pure attention mechanism, pas de convolutions. Besoin pré-entraînement massif (100M+ images) mais ensuite domine les CNN. Contexte global dès couche 1, scalabilité comme modèles NLP. Révolution : architecture unifiée vision + texte. Trade-off : efficacité données vs performance ultime ! 📸✨
🎯 Conclusion
ViT a prouvé que les inductive biases ne sont pas nécessaires - avec assez de données, l'attention pure bat les convolutions faites main. De l'imagerie médicale à la conduite autonome, ViT et variantes (DeiT, Swin, BEiT) remplacent les CNN. L'ère vision-langage (CLIP, DALL-E) est construite sur les fondations ViT. Défis restants : efficacité données, coût computationnel, détails fins. L'avenir ? Modèles hybrides combinant forces CNN avec flexibilité Transformer, et architectures unifiées pour toutes modalités. Le monopole CNN est terminé - les Transformers ont conquis la vision ! 👁️🚀
❓ Questions/Réponses
Q : Je peux entraîner ViT sur mon petit dataset de 10k images ? R : Pas from scratch ! ViT a besoin de 100M+ images pour battre les CNN. Utilise des modèles pré-entraînés (ImageNet-21k ou JFT-300M) et fine-tune sur tes données. Ou utilise DeiT qui est conçu pour datasets plus petits. From scratch sur 10k images ? Prends un CNN à la place !
Q : Pourquoi ViT a besoin de tellement plus de données que les CNN ? R : Les CNN ont des hypothèses intégrées (localité, translation equivariance) qui marchent bien pour les images. ViT n'a aucune hypothèse - il apprend tout des données. C'est plus flexible mais nécessite bien plus d'exemples pour comprendre ce que les CNN savent par design. C'est comme apprendre une langue : règles de grammaire (CNN) vs lire des millions de livres (ViT) !
Q : ViT ou CNN pour mon projet vision par ordinateur ? R : Dépend de tes données ! Petit dataset (<100k images) : utilise CNN (ResNet, EfficientNet). Dataset moyen avec transfer learning : les deux marchent. Grand dataset ou besoin SOTA : utilise ViT (pré-entraîné). Besoin vitesse/efficacité : CNN. Besoin tâches vision-langage : ViT (s'intègre avec CLIP, etc.) !
🤓 Le saviez-vous ?
Le paper original ViT (2020) était initialement sceptique de ses propres résultats ! Les chercheurs Google étaient surpris que retirer toutes les convolutions et utiliser des Transformers purs puisse marcher. La percée clé ? L'échelle. Ils ont pré-entraîné sur JFT-300M (300 millions d'images - pas public !) et ont découvert que plus de données + plus gros modèle = Transformer gagne. Avant ViT, tout le monde pensait que les inductive biases des CNN étaient essentiels pour la vision. ViT a prouvé : données > inductive bias. Plot twist : La même année, DeiT a montré qu'on pouvait faire marcher ViT avec moins de données via distillation - prouvant que la communauté apprend VITE ! Aujourd'hui, les variantes ViT alimentent DALL-E, Stable Diffusion, SAM et tous les modèles vision-langage modernes. Un paper qui a failli ne pas être publié a changé la vision par ordinateur pour toujours ! 📸🤖💥
Théo CHARLET
Étudiant TSSR - Spécialisation IA/ML
Créateur d'AG-BPE (Attention-Guided Byte-Pair Encoding)
🔗 LinkedIn: https://www.linkedin.com/in/théo-charlet
🚀 En recherche de stage