Isolamento degli oggetti di segmentazione
Dopo aver eseguito l'attività di segmentazione, a volte è auspicabile estrarre gli oggetti isolati dai risultati dell'inferenza. Questa guida fornisce una ricetta generica su come ottenere questo risultato utilizzando lamodalità Ultralytics Predict.
Passaggio della ricetta
Consulta la sezione Installazione rapida diUltralytics per una guida rapida all'installazione delle librerie necessarie.
Carica un modello ed esegui
predict()
su una sorgente.from ultralytics import YOLO # Load a model model = YOLO("yolo11n-seg.pt") # Run inference results = model.predict()
Nessun argomento di previsione?
Senza specificare una fonte, verranno utilizzate le immagini di esempio della libreria:
Questo è utile per effettuare test rapidi con il
predict()
metodo.Per ulteriori informazioni sui Modelli di Segmentazione, visita la pagina Segmento Attività pagina. Per saperne di più su
predict()
metodo, vedi Modalità Previsione nella sezione della Documentazione.Ora itera sui risultati e sui contorni. Per i flussi di lavoro che desiderano salvare un'immagine su file, l'immagine di origine
base-name
e il rilevamentoclass-label
vengono recuperati per un uso successivo (opzionale).from pathlib import Path import numpy as np # (2) Iterate detection results (helpful for multiple images) for r in res: img = np.copy(r.orig_img) img_name = Path(r.path).stem # source image base-name # Iterate each object contour (multiple detections) for ci, c in enumerate(r): # (1) Get detection class name label = c.names[c.boxes.cls.tolist().pop()]
- Per saperne di più su come lavorare con i risultati del rilevamento, consulta la sezione Boxes per la modalità Predict.
- Per saperne di più
predict()
risultati vedi Lavorare con i risultati della modalità Predict
Per-loop
Una singola immagine itererà il primo ciclo una sola volta. Un'immagine singola con un solo rilevamento itererà ogni ciclo una sola volta.
Inizia generando una maschera binaria dall'immagine di partenza e poi disegna un contorno pieno sulla maschera. In questo modo l'oggetto verrà isolato dalle altre parti dell'immagine. Un esempio tratto da
bus.jpg
per uno dei dati rilevatiperson
è mostrato a destra.import cv2 # Create binary mask b_mask = np.zeros(img.shape[:2], np.uint8) # (1) Extract contour result contour = c.masks.xy.pop() # (2) Changing the type contour = contour.astype(np.int32) # (3) Reshaping contour = contour.reshape(-1, 1, 2) # Draw contour onto mask _ = cv2.drawContours(b_mask, [contour], -1, (255, 255, 255), cv2.FILLED)
Per maggiori informazioni su
c.masks.xy
vedere Sezione Maschere dalla modalità Previsione.Qui i valori vengono inseriti in
np.int32
per la compatibilità condrawContours()
function from OpenCV.L'OpenCV
drawContours()
la funzione si aspetta che i contorni abbiano una forma di[N, 1, 2]
espandi la sezione sottostante per maggiori dettagli.
Espandi la comprensione di ciò che sta accadendo quando si definiscono i parametri di
contour
variabile.c.masks.xy
:: Fornisce le coordinate dei punti del contorno della maschera nel formato(x, y)
. Per maggiori dettagli, consulta la sezione Sezione Maschere dalla modalità Previsione..pop()
:: Comemasks.xy
è un elenco contenente un singolo elemento, questo elemento viene estratto utilizzando il metodopop()
metodo..astype(np.int32)
:: Utilizzomasks.xy
restituirà un tipo di dati difloat32
ma questo non sarà compatibile con OpenCVdrawContours()
quindi cambierà il tipo di dati inint32
per la compatibilità..reshape(-1, 1, 2)
:: Riformatta i dati nella forma richiesta di[N, 1, 2]
doveN
è il numero di punti del contorno, con ogni punto rappresentato da un singolo elemento1
e la voce è composta da2
valori. Il-1
indica che il numero di valori lungo questa dimensione è flessibile.
Espandi per una spiegazione del
drawContours()
configurazione.Incapsulamento del
contour
tra parentesi quadre,[contour]
è stato trovato in grado di generare efficacemente la maschera di contorno desiderata durante i test.Il valore
-1
specificato per l'opzionedrawContours()
indica alla funzione di disegnare tutti i contorni presenti nell'immagine.Il
tuple
(255, 255, 255)
rappresenta il colore bianco, che è il colore desiderato per disegnare il contorno in questa maschera binaria.L'aggiunta di
cv2.FILLED
colorerà tutti i pixel racchiusi dal contorno allo stesso modo; in questo caso, tutti i pixel racchiusi saranno bianchi.Vedi Documentazione di OpenCV su
drawContours()
per maggiori informazioni.
Poi ci sono due opzioni per procedere con l'immagine a partire da questo punto e un'opzione successiva per ciascuna di esse.
Opzioni di isolamento degli oggetti
Esempio
# Create 3-channel mask mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR) # Isolate object with binary mask isolated = cv2.bitwise_and(mask3ch, img)
Come funziona?
Innanzitutto, la maschera binaria viene convertita da un'immagine a canale singolo a un'immagine a tre canali. Questa conversione è necessaria per la fase successiva in cui la maschera e l'immagine originale vengono combinate. Entrambe le immagini devono avere lo stesso numero di canali per essere compatibili con l'operazione di fusione.
L'immagine originale e la maschera binaria a tre canali vengono unite utilizzando la funzione OpenCV
bitwise_and()
. Questa operazione conserva solo valori dei pixel maggiori di zero(> 0)
da entrambe le immagini. Poiché i pixel della maschera sono maggiori di zero(> 0)
solo all'interno della regione del contorno, i pixel rimanenti dell'immagine originale sono quelli che si sovrappongono al contorno.
Isola con pixel neri: Sotto-opzioni
Immagine a grandezza naturale
Non sono necessari ulteriori passaggi se si conserva l'immagine a grandezza naturale.
Immagine dell'oggetto ritagliata
Sono necessari ulteriori passaggi per ritagliare l'immagine in modo da includere solo la regione dell'oggetto.
# (1) Bounding box coordinates x1, y1, x2, y2 = c.boxes.xyxy.cpu().numpy().squeeze().astype(np.int32) # Crop image to object region iso_crop = isolated[y1:y2, x1:x2]
- For more information on bounding box results, see Boxes Section from Predict Mode
Cosa fa questo codice?
Il
c.boxes.xyxy.cpu().numpy()
recupera i riquadri di delimitazione come array NumPy nell'arrayxyxy
formato, dovexmin
,ymin
,xmax
, eymax
rappresentano le coordinate del rettangolo di delimitazione. Vedi Sezione Scatole dalla modalità Predict per maggiori dettagli.Il
squeeze()
rimuove le dimensioni non necessarie dall'array NumPy, assicurandosi che abbia la forma prevista.Convertire i valori delle coordinate utilizzando
.astype(np.int32)
cambia il tipo di dati delle coordinate della casella dafloat32
aint32
, rendendoli compatibili con il ritaglio delle immagini utilizzando le fette di indice.Infine, la regione del rettangolo di selezione viene ritagliata dall'immagine utilizzando l'index slicing. I limiti sono definiti dal parametro
[ymin:ymax, xmin:xmax]
coordinate del rettangolo di selezione del rilevamento.
# Isolate object with transparent background (when saved as PNG) isolated = np.dstack([img, b_mask])
Come funziona?
- Utilizzo di NumPy
dstack()
(impilamento di array lungo l'asse di profondità) insieme alla maschera binaria generata, creerà un'immagine con quattro canali. In questo modo tutti i pixel al di fuori del contorno dell'oggetto saranno trasparenti quando verranno salvati come immaginiPNG
file.
Isola con pixel trasparenti: Sotto-opzioni
Immagine a grandezza naturale
Non sono necessari ulteriori passaggi se si conserva l'immagine a grandezza naturale.
Immagine dell'oggetto ritagliata
Sono necessari ulteriori passaggi per ritagliare l'immagine in modo da includere solo la regione dell'oggetto.
# (1) Bounding box coordinates x1, y1, x2, y2 = c.boxes.xyxy.cpu().numpy().squeeze().astype(np.int32) # Crop image to object region iso_crop = isolated[y1:y2, x1:x2]
- Per maggiori informazioni sui risultati dei riquadri di delimitazione, consulta la sezione Riquadri dalla modalità Previsione.
Cosa fa questo codice?
Quando si utilizza
c.boxes.xyxy.cpu().numpy()
, i riquadri di delimitazione vengono restituiti come array NumPy, utilizzando l'opzionexyxy
formato delle coordinate della scatola, che corrispondono ai puntixmin, ymin, xmax, ymax
per il rettangolo di delimitazione (rettangolo), vedi Sezione Scatole dalla modalità Predict per maggiori informazioni.Aggiunta di
squeeze()
assicura che qualsiasi dimensione estranea venga rimossa dall'array NumPy.Convertire i valori delle coordinate utilizzando
.astype(np.int32)
cambia il tipo di dati delle coordinate della casella dafloat32
aint32
che sarà compatibile quando si ritaglia l'immagine utilizzando le fette di indice.Infine, la regione dell'immagine per il riquadro di delimitazione viene ritagliata utilizzando l'index slicing, in cui i limiti vengono impostati utilizzando l'opzione
[ymin:ymax, xmin:xmax]
coordinate del rettangolo di selezione del rilevamento.
E se volessi ritagliare l'oggetto , compreso lo sfondo?
Si tratta di una funzione integrata nella libreria Ultralytics . Vedi la sezione
save_crop
argomento per Argomenti di inferenza della modalità di previsione per i dettagli.La scelta del passo successivo spetta esclusivamente a te, in quanto sviluppatore. Viene mostrato un esempio di base di un possibile passo successivo (salvare l'immagine in un file per un uso futuro).
- NOTA: questo passaggio è facoltativo e può essere saltato se non è necessario per il tuo caso d'uso specifico.
Esempio di passo finale
- In questo esempio, il
img_name
è il nome di base del file immagine di origine,label
è il nome della classe rilevata eci
is the index of the object detection (in case of multiple instances with the same class name).
Codice di esempio completo
In questo caso, tutti i passaggi della sezione precedente vengono combinati in un unico blocco di codice. Per un uso ripetuto, sarebbe ottimale definire una funzione che esegua alcuni o tutti i comandi contenuti nel file for
-Ma questo è un esercizio che lasciamo al lettore.
from pathlib import Path
import cv2
import numpy as np
from ultralytics import YOLO
m = YOLO("yolo11n-seg.pt") # (4)!
res = m.predict() # (3)!
# Iterate detection results (5)
for r in res:
img = np.copy(r.orig_img)
img_name = Path(r.path).stem
# Iterate each object contour (6)
for ci, c in enumerate(r):
label = c.names[c.boxes.cls.tolist().pop()]
b_mask = np.zeros(img.shape[:2], np.uint8)
# Create contour mask (1)
contour = c.masks.xy.pop().astype(np.int32).reshape(-1, 1, 2)
_ = cv2.drawContours(b_mask, [contour], -1, (255, 255, 255), cv2.FILLED)
# Choose one:
# OPTION-1: Isolate object with black background
mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
isolated = cv2.bitwise_and(mask3ch, img)
# OPTION-2: Isolate object with transparent background (when saved as PNG)
isolated = np.dstack([img, b_mask])
# OPTIONAL: detection crop (from either OPT1 or OPT2)
x1, y1, x2, y2 = c.boxes.xyxy.cpu().numpy().squeeze().astype(np.int32)
iso_crop = isolated[y1:y2, x1:x2]
# TODO your actions go here (2)
- La linea che popola
contour
viene riunito in un'unica riga qui, mentre prima era diviso in più righe. - Quello che c'è qui dipende da te!
- Per ulteriori informazioni, consulta la sezione Modalità Previsione.
- Per maggiori informazioni, consulta la sezione Attività di segmento.
- Per saperne di più su Lavorare con i risultati
- Per saperne di più sui risultati della maschera di segmentazione
DOMANDE FREQUENTI
How do I isolate objects using Ultralytics YOLO11 for segmentation tasks?
To isolate objects using Ultralytics YOLO11, follow these steps:
Carica il modello ed esegui l'inferenza:
Genera una maschera binaria e disegna i contorni:
Isola l'oggetto utilizzando la maschera binaria:
Per maggiori informazioni, consulta la guida sulla modalità Previsione e l'attività Segmento.
Quali sono le opzioni disponibili per salvare gli oggetti isolati dopo la segmentazione?
Ultralytics YOLO11 offers two main options for saving isolated objects:
Con sfondo nero:
Con uno sfondo trasparente:
Per ulteriori dettagli, visita la sezione Modalità Predittiva.
How can I crop isolated objects to their bounding boxes using Ultralytics YOLO11?
Per ritagliare gli oggetti isolati in base ai loro riquadri di delimitazione:
Recupera le coordinate del rettangolo di selezione:
Ritaglia l'immagine isolata:
Per saperne di più sui risultati dei riquadri di delimitazione, consulta la documentazione della Modalità Predittiva.
Why should I use Ultralytics YOLO11 for object isolation in segmentation tasks?
Ultralytics YOLO11 provides:
- Rilevamento e segmentazione degli oggetti ad alta velocità e in tempo reale.
- Generazione accurata di bounding box e maschere per un preciso isolamento degli oggetti.
- Documentazione completa e API facili da usare per uno sviluppo efficiente.
Esplora i vantaggi dell'utilizzo di YOLO nella documentazione sulle attività di segmento.
Can I save isolated objects including the background using Ultralytics YOLO11?
Yes, this is a built-in feature in Ultralytics YOLO11. Use the save_crop
nell'argomento predict()
metodo. Ad esempio:
Per saperne di più sul save_crop
nell'argomento Argomenti di inferenza della modalità di previsione sezione.