Polydesk-logotype
Polydesk.ai — Header

Image Classification (Classification d’Images)

L’image classification (ou classification d’images) est une tâche fondamentale de vision par ordinateur qui consiste à attribuer automatiquement une ou plusieurs catégories prédéfinies à une image en analysant son contenu visuel.

Vous prenez une photo. Le modèle analyse les pixels, extrait des patterns visuels (contours, textures, formes, couleurs), et détermine ce que l’image représente : un chat, un chien, une voiture, une tumeur maligne, un défaut de fabrication. C’est la brique fondamentale sur laquelle reposent la plupart des systèmes de vision par ordinateur, de la reconnaissance faciale à l’imagerie médicale en passant par les véhicules autonomes.

Le marché mondial de la reconnaissance d’images atteignait environ $43,6 milliards en 2023 et devrait dépasser $178 milliards d’ici 2032. L’image classification n’est pas un sujet de recherche abstrait : c’est une technologie déployée massivement dans l’industrie, la santé, la sécurité, le commerce et l’agriculture.

Image Classification en bref
Catégorie
Tâche fondamentale de vision par ordinateur
Input
Image (tableau de pixels, typiquement 224×224 ou 384×384)
Output
Catégorie prédite + score de confiance
Types
Binaire, multi-classe, multi-label
Benchmark principal
ImageNet (1000 classes, ~1,2M images d’entraînement)
SOTA ImageNet
~91% top-1 accuracy (CoCa, fine-tuné)
Architectures
CNN (EfficientNet, ConvNeXt), Vision Transformer (ViT, Swin), Multimodal (CLIP, CoCa)

Types de classification d’images

Classification binaire : l’image appartient à une classe parmi deux. Exemple : « tumeur bénigne » vs « tumeur maligne », « pièce conforme » vs « pièce défectueuse ». C’est le cas le plus simple mais aussi l’un des plus déployés en production (contrôle qualité, diagnostic médical).

Classification multi-classe : l’image appartient à exactement une classe parmi N. Exemple : classifier une image parmi 1000 catégories (ImageNet), identifier une espèce de plante parmi 200, ou classifier un chiffre manuscrit parmi 10 (MNIST). Chaque image reçoit un seul label.

Classification multi-label : l’image peut appartenir simultanément à plusieurs catégories. Exemple : une photo de plage peut être taguée « mer », « sable », « coucher de soleil », « personnes ». Le modèle prédit un ensemble de labels pour chaque image. Plus complexe que le multi-classe car les labels ne sont pas mutuellement exclusifs.


Évolution des architectures

Vision classique (avant 2012)

Avant le deep learning, la classification d’images reposait sur des features extraites manuellement : histogrammes de gradients orientés (HOG), SIFT (Scale-Invariant Feature Transform), LBP (Local Binary Patterns). Ces features alimentaient un classifieur SVM ou Random Forest. L’accuracy sur ImageNet plafonnait autour de 72% en top-5.

L’ère des CNN (2012-2020)

AlexNet (Krizhevsky et al., 2012) a déclenché la révolution du deep learning en vision par ordinateur en remportant le challenge ImageNet avec une erreur top-5 de 15,3% (vs 26,2% pour le meilleur système classique). Les Convolutional Neural Networks empilent des couches de convolution (extraction de features), de pooling (réduction de dimension) et de couches fully-connected (classification).

Les architectures ont rapidement progressé :

ArchitectureAnnéeInnovation cléTop-1 ImageNet
AlexNet2012CNN profond + GPU, premier deep learning ImageNet~63%
VGGNet2014Profondeur accrue (16-19 couches), filtres 3×3~74%
ResNet2015Residual connections (skip connections), 152 couches~78%
Inception (GoogLeNet)2015Modules multi-échelle parallèles~78%
EfficientNet2019Compound scaling (profondeur, largeur, résolution)~84%
EfficientNetV22021Progressive training, Fused-MBConv~87%
ConvNeXt2022CNN modernisé avec techniques de Transformers~87%

L’ère des Vision Transformers (2020-présent)

Le Vision Transformer (ViT, Dosovitskiy et al., 2020) a transposé l’architecture Transformer du NLP à la vision. Au lieu de convolutions, ViT découpe l’image en patches (typiquement 16×16 pixels), les traite comme des tokens, et applique le mécanisme d’self-attention pour capturer les relations entre patches.

