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.
Passeggiata con le ricette
-
Consultate la sezione Installazione rapida diUltralytics per una rapida guida all'installazione delle librerie necessarie.
-
Caricare un modello ed eseguirlo
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 un'origine, 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, visitare il sito web Segmento Compito pagina. Per saperne di più
predict()
metodo, vedere Modalità di previsione della sezione Documentazione.
-
Ora si iterano i risultati e i 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 ulteriori informazioni sull'utilizzo dei risultati del rilevamento, consultare la sezione Box per la modalità Previsione.
- Per saperne di più
predict()
risultati vedi Lavorare con i risultati della modalità Previsione
A ciclo continuo
Un'immagine singola itera il primo ciclo una sola volta. Un'immagine singola con un solo rilevamento itererà ogni ciclo una sola volta.
-
Iniziare a generare una maschera binaria dall'immagine di partenza e poi disegnare un contorno pieno sulla maschera. Ciò consentirà di isolare l'oggetto dalle altre parti dell'immagine. Un esempio da
bus.jpg
per uno dei punti 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()
da OpenCV. -
L'OpenCV
drawContours()
La funzione si aspetta che i contorni abbiano una forma di[N, 1, 2]
espandere la sezione sottostante per maggiori dettagli.
Espandere la comprensione di ciò che sta accadendo durante la definizione del
contour
variabile.-
c.masks.xy
:: Fornisce le coordinate dei punti di contorno della maschera nel formato(x, y)
. Per ulteriori dettagli, consultare 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 non sarà compatibile con OpenCV.drawContours()
quindi questo 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 ciascun punto rappresentato da una singola voce1
e la voce è composta da2
valori. Il-1
indica che il numero di valori lungo questa dimensione è flessibile.
Espandere per una spiegazione del
drawContours()
configurazione.-
Incapsulamento del
contour
tra parentesi quadre,[contour]
è risultato in grado di generare efficacemente la maschera di contorno desiderata durante i test. -
Il valore
-1
specificato per ildrawContours()
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à allo stesso modo tutti i pixel racchiusi dal contorno; in questo caso, tutti i pixel racchiusi saranno bianchi. -
Vedi Documentazione di OpenCV su
drawContours()
per maggiori informazioni.
-
-
Quindi 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 di OpenCV
bitwise_and()
. Questa operazione mantiene 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.
Isolare 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]
- Per ulteriori informazioni sui risultati dei riquadri di delimitazione, consultare la sezione Riquadri dalla modalità Previsione.
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. Vedere Sezione scatole dalla modalità Predict per maggiori dettagli. -
Il
squeeze()
rimuove le dimensioni non necessarie dall'array NumPy, assicurando 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 tramite 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 della matrice lungo l'asse di profondità) insieme alla maschera binaria generata, creerà un'immagine con quattro canali. Ciò consente di rendere trasparenti tutti i pixel al di fuori del contorno dell'oggetto quando si salva come immaginePNG
file.
Isolare 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 ulteriori informazioni sui risultati dei riquadri di delimitazione, consultare 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 il metodoxyxy
formato delle coordinate della casella, che corrispondono ai puntixmin, ymin, xmax, ymax
per il rettangolo di delimitazione (rettangolo), vedere Sezione scatole dalla modalità Predict per maggiori informazioni. -
Aggiunta di
squeeze()
assicura che qualsiasi dimensione estranea sia 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 usando le fette di indice. -
Infine, l'area dell'immagine per il riquadro di delimitazione viene ritagliata utilizzando l'index slicing, dove i limiti vengono impostati utilizzando l'opzione
[ymin:ymax, xmin:xmax]
coordinate del rettangolo di selezione del rilevamento.
E se si desidera che l'oggetto ritagliato includa lo sfondo?
Si tratta di una funzione integrata nella libreria Ultralytics . Vedere la sezione
save_crop
argomento per Modalità di previsione Argomenti di inferenza per i dettagli.
-
-
La scelta delle azioni successive è interamente affidata allo 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 caso d'uso specifico.
Esempio Fase finale
- In questo esempio, il
img_name
è il nome di base del file immagine di origine,label
è il nome della classe rilevata eci
è l'indice dell'elemento rilevamento degli oggetti (in caso di istanze multiple con lo stesso nome di classe).
Codice di esempio completo
In questo caso, tutti i passaggi della sezione precedente sono 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 lasciato 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, dove era stato diviso in più righe in precedenza. - Quello che c'è qui dipende da voi!
- Per ulteriori informazioni, vedere Modalità di previsione.
- Per ulteriori informazioni, vedere Attività di segmento.
- Per saperne di più su Lavorare con i risultati
- Per saperne di più sui risultati della maschera di segmentazione
FAQ
Come si isolano gli oggetti utilizzando Ultralytics YOLO11 per le attività di segmentazione?
Per isolare gli oggetti utilizzando Ultralytics YOLO11 , procedere come segue:
-
Caricare il modello ed eseguire l'inferenza:
-
Generare una maschera binaria e disegnare i contorni:
-
Isolare l'oggetto utilizzando la maschera binaria:
Per ulteriori informazioni, consultare la guida sulla modalità di previsione e sull'attività di segmento.
Quali sono le opzioni disponibili per salvare gli oggetti isolati dopo la segmentazione?
Ultralytics YOLO11 offre due opzioni principali per il salvataggio di oggetti isolati:
-
Con sfondo nero:
-
Con sfondo trasparente:
Per ulteriori dettagli, visitate la sezione Modalità di previsione.
Come posso ritagliare oggetti isolati in base ai loro riquadri di delimitazione utilizzando Ultralytics YOLO11 ?
Per ritagliare gli oggetti isolati in base alle loro caselle di delimitazione:
-
Recupera le coordinate del rettangolo di selezione:
-
Ritagliare l'immagine isolata:
Per ulteriori informazioni sui risultati dei riquadri di delimitazione, consultare la documentazione sulla modalità di previsione.
Perché utilizzare Ultralytics YOLO11 per l'isolamento degli oggetti nelle attività di segmentazione?
Ultralytics YOLO11 fornisce:
- Rilevamento e segmentazione di oggetti ad alta velocità e in tempo reale.
- Generazione accurata di rettangoli di selezione e maschere per un preciso isolamento degli oggetti.
- Documentazione completa e API di facile utilizzo per uno sviluppo efficiente.
Esplorate i vantaggi dell'uso di YOLO nella documentazione sulle attività di segmento.
È possibile salvare oggetti isolati, compreso lo sfondo, utilizzando Ultralytics YOLO11 ?
Sì, questa è una funzione integrata in Ultralytics YOLO11 . Utilizzate la funzione save_crop
nell'argomento predict()
metodo. Ad esempio:
Per saperne di più sul save_crop
nell'argomento Modalità di previsione Argomenti di inferenza sezione.