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érence → extraire chaque contour → isoler l'objet → enregistrer 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")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.
{ 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)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 depuisfloat32, que la fonctiondrawContours()d'OpenCV n'accepte pas..reshape(-1, 1, 2)reformate les points dans la disposition[N, 1, 2]attendue pardrawContours(), oùNest 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 :
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)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]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.