ViT nécessite un pré-entraînement sur de très grands datasets (JFT-300M, ImageNet-21k) pour surpasser les CNN. Sans cela, les CNN restent compétitifs. Swin Transformer a amélioré ViT en ajoutant une structure hiérarchique avec des fenêtres d’attention glissantes, le rendant plus efficace sur les images haute résolution.

ArchitectureTypeTop-1 ImageNetParticularité
ViT-L/16Transformer~88%Patches 16×16, self-attention globale
Swin TransformerTransformer hiérarchique~87-88%Fenêtres d’attention glissantes, efficace en haute résolution
DaViTTransformer dual-attention~90%Attention spatiale + par canal
CLIPMultimodal (vision + texte)~88% (zero-shot ~76%)Classification zero-shot par prompts textuels
CoCaMultimodal~91%Contrastive + captioning, SOTA 2025

L’ère multimodale (2024-présent)

CLIP (OpenAI, 2021) a ouvert une nouvelle direction en entraînant conjointement un encoder image et un encoder texte sur 400 millions de paires image-texte. Résultat : un modèle capable de classifier des images en zero-shot, simplement en décrivant les catégories en langage naturel. « A photo of a cat » vs « A photo of a dog » suffit comme prompt de classification, sans aucune donnée d’entraînement spécifique.

CoCa (Contrastive Captioners, Google) combine l’apprentissage contrastif (type CLIP) et la génération de légendes dans un modèle unifié. En 2025, CoCa détient le record de précision sur ImageNet-1K fine-tuné (~91% top-1), illustrant la puissance de l’approche multimodale.

CNN vs Transformer : quel choix en production ? En production, le choix dépend de vos contraintes. Les CNN (EfficientNetV2, ConvNeXt) restent excellents quand les données sont limitées, le compute contraint, ou la latence critique. Les Vision Transformers (ViT, Swin) brillent avec un pré-entraînement à grande échelle et sur les images haute résolution. CLIP est imbattable quand vous avez besoin de flexibilité (classification zero-shot, catégories changeantes). Sur les appareils mobiles et edge, MobileNetV3 et les petites variantes de ConvNeXt ou EfficientNet sont les choix standard.

Pipeline de classification d’images

Un projet de classification d’images suit une pipeline structurée.

1. Collecte et annotation des données. Constituez un dataset d’images annotées (manuellement ou via des plateformes comme Label Studio, CVAT, Labelbox). Visez au minimum 100 images par classe, idéalement 500 à 1000+ pour des résultats robustes. L’équilibre entre classes est important : un dataset avec 10 000 images de chats et 100 images de chiens produira un modèle biaisé.

2. Prétraitement et augmentation. Redimensionnement (224×224 ou 384×384 selon le modèle), normalisation des pixels (typiquement ImageNet mean/std), et data augmentation (rotation, flip, crop aléatoire, color jitter, mixup, cutmix) pour augmenter la diversité et la robustesse.

3. Choix du modèle et transfer learning. En pratique, on ne part presque jamais de zéro. Le transfer learning (charger un modèle pré-entraîné sur ImageNet puis fine-tuner sur vos données) est la norme. Un EfficientNetV2 pré-entraîné sur ImageNet puis fine-tuné sur 500 images de votre domaine surpassera largement un CNN entraîné from scratch sur ces mêmes 500 images.

4. Entraînement et fine-tuning. Gelez les premières couches du modèle pré-entraîné (features génériques : contours, textures), ne fine-tunez que les dernières couches (features spécifiques au domaine) et la tête de classification. Learning rate faible (1e-4 à 1e-5), optimiseur AdamW pour les Transformers, SGD avec momentum pour les CNN.

5. Évaluation. Accuracy top-1 (le label le plus probable est correct), top-5 (le label correct est dans les 5 premiers), F1-score par classe, matrice de confusion, et courbe ROC/AUC pour les problèmes binaires.

6. Déploiement. Export du modèle (ONNX, TensorRT, CoreML pour mobile), optimisation (quantization INT8, pruning), et monitoring en production (data drift, dégradation de performance).


Benchmarks de référence

