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

Les classificateurs d'images entraînables comprennent : 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.

ConvNeXt V2 ajoute la classification supervisée avec des poids pré-entraînés sous CC-BY-NC-4.0. PE prend en charge la classification zero-shot ; V-JEPA 2 entraîne des sondes de classification vidéo.

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.

ResNet, ConvNeXt, ConvNeXt V2, MobileNetV4, EfficientNetV2 et DINOv2 prennent en charge la pondération de la loss par cls_pw ou class_weights. En classification, scale contrôle l'aire de recadrage et crop_pct contrôle le recadrage d'évaluation. Consultez les augmentations.

Le filtre de redimensionnement fait partie du modèle. Définissez model.interpolation sur "bilinear", "bicubic", "nearest" ou "bilinear_no_antialias" avant l'entraînement : l'entraînement, val(), predict(), la calibration INT8 et l'export l'utilisent tous, et save(), best.pt et last.pt l'enregistrent, si bien qu'un rechargement le conserve. Tout autre nom lève ValueError. "bilinear_no_antialias" redimensionne partout en bilinéaire simple et sans antialiasing, RandomResizedCrop compris, pour les modèles qui s'exécuteront derrière un redimensionnement runtime sans antialiasing. MobileNetV4, ResNet, ConvNeXt, ConvNeXt V2, EfficientNetV2, DeiT, Swin et ViT utilisent bicubic par défaut ; AlexNet et VGG utilisent bilinear.

Valider

val() renvoie un dictionnaire 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") # Un dict de clés metrics/, plus top1, top5 et confusion_matrix.metrics = model.val(data="imagenette160") print(metrics["metrics/accuracy_top1"])print(metrics["metrics/accuracy_top5"])print(metrics.top1, metrics.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.

La validation ImageFolder renvoie aussi les valeurs macro metrics/precision, metrics/recall et metrics/f1, moyennées sur les classes présentes dans les cibles de validation. Les classes non prédites contribuent une précision nulle. Le score de sélection par défaut reste l'exactitude top-1. La validation et la calibration utilisent la transformation d'évaluation du modèle.

Le résultat est une sous-classe de dict avec trois attributs : top1 et top5 contiennent les deux valeurs d'exactitude, et confusion_matrix compte chaque image selon sa classe top-1 face à son étiquette, indexée matrix[predicted, true]. plots=True l'écrit sous forme de comptes dans confusion_matrix.png et sous forme de parts de chaque étiquette dans confusion_matrix_normalized.png. Au-delà de 2 000 classes, la matrice dense et ses graphiques ne sont pas disponibles, et nonzero(), tp_fp() et class_accuracy() lisent les comptes à la place ; voir Validation et mesures.

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.6.0.