Vai al contenuto

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.

Esempio di segmentazione di oggetti isolati

Passeggiata con le ricette

  1. Consultate la sezione Installazione rapida diUltralytics per una rapida guida all'installazione delle librerie necessarie.


  2. 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:

    'ultralytics/assets/bus.jpg'
    'ultralytics/assets/zidane.jpg'
    

    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.


  3. 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 rilevamento class-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()]
    
    1. Per ulteriori informazioni sull'utilizzo dei risultati del rilevamento, consultare la sezione Box per la modalità Previsione.
    2. 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.


  4. 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 rilevati person è mostrato a destra.

    Immagine della maschera binaria

    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)
    
    1. Per maggiori informazioni su c.masks.xy vedere Sezione Maschere dalla modalità Previsione.

    2. Qui i valori vengono inseriti in np.int32 per la compatibilità con drawContours() da OpenCV.

    3. 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() :: Come masks.xy è un elenco contenente un singolo elemento, questo elemento viene estratto utilizzando il metodo pop() metodo.

    • .astype(np.int32) :: Utilizzo masks.xy restituirà un tipo di dati di float32ma non sarà compatibile con OpenCV. drawContours() quindi questo cambierà il tipo di dati in int32 per la compatibilità.

    • .reshape(-1, 1, 2) :: Riformatta i dati nella forma richiesta di [N, 1, 2] dove N è il numero di punti del contorno, con ciascun punto rappresentato da una singola voce 1e la voce è composta da 2 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 il drawContours() 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.


  5. 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.

    Esempio di immagine di oggetto isolato a grandezza naturale Sfondo nero
    Esempio di uscita a grandezza naturale

    Immagine dell'oggetto ritagliata

    Sono necessari ulteriori passaggi per ritagliare l'immagine in modo da includere solo la regione dell'oggetto.

    Esempio di ritaglio dell'immagine di un oggetto isolato Sfondo nero

    # (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]
    

    1. 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'array xyxy formato, dove xmin, ymin, xmax, e ymax 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 da float32 a int32, 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 immagine PNG file.

    Isolare con pixel trasparenti: Sotto-opzioni

    Immagine a grandezza naturale

    Non sono necessari ulteriori passaggi se si conserva l'immagine a grandezza naturale.

    Esempio di immagine di oggetto isolato a grandezza naturale senza sfondo
    Esempio di output a grandezza naturale + sfondo trasparente

    Immagine dell'oggetto ritagliata

    Sono necessari ulteriori passaggi per ritagliare l'immagine in modo da includere solo la regione dell'oggetto.

    Esempio di ritaglio dell'immagine di un oggetto isolato senza sfondo

    # (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]
    

    1. 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 metodo xyxy formato delle coordinate della casella, che corrispondono ai punti xmin, 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 da float32 a int32 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.


  6. 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
    # Save isolated object to file
    _ = cv2.imwrite(f"{img_name}_{label}-{ci}.png", iso_crop)
    
    • In questo esempio, il img_name è il nome di base del file immagine di origine, label è il nome della classe rilevata e ci è 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)
  1. La linea che popola contour viene riunito in un'unica riga qui, dove era stato diviso in più righe in precedenza.
  2. Quello che c'è qui dipende da voi!
  3. Per ulteriori informazioni, vedere Modalità di previsione.
  4. Per ulteriori informazioni, vedere Attività di segmento.
  5. Per saperne di più su Lavorare con i risultati
  6. 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:

  1. Caricare il modello ed eseguire l'inferenza:

    from ultralytics import YOLO
    
    model = YOLO("yolo11n-seg.pt")
    results = model.predict(source="path/to/your/image.jpg")
    
  2. Generare una maschera binaria e disegnare i contorni:

    import cv2
    import numpy as np
    
    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)
    
  3. Isolare l'oggetto utilizzando la maschera binaria:

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

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:

  1. Con sfondo nero:

    mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
    isolated = cv2.bitwise_and(mask3ch, img)
    
  2. Con sfondo trasparente:

    isolated = np.dstack([img, b_mask])
    

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:

  1. Recupera le coordinate del rettangolo di selezione:

    x1, y1, x2, y2 = results[0].boxes.xyxy[0].cpu().numpy().astype(np.int32)
    
  2. Ritagliare l'immagine isolata:

    iso_crop = isolated[y1:y2, x1:x2]
    

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:

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

Per saperne di più sul save_crop nell'argomento Modalità di previsione Argomenti di inferenza sezione.

📅C reato 1 anno fa ✏️ Aggiornato 2 mesi fa

Commenti