DatasetClassesImagesUsage
ImageNet-1K (ILSVRC)1 000~1,2M train / 50K valBenchmark principal, pré-entraînement standard
ImageNet-21K~21 000~14MPré-entraînement grande échelle
CIFAR-101060K (32×32)Prototypage, éducation
CIFAR-10010060K (32×32)Classification fine-grained simple
MNIST10 (chiffres)70K (28×28)Benchmark historique, trop simple pour l’évaluation moderne
Oxford Flowers 102102~8KFine-grained classification (fleurs)
Stanford Cars196~16KFine-grained classification (voitures)
ImageNet-C / ImageNet-R1 000VariableRobustesse aux corruptions et perturbations

ImageNet reste le benchmark universel, mais attention : un modèle qui excelle sur ImageNet ne sera pas nécessairement performant sur vos données métier (imagerie médicale, inspection industrielle, reconnaissance d’espèces). L’évaluation sur votre propre jeu de test est indispensable.


Outils et frameworks

Classification avec PyTorch et un modèle pré-entraîné

import torch
from torchvision import models, transforms
from PIL import Image

# Charger un EfficientNetV2 pré-entraîné sur ImageNet
model = models.efficientnet_v2_s(weights=models.EfficientNet_V2_S_Weights.DEFAULT)
model.eval()

# Prétraitement standard ImageNet
preprocess = transforms.Compose([
    transforms.Resize(384),
    transforms.CenterCrop(384),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406],
                         std=[0.229, 0.224, 0.225]),
])

# Classifier une image
img = Image.open("photo.jpg")
input_tensor = preprocess(img).unsqueeze(0)

with torch.no_grad():
    output = model(input_tensor)
    probabilities = torch.nn.functional.softmax(output[0], dim=0)

# Top-5 prédictions
top5_prob, top5_idx = torch.topk(probabilities, 5)
for i in range(5):
    print(f"{top5_idx[i].item():4d}  {top5_prob[i].item():.3f}")

Classification zero-shot avec CLIP

import torch
from PIL import Image
from transformers import CLIPProcessor, CLIPModel

model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")

image = Image.open("animal.jpg")
# Classification zero-shot : pas besoin de données d'entraînement
labels = ["a photo of a cat", "a photo of a dog",
          "a photo of a bird", "a photo of a fish"]

inputs = processor(text=labels, images=image, return_tensors="pt",
                   padding=True)

with torch.no_grad():
    outputs = model(**inputs)
    logits = outputs.logits_per_image
    probs = logits.softmax(dim=1)

for label, prob in zip(labels, probs[0]):
    print(f"{label:30} {prob.item():.3f}")

Fine-tuning avec Hugging Face

from transformers import (AutoImageProcessor, AutoModelForImageClassification,
                          TrainingArguments, Trainer)
from datasets import load_dataset
import numpy as np
from sklearn.metrics import accuracy_score

# Charger un dataset (exemple : beans disease classification)
dataset = load_dataset("beans")

model_name = "google/efficientnet-b0"
processor = AutoImageProcessor.from_pretrained(model_name)
model = AutoModelForImageClassification.from_pretrained(
    model_name, num_labels=3, ignore_mismatched_sizes=True)

def transform(batch):
    inputs = processor(batch["image"], return_tensors="pt")
    inputs["labels"] = batch["labels"]
    return inputs

dataset = dataset.with_transform(transform)

training_args = TrainingArguments(
    output_dir="./efficientnet-beans",
    num_train_epochs=5,
    per_device_train_batch_size=16,
    learning_rate=1e-4,
    eval_strategy="epoch",
)

def compute_metrics(eval_pred):
    preds = np.argmax(eval_pred.predictions, axis=1)
    return {"accuracy": accuracy_score(eval_pred.label_ids, preds)}

trainer = Trainer(model=model, args=training_args,
                  train_dataset=dataset["train"],
                  eval_dataset=dataset["validation"],
                  compute_metrics=compute_metrics)
trainer.train()

Comparaison des frameworks

