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.
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
streamlit run app/app_streamlit.pyEntrá al link que muestra Streamlit (por defecto http://localhost:8501) y elegí el modelo desde la barra lateral.
.
├── 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
Creá .env en la raíz:
GEMINI_API_KEY="TU_API_KEY"
- Asegurate de tener
data/ref/A.png ... Y.png(pose canónica por letra). - 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_thresholden el script (0.10 → 0.12).
python train/train_letters_from_images.py
# crea models/signai_letters_full_mlp.joblib + models/label_map_letters.jsonSi 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).
- 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.
MIT
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.
