Classification d'images

La classification d'images attribue une distribution d'étiquettes à une image entière et ne localise rien à l'intérieur. La clé de tâche est classify.

Définition

La classification d'images produit un score par classe pour l'image entière et aucune coordonnée. Elle répond à la question de ce qui se trouve dans l'image, jamais où. C'est ce qui la distingue de la détection d'objets.

classify est la clé de tâche canonique, et le suffixe -cls du nom d'un checkpoint la sélectionne. Ce suffixe est obligatoire, et non facultatif, pour les familles de classification. LibreResNet50.pt n'est donc pas interprété comme un classificateur. Seul LibreResNet50-cls.pt l'est.

predict() remplit result.probs et laisse boxes vide. .data est le vecteur complet des scores, .top1 l'indice du score le plus élevé et .top1conf sa valeur. .top5 contient les cinq indices les plus élevés dans l'ordre décroissant et .top5conf leurs scores. Ces indices pointent vers result.names. Découper un objet Results ne tronque jamais probs, car le vecteur appartient à l'image et non à une ligne.

Modèles

Cinq familles peuvent être entraînées et effectuer des prédictions : ResNet, ConvNeXt, MobileNetV4, EfficientNetV2 et DINOv2. Les quatre premières s'exécutent avec le paquet de base et proposent des poids publiés. DINOv2 nécessite pip install "libreyolo[rfdetr]" et ne possède aucun checkpoint hébergé par LibreYOLO. Il charge le backbone amont avec une tête linéaire initialisée aléatoirement. Il constitue donc un point de départ pour le fine-tuning plutôt qu'un prédicteur prêt à l'emploi.

Cinq autres familles effectuent la prédiction, la validation et l'exportation, mais leur méthode train() déclenche une NotImplementedError : ViT, Swin, VGG, AlexNet et DeiT.

CLIP et SigLIP2 classent sans ensemble fixe d'étiquettes. Ils comparent l'image à des prompts textuels. set_classes() définit donc les classes au moment de l'appel, sans aucune étape d'entraînement pour un nouvel ensemble d'étiquettes. Tous deux couvrent également la tâche embed.

Prédire

Les poids sont téléchargés depuis Hugging Face à la première utilisation et mis en cache localement.

Python
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Le suffixe -cls du nom de fichier sélectionne la tâche.# Aucun argument task n'est donc nécessaire.model = LibreYOLO("LibreResNet50-cls.pt")result = model(SAMPLE_IMAGE, save=True) print(result.names[result.probs.top1], float(result.probs.top1conf))print(result.probs.top5)
CLI
libreyolo predict model=LibreResNet50-cls.pt save=True \  source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg
Distribution complète
from libreyolo import LibreYOLO, SAMPLE_IMAGE result = LibreYOLO("LibreResNet50-cls.pt")(SAMPLE_IMAGE)probs = result.probs # .data est le vecteur (C,) complet ; top5/top5conf sont des vues ordonnées.print(probs.data.shape)for index, score in zip(probs.top5, probs.top5conf):    print(result.names[index], float(score))
Zero-shot, sans entraînement
from libreyolo import LibreYOLO, SAMPLE_IMAGE # CLIP compare l'image à des prompts textuels. L'ensemble d'étiquettes# est donc défini à l'appel plutôt qu'intégré au checkpoint.model = LibreYOLO("LibreCLIPb32-cls.pt")model.set_classes(["a person jumping", "an empty street", "a parked car"])result = model(SAMPLE_IMAGE) print(model.names[result.probs.top1], float(result.probs.top1conf))

conf, iou et max_det n'ont aucun effet ici. Il n'existe aucun candidat à filtrer par seuil ou à supprimer, seulement une distribution. Consultez la page prédiction pour les sources, le streaming et la gestion des résultats.

Format du dataset

La classification emploie une arborescence de répertoires, pas des fichiers d'étiquettes ni un fichier YAML. data désigne la racine du dataset.

