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.
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
Prepara Python
Crea un venv con --system-site-packages y corre pip install mediapipe scikit-learn.
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.
Reconoce en vivo
Cuando varias letras tengan ejemplos, la letra que predice aparece en la ventana de video.
Guarda tus datos
Presiona Esc para salir; los ejemplos se guardan en signs.npz y se cargan la próxima vez.
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.