Detección de puntos de referencia de la cara y la mano con Python: Mediapipe, OpenCV

En este artículo, utilizaremos la biblioteca python de mediapipe para detectar puntos de referencia de rostros y manos. Usaremos un modelo holístico de las soluciones de mediapipe para detectar todos los puntos de referencia de la cara y la mano. También veremos cómo podemos acceder a diferentes puntos de referencia de la cara y las manos que se pueden usar para diferentes aplicaciones de visión por computadora, como detección de lenguaje de señas, detección de somnolencia, etc.

Bibliotecas requeridas

  • Mediapipe es una biblioteca multiplataforma desarrollada por Google que proporciona increíbles soluciones de aprendizaje automático listas para usar para tareas de visión artificial.
  • La biblioteca OpenCV en python es una biblioteca de visión por computadora que se usa ampliamente para el análisis de imágenes, el procesamiento de imágenes, la detección, el reconocimiento, etc.

Instalación de bibliotecas necesarias

pip install opencv-python mediapipe msvc-runtime

A continuación se muestra el enfoque paso a paso para la detección de puntos de referencia de cara y mano

PASO-1: Importe todas las bibliotecas necesarias. En nuestro caso, solo se requieren dos bibliotecas.

Python3

# Import Libraries
import cv2
import time
import mediapipe as mp

 PASO 2: Inicialización del modelo holístico y herramientas de dibujo para detectar y dibujar puntos de referencia en la imagen.

Python3

# Grabbing the Holistic Model from Mediapipe and
# Initializing the Model
mp_holistic = mp.solutions.holistic
holistic_model = mp_holistic.Holistic(
    min_detection_confidence=0.5,
    min_tracking_confidence=0.5
)
 
# Initializing the drawng utils for drawing the facial landmarks on image
mp_drawing = mp.solutions.drawing_utils

Veamos los parámetros del modelo holístico:

Holistic(
  static_image_mode=False, 
  model_complexity=1, 
  smooth_landmarks=True, 
  min_detection_confidence=0.5, 
  min_tracking_confidence=0.5
)
  • static_image_mode: se utiliza para especificar si las imágenes de entrada deben tratarse como imágenes estáticas o como una transmisión de video. El valor predeterminado es Falso.
  • model_complexity: se utiliza para especificar la complejidad del modelo de punto de referencia de pose: 0, 1 o 2. A medida que la complejidad del modelo aumenta, la precisión del punto de referencia y la latencia aumentan. El valor predeterminado es 1.
  • smooth_landmarks: este parámetro se usa para reducir la fluctuación en la predicción al filtrar puntos de referencia de pose en diferentes imágenes de entrada. El valor por defecto es verdadero.
  • min_detection_confidence: Se utiliza para especificar el valor mínimo de confianza con el que se debe considerar exitosa la detección del modelo de detección de personas. Puede especificar un valor en [0.0,1.0]. El valor predeterminado es 0,5.
  • min_tracking_confidence: Se utiliza para especificar el valor mínimo de confianza con el que se debe considerar exitosa la detección del modelo de seguimiento de hitos. Puede especificar un valor en [0.0,1.0]. El valor predeterminado es 0,5.

PASO-3: Detección de puntos de referencia de cara y mano de la imagen. El modelo holístico procesa la imagen y produce puntos de referencia para la cara, la mano izquierda, la mano derecha y también detecta la pose del 

  1. Captura los cuadros continuamente desde la cámara usando OpenCV.
  2. Convierta la imagen BGR en una imagen RGB y haga predicciones utilizando un modelo holístico inicializado.
  3. Las predicciones realizadas por el modelo holístico se guardan en la variable de resultados desde la que podemos acceder a los puntos de referencia utilizando results.face_landmarks, results.right_hand_landmarks, results.left_hand_landmarks respectivamente.
  4. Dibuje los puntos de referencia detectados en la imagen utilizando la función draw_landmarks de herramientas de dibujo.
  5. Muestre la imagen resultante.

Python3