dataset/
  train/
    tench/000001.jpg
    parachute/000002.jpg
  val/
    tench/000101.jpg
    parachute/000102.jpg

train/ est obligatoire pour l'entraînement et définit l'association entre classes et indices selon l'ordre des noms de dossiers. Le premier dossier par ordre alphabétique devient donc la classe 0. val/ est obligatoire pour la validation. Une partition test/ peut être présente, mais les commandes d'entraînement et de validation par défaut ne l'utilisent pas. Toute partition autre que train doit contenir les mêmes noms de dossiers de classes que l'ensemble attendu. Une incompatibilité échoue ainsi explicitement au lieu d'être évaluée comme une mauvaise prédiction. Les extensions d'images acceptées sont .jpg, .jpeg, .png, .bmp, .webp, .tif et .tiff.

data accepte trois formes : le chemin d'un répertoire contenant une partition train/, l'URL d'un fichier .zip ou l'un des noms de datasets connus, imagenette160 et smoke10, téléchargés et mis en cache à la première utilisation.

Le chargeur canonique est libreyolo.data.classify_dataset.

Entraîner

Python
from libreyolo import LibreYOLO # imagenette160 est un nom de dataset connu, téléchargé à la première# utilisation. Pour vos données, transmettez un répertoire avec une partition train/.model = LibreYOLO("LibreResNet50-cls.pt")model.train(data="imagenette160", epochs=5)
CLI
libreyolo train model=LibreResNet50-cls.pt data=imagenette160 epochs=5
Multi-GPU
libreyolo train model=LibreResNet50-cls.pt data=imagenette160 \  epochs=50 device=0,1 batch=-1

Aucun nc n'est à déclarer. Le nombre de classes provient des noms de dossiers sous train/, et la couche linéaire finale est reconstruite pour lui correspondre tandis que le backbone est transféré sans modification. Consultez la page entraînement pour les datasets, les augmentations, le multi-GPU et les systèmes de journalisation.

Valider

val() renvoie un dictionnaire ordinaire de clés metrics/, calculées sur la partition val/ de la racine du dataset.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreResNet50-cls.pt") # val() renvoie un dictionnaire ordinaire et non un objet.metrics = model.val(data="imagenette160") print(metrics["metrics/accuracy_top1"])print(metrics["metrics/accuracy_top5"])
CLI
libreyolo val model=LibreResNet50-cls.pt data=imagenette160

metrics/accuracy_top1 est la proportion d'images dont la classe au score le plus élevé correspond à la vérité terrain. C'est le nombre principal, utilisé par l'entraînement pour choisir la meilleure époque. metrics/accuracy_top5 est la proportion d'images dont la vraie classe figure parmi les cinq scores les plus élevés. Cette valeur est d'autant moins significative que le dataset contient peu de classes. Le dictionnaire contient aussi fitness, une copie de la valeur top-1.

Exporter

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreResNet50-cls.pt")model.export(format="onnx")
CLI
libreyolo export model=LibreResNet50-cls.pt format=onnx
Utiliser le fichier exporté
from libreyolo import LibreYOLO, SAMPLE_IMAGE # La fabrique s'oriente grâce au suffixe du fichier. Un artefact exporté# se charge comme un checkpoint et renvoie le même objet Results.model = LibreYOLO("LibreResNet50-cls.onnx")result = model(SAMPLE_IMAGE) print(result.probs.top1, result.probs.top1conf)

Un artefact exporté se recharge par LibreYOLO() grâce au suffixe de son fichier. Un fichier .onnx ou .engine se comporte donc comme un checkpoint et renvoie le même Results. La couverture des formats varie selon la famille. La matrice de chaque page de modèle est générée depuis l'ensemble validé plutôt que saisie manuellement. Consultez la page exporter et déployer pour les formats, leurs extras et leurs contraintes.

Vérifié avec LibreYOLO v1.5.0.