Le Vision Transformer (ViT) applique aux images l'architecture des modèles de langage. L'image est découpée en tuiles, traitées comme les mots d'une phrase, et chaque tuile regarde toutes les autres grâce à l'attention. Pré-entraîné sur des millions d'images, il égale ou dépasse les CNN et sert de base à de nombreux modèles de vision récents.
Un expert examine une photo de pièce en la découpant en carrés. Pour juger un carré suspect, il le compare à tous les autres, même à l'autre bout de l'image.
Une image 224 x 224 devient 196 tuiles de 16 x 16 pixels. Chaque tuile est aplatie puis projetée en vecteur, avec un code de position qui dit où elle se trouve.
Un encodeur Transformer applique plusieurs couches d'attention : chaque tuile pondère les informations de toutes les autres. Un jeton de classe supplémentaire collecte au fil des couches un résumé de l'image.
Le jeton de classe passe dans une couche de sortie qui donne la catégorie. En pratique, on part d'un ViT pré-entraîné et on n'ajuste que la fin sur ses propres images.
Des chiffres de 0 à 9 écrits à la main, comme sur un formulaire ou un chèque. Chaque image est découpée en 16 tuiles de 2 x 2 pixels, version miniature du découpage 16 x 16 d'un vrai ViT.
Le modèle lit les 16 tuiles et prédit le chiffre. Ce ViT miniature, entraîné de zéro sur 1 258 images, montre le mécanisme. Sur si peu de données, un CNN ou même une régression logistique atteint déjà un très bon score : en production, on part d'un ViT pré-entraîné.
On mesure la part de chiffres bien lus sur les 30 % d'images jamais vues. Pour un montant, une erreur coûte cher : on fixe un seuil de confiance en dessous duquel l'image part en vérification humaine.
Noms courants dans PyTorch, timm et transformers (Hugging Face).
16 x 16 pixels est le standard. Des tuiles plus petites donnent plus de détails mais beaucoup plus de tuiles, donc un coût d'attention bien plus élevé.
ViT-Base, DeiT, ou des encodeurs auto-supervisés comme DINOv2. Le choix du point de départ compte plus que tous les autres réglages.
Un taux faible pour l'ajustement, avec une montée progressive au début (warmup). Les Transformers sont sensibles à ce réglage.
Recadrages, retournements, variations de couleur. Indispensable pour entraîner un ViT sur un volume modeste.
# Lecture de chiffres manuscrits : Vision Transformer en Python
import pandas as pd
import torch
from torch import nn
torch.manual_seed(42)
df = pd.read_csv("chiffres_manuscrits.csv")
images = torch.tensor(df.drop(columns="chiffre").values / 16, dtype=torch.float32).reshape(-1, 8, 8)
y = torch.tensor(df["chiffre"].values)
tuiles = images.unfold(1, 2, 2).unfold(2, 2, 2).reshape(-1, 16, 4) # 16 tuiles de 2x2 pixels par image
app, test = torch.randperm(len(y)).split([1258, len(y) - 1258]) # 70 % apprentissage, 30 % test
class MiniViT(nn.Module):
def __init__(self, d=64):
super().__init__()
self.projection = nn.Linear(4, d) # chaque tuile devient un vecteur
self.classe = nn.Parameter(torch.zeros(1, 1, d)) # jeton de classe, qui résume l'image
self.position = nn.Parameter(0.02 * torch.randn(1, 17, d)) # position de chaque tuile, apprise
couche = nn.TransformerEncoderLayer(d, nhead=4, dim_feedforward=128, dropout=0.0, batch_first=True, norm_first=True)
self.encodeur = nn.TransformerEncoder(couche, num_layers=2, enable_nested_tensor=False)
self.sortie = nn.Linear(d, 10)
def forward(self, t):
z = torch.cat([self.classe.expand(len(t), -1, -1), self.projection(t)], dim=1) + self.position
return self.sortie(self.encodeur(z)[:, 0]) # la décision se lit sur le jeton de classe
modele = MiniViT()
optim = torch.optim.AdamW(modele.parameters(), lr=1e-3)
for epoque in range(30):
for lot in app[torch.randperm(len(app))].split(64):
optim.zero_grad()
nn.functional.cross_entropy(modele(tuiles[lot]), y[lot]).backward()
optim.step()
print("Exactitude test :", round((modele(tuiles[test]).argmax(dim=1) == y[test]).float().mean().item(), 3))
Les Vision Transformers se pratiquent en Python (PyTorch, timm, transformers) : pas d'équivalent R courant en entreprise.
Un CNN applique des filtres locaux et construit la vision de l'image par couches successives. Le ViT découpe l'image en tuiles et laisse chacune regarder toutes les autres dès la première couche. Le CNN apprend mieux avec peu de données ; le ViT prend l'avantage avec un pré-entraînement sur de très gros volumes.
Il a été présenté par Google en 2020 dans l'article « An Image is Worth 16x16 Words ». Il reprend l'encodeur du Transformer, conçu pour le texte, avec des tuiles d'image à la place des mots.
Pour l'entraîner de zéro, oui en pratique. Pour l'utiliser, non : on télécharge un modèle pré-entraîné et on l'ajuste sur quelques centaines ou milliers d'images de son propre problème.
Des filtres qui balaient l'image localement. Plus efficaces sur de petits volumes, toujours très utilisés en production.
Voir la fiche → la même architecture sur le texteLe ViT reprend l'encodeur Transformer tel quel, avec des tuiles à la place des mots.
Voir la fiche → la façon de s'en servirOn part d'un ViT pré-entraîné et on l'adapte à ses images. C'est ainsi qu'on l'utilise en entreprise.
Voir la fiche →Dataistudio forme les équipes au machine learning et à l'IA, sur des cas concrets.
Nous utilisons des cookies de mesure d'audience et de suivi publicitaire pour comprendre la fréquentation du site et l'efficacité de nos annonces. Rien n'est déposé sans votre accord. En savoir plus