Abstract
Cuando los primeros signos de enfermedad en una hoja son visibles, la planta ya está comprometida. Una cámara hiperespectral captura 96 bandas del espectro por punto (una RGB captura 3) y “ve” cambios en clorofila y pigmentos fuera del rango visible — pero sus datos crudos (decenas de GB por sesión) no le sirven de nada a un agrónomo. Esta suite los traduce en mapas de calor, firmas espectrales y clasificaciones accionables, para un cultivo de claveles.
Materiales y métodos
- Backend (Python 3.11 + FastAPI): decodifica las capturas crudas del sensor, calcula 10 índices de vegetación y estrés por píxel (NDVI, NDRE, GNDVI, PRI, MCARI, SAVI, CI red-edge, ARI, REP, proxy WBI), detecta anomalías espectrales (distancia RX/ Mahalanobis a una firma sana), segmenta lesiones foliares (NDVI + verificación cruzada con Spectral Angle Mapper) y entrena clasificadores Random Forest/SVM con validación cruzada y matriz de confusión.
- Frontend (C#/.NET 8, WPF, MVVM, ScottPlot): un usuario no técnico navega capturas, ve índices como overlays de color, hace clic en cualquier punto para ver su firma espectral y entrena clasificadores sin tocar código.
- Empaquetado distribuible: .NET self-contained con entorno Python y SDK de la cámara embebidos — se instala en el equipo del cliente sin entorno de desarrollo.
- Librería de firmas de referencia exportable en HDF5; reportes automáticos en Markdown, PDF y Word con membrete del cliente. ~105 GB de capturas crudas procesadas.
Resultados
Estudio de laboratorio con 12 capturas reales y 2.171 puntos espectrales etiquetados (1.562 sanos / 609 enfermos), validado con leave-one-capture-out — el modelo nunca ve la misma hoja en entrenamiento y prueba:
- Random Forest: 84,1 % de precisión (75,4 % balanceada), contra 76,9 % de la línea base (Spectral Angle Mapper).
- Mejor índice individual: GNDVI (AUC 0,80). Bandas más discriminantes: rojo/red-edge (690–721 nm) y verde/amarillo (506–573 nm) — consistente con degradación de clorofila.
Retos técnicos resueltos
- Carga de datos resiliente: cascada de fallback en tres niveles (caché NPZ → HDF5 con recuperación de chunks corruptos → decodificación en vivo del crudo con caché LRU) para que la aplicación funcione aunque el preprocesamiento haya quedado a medias.
- 7 suites de pruebas, varias con datos sintéticos para no depender del hardware real.
Proyecto privado: el código no es público.