Saltar al contenido

Aislar objetos de segmentaci贸n

Tras realizar la Tarea Segmento, a veces es conveniente extraer los objetos aislados de los resultados de la inferencia. Esta gu铆a proporciona una receta gen茅rica sobre c贸mo lograrlo utilizando elModo Predecir de Ultralytics .

Ejemplo Segmentaci贸n de objetos aislados

Recorrido por las recetas

  1. Consulta la secci贸n Instalaci贸n r谩pida deUltralytics para obtener una gu铆a r谩pida sobre la instalaci贸n de las bibliotecas necesarias.


  2. Carga un modelo y ejec煤talo predict() en una fuente.

    from ultralytics import YOLO
    
    # Load a model
    model = YOLO("yolo11n-seg.pt")
    
    # Run inference
    results = model.predict()
    

    驴No hay argumentos de predicci贸n?

    Sin especificar una fuente, se utilizar谩n las im谩genes de ejemplo de la biblioteca:

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

    Esto es 煤til para realizar pruebas r谩pidas con el predict() m茅todo.

    Para obtener informaci贸n adicional sobre los Modelos de Segmentaci贸n, visita la p谩gina Segmento Tarea p谩gina. Para saber m谩s sobre predict() ver Modo Predecir de la Documentaci贸n.


  3. Ahora itera sobre los resultados y los contornos. Para los flujos de trabajo que quieren guardar una imagen en un archivo, la imagen de origen base-name y la detecci贸n class-label se recuperan para su uso posterior (opcional).

    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. Para saber m谩s sobre c贸mo trabajar con los resultados de la detecci贸n, consulta la Secci贸n de recuadros para el modo Predecir.
    2. Para saber m谩s sobre predict() resultados ver Trabajar con los resultados del modo Predecir
    Bucle For

    Una sola imagen s贸lo iterar谩 el primer bucle una vez. Una sola imagen con una sola detecci贸n iterar谩 cada bucle s贸lo una vez.


  4. Empieza por generar una m谩scara binaria a partir de la imagen de origen y luego dibuja un contorno relleno sobre la m谩scara. Esto permitir谩 aislar el objeto de las dem谩s partes de la imagen. Un ejemplo de bus.jpg para uno de los detectados person se muestra a la derecha.

    Imagen de m谩scara 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. Para m谩s informaci贸n sobre c.masks.xy consulta Secci贸n M谩scaras del modo Predecir.

    2. Aqu铆 los valores se introducen en np.int32 para compatibilidad con drawContours() function from OpenCV.

    3. El OpenCV drawContours() espera que los contornos tengan una forma de [N, 1, 2] ampl铆a la secci贸n de abajo para m谩s detalles.

    Ampliar para comprender lo que ocurre al definir la contour variable.

    • c.masks.xy :: Proporciona las coordenadas de los puntos del contorno de la m谩scara en el formato (x, y). Para m谩s detalles, consulta Secci贸n M谩scaras del modo Predecir.

    • .pop() :: Como masks.xy es una lista que contiene un solo elemento, este elemento se extrae utilizando la funci贸n pop() m茅todo.

    • .astype(np.int32) :: Utilizando masks.xy devolver谩 con un tipo de datos de float32pero esto no ser谩 compatible con el OpenCV drawContours() as铆 que esto cambiar谩 el tipo de datos a int32 para la compatibilidad.

    • .reshape(-1, 1, 2) :: Reformatea los datos en la forma requerida de [N, 1, 2] donde N es el n煤mero de puntos del contorno, con cada punto representado por una 煤nica entrada 1y la entrada se compone de 2 valores. En -1 denota que el n煤mero de valores a lo largo de esta dimensi贸n es flexible.

    Ampliar para una explicaci贸n de la drawContours() configuraci贸n.

    • Encapsular la contour variable entre corchetes, [contour]gener贸 eficazmente la m谩scara de contorno deseada durante las pruebas.

    • El valor -1 especificado para el drawContours() indica a la funci贸n que dibuje todos los contornos presentes en la imagen.

    • En tuple (255, 255, 255) representa el color blanco, que es el color deseado para dibujar el contorno en esta m谩scara binaria.

    • La adici贸n de cv2.FILLED colorear谩 todos los p铆xeles encerrados por el l铆mite del contorno de la misma manera, en este caso, todos los p铆xeles encerrados ser谩n blancos.

    • Consulta Documentaci贸n de OpenCV en drawContours() para m谩s informaci贸n.


  5. A continuaci贸n hay 2 opciones sobre c贸mo avanzar con la imagen a partir de este punto y una opci贸n posterior para cada una.

    Opciones de aislamiento de objetos

    Ejemplo

    # Create 3-channel mask
    mask3ch = cv2.cvtColor(b_mask, cv2.COLOR_GRAY2BGR)
    
    # Isolate object with binary mask
    isolated = cv2.bitwise_and(mask3ch, img)
    
    驴C贸mo funciona?
    • En primer lugar, la m谩scara binaria se convierte de una imagen de un solo canal a una imagen de tres canales. Esta conversi贸n es necesaria para el paso posterior en el que se combinan la m谩scara y la imagen original. Ambas im谩genes deben tener el mismo n煤mero de canales para que sean compatibles con la operaci贸n de mezcla.

    • La imagen original y la m谩scara binaria de tres canales se fusionan utilizando la funci贸n OpenCV bitwise_and(). Esta operaci贸n conserva s贸lo valores de p铆xel mayores que cero (> 0) de ambas im谩genes. Como los p铆xeles de la m谩scara son mayores que cero (> 0) s贸lo dentro de la regi贸n del contorno, los p铆xeles que quedan de la imagen original son los que se solapan con el contorno.

    Aislar con p铆xeles negros: Subopciones

    Imagen a tama帽o completo

    No se requieren pasos adicionales si mantienes la imagen a tama帽o completo.

    Ejemplo Imagen Objeto Aislado Tama帽o Completo Fondo Negro
    Ejemplo de salida a tama帽o completo

    Objeto recortado Imagen

    Pasos adicionales necesarios para recortar la imagen de modo que s贸lo incluya la regi贸n del objeto.

    Ejemplo Recortar Imagen Objeto Aislado Fondo Negro

    # (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. For more information on bounding box results, see Boxes Section from Predict Mode
    驴Qu茅 hace este c贸digo?
    • En c.boxes.xyxy.cpu().numpy() recupera los recuadros delimitadores como una matriz NumPy en la funci贸n xyxy formato, donde xmin, ymin, xmaxy ymax representan las coordenadas del rect谩ngulo de la caja delimitadora. Consulta Secci贸n Cajas del Modo Predecir para m谩s detalles.

    • En squeeze() elimina cualquier dimensi贸n innecesaria de la matriz NumPy, garantizando que tenga la forma esperada.

    • Convertir los valores de las coordenadas mediante .astype(np.int32) cambia el tipo de datos de las coordenadas de la casilla de float32 a int32haci茅ndolas compatibles para el recorte de im谩genes mediante cortes 铆ndice.

    • Por 煤ltimo, la regi贸n del cuadro delimitador se recorta de la imagen mediante el corte de 铆ndice. Los l铆mites se definen mediante la funci贸n [ymin:ymax, xmin:xmax] coordenadas del cuadro delimitador de la detecci贸n.

    # Isolate object with transparent background (when saved as PNG)
    isolated = np.dstack([img, b_mask])
    
    驴C贸mo funciona?
    • Utilizar NumPy dstack() (apilamiento de matrices a lo largo del eje de profundidad) junto con la m谩scara binaria generada, crear谩 una imagen con cuatro canales. Esto permite que todos los p铆xeles fuera del contorno del objeto sean transparentes al guardarlos como un PNG archivo.

    Aislar con p铆xeles transparentes: Subopciones

    Imagen a tama帽o completo

    No se requieren pasos adicionales si mantienes la imagen a tama帽o completo.

    Ejemplo Imagen de objeto aislado a tama帽o completo Sin fondo
    Ejemplo de salida a tama帽o completo + fondo transparente

    Objeto recortado Imagen

    Pasos adicionales necesarios para recortar la imagen de modo que s贸lo incluya la regi贸n del objeto.

    Ejemplo Recortar Imagen Objeto Aislado Sin Fondo

    # (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. Para m谩s informaci贸n sobre los resultados de los recuadros delimitadores, consulta la secci贸n Recuadros del modo Predecir
    驴Qu茅 hace este c贸digo?
    • Al utilizar c.boxes.xyxy.cpu().numpy()las cajas delimitadoras se devuelven como una matriz NumPy, utilizando la funci贸n xyxy formato de coordenadas de casilla, que corresponden a los puntos xmin, ymin, xmax, ymax para el cuadro delimitador (rect谩ngulo), v茅ase Secci贸n Cajas del Modo Predecir para m谩s informaci贸n.

    • A帽adir squeeze() garantiza que se elimine cualquier dimensi贸n extra帽a de la matriz NumPy.

    • Convertir los valores de las coordenadas mediante .astype(np.int32) cambia el tipo de datos de las coordenadas de la casilla de float32 a int32 que ser谩 compatible al recortar la imagen mediante cortes 铆ndice.

    • Por 煤ltimo, la regi贸n de la imagen para el cuadro delimitador se recorta mediante el corte de 铆ndice, en el que los l铆mites se establecen mediante la funci贸n [ymin:ymax, xmin:xmax] coordenadas del cuadro delimitador de la detecci贸n.

    驴Y si quiero el objeto recortado incluyendo el fondo?

    Se trata de una funci贸n integrada en la biblioteca Ultralytics . Consulta la p谩gina save_crop argumento para Argumentos de Inferencia del Modo Predecir para m谩s detalles.


  6. Lo que se haga a continuaci贸n depende totalmente de ti como desarrollador. Se muestra un ejemplo b谩sico de un posible paso siguiente (guardar la imagen en un archivo para utilizarla en el futuro).

    • NOTA: este paso es opcional y puedes omitirlo si no es necesario para tu caso de uso espec铆fico.
    Ejemplo Paso final
    # Save isolated object to file
    _ = cv2.imwrite(f"{img_name}_{label}-{ci}.png", iso_crop)
    
    • En este ejemplo, la img_name es el nombre base del archivo de imagen de origen, label es el nombre de la clase detectada, y ci is the index of the object detection (in case of multiple instances with the same class name).

