GitHub - guzzipa/SignAI

✋ SignAI — Reconocimiento de señas en tiempo real

SignAI Demo

SignAI interpreta el alfabeto de ASL en vivo usando MediaPipe + modelos MLP. Incluye:

  • 🧠 Entrenamiento a partir de landmarks (tu data real o mixta).
  • 🤖 Generación de data sintética guiada por imagen de referencia (Gemini).
  • 🧰 Soporte para múltiples modelos conmutables desde la UI:
    • signai_letters_full_mlp.joblib → modelo propio (real/sintético mix).
    • signai_letters_mlp.joblib → solo data sintética.
    • signai_mnist_mlp.joblib → Kaggle (pipeline tipo MNIST 28×28).
  • 🪄 App de Streamlit con dibujo de landmarks / bbox y armado de palabra.

🚀 Demo rápida

python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
streamlit run app/app_streamlit.py

Entrá al link que muestra Streamlit (por defecto http://localhost:8501) y elegí el modelo desde la barra lateral.


📁 Estructura

.
├── app/
│   └── app_streamlit.py
├── data/
│   ├── ref/            # imágenes de referencia por letra (A–Y, sin J/Z)
│   ├── synth/          # data sintética generada
│   └── processed/      # normalizado para entrenar (opcional)
├── models/
│   ├── signai_letters_full_mlp.joblib
│   ├── signai_letters_mlp.joblib
│   ├── signai_mnist_mlp.joblib
│   ├── label_map_letters.json
│   └── label_map_mnist.json
├── scripts/
│   ├── gen_synth_alphabet_guided.py   # generación con referencia + validación
│   ├── gen_synth_alphabet_genai.py    # generación libre
│   └── cam_preview.py
└── train/
    ├── train_letters_from_images.py
    ├── train_landmarks.py
    ├── collect.py / collect_one.py    # captura manual
    └── letters_config.yaml / config.yaml

🔑 API Key (opcional, para data sintética)

Creá .env en la raíz:

GEMINI_API_KEY="TU_API_KEY"

🖼️ Generar data sintética

  1. Asegurate de tener data/ref/A.png ... Y.png (pose canónica por letra).
  2. Ejecutá:
python scripts/gen_synth_alphabet_guided.py
  • Usa la referencia, valida con MediaPipe (similitud de pose) y/o con tu clasificador.
  • Guarda imágenes en data/synth/<LETRA>/.

Tip: si hay muchos rechazos, ajustá pose_threshold en el script (0.10 → 0.12).


🏋️ Entrenar

Landmarks (modelo de letras)

python train/train_letters_from_images.py
# crea models/signai_letters_full_mlp.joblib + models/label_map_letters.json

Kaggle (MNIST-style)

Si ya tenés signai_mnist_mlp.joblib + label_map_mnist.json, podés usarlo directo. De lo contrario, adaptá train/train_mnist_mlp.py a tu dataset (28×28).


🧪 Modo de inferencia en la app

  • Landmarks: dibuja puntos/conexiones y usa 63 features (21×3).
  • MNIST: recorta la mano, normaliza a 28×28 y predice; dibuja un bbox verde.

Elegís el modelo desde el sidebar. La app arma una palabra agregando letras cuando la predicción se mantiene estable por N frames y supera el umbral.


🧾 Licencia

MIT


🤝 Contribuir

PRs y issues bienvenidos. Si agregás un modelo nuevo, sólo sumalo a MODEL_OPTIONS en app/app_streamlit.py indicando type = landmarks o mnist.