Aislar objetos de segmentaci贸n
Despu茅s de 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 Predict de Ultralytics .
Recorrido por las recetas
-
Consulte la secci贸nUltralytics Quickstart Installation para obtener informaci贸n sobre la instalaci贸n de las bibliotecas necesarias.
-
Cargar un modelo y ejecutar
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?
Si no se especifica una fuente, se utilizar谩n las im谩genes de ejemplo de la biblioteca:
Esto es 煤til para realizar pruebas r谩pidas con el
predict()
m茅todo.Para m谩s informaci贸n sobre los modelos de segmentaci贸n, visite la p谩gina Segmento Tarea p谩gina. Para saber m谩s sobre
predict()
v茅ase Modo Predecir de la Documentaci贸n.
-
Ahora itere sobre los resultados y los contornos. Para los flujos de trabajo que desean guardar una imagen en un archivo, la imagen de origen
base-name
y la detecci贸nclass-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()]
- Para obtener m谩s informaci贸n sobre c贸mo trabajar con los resultados de detecci贸n, consulte la Secci贸n de recuadros para el modo Predecir.
- 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 una sola vez.
-
Empiece por generar una m谩scara binaria a partir de la imagen de origen y, a continuaci贸n, dibuje 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 losperson
se muestra a la derecha.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)
-
Para m谩s informaci贸n
c.masks.xy
v茅ase Secci贸n M谩scaras del modo Predecir. -
Aqu铆 los valores se convierten en
np.int32
para compatibilidad condrawContours()
funci贸n de OpenCV. -
El OpenCV
drawContours()
espera que los contornos tengan una forma de[N, 1, 2]
para m谩s detalles.
Ampliar para entender lo que ocurre al definir el
contour
variable.-
c.masks.xy
:: Proporciona las coordenadas de los puntos de contorno de la m谩scara en el formato(x, y)
. Para m谩s informaci贸n, consulte el Secci贸n M谩scaras del modo Predecir. -
.pop()
:: Comomasks.xy
es una lista que contiene un 煤nico elemento, este elemento se extrae utilizando la funci贸npop()
m茅todo. -
.astype(np.int32)
:: Utilizaci贸n demasks.xy
devolver谩 con un tipo de datos defloat32
pero esto no ser谩 compatible con el OpenCVdrawContours()
esto cambiar谩 el tipo de datos aint32
por compatibilidad. -
.reshape(-1, 1, 2)
:: Reformatea los datos en la forma requerida de[N, 1, 2]
dondeN
es el n煤mero de puntos de contorno, con cada punto representado por una 煤nica entrada1
y la entrada se compone de2
valores. En-1
denota que el n煤mero de valores a lo largo de esta dimensi贸n es flexible.
Ampliar para una explicaci贸n del
drawContours()
configuraci贸n.-
Encapsulando el
contour
variable entre corchetes,[contour]
gener贸 eficazmente la m谩scara de contorno deseada. -
El valor
-1
especificado para eldrawContours()
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. -
V茅ase Documentaci贸n de OpenCV en
drawContours()
para m谩s informaci贸n.
-
-
A continuaci贸n hay 2 opciones para 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 siguiente, 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 mediante la funci贸n OpenCV
bitwise_and()
. Esta operaci贸n conserva s贸lo valores de p铆xeles superiores a cero(> 0)
de ambas im谩genes. Dado que los p铆xeles de la m谩scara son mayores que cero(> 0)
s贸lo dentro de la regi贸n del contorno, los p铆xeles restantes 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 se mantiene la imagen 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.
# (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]
- Para obtener m谩s informaci贸n sobre los resultados de los recuadros delimitadores, consulte la secci贸n Recuadros del modo Predecir
驴Qu茅 hace este c贸digo?
-
En
c.boxes.xyxy.cpu().numpy()
recupera los cuadros delimitadores como una matriz NumPy en el archivoxyxy
dondexmin
,ymin
,xmax
yymax
representan las coordenadas del rect谩ngulo del cuadro delimitador. V茅ase Secci贸n de cajas del modo Predecir para m谩s detalles. -
En
squeeze()
elimina cualquier dimensi贸n innecesaria de la matriz NumPy, asegur谩ndose de que tiene la forma esperada. -
Conversi贸n de los valores de las coordenadas mediante
.astype(np.int32)
cambia el tipo de datos de las coordenadas de la caja defloat32
aint32
por lo que son compatibles con el recorte de im谩genes mediante cortes de 铆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 los par谩metros
[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?
- Uso de 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 guardar como unaPNG
archivo.
Aislar con p铆xeles transparentes: Subopciones
Imagen a tama帽o completo
No se requieren pasos adicionales si se mantiene la imagen 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.
# (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]
- Para obtener m谩s informaci贸n sobre los resultados de los recuadros delimitadores, consulte 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贸nxyxy
formato de coordenadas de caja, que corresponden a los puntosxmin, ymin, xmax, ymax
para el cuadro delimitador (rect谩ngulo), v茅ase Secci贸n de 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. -
Conversi贸n de los valores de las coordenadas mediante
.astype(np.int32)
cambia el tipo de datos de las coordenadas de la caja defloat32
aint32
que ser谩 compatible al recortar la imagen utilizando cortes de 铆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 . Consulte la p谩gina
save_crop
argumento para Argumentos de inferencia del modo Predecir para m谩s detalles.
-
-
Como desarrollador, usted decide qu茅 hacer a continuaci贸n. Se muestra un ejemplo b谩sico de un posible paso siguiente (guardar la imagen en un archivo para su uso futuro).
- NOTA: este paso es opcional y puede omitirse si no es necesario para su caso de uso espec铆fico.
Ejemplo Paso final
- En este ejemplo, el
img_name
es el nombre base del archivo de imagen de origen,label
es el nombre de la clase detectada, yci
es el 铆ndice del detecci贸n de objetos (en caso de varias instancias con el mismo nombre de clase).
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, ser铆a 贸ptimo definir una funci贸n para realizar 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)
- La l铆nea que rellena
contour
se combina aqu铆 en una sola l铆nea, donde antes se divid铆a en varias. - Lo que vaya aqu铆 depende de usted.
- Consulte el modo Predecir para obtener informaci贸n adicional.
- Consulte Tarea de segmento para obtener m谩s informaci贸n.
- M谩s informaci贸n sobre Trabajar con resultados
- M谩s informaci贸n sobre los resultados de la m谩scara de segmentaci贸n
PREGUNTAS FRECUENTES
驴C贸mo aislar objetos utilizando Ultralytics YOLO11 para tareas de segmentaci贸n?
Para aislar objetos utilizando Ultralytics YOLO11 , siga estos pasos:
-
Cargar el modelo y ejecutar la inferencia:
-
Generar una m谩scara binaria y dibujar contornos:
-
A铆sla el objeto utilizando la m谩scara binaria:
Consulte la gu铆a sobre el Modo Predecir y la Tarea Segmento para obtener m谩s informaci贸n.
驴Qu茅 opciones hay para guardar los objetos aislados despu茅s de la segmentaci贸n?
Ultralytics YOLO11 ofrece dos opciones principales para guardar objetos aislados:
-
Con fondo negro:
-
Con fondo transparente:
Para m谩s detalles, visite la secci贸n Modo Predicci贸n.
驴C贸mo puedo recortar objetos aislados a sus cuadros delimitadores utilizando Ultralytics YOLO11 ?
Para recortar objetos aislados a sus cuadros delimitadores:
-
Recupera las coordenadas del cuadro delimitador:
-
Recorta la imagen aislada:
Obtenga m谩s informaci贸n sobre los resultados del cuadro delimitador en la documentaci贸n del modo Predecir.
驴Por qu茅 deber铆a utilizar Ultralytics YOLO11 para aislar objetos en tareas de segmentaci贸n?
Ultralytics YOLO11 proporciona:
- 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 exhaustiva y API f谩cil de usar para un desarrollo eficaz.
Explore las ventajas de utilizar YOLO en la documentaci贸n Tarea de segmento.
驴Puedo guardar objetos aislados, incluido el fondo, utilizando Ultralytics YOLO11 ?
S铆, es una funci贸n integrada en Ultralytics YOLO11 . Utilice la funci贸n save_crop
en el predict()
m茅todo. Por ejemplo:
M谩s informaci贸n save_crop
en el Argumentos de inferencia del modo Predecir secci贸n.