IA y Visión ArtificialIngeniero

Reconoce letras de lengua de señas con MediaPipe

Enséñale al Pi tus letras deletreadas con la mano en minutos y luego mira cómo nombra cada una en vivo en la pantalla.

NivelIngeniero
Tiempo2 h
Costo est.~$155
Pasos5

MediaPipe encuentra 21 puntos de referencia en tu mano en cada cuadro. Esos puntos, normalizados a la muñeca, forman una huella compacta de cada forma de la mano, y un clasificador de vecinos más cercanos aprende tus letras con unas docenas de ejemplos que grabas tú mismo.

Pasos de la misión

  1. Prepara Python

    Crea un venv con --system-site-packages y corre pip install mediapipe scikit-learn.

  2. Graba ejemplos

    Corre el script, haz la forma de una letra y presiona la tecla de esa letra de 20 a 30 veces moviendo un poco la mano.

  3. Reconoce en vivo

    Cuando varias letras tengan ejemplos, la letra que predice aparece en la ventana de video.

  4. Guarda tus datos

    Presiona Esc para salir; los ejemplos se guardan en signs.npz y se cargan la próxima vez.

  5. Mejora la precisión

    Graba ejemplos con distinta luz y distancia, y pide a otras personas que usan señas que agreguen los suyos.

Código

import cv2, numpy as np, mediapipe as mp
from picamera2 import Picamera2
from sklearn.neighbors import KNeighborsClassifier

hands = mp.solutions.hands.Hands(max_num_hands=1, min_detection_confidence=0.6)
cam = Picamera2()
cam.configure(cam.create_preview_configuration(main={'size': (640, 480), 'format': 'RGB888'}))
cam.start()

try:
    d = np.load('signs.npz'); X, y = list(d['X']), list(d['y'])
except FileNotFoundError:
    X, y = [], []
fit = lambda: KNeighborsClassifier(3).fit(X, y) if len(X) >= 3 else None
knn = fit()

while True:
    frame = cam.capture_array()
    res = hands.process(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
    feat = None
    if res.multi_hand_landmarks:
        pts = np.array([[p.x, p.y] for p in res.multi_hand_landmarks[0].landmark])
        pts -= pts[0]                                  # relative to the wrist
        feat = (pts / np.abs(pts).max()).flatten()
        if knn is not None:
            cv2.putText(frame, knn.predict([feat])[0].upper(), (20, 80),
                        cv2.FONT_HERSHEY_SIMPLEX, 3, (0, 255, 0), 5)
    cv2.imshow('signs', frame)
    key = cv2.waitKey(1) & 0xFF
    if key == 27: break                                # Esc
    if feat is not None and ord('a') <= key <= ord('z'):
        X.append(feat); y.append(chr(key)); knn = fit()

np.savez('signs.npz', X=np.array(X), y=np.array(y))

Code comments are in English, like most libraries and docs — a good habit for makers.

Preguntas

¿Por qué no aprende la J y la Z?

En ASL esas letras llevan movimiento. Este proyecto clasifica formas de la mano quietas; las letras con movimiento necesitan un modelo de secuencias.

¿Funciona con lenguas de señas hispanas?

Sí: aprende las formas de mano que grabes, así que puedes entrenarlo con LSM, LSE o cualquier otro alfabeto.