FrameworkPoints fortsUsage recommandé
PyTorch + torchvisionFlexibilité maximale, écosystème riche, standard rechercheRecherche, projets personnalisés, fine-tuning avancé
Hugging Face TransformersAPI unifiée, Hub de modèles, Trainer simplifiéPrototypage rapide, accès aux derniers modèles
TensorFlow / KerasDéploiement TFLite/TF.js, TPU natifProduction Google Cloud, déploiement mobile/web
YOLO (Ultralytics)Classification + détection + segmentation en un seul modèleApplications multi-tâches, temps réel
timm (PyTorch Image Models)400+ architectures pré-entraînées, benchmarks systématiquesÉvaluation de modèles, recherche d’architecture
Google Cloud Vision APIAPI managée, pas besoin de modèlePrototypage sans ML, petits volumes
AWS RekognitionAPI managée, intégration AWSProduction AWS, modération de contenu

Applications concrètes

Imagerie médicale. Classification de radiographies (détection de pneumonies, fractures), d’images dermatologiques (mélanomes vs naevus bénins), de coupes histologiques (cellules cancéreuses). Les modèles EfficientNet fine-tunés atteignent des performances au niveau des dermatologues pour la classification des lésions cutanées. L’enjeu principal est la certification réglementaire (FDA, CE) et la gestion des faux négatifs.

Véhicules autonomes. Classification des panneaux de signalisation, des feux de circulation, et identification des types d’obstacles (piéton, vélo, véhicule, animal). Tesla traite plus de 50 tâches de classification simultanées en temps réel. La robustesse aux conditions météorologiques défavorables (ImageNet-C) est critique.

Contrôle qualité industriel. Détection de défauts sur les lignes de production : rayures, fissures, déformations, composants manquants. La classification binaire (conforme/non-conforme) avec des CNN déployés sur des caméras industrielles permet un contrôle à 100% de la production, impossible manuellement.

Agriculture de précision. Classification des maladies des plantes (le dataset « beans » ci-dessus est un exemple réel), évaluation de la maturité des fruits, identification des espèces de mauvaises herbes pour un traitement ciblé. Les drones équipés de caméras et de modèles de classification cartographient les parcelles à grande échelle.

Commerce et retail. Recherche visuelle (« trouvez des produits similaires à cette photo »), classification automatique des catalogues produit, détection de produits contrefaits, et essayage virtuel. CLIP est particulièrement adapté à ces cas d’usage grâce à sa flexibilité zero-shot.

Modération de contenu. Classification automatique des images uploadées sur les plateformes (contenu explicite, violent, haineux, ou conforme). Les API cloud (Google Vision, AWS Rekognition) proposent nativement cette fonctionnalité.


Défis de l’image classification

Dépendance aux données. La qualité et la quantité des données annotées conditionnent directement les performances. L’annotation est coûteuse (typiquement $0,02 à $0,10 par image pour une classification simple). Les techniques de data augmentation, de self-supervised learning, et de transfer learning atténuent ce problème.

Robustesse. Les modèles sont sensibles aux perturbations : changement d’éclairage, rotation, occlusion, bruit, conditions météorologiques adverses. Un modèle parfait sur ImageNet peut échouer sur des images réelles. Les benchmarks de robustesse (ImageNet-C, ImageNet-R) et les techniques d’augmentation adversariale adressent ce défi.

Biais. Les datasets d’entraînement contiennent des biais (sous-représentation de certaines catégories, biais culturels dans les annotations). Un classifieur de « nourriture » entraîné sur des données occidentales reconnaîtra mal la cuisine asiatique. L’audit systématique des datasets et des prédictions est nécessaire.

Classification fine-grained. Distinguer des sous-catégories visuellement proches (200 espèces d’oiseaux, 196 modèles de voitures) est nettement plus difficile que la classification générique. Les architectures à attention fine (ViT, Swin) et les techniques de pooling bilinéaire sont utilisées pour cette tâche.

Déploiement edge/mobile. Les modèles performants (ViT-L, EfficientNetV2-L) sont trop lourds pour les appareils mobiles ou embarqués. La quantization (INT8, INT4), le pruning, et la distillation permettent de compresser les modèles avec une perte de précision minimale.


Bonnes pratiques

Commencez par le transfer learning. Ne partez jamais de zéro. Chargez un modèle pré-entraîné sur ImageNet et fine-tunez sur vos données. Avec 500 images par classe et un EfficientNet pré-entraîné, vous obtiendrez des résultats nettement supérieurs à un CNN entraîné from scratch sur 10 000 images.