C贸digo de ejemplo completo

Aqu铆, todos los pasos de la secci贸n anterior se combinan en un 煤nico bloque de c贸digo. Para un uso repetido, lo 贸ptimo ser铆a definir una funci贸n que realice algunos o todos los comandos contenidos en el bloque de c贸digo for-loops, pero eso es un ejercicio que se deja al lector.

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 l铆nea que rellena contour se combina aqu铆 en una sola l铆nea, donde antes se divid铆a en varias.
  2. 隆Lo que vaya aqu铆 depende de ti!
  3. Consulta el Modo Predecir para obtener informaci贸n adicional.
  4. Para m谩s informaci贸n, consulta Tarea de segmento.
  5. M谩s informaci贸n sobre Trabajar con resultados
  6. M谩s informaci贸n sobre los Resultados de la M谩scara de Segmentaci贸n

PREGUNTAS FRECUENTES

How do I isolate objects using Ultralytics YOLO11 for segmentation tasks?

To isolate objects using Ultralytics YOLO11, follow these steps:

  1. Carga el modelo y ejecuta la inferencia:

    from ultralytics import YOLO
    
    model = YOLO("yolo11n-seg.pt")
    results = model.predict(source="path/to/your/image.jpg")
    
  2. Genera una m谩scara binaria y dibuja contornos:

    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. A铆sla el objeto utilizando la m谩scara binaria:

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

