Electiva III – Deep Learning · Ingeniería de Sistemas · Universidad Cooperativa de Colombia

¿Está buena esta manzana?

Una red neuronal convolucional que clasifica la foto de una manzana como fresca o dañada. Esta página reúne las cuatro entregas del curso: la teoría, los elementos del Deep Learning, el código y el proyecto funcionando.

Probar el detector Ver cómo se construyó

1. Teoría: qué es el Deep Learning

Entrega 1 · Mapa conceptual

El Deep Learning es un subconjunto del Machine Learning que aprende representaciones de los datos mediante redes neuronales con muchas capas. A diferencia del ML clásico, no necesita que una persona diseñe las características a mano: la red las aprende durante el entrenamiento.

Machine Learning clásico

Características diseñadas a mano (color, bordes, umbrales) y un modelo sencillo encima. En este proyecto es el detector por umbral de pulpa, que acertó solo el 50 %.

Deep Learning

La red aprende de los píxeles: bordes en las primeras capas, texturas y formas después, y conceptos como «mancha» o «mordisco» en las últimas.

Deep Learning
├── Fundamentos ......... neurona · MLP · funciones de activación · backpropagation · optimizadores
├── Arquitecturas ....... CNN (imágenes) · RNN/LSTM (secuencias) · Transformers · GANs
├── Entrenamiento ....... pérdida · gradiente · épocas · lotes · regularización · hiperparámetros
├── Reutilización ....... transfer learning · fine-tuning · modelos preentrenados
├── Despliegue .......... Edge AI · ONNX / TensorFlow Lite · APIs · monitoreo
└── Responsabilidad ..... sesgo en los datos · interpretabilidad (Grad-CAM, SHAP, LIME) · privacidad
    
Mapa conceptual con los elementos del programa del curso. Los resaltados en este proyecto: CNN, regularización, transfer learning, interpretabilidad y despliegue.

2. Elementos del Deep Learning, explicados con el proyecto

Entrega 2 · Programa que explica los elementos

Neurona y MLP Módulo 2

Una neurona calcula una suma ponderada de sus entradas y le aplica una función de activación. Una MLP apila capas densas. Aplanar una imagen de 100×100×3 da 30 000 entradas y 3,8 millones de parámetros: caro y sin noción de vecindad.

Activaciones Módulo 2

ReLU en las capas ocultas (rápida, evita gradientes que se apagan) y softmax en la salida para obtener la probabilidad de cada clase.

Backpropagation y optimizador Módulo 2

La pérdida (entropía cruzada) mide el error; la retropropagación calcula el gradiente de cada peso; Adam los ajusta paso a paso.

Convolución, pooling y padding Módulo 3

Un filtro 3×3 se desliza por la imagen y detecta un patrón con los mismos pesos en todas partes. El pooling reduce el tamaño y el padding controla los bordes. Una CNN de 876 mil parámetros iguala a una MLP de 3,8 millones.

Regularización Módulo 6

Con pocos datos la red memoriza. Se combate con Dropout, aumento de datos, BatchNorm y Early Stopping sobre la pérdida de validación.

Transfer learning Módulo 7

Se parte de MobileNetV2, ya entrenada con ImageNet, y solo se ajusta la parte final para distinguir manzanas frescas y dañadas. Menos datos, menos tiempo y mejor generalización.

IA responsable Módulo 13

El primer modelo del proyecto aprendió de qué fuente venía la foto y no el daño de la fruta. Se detectó con una imagen externa y se corrige con datos variados y Grad-CAM.

Despliegue Módulos 12 y 15

El modelo se exporta a ONNX y corre dentro de esta página con ONNX Runtime Web: la foto no sale de tu navegador.

3. Código

Entrega 3 · Programa que codifica los elementos

Todo el código está en el repositorio.

ArchivoQué contiene
notebooks/00_avance_clases_cnn_mordida.pyAvance de las primeras clases: convolución manual, MLP vs CNN, curvas, activaciones.
notebooks/01_transfer_learning_manzanas.ipynbDatos, partición, aumento, MobileNetV2 en PyTorch, fine-tuning, métricas y Grad-CAM.
src/Módulos de PyTorch: datos, modelo, entrenamiento, evaluación, Grad-CAM y exportación a ONNX.
m = models.mobilenet_v2(weights=models.MobileNet_V2_Weights.IMAGENET1K_V1)
m.classifier = nn.Sequential(nn.Dropout(0.3), nn.Linear(m.last_channel, 1))   # logit de «dañada»
for p in m.features.parameters():
    p.requires_grad = False          # fase 1: solo se entrena la cabeza
opt = torch.optim.Adam(m.classifier.parameters(), lr=1e-3)
perdida = nn.BCEWithLogitsLoss()

4. Proyecto: detector de manzanas frescas y dañadas

Entrega 4 · Implementación del paradigma Deep Learning

  1. Problema. Clasificación binaria de imagen: fresca (0) o dañada (1).
  2. Datos. Conjunto público fresh_rotten_fruit_classification (Project-AgML, licencia CC BY 4.0), filtrado a la fruta «manzana».
  3. Partición. 70 / 15 / 15 estratificada, sin imágenes duplicadas entre conjuntos.
  4. Línea base. La CNN propia y la MLP del avance de clases.
  5. Modelo final. MobileNetV2 con transfer learning y fine-tuning, con aumento de brillo, contraste y zoom.
  6. Evaluación. Matriz de confusión y recall de la clase dañada, porque lo grave es que una manzana mala pase como buena.
  7. Interpretabilidad. Grad-CAM para comprobar que la red mira la mancha y no el fondo.
  8. Despliegue. Exportación a ONNX y demo en esta página.

Demo en vivo

Sube o toma la foto de una manzana. El análisis se hace en tu navegador y la imagen no se envía a ningún servidor.

Esperando imagen…

Resultados

Esta sección se completa tras el entrenamiento final. Resultados del avance de clases, con las limitaciones ya identificadas:

ClasificadorExactitud en pruebaParámetrosLectura
Detector por umbral (sin aprendizaje)50 %0Equivale a lanzar una moneda.
MLP100 %3 840 386Prueba de solo 10 imágenes: no concluyente.
CNN propia100 %875 906Falló con una foto externa: aprendió la fuente de la foto.
MobileNetV2 (transfer learning)Pendiente de entrenamiento.

Referencias