Segmentación de Imágenes en Tiempo Real con Yolo y Python

Clase 5 de 16Curso de Visión Artificial con Python

Resumen

La segmentación de imágenes con YOLO representa una de las técnicas más avanzadas en visión por computadora, permitiendo identificar y delimitar objetos específicos en tiempo real. Esta tecnología no solo detecta objetos, sino que también crea máscaras precisas que los separan del fondo, ofreciendo aplicaciones revolucionarias en campos como la robótica, la vigilancia y el análisis de video.

¿Qué es YOLO y por qué es importante para la segmentación de imágenes?

YOLO (You Only Look Once) es un algoritmo de detección de objetos que analiza una imagen en una sola pasada, lo que le permite ser extremadamente rápido. Actualmente, la empresa Ultralytics está desarrollando nuevas versiones de YOLO, ofreciendo una librería de código abierto con una gran comunidad de soporte.

Las características principales de YOLO incluyen:

  • Procesamiento en tiempo real
  • Segmentación de imágenes
  • Detección de objetos
  • Identificación de puntos característicos del cuerpo

La popularidad de YOLO se debe a su eficiencia y versatilidad, permitiendo implementaciones en diversos dispositivos, desde potentes GPUs hasta sistemas con recursos limitados como CPUs estándar.

¿Cómo implementar la segmentación con YOLO en tiempo real?

Para implementar la segmentación con YOLO necesitamos algunas herramientas fundamentales:

  • OpenCV para el procesamiento de imágenes
  • NumPy para operaciones matemáticas
  • Ultralytics para acceder a los modelos YOLO

Si aún no tienes instalada la librería Ultralytics, puedes hacerlo con un simple comando de instalación mediante pip.

Selección del modelo adecuado

Para la segmentación, utilizaremos YOLOv11 en su versión "nano", que es el modelo más pequeño disponible. Esta elección es ideal cuando trabajamos con CPUs en lugar de GPUs, ya que requiere menos recursos computacionales.

# Importar las librerías necesarias import cv2 import numpy as np from ultralytics import YOLO # Cargar el modelo YOLOv11 nano model = YOLO('yolov11n.pt') # Configurar la fuente de video (0 para la cámara principal, 1 para la segunda cámara) cap = cv2.VideoCapture(1) # Configurar la resolución cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)

Procesamiento de frames y medición de latencia

Un aspecto importante al trabajar con segmentación en tiempo real es medir la latencia, es decir, cuánto tiempo tarda el sistema en procesar cada frame:

while True: # Capturar frame ret, frame = cap.read() # Medir tiempo de inicio start_time = time.time() # Procesar el frame con YOLO results = model(frame) # Calcular latencia latency = time.time() - start_time # Mostrar FPS cv2.putText(frame, f"Latencia: {latency:.3f}s", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)

Visualización de bounding boxes y segmentación

La segmentación con YOLO proporciona dos elementos principales:

  1. Bounding boxes: Rectángulos que encierran los objetos detectados
  2. Máscaras de segmentación: Áreas coloreadas que delimitan exactamente la forma del objeto
# Acceder a las detecciones for r in results: boxes = r.boxes masks = r.masks # Procesar cada detección for i, box in enumerate(boxes): # Obtener coordenadas del bounding box x1, y1, x2, y2 = map(int, box.xyxy[0]) # Obtener confianza y clase confidence = float(box.conf[0]) class_id = int(box.cls[0]) # Dibujar bounding box cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) # Añadir etiqueta label = f"{class_names[class_id]}: {confidence:.2f}" cv2.putText(frame, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

Creación y aplicación de máscaras de segmentación

La parte más distintiva de la segmentación es la creación de máscaras que se superponen a la imagen original:

# Procesar máscaras de segmentación if masks is not None: for i, mask in enumerate(masks): # Redimensionar la máscara al tamaño del frame mask_image = mask.data.cpu().numpy() mask_image = cv2.resize(mask_image, (frame.shape[1], frame.shape[0])) # Crear máscara booleana mask_bool = mask_image > 0.5 # Generar color aleatorio para la máscara color = np.random.randint(0, 255, 3, dtype=np.uint8) # Aplicar color a la máscara colored_mask = np.zeros_like(frame) colored_mask[mask_bool] = color # Combinar máscara con el frame original frame = cv2.addWeighted(frame, 1, colored_mask, 0.5, 0)

¿Cómo filtrar objetos específicos en la segmentación?

Una de las ventajas de YOLO es la capacidad de filtrar objetos específicos según nuestras necesidades. Podemos hacerlo de dos maneras:

Filtrado por confianza

Podemos establecer un umbral de confianza para mostrar solo las detecciones con alta probabilidad:

# Configurar umbral de confianza confidence_threshold = 0.7 # Filtrar detecciones por confianza results = model(frame, conf=confidence_threshold)

Filtrado por clase de objeto

YOLO viene preentrenado para detectar 80 categorías diferentes de objetos. Podemos filtrar para mostrar solo las clases que nos interesan:

# Clases de interés (0 = persona, 13 = silla) classes_of_interest = [0, 13] # Filtrar por clase y confianza results = model(frame, conf=0.7, classes=classes_of_interest)

El modelo preentrenado de YOLO asigna un número a cada categoría de objeto. Por ejemplo:

  • 0: Persona
  • 13: Silla
  • 41: Taza
  • 77: Oso de peluche

Esto permite una gran flexibilidad para aplicaciones específicas, como sistemas de seguridad que solo detecten personas o aplicaciones de inventario que se centren en productos particulares.

La segmentación con YOLO representa una herramienta poderosa para el análisis de imágenes, combinando velocidad y precisión en un solo sistema. Su capacidad para procesar video en tiempo real y generar máscaras precisas abre un mundo de posibilidades para desarrolladores e investigadores. ¿Has probado implementar YOLO en alguno de tus proyectos? Comparte tu experiencia en los comentarios.

      Segmentación de Imágenes en Tiempo Real con Yolo y Python