Meet YOLO26: next-gen vision AI.

Link to this sectionComment isoler des objets segmentés avec Ultralytics YOLO#

La segmentation d'instances produit un masque précis au pixel près pour chaque objet détecté, ce qui signifie que tu peux extraire chaque objet d'une image individuellement. Ce guide te montre comment transformer les résultats de segmentation d'Ultralytics YOLO en objets isolés en utilisant le Mode Prédiction et OpenCV, avec soit un fond noir uni, soit un fond transparent pour l'enregistrement au format PNG.



Watch: How to Remove Background and Isolate Objects with Ultralytics YOLO Segmentation & OpenCV in Python 🚀

Link to this sectionPourquoi isoler des objets segmentés ?#

Extraire des objets individuels d'une image ouvre la porte à toute une série de flux de travail en aval :

  • Suppression de l'arrière-plan pour des photos de produits, des catalogues ou de l'édition créative.
  • Recadrages par objet pour construire des jeux de données de classification à partir de tes détections.
  • Traitement ciblé pour que les étapes ultérieures comme l'OCR, l'analyse des couleurs ou la mesure ne voient que l'objet, et non la scène environnante.
  • Export PNG transparent pour composer des objets sur de nouveaux arrière-plans.

La méthode fonctionne avec n'importe quel modèle de segmentation Ultralytics YOLO et suit quatre étapes : exécuter l'inférenceextraire chaque contourisoler l'objetenregistrer le résultat.

Link to this sectionExécuter l'inférence de segmentation#

Installe les bibliothèques requises, puis charge un modèle de segmentation (le suffixe -seg est requis pour produire des masques) et exécute la prédiction sur ton image source :

from ultralytics import YOLO

# Load a segmentation model
model = YOLO("yolo26n-seg.pt")

# Run inference on a source
results = model.predict(source="path/to/image.jpg")
Pas de source ? YOLO utilise les images d'exemple fournies

Si tu appelles model.predict() sans source, Ultralytics utilise les images d'exemple fournies avec le paquet (bus.jpg et zidane.jpg), ce qui est pratique pour tester rapidement le flux de travail.

Link to this sectionExtraire les contours des objets#

Chaque élément dans results correspond à une image, et itérer sur un résultat permet d'obtenir une détection à la fois. Pour chaque détection, copie l'image originale, lis l'étiquette de classe et dessine le contour du masque de l'objet sur un masque binaire vierge. La zone blanche de ce masque marque exactement quels pixels appartiennent à l'objet.

Les extraits de cette section et de la suivante s'exécutent à l'intérieur de la boucle de détection ci-dessous ; le script complet, prêt à être copié, se trouve dans Exemple complet.

Image du masque binaire{ width="240", align="right" }

from pathlib import Path

import cv2
import numpy as np

for r in results:
    img = np.copy(r.orig_img)
    img_name = Path(r.path).stem  # source image base-name

    # Iterate each detected object in the image
    for ci, c in enumerate(r):
        label = c.names[c.boxes.cls.tolist().pop()]  # class name

        # Build a binary mask and draw the object contour onto it
        b_mask = np.zeros(img.shape[:2], np.uint8)
        contour = c.masks.xy[0].astype(np.int32).reshape(-1, 1, 2)
        cv2.drawContours(b_mask, [contour], -1, (255, 255, 255), cv2.FILLED)
Que fait `c.masks.xy[0].astype(np.int32).reshape(-1, 1, 2)` ?
  • c.masks.xy[0] renvoie le contour du masque sous forme de coordonnées de points (x, y) pour l'objet dans ce résultat de détection unique.
  • .astype(np.int32) convertit les points depuis float32, que la fonction drawContours() d'OpenCV n'accepte pas.
  • .reshape(-1, 1, 2) reformate les points dans la disposition [N, 1, 2] attendue par drawContours(), où N est le nombre de points du contour.

Passer [contour] avec l'indice -1 dessine tous les points du contour fourni, et cv2.FILLED remplit chaque pixel englobé en blanc.

Link to this sectionIsoler l'objet#

Une fois le masque binaire prêt, combine-le avec l'image originale. Il existe deux styles courants, selon ce que tu souhaites obtenir pour l'arrière-plan :

Choisis un style d'isolation

Convertis le masque en trois canaux et ne garde que les pixels qui chevauchent l'objet. Tout ce qui se trouve en dehors du contour devient noir :