Augmentez vos données. La data augmentation (rotation, flip, crop, color jitter, mixup, cutmix) est gratuite et améliore systématiquement la robustesse. Les bibliothèques albumentations (Python) et torchvision.transforms fournissent des pipelines d’augmentation prêtes à l’emploi.

Choisissez le modèle selon vos contraintes. Mobile/edge : MobileNetV3, EfficientNet-B0. Production avec GPU : EfficientNetV2, ConvNeXt. Précision maximale : ViT-L, Swin, CoCa. Catégories changeantes : CLIP (zero-shot).

Évaluez au-delà de l’accuracy globale. Si vos classes sont déséquilibrées, l’accuracy est trompeuse. Utilisez le F1-score pondéré, la matrice de confusion, et examinez les performances par classe. Un modèle avec 98% d’accuracy globale mais 50% de rappel sur la classe critique (ex: tumeur maligne) est dangereux.

Testez la robustesse. Évaluez votre modèle sur des images perturbées (bruit, flou, changement de contraste) et sur des données hors distribution. La performance en conditions idéales ne prédit pas la performance en conditions réelles.


Questions fréquentes sur l’image classification

Quelle est la différence entre image classification et object detection ?

L’image classification attribue un label à l’image entière (« cette image contient un chat »). L’object detection localise et identifie chaque objet dans l’image avec une bounding box (« il y a un chat en haut à gauche et un chien en bas à droite »). L’image classification est plus simple et plus rapide. L’object detection est nécessaire quand il faut savoir où se trouvent les objets et quand plusieurs objets de classes différentes coexistent dans la même image. L’image segmentation va encore plus loin en délimitant le contour exact de chaque objet au niveau du pixel.

Combien d’images faut-il pour entraîner un classifieur ?

Avec du transfer learning (modèle pré-entraîné sur ImageNet), 100 à 500 images par classe suffisent souvent pour un premier modèle fonctionnel. Pour des performances robustes en production, visez 1 000 à 5 000 images par classe. Avec CLIP en zero-shot, vous avez besoin de 0 image d’entraînement (juste une description textuelle des classes). Pour les techniques de few-shot learning, 5 à 20 exemples par classe peuvent suffire. Sans transfer learning (entraînement from scratch), comptez 10 000+ images par classe pour des résultats corrects.

CLIP peut-il remplacer un classifieur entraîné sur des données spécifiques ?

CLIP en zero-shot atteint environ 76% de top-1 accuracy sur ImageNet, ce qui est remarquable sans aucune donnée d’entraînement spécifique, mais reste 15 points en dessous des modèles fine-tunés (~91%). Pour des catégories visuellement distinctes et génériques (animaux, véhicules, objets courants), CLIP est souvent suffisant. Pour de la classification fine-grained dans un domaine spécialisé (espèces de plantes, défauts de fabrication, pathologies médicales), un modèle fine-tuné sur vos données sera nettement plus précis. CLIP est idéal pour le prototypage rapide et les cas où les catégories changent fréquemment.

Quel modèle utiliser pour le déploiement mobile ?

MobileNetV3 est le standard pour les appareils mobiles (< 10ms d'inférence sur un smartphone récent). EfficientNet-B0 offre un bon compromis si vous avez un peu plus de compute. Les petites variantes de ConvNeXt (Atto, Femto, Pico) et de EfficientViT sont des alternatives modernes. Pour le déploiement, exportez en ONNX ou TFLite, appliquez la quantization INT8 (réduction de taille ~4x avec moins de 1% de perte de précision), et utilisez les runtimes optimisés (TensorRT pour GPU, CoreML pour Apple, NNAPI pour Android).

Comment gérer un dataset très déséquilibré ?

Cinq stratégies complémentaires. Le suréchantillonnage des classes minoritaires (dupliquer les images rares, éventuellement avec augmentation). Le sous-échantillonnage des classes majoritaires. La pondération de la loss function (poids inversement proportionnels à la fréquence de chaque classe). L’utilisation de métriques adaptées (F1, AUC-ROC) au lieu de l’accuracy. Et la génération d’images synthétiques via des modèles génératifs pour enrichir les classes rares. En pratique, la combinaison oversampling + class weights + augmentation donne les meilleurs résultats.

Polydesk.ai — Footer