Effectuer une prédiction sur une image
Exécute un modèle YOLO26 préentraîné depuis Python, lis les classes, les scores de confiance et les boîtes en pixels dans les résultats, et ajuste les paramètres qui corrigent la plupart des détections manquées.
Toute utilisation concrète d’un détecteur — compter les articles en stock sur une étagère, recadrer des visages pour les flouter, envoyer des boîtes à une API JSON — commence par une lecture correcte de l’objet de résultat. Une seule erreur, comme indexer les noms de classes avec un tenseur, et ton application plante dès la première image.
Un modèle YOLO26 de détection préentraîné connaît déjà les 80 classes COCO. Dans cette leçon, tu vas exécuter le mode Predict depuis Python, extraire des résultats chaque champ utile et apprendre quel paramètre modifier en cas de détections manquées, de doublons et de petits objets. Le même objet de résultat sera renvoyé plus tard par ton propre modèle entraîné.
Pratique
Effectuer une prédiction et afficher chaque détection#

L’appel du modèle sur une source exécute le mode Predict et renvoie une liste contenant un objet Results par image. Avec une seule image, lis results[0].
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
results = model("https://ultralytics.com/images/bus.jpg")
result = results[0]
for box in result.boxes:
name = result.names[int(box.cls)]
conf = float(box.conf)
x1, y1, x2, y2 = box.xyxy[0].tolist()
print(f"{name:>8} {conf:.2f} ({x1:.0f}, {y1:.0f}) -> ({x2:.0f}, {y2:.0f})")
result.save("bus_annotated.jpg")Résultat réel de predict.py, après la ligne de journal habituelle :
bus 0.88 (0, 230) -> (803, 751)
person 0.87 (49, 398) -> (240, 902)
person 0.86 (223, 405) -> (345, 861)
person 0.85 (670, 395) -> (810, 880)
person 0.65 (0, 553) -> (60, 871)Lecture du résultat :
bus 0.88: nom de la classe et score de confiance. Les boîtes sont triées par score de confiance décroissant.(0, 230) -> (803, 751): coins supérieur gauche et inférieur droit en pixels de l’image originale de 810×1080, avec l’origine en haut à gauche. Tu peux les utiliser directement pour recadrer ou dessiner.person 0.65à(0, 553): une cinquième personne, coupée par le bord gauche, obtient un score inférieur. C’est généralement le cas des objets partiels.
result.save() écrit l’image annotée ; result.show() l’ouvre dans une fenêtre.
Comprendre le contenu d’un résultat#
Chaque tâche renvoie le même type Results ; seuls les champs renseignés changent. La liste complète des champs est présentée dans le guide d’utilisation de Python.
| Attribut | Contient |
|---|---|
boxes | Détections : pixels xyxy, format centre normalisé xywhn, conf, cls et id en mode suivi |
masks, keypoints, obb, probs | Sorties des modèles de segmentation, de pose, OBB et de classification (None pour un modèle de détection) |
names | Dictionnaire associant les indices de classe aux noms de classe |
orig_img, orig_shape | Image d’entrée sous forme de tableau NumPy, ainsi que sa hauteur × largeur |
speed | Temps de prétraitement, d’inférence et de post-traitement en ms |
path, save_dir | Origine de l’entrée et emplacement d’écriture des sorties |
Pour la détection d’objets, tu as surtout besoin de boxes, les boîtes englobantes. result.summary() renvoie les mêmes détections sous forme de liste de dictionnaires ordinaires, prêts à être envoyés à une API JSON.
Ajuster la prédiction#
Les paramètres par défaut conviennent à la plupart des images. Si ce n’est pas le cas, modifie un seul paramètre à la fois :
| Problème observé | Argument | Par défaut | Modification |
|---|---|---|---|
| Détections manquées : un objet visible n’est pas encadré | conf | 0.25 | Réduis, par exemple 0.1 |
| Faux positifs : des boîtes apparaissent sans objet | conf | 0.25 | Augmente, par exemple 0.5 |
| Deux boîtes autour d’un même objet | iou | 0.7 | Réduis le seuil de chevauchement (IoU) de la NMS pour fusionner les doublons |
| Petits objets éloignés non détectés | imgsz | 640 | Augmente, par exemple 1280 (arrondi au multiple de 32) |
| Seules certaines classes sont pertinentes | classes | toutes | par exemple classes=[0] pour les personnes |
| Matériel inadapté | device | auto | cpu, mps ou un indice de GPU comme 0 |
Le score de confiance change le résultat, pas seulement le nombre de détections. Sur la même image de bus :
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
model("https://ultralytics.com/images/bus.jpg", conf=0.5, classes=[0]) # 4 persons
model("https://ultralytics.com/images/bus.jpg", conf=0.1) # 5 personnes, 1 bus, 1 panneau d’arrêtAvec conf=0.1, le modèle signale aussi un panneau d’arrêt dont il n’était pas sûr. Réduire conf est le moyen le plus rapide de voir ce qu’un modèle a presque détecté. Tous les autres paramètres figurent dans la référence de configuration.
Si une prédiction ne renvoie rien, suis ces étapes :
Traiter plusieurs images#
Transmets une liste, un dossier ou un motif glob tel que "photos/*.jpg". Par défaut, Predict utilise batch=1 ; définis batch pour traiter plusieurs images à la fois avec le modèle, ce qui est beaucoup plus rapide sur un GPU :
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
images = ["https://ultralytics.com/images/bus.jpg", "https://ultralytics.com/images/zidane.jpg"]
for result in model(images, batch=2):
print(result.path, len(result.boxes), result.verbose())image0.jpg 5 4 persons, 1 bus,
image1.jpg 3 2 persons, 1 tie,Éviter ces erreurs#
Symptôme : KeyError: tensor([5.]). Cause : box.cls et box.conf sont des tenseurs PyTorch, et result.names est un dictionnaire indexé par int. Solution : convertis-les d’abord : result.names[int(box.cls)], float(box.conf), box.xyxy[0].tolist().
Symptôme : une fonction auxiliaire qui appelle YOLO("yolo26n.pt") s’exécute lentement. Sur le CPU d’un ordinateur portable, le rechargement du modèle pour chaque image a pris 71 ms, contre 25 ms lorsque le modèle n’était chargé qu’une fois. Solution : crée le modèle une fois au démarrage et réutilise-le pour chaque image.
model(list_or_folder) collecte en mémoire chaque objet Results avant de renvoyer le résultat. Pour les dossiers volumineux et toutes les vidéos, passe stream=True et itère : les résultats arrivent un par un. La leçon sur la vidéo traite ce sujet en détail.
Afficher la solution
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # load once
images = ["https://ultralytics.com/images/bus.jpg", "https://ultralytics.com/images/zidane.jpg"]
for result in model(images, verbose=False):
top3 = sorted(result.summary(), key=lambda d: d["confidence"], reverse=True)[:3]
print(f"{result.path}: {len(result.boxes)} detections")
for d in top3:
print(f" {d['name']:>8} {d['confidence']:.2f}")image0.jpg: 5 detections
bus 0.90
person 0.85
person 0.85
image1.jpg: 3 detections
person 0.89
person 0.79
tie 0.59summary() renvoie déjà des noms ordinaires et des nombres flottants : aucun tenseur n’est donc à convertir. Les scores de confiance diffèrent légèrement de predict.py, car une liste d’images est complétée jusqu’à une forme commune. Avec conf=0.1, bus.jpg ajoute un panneau d’arrêt.