13. Guía de onboarding
Plan de estudio de 5 semanas para un nuevo integrante, con orden de lectura, objetivos, ejercicios prácticos y criterios de "ya lo dominas". Ajusta el ritmo a tu experiencia previa: un desarrollador sin ML puede necesitar más tiempo en las semanas 1-2; uno con ML puede acelerar.
Antes de empezar: setup (día 0)
- Lee LOCAL.md del repo y levanta el entorno: crea el
venv,make install, configura.envconDATASET_ROOT, ymake download-dataset. - Verifica que todo funciona:
make test-loader(smoke check) ymake summary(conteo por clase). - Si algo falla, casi siempre es el
.env:get_dataset_root()da un mensaje claro.
Criterio de listo: make test-loader pasa sin errores.
Semana 1 — Panorama y arquitectura
Objetivo: entender qué hace el sistema y cómo está organizado, sin entrar al detalle del código.
Lectura (en orden):
- Resumen ejecutivo — el qué, el porqué, las 9 clases, los resultados.
- Mapa del repositorio — la topología, la dualidad src/scripts.
- Flujo completo del sistema — el recorrido de una imagen de punta a punta.
- Si no tienes background de ML: hojea el Glosario en paralelo.
Ejercicio práctico:
- Recorre el árbol del repo con la mano en el mapa. Abre 3 archivos de
src/y 3 descripts/y clasifícalos como "componente" o "entrypoint". - Corre
make summaryy anota la distribución de clases. ¿Cuál es la más y la menos frecuente? Calcula el ratio.
Criterio de dominio: puedes dibujar de memoria el diagrama de las 9 etapas y explicar la diferencia entre train_baselines.py y train.py.
Semana 2 — Datos y preprocesamiento
Objetivo: dominar cómo se preparan y cargan los datos (la capa más crítica).
Lectura:
- Configuración y rutas — el YAML y
config.py. - Capa de datos — loader, dataset, splitter, transforms (léela con el código abierto al lado).
- Fundamentos: Data Augmentation, regularización.
Ejercicio práctico:
- Corre
make splits-baseliney abreoutputs/splits/seed_42_baseline/split_audit_report.csv. Verifica que la proporción 70/15/15 se cumple por clase. - Lee
compute_minority_classesy calcula a mano qué clases son minoritarias con umbral 4.0 usando los conteos demake summary. - Abre un run existente y mira
augmentation_preview/: compara el grid de una clase minoritaria vs una mayoritaria. ¿Ves la diferencia de agresividad?
Criterio de dominio: puedes explicar por qué saturación/hue están casi en cero, por qué se deduplica por hash, y qué hace el for/else de __getitem__.
Semana 3 — Modelos y entrenamiento
Objetivo: entender cómo se construyen los modelos y cómo funciona el loop.
Lectura:
- Modelos y registry — el patrón registry, transfer learning en código.
- Entrenamiento —
common.py, el loop detrain_baselines.py. - Fundamentos: CNN, transfer learning, backprop, optimizadores, cross-entropy.
- Hiperparámetros.
Ejercicio práctico:
- Entrena un modelo corto:
make train-baselines MODELS=shufflenet_v2_x1_0 EPOCHS=3. Observatrain_history.csvmientras corre. - Abre
summary.jsondel run y localiza cada hiperparámetro en el código que lo generó. - Cambia el LR:
make train-baselines MODELS=shufflenet_v2_x1_0 EPOCHS=3 LEARNING_RATE=0.01. Compara la loss. ¿Diverge o mejora?
Criterio de dominio: puedes trazar el camino de un batch desde el DataLoader hasta optimizer.step(), y explicar por qué se guarda best.pth por macro-F1.
Semana 4 — Evaluación e inferencia
Objetivo: interpretar resultados y correr inferencia/explicabilidad.
Lectura:
- Fundamentos: métricas, matriz de confusión, XAI.
- Explicabilidad (código).
- Scripts de soporte: predict.
Ejercicio práctico:
- Abre
test_confusion_matrix.csvde un run. Identifica las dos clases que más se confunden entre sí. ¿Tiene sentido agronómico (síntomas parecidos)? - Corre
make explain-lime MODELS=<tu-modelo>y abre un PNG delime_visual/. ¿LIME y Grad-CAM coinciden en la lesión? - Corre
make explain-errors MODELS=<tu-modelo>y mira un error. ¿En qué se fijó el modelo al equivocarse? - Predice una imagen:
python scripts/pipeline/predict.py --model <m> --image <ruta>.
Criterio de dominio: puedes leer una matriz de confusión, interpretar un panel LIME+Grad-CAM y explicar la métrica explanation_dispersion.
Semana 5 — Decisiones, riesgos y defensa
Objetivo: pasar de "sé cómo funciona" a "puedo defenderlo y mejorarlo".
Lectura:
- Decisiones técnicas — el porqué de cada elección.
- ¿Qué pasaría si...? — la sensibilidad del sistema.
- Riesgos técnicos — limitaciones y fragilidades.
- Banco de preguntas — auto-evaluación.
- Guía de defensa.
Ejercicio práctico:
- Responde las 28 preguntas del banco sin mirar las respuestas. Compara.
- Prepara una defensa de 10 minutos siguiendo el guion de la sección 12.8.
- Elige una limitación de riesgos y propón una mejora concreta con su plan de implementación.
Criterio de dominio: puedes justificar cualquier decisión del proyecto contra su alternativa, y responder a una objeción sin inventar datos.
Ruta rápida (para experimentados con ML)
Si ya dominas ML y solo necesitas conocer este proyecto:
Puedes saltarte los fundamentos teóricos (sección 5) y el glosario, y usarlos solo como referencia puntual.
Primeras contribuciones sugeridas (para aprender haciendo)
Ordenadas de menor a mayor dificultad:
- Fácil: añadir un test unitario de
compute_minority_classesobuild_weighted_sampler. - Fácil: entrenar y explicar un modelo del registry aún no comparado (p.ej.
ghostnetv2_100) y documentar sus métricas. - Media: añadir un learning rate scheduler opcional a
train_baselines.py. - Media: implementar dedup perceptual opcional en
create_splits.py. - Difícil: implementar el loop de entrenamiento de
train.pyreusando_run_epoch. - Difícil: pipeline de exportación a TFLite Int8 + validación de macro-F1 post-cuantización.
Referencia permanente
El Glosario queda como consulta rápida de cualquier término técnico durante todo el onboarding y después.