# Isolate object with a black background
mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
isolated = cv2.bitwise_and(mask3ch, img)
![Example Full size Isolated Object Image Black Background](https://cdn.jsdelivr.net/gh/ultralytics/assets@main/docs/full-size-isolated-object-black-background.avif){ width=240 }
Full-size object on a black background
Recadrer vers la boîte englobante

Pour ne conserver que la zone de l'objet au lieu de l'image en taille réelle, découpe-la selon la boîte englobante de la détection :

# Bounding box coordinates
x1, y1, x2, y2 = c.boxes.xyxy.cpu().numpy().squeeze().astype(np.int32)
# Crop the isolated image to the object region
iso_crop = isolated[y1:y2, x1:x2]
![Example Crop Isolated Object Image Black Background](https://cdn.jsdelivr.net/gh/ultralytics/assets@main/docs/example-crop-isolated-object-image-black-background.avif){ width=240 }
Object cropped to its bounding box
Besoin du recadrage avec son arrière-plan original ?

C'est intégré. Passe save_crop=True à predict() et Ultralytics enregistre automatiquement les recadrages des boîtes englobantes, sans nécessiter de masquage.

Link to this sectionEnregistrer le résultat (optionnel)#

Ce que tu fais avec chaque objet isolé dépend de toi. Une étape suivante courante consiste à l'écrire sur le disque pour une utilisation ultérieure :

# Save the isolated object to file
cv2.imwrite(f"{img_name}_{label}-{ci}.png", isolated)

Ici, img_name est le nom de base de l'image source, label est le nom de la classe, et ci est l'indice de détection, afin que plusieurs instances de la même classe obtiennent des noms de fichiers uniques. Remplace isolated par iso_crop si tu as appliqué le recadrage optionnel ci-dessus.

Link to this sectionExemple complet#

Le script ci-dessous combine chaque étape en un seul bloc exécutable. Il utilise un arrière-plan noir par défaut ; remplace la ligne marquée par np.dstack([img, b_mask]) pour obtenir un PNG transparent à la place :

from pathlib import Path

import cv2
import numpy as np

from ultralytics import YOLO

model = YOLO("yolo26n-seg.pt")
results = model.predict(source="path/to/image.jpg")

for r in results:
    img = np.copy(r.orig_img)
    img_name = Path(r.path).stem

    for ci, c in enumerate(r):
        label = c.names[c.boxes.cls.tolist().pop()]

        # Build a binary mask from the object contour
        b_mask = np.zeros(img.shape[:2], np.uint8)
        contour = c.masks.xy[0].astype(np.int32).reshape(-1, 1, 2)
        cv2.drawContours(b_mask, [contour], -1, (255, 255, 255), cv2.FILLED)

        # Isolate the object (black background)
        mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
        isolated = cv2.bitwise_and(mask3ch, img)  # transparent PNG: isolated = np.dstack([img, b_mask])

        # Save or add your custom post-processing here
        cv2.imwrite(f"{img_name}_{label}-{ci}.png", isolated)

        # Optional: crop to the bounding box before saving
        # x1, y1, x2, y2 = c.boxes.xyxy.cpu().numpy().squeeze().astype(np.int32)
        # cv2.imwrite(f"{img_name}_{label}-{ci}.png", isolated[y1:y2, x1:x2])

Pour une utilisation répétée, enveloppe le corps de la boucle dans une fonction afin de pouvoir l'appeler sur de nombreuses images.

Link to this sectionConclusion#

Tu possèdes maintenant une recette complète pour isoler des objets segmentés avec Ultralytics YOLO : exécute l'inférence, construis un masque binaire à partir de chaque contour, puis extrais l'objet sur un fond noir ou transparent et recadre-le éventuellement selon sa boîte englobante. Explore la documentation complète sur la Tâche de segmentation et le Mode Prédiction pour adapter ce flux de travail à tes propres classes.

Link to this sectionFAQ#

Link to this sectionComment isoler des objets en utilisant Ultralytics YOLO pour des tâches de segmentation ?#

Charge un modèle de segmentation, exécute l'inférence, construis un masque binaire à partir du contour de chaque détection et combine-le avec l'image originale :

import cv2
import numpy as np

from ultralytics import YOLO

model = YOLO("yolo26n-seg.pt")
results = model.predict(source="path/to/your/image.jpg")

img = np.copy(results[0].orig_img)
b_mask = np.zeros(img.shape[:2], np.uint8)
contour = results[0].masks.xy[0].astype(np.int32).reshape(-1, 1, 2)
cv2.drawContours(b_mask, [contour], -1, (255, 255, 255), cv2.FILLED)

mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
isolated = cv2.bitwise_and(mask3ch, img)

Consulte l'Exemple complet pour voir la boucle de détection complète.

Link to this sectionQuelles options sont disponibles pour enregistrer les objets isolés après la segmentation ?#

Il existe deux styles principaux. Pour un arrière-plan noir, convertis le masque en trois canaux et utilise cv2.bitwise_and(). Pour un arrière-plan transparent (lors de l'enregistrement en PNG), empile le masque en tant que quatrième canal alpha avec np.dstack([img, b_mask]). Les deux sont présentés dans Isoler l'objet.

Link to this sectionComment puis-je recadrer des objets isolés selon leurs boîtes englobantes ?#

Lis les coordonnées de la boîte englobante à partir de la détection et découpe l'image isolée :

x1, y1, x2, y2 = results[0].boxes.xyxy[0].cpu().numpy().astype(np.int32)
iso_crop = isolated[y1:y2, x1:x2]

Apprends-en plus sur les résultats des boîtes englobantes dans la documentation du Mode Prédiction.

Link to this sectionPourquoi devrais-je utiliser Ultralytics YOLO pour l'isolation d'objets dans des tâches de segmentation ?#

Ultralytics YOLO fournit une segmentation d'instances rapide et en temps réel avec une génération précise de masques et de boîtes englobantes, ainsi qu'une API Python simple qui transforme les résultats d'inférence en objets isolés avec quelques lignes de code OpenCV.

Link to this sectionPuis-je enregistrer des objets isolés en incluant l'arrière-plan avec Ultralytics YOLO ?#

Oui. Utilise l'argument save_crop dans predict() pour enregistrer les recadrages des boîtes englobantes avec leur arrière-plan original :

results = model.predict(source="path/to/your/image.jpg", save_crop=True)

Lis la suite dans la section Arguments d'inférence du Mode Prédiction.

Commentaires