Diagnóstico de enfermedades foliares de soya en el dispositivo: detecta, estima severidad y genera recomendaciones de tratamiento ajustadas al clima.
imagen → M_seg (hoja/fondo) → hoja aislada → M1 [original+hoja] sana/enferma
│ (si enferma)
▼
M2 [original+hoja] tipo de patógeno + severidad por color
- M_seg: U-Net ResNet50 256×256, 2 clases (hoja/fondo).
- M1: EfficientNetB1 240×240, doble entrada (original + hoja aislada), sigmoid.
- M2: EfficientNetB0 224×224, doble entrada, softmax 5 clases (
bacterianas,fungicas,plagas_insectos,roya,virales). - Backend: FastAPI + Docker (mismos modelos por HTTP, opcional).
glycine-vision-dss/
├── App/ Flutter app (Clean Architecture)
│ └── assets/models/{hs,pd,seg}/ M1 · M2 · M_seg (.tflite)
├── Backend/ FastAPI (server.py, config.py, inference/, Dockerfile)
├── Models/ Modelos desplegados {health,disease,segmentation}/
├── Training/notebooks/ 01–06 (Google Colab)
└── docker-compose.yml
cd App
flutter pub get
flutter run -d <device_id> # Android / iOS
flutter run -d chrome # Web (requiere el backend corriendo)Requisitos: Flutter 3.x, Android SDK ≥31, Dart ≥3.0.
Docker (recomendado):
docker compose up --build # API en http://localhost:8001Manual:
cd Backend
python -m venv env
.\env\Scripts\Activate.ps1
pip install -r requirements.txt
python server.py| Variable de entorno | Default | Descripción |
|---|---|---|
MODELS_DIR |
../Models |
Ruta a la carpeta de modelos |
curl -X POST http://localhost:8001/api/diagnose \
-F "image=@leaf.jpg" -F "lat=-17.5" -F "lon=-65.3"Respuesta: enfermedades_detectadas, global_severity_pct, seg_mask (base64 uint8 256×256), climate.
Ejecutar los notebooks en orden. M_seg se entrena antes que M1/M2 (produce la hoja aislada que es su segunda entrada).
Máscaras de segmentación (M_seg):
- Tus máscaras de Roboflow →
Training/splits/masks/(con_annotations.coco.json). - Dataset SoyCotton (figshare CC BY 4.0) →
Training/splits/masks_soycotton/annotations/(JSON COCO) +Training/splits/masks_soycotton/images/(imágenes). El notebook 02 las fusiona automáticamente. La celda de descarga del notebook 01 reproduce esa estructura.
Tras mejorar solo M_seg: reentrenar 02, reejecutar 05 (métricas) y 06 (export). M1/M2 (03/04) no requieren reentrenamiento.
Desde la raíz del proyecto, tras completar los notebooks:
$SRC = "Training/outputs"; $APP = "App/assets/models"; $MOD = "Models"
Copy-Item "$SRC/model1.tflite" "$APP/hs/model.tflite" -Force
Copy-Item "$SRC/labels_m1.txt" "$APP/hs/labels.txt" -Force
Copy-Item "$SRC/model2.tflite" "$APP/pd/model_unquant.tflite" -Force
Copy-Item "$SRC/labels_m2.txt" "$APP/pd/labels.txt" -Force
Copy-Item "$SRC/model_seg_int8.tflite" "$APP/seg/model_seg.tflite" -Force
Copy-Item "$SRC/model1.tflite" "$MOD/health/model.tflite" -Force
Copy-Item "$SRC/model1_int8.tflite" "$MOD/health/model_int8.tflite" -Force
Copy-Item "$SRC/labels_m1.txt" "$MOD/health/labels.txt" -Force
Copy-Item "$SRC/model2.tflite" "$MOD/disease/model.tflite" -Force
Copy-Item "$SRC/model2_int8.tflite" "$MOD/disease/model_int8.tflite" -Force
Copy-Item "$SRC/labels_m2.txt" "$MOD/disease/labels.txt" -Force
Copy-Item "$SRC/model_seg.tflite" "$MOD/segmentation/model.tflite" -Force
Copy-Item "$SRC/model_seg_int8.tflite" "$MOD/segmentation/model_int8.tflite" -Force
Write-Host "Deploy OK"