Consulta la gu铆a sobre el Modo Predecir y la Tarea Segmento para m谩s informaci贸n.

驴Qu茅 opciones hay para guardar los objetos aislados despu茅s de la segmentaci贸n?

Ultralytics YOLO11 offers two main options for saving isolated objects:

  1. Con fondo negro:

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

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

Para m谩s detalles, visita la secci贸n Modo Predecir.

How can I crop isolated objects to their bounding boxes using Ultralytics YOLO11?

Para recortar objetos aislados a sus cuadros delimitadores:

  1. Recupera las coordenadas de la caja delimitadora:

    x1, y1, x2, y2 = results[0].boxes.xyxy[0].cpu().numpy().astype(np.int32)
    
  2. Recorta la imagen aislada:

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

M谩s informaci贸n sobre los resultados del cuadro delimitador en la documentaci贸n del Modo Predecir.

Why should I use Ultralytics YOLO11 for object isolation in segmentation tasks?

Ultralytics YOLO11 provides:

  • Detecci贸n y segmentaci贸n de objetos a alta velocidad y en tiempo real.
  • Generaci贸n precisa de recuadros delimitadores y m谩scaras para aislar con precisi贸n los objetos.
  • Documentaci贸n completa y API f谩cil de usar para un desarrollo eficaz.

Explora las ventajas de utilizar YOLO en la documentaci贸n de la Tarea 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 argumento en el predict() m茅todo. Por ejemplo:

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

M谩s informaci贸n sobre el save_crop argumento en el Argumentos de Inferencia del Modo Predecir secci贸n.


馃搮 Created 10 months ago 鉁忥笍 Updated 4 days ago

Comentarios