MEDIAPIPE OBJECTRON (📷🪑👟☕) | Python – MediaPipe – OpenCV

Por Administrador

¡Puedes detectar cámaras 📷, sillas 🪑, zatatos 👟 o tazas ☕ y encerrarlas en un cuadro delimitador 3D!. Mediapipe nos da un enfoque diferente para la detección de objetos, ¿te animas a probarlo?.

CONTENIDO

  • MediaPipe Objectron
    • Dataset usado para el entrenamiento de MediaPipe Objectron
    • ¿Qué objetos nos permite detectar MediaPipe Objectron?
    • Opciones de configuración
    • Salidas que obtenemos al aplicar MediaPipe Objectron
    • ¡Vamos con la programación!
      • MediaPipe Objectron en imágenes
      • MediaPipe Objectron en videos
    • Referencias

MediaPipe Objectron

Figura 1: Ejemplo del uso de MediaPipe Objectron aplicado en la detección de zapatos.

En anteriores tutoriales habíamos hablado de la detección de objetos, que es básicamente buscar la ubicación de un objeto en una imagen, y una vez encontrado podemos encerrarlo en un cuadro delimitador. Este cuadro delimitador posee un ancho y alto que permite encerrar al objeto, pero ¿qué pasaría si queremos capturar al objeto en un cuadro delimitador 3D?, pues bien, eso es lo que hace la solución que veremos hoy: MediaPipe Objectron. 

Como lo describen en la documentación, mediapipe Objectron es una solución de detección de objetos 3D en tiempo real, de tal modo que detecta objetos en imágenes 2D y estima sus poses a través de un modelo de machine learning.

Dataset usado para el entrenamiento de MediaPipe Objectron

Figura 2: Representación de las categorías del Objectron dataset.

Este modelo ha sido entrenado con la Objectron dataset, que es un dataset de videoclips cortos centrados en objetos con anotaciones de pose. En cada uno de los videos del dataset, la cámara se mueve alrededor del objeto lo que permite capturarlo de distintos ángulos. Además los datos contienen cuadros delimitadores 3D anotados manualmente por cada objeto que describen posición orientación y dimensiones. Para realizar este conjunto de datos se usaron técnicas de Realidad Aumentada. 

El dataset contiene las categorías: bicicletas, libros, botellas, cámaras, cajas de cereales, sillas, tazas, laptos y zapatos. Para más información sobre este dataset puedes revisar la documentación. 

¿Qué objetos nos permite detectar MediaPipe Objectron?

Figura 3: Objetos que nos permite detectar MediaPipe Objectron. (Fuente)

Pero bien, volviendo a MediaPipe Objectron, esta solución nos permitirá detectar: cámaras, sillas, tazas y zapatos. Y veremos como estos objetos son rodeados por un cuadro delimitador 3D y además nos permitirá visualizar los ejes x, y y z de cada uno de los objetos. 

Opciones de Configuración

STATIC_IMAGE_MODE (Por defecto False)

Si lo establecemos como False, la solución trata a las imágenes de entrada como un video en directo, así que tratará de detectar los objetos en las primeras imágenes y cuando haya detecciones exitosas localizará el cuadro delimitador 3D. Para las siguientes imágenes, una vez que se haya detectado el número máximo de objetos establecido por MAX_NUM_OBJECTS y se obtengan sus correspondientes puntos de referencia del cuadro delimitador 3D, simplemente se rastrea esos puntos sin tener que invocar nuevamente al detector, a menos que se pierda alguno de los objetos. De este modo se reduce la latencia. 

Si se establece como True, la detección se ejecuta en cada imagen por lo que es ideal para usarlo en imágenes que no estén relacionadas. 

MAX_NUM_OBJECTS (Por defecto 5)

Número máximo de objetos  a detectar 

MIN_DETECTION_CONFIDENCE (Por defecto 0.5)

Valor mínimo de confianza entre 0.0 y 1.0 del modelo de detección de objetos para que la detección sea considerada como exitosa. 

MIN_TRACKING_CONFIDENCE (Por defecto 0.99)

Valor mínimo de confianza entre 0.0 y 1.0 del modelo seguimiento de puntos de referencia para que los puntos de referencia del cuadro delimitador 3D se consideren como seguidos correctamente, de otro modo la detección de objetos se invocará automáticamente en la siguiente imagen.  

Al especificarlo con un valor alto puede incrementar la robustez de la solución, pero también incrementaría la latencia.

Este es ignorados si STATIC_IMAGE_MODE es True. 

MODEL NAME (Por defecto Shoe)

Nombre del modelo usado para predecir los puntos de referencia del cuadro delimitador 3D.  Actualmente podemos especificar {‘Shoe’, ‘Chair’, ‘Cup’, ‘Camera’}. 

NOTA: Tenemos otras opciones de configuración que podemos revisar en la documentación, pero por ahora no las cubriremos en este tutorial.

Salidas que obtenemos al aplicar MediaPipe Objectron

DETECTED OBJECTS 

Esta es una lista de cuadros delimitadores 3D. Cada uno de ellos consistirá en: 

  • landmarks_2D: Puntos de referencia 2D del cuadro delimitador 3D del objeto. 
  • landmarks_3D: Puntos de referencia 3D del cuadro delimitador 3D del objeto. 
  • rotation: una matriz de rotación 
  • Traslation: un vector de traslación 
  • Scale 

¡Vamos con la programación!

Para una explicación más detallada de los programas que veremos a continuación, por favor dirígete al videotutorial de mi canal.

MediaPipe Objectron en imágenes

import cv2
import mediapipe as mp

mp_drawing = mp.solutions.drawing_utils
mp_objectron = mp.solutions.objectron

with mp_objectron.Objectron(
     static_image_mode=True,
     max_num_objects=5,
     min_detection_confidence=0.5,
     model_name="Shoe") as objectron:

     image = cv2.imread("images/shoes_001.jpg")

     image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
     results = objectron.process(image_rgb)
     print("results.detected_objects: ", results.detected_objects)
     if results.detected_objects is not None:
          for detected_object in results.detected_objects:
               mp_drawing.draw_landmarks(image, detected_object.landmarks_2d, mp_objectron.BOX_CONNECTIONS,
                    mp_drawing.DrawingSpec(color=(255, 255, 255), thickness=2, circle_radius=6),
                    mp_drawing.DrawingSpec(color=(128, 0, 255), thickness=2))
               mp_drawing.draw_axis(image, detected_object.rotation, detected_object.translation)

     cv2.imshow("Image", image)
     cv2.waitKey(0)
cv2.destroyAllWindows()

En la línea 11 podemos cambiar el objeto que deseamos detectar por: ‘Shoe’, ‘Chair’, ‘Cup’, ‘Camera’.

En la línea 13 debemos especificar la imagen de entrada sobre la cual se va a realizar la detección.

De la línea 20 a 22 tenemos la visualización de los puntos de referencia y sus conexiones, a estas podemos modificarles el color y cambiarlos como lo hemos hecho.

En la línea 23 dibujamos los ejes en el objeto.

MediaPipe Objectron en video

import cv2
import mediapipe as mp

mp_drawing = mp.solutions.drawing_utils
mp_objectron = mp.solutions.objectron

cap = cv2.VideoCapture("videos/shoe_001.mp4")

with mp_objectron.Objectron(
     static_image_mode=False,
     max_num_objects=5,
     min_detection_confidence=0.5,
     min_tracking_confidence=0.99,
     model_name="Shoe") as objectron:

     while True:
          ret, frame = cap.read()
          if ret == False:
               break
          frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
          results = objectron.process(frame_rgb)
          
          if results.detected_objects is not None:
               for detected_object in results.detected_objects:
                    mp_drawing.draw_landmarks(frame, detected_object.landmarks_2d, mp_objectron.BOX_CONNECTIONS)
                    mp_drawing.draw_axis(frame, detected_object.rotation, detected_object.translation)
          cv2.imshow("Frame", frame)
          if cv2.waitKey(1) & 0xFF == 27:
               break
cap.release()
cv2.destroyAllWindows()

En la línea 7 tendremos que especificar el video a leer, o a su vez el videostreaming.

En la línea 14 podemos cambiar el objeto que deseamos detectar por: ‘Shoe’, ‘Chair’, ‘Cup’, ‘Camera’.

Referencias