Clasificador de Enfermedades en Hojas de Banano — El Oro, Ecuador
Modelo de clasificación de imágenes para detectar 7 enfermedades en hojas de banano, orientado a productores de la provincia de El Oro, Ecuador. Desarrollado como proyecto de aplicación a la Escuela de Primavera en Deep Learning — UBA/CONICET 2026.
Autor: Joel Velásquez — Universidad Técnica de Machala (UTMACH)
Motivación
El Oro concentra 32,161 hectáreas de banano (18% de la producción nacional de Ecuador). En diciembre 2025 se confirmó Fusarium Raza Tropical 4 en la provincia, con 8,309 hectáreas en riesgo directo. Este proyecto busca dar a pequeños productores rurales una herramienta de diagnóstico temprano accesible desde un smartphone, incluso sin conectividad estable.
Clases detectadas
| # | Clase | Relevancia en El Oro |
|---|---|---|
| 0 | Sigatoka | Alta — endémica |
| 1 | Cordana | Media |
| 2 | Pestalotiopsis | Media |
| 3 | Healthy | — |
| 4 | Moko | Alta — cuarentena activa |
| 5 | Panama Disease | Alta — relacionada a Fusarium R1 |
| 6 | Insect Pest | Media |
Modelos incluidos
Se entrenaron y compararon tres arquitecturas CNN con transfer learning (pesos preentrenados en ImageNet) y fine-tuning en dos fases.
| Archivo | Arquitectura | Parámetros | Tamaño | Accuracy (test) | F1-macro |
|---|---|---|---|---|---|
efficientnet_b0_mejor.pth |
EfficientNet-B0 | 4.0M | 16.4 MB | 100.00% | 100.00% |
mobilenet_v2_mejor.pth |
MobileNetV2 | 2.2M | 9.18 MB | 99.31% | 99.21% |
resnet18_mejor.pth |
ResNet18 | 11.2M | 44.8 MB | 99.65% | 99.11% |
Modelo recomendado para despliegue móvil: mobilenet_v2_mejor.pth.
Aunque EfficientNet-B0 obtuvo el mejor accuracy en el test set interno,
la validación con imágenes externas (ver más abajo) mostró rendimiento
idéntico entre ambos modelos, por lo que el tamaño significativamente
menor de MobileNetV2 lo hace preferible para una app offline en
dispositivos Android de gama media.
Modelo TFLite (para despliegue móvil)
mobilenet_v2_banano.tflite — exportación directa de los pesos
entrenados de MobileNetV2 vía litert-torch (sucesor de
ai-edge-torch). Verificado: las predicciones del modelo TFLite
coinciden con las del modelo PyTorch original sobre las mismas
imágenes de prueba.
import litert_torch
import torch
import numpy as np
from huggingface_hub import hf_hub_download
tflite_path = hf_hub_download(
repo_id="JoelVela/banano-eloro-classifier",
filename="mobilenet_v2_banano.tflite"
)
modelo_tflite = litert_torch.load(tflite_path)
# input_tensor: numpy array, shape (1, 3, 224, 224), normalizado con
# media/std de ImageNet
output = modelo_tflite(input_tensor)
Datos de entrenamiento
| Dataset | Imágenes | Clases aportadas | Fuente |
|---|---|---|---|
| BananaLSD (Augmented) | 1,600 | Sigatoka, Cordana, Pestalotiopsis, Healthy | Kaggle — DOI: 10.1016/j.dib.2023.109608 |
| Banana Disease Recognition | 333 | Moko, Panama Disease, Insect Pest | HuggingFace — DOI: 10.17632/79w2n6b4kf.1 |
Split estratificado por grupo (70% train / 15% val / 15% test), diseñado específicamente para evitar data leakage entre variantes de una misma imagen base (ver sección de metodología en el repositorio de GitHub).
Clases excluidas por ausencia de datos validados: Bacterial Wilt y Fusarium RT4 — documentadas como trabajo futuro.
Limitación conocida: Sigatoka en estadio avanzado
Validación con 9 imágenes externas (fuera de ambos datasets de entrenamiento, de bancos profesionales y sitios agrícolas especializados) reveló una limitación específica: el modelo clasifica correctamente Sigatoka en etapa temprana (lesiones individuales definidas), pero confunde sistemáticamente Sigatoka en estadio avanzado (necrosis extensa) con Panama Disease o Moko. Este patrón se repite de forma idéntica en EfficientNet-B0 y MobileNetV2, lo que sugiere que la causa es un sesgo del dataset de origen (BananaLSD, recolectado en Bangladesh, predominantemente en estadios tempranos) y no una limitación de arquitectura.
Uso (PyTorch)
import torch
import torchvision.models as models
import torch.nn as nn
from huggingface_hub import hf_hub_download
CLASSES = [
'Sigatoka', 'Cordana', 'Pestalotiopsis', 'Healthy',
'Moko', 'Panama_Disease', 'Insect_Pest'
]
# Descargar el checkpoint
ckpt_path = hf_hub_download(
repo_id="JoelVela/banano-eloro-classifier",
filename="mobilenet_v2_mejor.pth"
)
# Reconstruir la arquitectura
modelo = models.mobilenet_v2(weights=None)
in_features = modelo.classifier[1].in_features
modelo.classifier = nn.Sequential(
nn.Dropout(p=0.3),
nn.Linear(in_features, len(CLASSES))
)
# Cargar pesos
modelo.load_state_dict(torch.load(ckpt_path, map_location="cpu"))
modelo.eval()
Preprocesamiento esperado: redimensionar a 224x224 y normalizar con
media/std de ImageNet ([0.485, 0.456, 0.406] / [0.229, 0.224, 0.225]).
Trabajo relacionado
Este proyecto extiende a Jiménez et al. (2025), "Detection of Leaf Diseases in Banana Crops Using Deep Learning Techniques" (UTMACH), que clasificó 3 enfermedades con EfficientNetB0/ResNet50/VGG19 sobre un dataset propio de 900 imágenes de El Oro. Este trabajo amplía a 7 clases, compara arquitecturas distintas (incluyendo MobileNetV2 para móvil), y añade despliegue offline vía TFLite + Flutter.
Código de entrenamiento
El notebook completo de entrenamiento, con la metodología detallada (incluyendo la detección y corrección de un problema de data leakage en el split inicial), está disponible en GitHub: [enlace pendiente]
Citación
Si usás este modelo, por favor citá los datasets originales:
@article{arman2023bananalsd,
title={BananaLSD: A banana leaf images dataset for classification of banana leaf diseases using machine learning},
author={Arman, Shifat E and Bhuiyan, Md Abdullahil Baki and Abdullah, Hasan Muhammad and Islam, Shariful and Chowdhury, Tahsin Tanha and Hossain, Md Arban},
journal={Data in Brief},
year={2023},
publisher={Elsevier}
}
@article{mafi2023bananadisease,
title={Banana Disease Recognition Dataset},
author={Mafi, Md Mafiul Hasan Matin and Sifat, R.M. and Moazzam, Md. Golam Moazzam and Uddin, Mohammad Shorif},
journal={Mendeley Data},
volume={V1},
year={2023},
doi={10.17632/79w2n6b4kf.1}
}
- Downloads last month
- -