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
-
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support