Seguimiento de Ojos y Posición del Iris con Python y MediaPipe
Clase 11 de 16 • Curso de Visión Artificial con Python
Resumen
La detección facial mediante inteligencia artificial ha revolucionado numerosos campos, desde la seguridad hasta las aplicaciones de realidad aumentada. En este artículo, exploraremos cómo implementar un sistema de seguimiento ocular utilizando Python, OpenCV y MediaPipe, centrándonos en la detección de puntos característicos faciales y, específicamente, en el seguimiento de la mirada. Esta tecnología es fundamental para comprender la interacción humano-computadora y tiene aplicaciones en campos tan diversos como la psicología, el marketing y el desarrollo de interfaces.
¿Cómo funciona la detección de puntos característicos faciales?
Cuando hablamos de detección facial avanzada, nos referimos a la identificación de puntos específicos o "landmarks" en el rostro humano. MediaPipe ofrece una solución robusta para esta tarea, permitiéndonos detectar con precisión elementos como ojos, nariz, boca y contorno facial.
Para implementar un sistema de seguimiento ocular básico, necesitamos:
- OpenCV para el procesamiento de imágenes
- MediaPipe para la detección de puntos faciales
- Python como lenguaje de programación
El código base para detectar los extremos de los ojos se estructura de la siguiente manera:
# Configuración de MediaPipe Face Mesh
mp_face_mesh = mp.solutions.face_mesh
face_mesh = mp_face_mesh.FaceMesh(
min_detection_confidence=0.5,
min_tracking_confidence=0.5)
# Captura de video
cap = cv2.VideoCapture(1) # Usar 0 si solo hay una cámara
while cap.isOpened():
success, frame = cap.read()
if not success:
break
# Convertir BGR a RGB
rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# Procesar el frame
results = face_mesh.process(rgb_frame)
if results.multi_face_landmarks:
for face_landmarks in results.multi_face_landmarks:
# Obtener coordenadas del ojo izquierdo (landmark 33)
left_eye = face_landmarks.landmark[33]
x_left = int(left_eye.x * frame.shape[1])
y_left = int(left_eye.y * frame.shape[0])
# Obtener coordenadas del ojo derecho (landmark 263)
right_eye = face_landmarks.landmark[263]
x_right = int(right_eye.x * frame.shape[1])
y_right = int(right_eye.y * frame.shape[0])
# Dibujar círculos en los extremos de los ojos
cv2.circle(frame, (x_left, y_left), 3, (0, 255, 0), -1)
cv2.circle(frame, (x_right, y_right), 3, (0, 255, 0), -1)
# Mostrar el resultado
cv2.imshow('Eye Tracking', frame)
if cv2.waitKey(5) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
Es importante destacar que MediaPipe trabaja con coordenadas relativas (valores entre 0 y 1), por lo que debemos multiplicarlas por el ancho y alto del frame para obtener las coordenadas absolutas en píxeles.
¿Qué son los landmarks faciales y cómo se identifican?
Los landmarks faciales son puntos específicos en el rostro que MediaPipe puede detectar. Para el seguimiento ocular básico, nos enfocamos en los landmarks 33 y 263, que corresponden a los extremos externos de los ojos izquierdo y derecho, respectivamente.
MediaPipe Face Mesh proporciona un mapa detallado con cientos de puntos faciales. Aunque la detección es robusta, puede hacer predicciones probabilísticas cuando parte del rostro está oculta, lo que significa que podría estimar la posición de un ojo incluso si está parcialmente tapado.
¿Cómo mejorar el seguimiento ocular con la detección del iris?
Para aplicaciones más precisas, podemos ir más allá de los extremos de los ojos y detectar la posición del iris (la parte coloreada del ojo). MediaPipe ofrece una funcionalidad para refinar los landmarks y detectar puntos específicos del iris.
# Configuración con refinamiento de landmarks
face_mesh = mp_face_mesh.FaceMesh(
min_detection_confidence=0.5,
min_tracking_confidence=0.5,
refine_landmarks=True) # Habilitar refinamiento para detectar el iris
Con esta configuración, podemos acceder a landmarks adicionales (468, 469, 470, 471) que representan puntos en el contorno del iris del ojo izquierdo. De manera similar, existen landmarks para el ojo derecho.
Para calcular el centro del iris, promediamos las posiciones de estos cuatro puntos:
# Detectar los cuatro puntos del iris izquierdo
left_iris_landmarks = []
for i in range(468, 472):
landmark = face_landmarks.landmark[i]
x = int(landmark.x * frame.shape[1])
y = int(landmark.y * frame.shape[0])
left_iris_landmarks.append((x, y))
cv2.circle(frame, (x, y), 2, (0, 0, 255), -1) # Puntos rojos
# Calcular el centro del iris izquierdo
left_iris_x = sum(p[0] for p in left_iris_landmarks) // 4
left_iris_y = sum(p[1] for p in left_iris_landmarks) // 4
cv2.circle(frame, (left_iris_x, left_iris_y), 3, (255, 0, 0), -1) # Punto azul
Esta técnica proporciona una detección más precisa de hacia dónde está mirando la persona, ya que el iris es un indicador más directo de la dirección de la mirada que los extremos de los ojos.
¿Cuál es la estrategia más efectiva para el seguimiento de la mirada?
Dependiendo de la aplicación, podemos optar por diferentes estrategias:
- Extremos de los ojos: Útil para detección básica y menos intensiva computacionalmente
- Centro del iris: Más preciso para determinar la dirección exacta de la mirada
- Punto medio entre extremos: Una solución intermedia que funciona bien para objetos cercanos
Para implementar la tercera estrategia, calculamos el punto medio entre los extremos de cada ojo:
# Calcular punto medio del ojo izquierdo
mid_left_x = (x_left_inner + x_left_outer) // 2
mid_left_y = (y_left_inner + y_left_outer) // 2
cv2.circle(frame, (mid_left_x, mid_left_y), 3, (255, 0, 0), -1) # Punto azul
Esta aproximación es especialmente útil cuando la persona está mirando objetos cercanos, ya que el punto medio entre los extremos del ojo suele alinearse con la dirección de la mirada en estas situaciones.
¿Qué otras aplicaciones tiene la detección facial con MediaPipe?
Además del seguimiento ocular, MediaPipe Face Mesh permite detectar y rastrear muchos otros puntos faciales, como:
- La punta de la nariz (un desafío interesante para implementar)
- Los contornos de los labios
- Las cejas
- El contorno facial
Estas capacidades abren la puerta a numerosas aplicaciones:
- Filtros de realidad aumentada
- Análisis de expresiones faciales
- Sistemas de autenticación biométrica
- Interfaces controladas por gestos faciales
La detección facial con MediaPipe y Python representa una herramienta poderosa y accesible para desarrolladores interesados en la visión por computadora. Ya sea que estés construyendo una aplicación de seguimiento ocular o explorando otras posibilidades de interacción humano-computadora, estas técnicas proporcionan una base sólida para tu proyecto.
¿Has experimentado con la detección facial en tus proyectos? Te invitamos a compartir tus experiencias y código en los comentarios, especialmente si has implementado el desafío de seguimiento de la punta de la nariz.