# (0) in VideoCapture is used to connect to your computer's default camera
capture = cv2.VideoCapture(0)
 
# Initializing current time and precious time for calculating the FPS
previousTime = 0
currentTime = 0
 
while capture.isOpened():
    # capture frame by frame
    ret, frame = capture.read()
 
    # resizing the frame for better view
    frame = cv2.resize(frame, (800, 600))
 
    # Converting the from from BGR to RGB
    image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
 
    # Making predictions using holistic model
    # To improve performance, optionally mark the image as not writable to
    # pass by reference.
    image.flags.writable = False
    results = holistic_model.process(image)
    image.flags.writable = True
 
    # Converting back the RGB image to BGR
    image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
 
    # Drawing the Facial Landmarks
    mp_drawing.draw_landmarks(
      image,
      results.face_landmarks,
      mp_holistic.FACE_CONNECTIONS,
      mp_drawing.DrawingSpec(
        color=(255,0,255),
        thickness=1,
        circle_radius=1
      ),
      mp_drawing.DrawingSpec(
        color=(0,255,255),
        thickness=1,
        circle_radius=1
      )
    )
 
    # Drawing Right hand Land Marks
    mp_drawing.draw_landmarks(
      image,
      results.right_hand_landmarks,
      mp_holistic.HAND_CONNECTIONS
    )
 
    # Drawing Left hand Land Marks
    mp_drawing.draw_landmarks(
      image,
      results.left_hand_landmarks,
      mp_holistic.HAND_CONNECTIONS
    )
     
    # Calculating the FPS
    currentTime = time.time()
    fps = 1 / (currentTime-previousTime)
    previousTime = currentTime
     
    # Displaying FPS on the image
    cv2.putText(image, str(int(fps))+" FPS", (10, 70), cv2.FONT_HERSHEY_COMPLEX, 1, (0,255,0), 2)
 
    # Display the resulting image
    cv2.imshow("Facial and Hand Landmarks", image)
 
    # Enter key 'q' to break the loop
    if cv2.waitKey(5) & 0xFF == ord('q'):
        break
 
# When all the process is done
# Release the capture and destroy all windows
capture.release()
cv2.destroyAllWindows()

El modelo holístico produce 468 puntos de referencia de cara, 21 puntos de referencia de mano izquierda y 21 puntos de referencia de mano derecha. Se puede acceder a los puntos de referencia individuales especificando el índice del punto de referencia requerido. Ejemplo: resultados.left_hand_landmarks.landmark[0]. Puede obtener el índice de todos los puntos de referencia individuales utilizando el siguiente código:

Python3

# Code to access landmarks
for landmark in mp_holistic.HandLandmark:
    print(landmark, landmark.value)
 
print(mp_holistic.HandLandmark.WRIST.value)
HandLandmark.WRIST 0
HandLandmark.THUMB_CMC 1
HandLandmark.THUMB_MCP 2
HandLandmark.THUMB_IP 3
HandLandmark.THUMB_TIP 4
HandLandmark.INDEX_FINGER_MCP 5
HandLandmark.INDEX_FINGER_PIP 6
HandLandmark.INDEX_FINGER_DIP 7
HandLandmark.INDEX_FINGER_TIP 8
HandLandmark.MIDDLE_FINGER_MCP 9
HandLandmark.MIDDLE_FINGER_PIP 10
HandLandmark.MIDDLE_FINGER_DIP 11
HandLandmark.MIDDLE_FINGER_TIP 12
HandLandmark.RING_FINGER_MCP 13
HandLandmark.RING_FINGER_PIP 14
HandLandmark.RING_FINGER_DIP 15
HandLandmark.RING_FINGER_TIP 16
HandLandmark.PINKY_MCP 17
HandLandmark.PINKY_PIP 18
HandLandmark.PINKY_DIP 19
HandLandmark.PINKY_TIP 20
0

Puntos de referencia de la mano y sus índices

PRODUCCIÓN: 

Publicación traducida automáticamente

Artículo escrito por venugopalkadamba y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *