📦 Descubre cómo usar OBB con YOLO – Cajas delimitadoras orientadas paso a paso

Por Administrador

¡Hola, hola, Omesitos! En esta ocasión nos introduciremos en una tarea llamada OBB (Oriented Bounding Box) o cuadros delimitadores orientados, la cual lleva a la detección de objetos un paso más allá. Para llevarla a cabo usaremos Ultralytics, ya que nos provee distintos modelos YOLO. Así que, ¡empecemos!

¿Qué es OBB (Oriented Bounding Box) o Cuadros Delimitadores Orientados?

Para entenderlo mejor tendremos que recordar a los cuadros delimitadores en la detección de objetos. Dichos cuadros rodean al objeto detectado, pero no tienen en cuenta su orientación, es allí donde entra OBB, técnica que introduce un ángulo adicional al momento de localizar el objeto, lo que hace que la detección sea mucho más precisa.

🔧 Instalación de Ultralytics

Para llevar a cabo esta práctica debemos instalar Ultralytics, a través de:

pip install ultralytics

Puedes verificar su instalación y versión con: pip freeze

Nota: A continuación te dejo la programación usada en el video. Si quieres ver el paso a paso explicado con más detalle, ¡no te pierdas el video completo!

🖼️Cuadros delimitadores orientados en imágenes con YOLOv11 de Ultralytics

from ultralytics import YOLO

# Cargamos el modelo YOLO
model = YOLO("yolo11m-obb.pt")

# Cargamos la imagen
image = "./Inputs/*.jpg"

# Realizamos la inferencia de YOLO
results = model(image)

# Visualizar los resultados
for res in results:
    res.show()

🖼️ Cuadros delimitadores orientados en imágenes leídas con OpenCV con YOLOv11 de Ultralytics

from ultralytics import YOLO
import cv2
import numpy as np
import imutils

# Cargamos la imagen de entrada
image = cv2.imread("./Inputs/image_001.jpg")

# Cargamos el modelo YOLO
model = YOLO("yolo11m-obb.pt")

# Realizamos la inferencia sobre la imagen
results = model(image)
print(results)
print('--------------------')
print(results[0].obb)

# Obtenemos clases detectadas y puntos de OBB (Oriented Bounding Boxes)
cls_detected = results[0].obb.cls
tensor_points = results[0].obb.xyxyxyxy

# Recorremos cada caja delimitadora detectada
for tensor_points_obj, cls_obj in zip(tensor_points, cls_detected):
    # Convertimos el tensor a NumPy
    points = tensor_points_obj.cpu().numpy().squeeze()

    # Redimensionamos y convertimos a enteros
    points = points.reshape((4, 2)).astype(np.int32)
    print(points)
    # Dibujamos la caja rotada sobre la imagen
    cv2.drawContours(image, [points], -1, (0, 255, 0), 2)

    # Visualizar los puntos del cuadro delimitador
    for i, (x, y) in enumerate(points):
        if i == 0:
            color = (0, 255, 0) # Verde, para x1, y1
            #cv2.putText(image, results[0].names[int(cls_obj)], (x, y - 30), 1, 3, (0,255,0), 2)
        elif i == 1:
            color = (255, 0, 0) # Rojo, para x2, y2
            
        elif i == 2:
            color = (0, 0, 255) # Azul, para x3, y3
        else:
            color = (255, 255, 0) # Amarillo, para x4, y4

        # Dibujamos el punto en la imagen    
        cv2.circle(image, (x, y), 10, color, -1)

# Redimensionamos la imagen
image = imutils.resize(image, width=1000)
cv2.imshow("Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

🎞️ Cuadros delimitadores orientados en videos con YOLOv11 de Ultralytics

from ultralytics import YOLO
import cv2
import imutils

# Cargamos el modelo YOLO
model = YOLO("yolo11m-obb.pt")

# Cargamos el video de entrada
video_path = "./Inputs/video_001.mp4"
cap = cv2.VideoCapture(video_path)

while cap.isOpened():
    # Leemos el frame del video
    ret, frame = cap.read()
    if not ret:
        break

    # Realizamos la inferencia de YOLO sobre el frame
    results = model(frame)

    # Extraemos los resultados
    annotated_frame = results[0].plot()
    annotated_frame = imutils.resize(annotated_frame, width=1000)

    # Visualizamos los resultados
    cv2.imshow("YOLO Inference", annotated_frame)

    # El ciclo se rompe al presionar "Esc"
    if cv2.waitKey(1) & 0xFF == 27:
        break

cap.release()
cv2.destroyAllWindows()

Y eso ha sido todo por este post, Omesitos.
Espero que les haya resultado útil y que se animen a probar los cuadros delimitadores orientados con los modelos de Ultralytics usando YOLOv11.
📌 No olviden revisar el video si desean ver todo el paso a paso en acción.

¡Nos vemos en el siguiente post!