Implementación de Detector de Objetos con Yolo v11

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

Resumen

La detección de objetos es una de las aplicaciones más fascinantes y útiles de la visión por computadora. Con el avance de modelos pre-entrenados como YOLO (You Only Look Once), ahora es posible implementar sistemas de detección robustos con relativa facilidad. En este contenido, exploraremos cómo crear nuestro primer detector de objetos utilizando YOLOv11, un modelo capaz de identificar hasta 80 clases diferentes de objetos en tiempo real.

¿Cómo implementar un detector de objetos con YOLOv11?

Para comenzar a trabajar con detección de objetos, necesitamos configurar nuestro entorno con las bibliotecas adecuadas. El modelo YOLO en su versión 11 nos permite detectar una amplia variedad de objetos como libros, tazas, autos y osos de peluche, entre otros. La precisión de la detección dependerá del ángulo y las condiciones en las que se capture la imagen.

Para la implementación necesitaremos:

  • OpenCV para el procesamiento de imágenes y video
  • Time para medir la latencia entre frames
  • Ultralytics para cargar el modelo YOLO

Configuración inicial del detector

El primer paso es cargar el modelo pre-entrenado y configurar la captura de video:

# Importamos las bibliotecas necesarias
import cv2
import time
from ultralytics import YOLO

# Cargamos el modelo YOLOv11
model = YOLO('yolov11n.pt')

# Iniciamos la captura de video
cap = cv2.VideoCapture(1)  # Usar 0 si solo hay una cámara

# Configuramos el tamaño de la ventana para pantalla completa
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)

Una vez configurado el entorno, podemos comenzar a procesar cada frame del video para detectar objetos. Es importante medir el tiempo de procesamiento entre frames para evaluar el rendimiento de nuestro sistema.

Procesamiento de frames y detección de objetos

El siguiente paso es capturar cada frame, procesarlo con el modelo YOLO y visualizar los resultados:

while True:
    # Capturamos el frame
    ret, frame = cap.read()
    if not ret:
        break
    
    # Medimos el tiempo antes de procesar
    start_time = time.time()
    
    # Procesamos el frame con YOLO
    results = model(frame)
    
    # Calculamos la latencia
    latency = time.time() - start_time
    
    # Accedemos al primer resultado
    result = results[0]
    
    # Obtenemos las detecciones (boxes)
    boxes = result.boxes
    
    # Procesamos cada detección
    for box in boxes:
        # Obtenemos las coordenadas del bounding box
        x1, y1, x2, y2 = box.xyxy[0]
        x1, y1, x2, y2 = int(x1), int(y1), int(x2), int(y2)
        
        # Obtenemos la confianza y la clase
        confidence = box.conf[0]
        class_id = int(box.cls[0])
        class_name = result.names[class_id]
        
        # Dibujamos el rectángulo y la etiqueta
        cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
        label = f"{class_name}: {confidence:.2f}"
        cv2.putText(frame, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
    
    # Mostramos la latencia en el frame
    cv2.putText(frame, f"Latency: {latency:.4f}s", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
    
    # Mostramos el frame
    cv2.imshow("Object Detection", frame)
    
    # Salimos con la tecla 'q'
    if cv2.waitKey(1) == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

En este código, para cada objeto detectado, obtenemos:

  • Las coordenadas del bounding box (x1, y1, x2, y2)
  • El nivel de confianza de la detección
  • La clase a la que pertenece el objeto

El bounding box se define mediante dos coordenadas: la superior izquierda (x1, y1) y la inferior derecha (x2, y2). Estas coordenadas nos permiten dibujar un rectángulo alrededor del objeto detectado.

¿Cómo filtrar detecciones específicas?

Una característica muy útil es la capacidad de filtrar las detecciones para mostrar solo los objetos que nos interesan. Por ejemplo, si solo queremos detectar personas, podemos modificar nuestro código para filtrar por la clase "persona" (que tiene el ID 0 en YOLO) y establecer un umbral de confianza mínimo.

Filtrado por clase y confianza

# Definimos la clase que queremos detectar (0 = persona)
target_class = 0

# Definimos el umbral de confianza
confidence_threshold = 0.7

# En el bucle de procesamiento, modificamos la parte de detección:
for box in boxes:
    # Obtenemos la confianza y la clase
    confidence = box.conf[0]
    class_id = int(box.cls[0])
    
    # Solo procesamos si es la clase objetivo y supera el umbral de confianza
    if class_id == target_class and confidence >= confidence_threshold:
        # Obtenemos las coordenadas del bounding box
        x1, y1, x2, y2 = box.xyxy[0]
        x1, y1, x2, y2 = int(x1), int(y1), int(x2), int(y2)
        
        class_name = result.names[class_id]
        
        # Dibujamos el rectángulo y la etiqueta
        cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)
        label = f"{class_name}: {confidence:.2f}"
        cv2.putText(frame, label, (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)

Con esta modificación, nuestro detector solo mostrará personas con un nivel de confianza superior a 0.7 (70%). Esto es especialmente útil en aplicaciones donde solo nos interesa un tipo específico de objeto y queremos evitar falsos positivos.

¿Qué objetos puede detectar YOLOv11?

El modelo YOLOv11 viene pre-entrenado para detectar 80 clases diferentes de objetos. Algunas de estas clases incluyen:

  • Personas (ID 0)
  • Vehículos: autos, camiones, botes
  • Animales: perros, gatos, caballos, etc.
  • Objetos cotidianos: tazas, libros, teléfonos
  • Alimentos: varios tipos de comida

Esta versatilidad hace que YOLO sea una herramienta poderosa para una amplia gama de aplicaciones de visión por computadora.

La detección de objetos con YOLO abre un mundo de posibilidades en diversas industrias, desde seguridad y vigilancia hasta automatización industrial y análisis de comportamiento. Con el código que hemos explorado, ya tienes las bases para implementar tu propio sistema de detección de objetos. ¿Qué aplicaciones prácticas te imaginas para esta tecnología en tu campo? Comparte tus ideas en los comentarios.