Hasta ahora hemos usado las CNN para una única tarea: mirar una imagen y asignarle una etiqueta. Pero la clasificación es solo la puerta de entrada. Con el mismo motor de extracción de características que ya dominas —bloques conv+pooling construyendo la jerarquía bordes→texturas→partes→objetos— se resuelven tareas mucho más ricas: decir dónde está cada objeto, recortar su silueta exacta, leer texto en una foto o encontrar productos visualmente parecidos. En esta lección haremos el mapa completo de las tareas de visión por computador, cada una aplicada a una necesidad real de TecnoMarket, veremos cómo es el pipeline de un sistema de reconocimiento en producción, y lo aterrizaremos con dos ejemplos ejecutables: un clasificador Keras haciendo predicciones sobre imágenes y una demostración de búsqueda por similitud con embeddings y similitud coseno.

Contenido

  1. El mapa de tareas: de clasificar a segmentar
  2. Detección de objetos: YOLO y SSD a vista de pájaro
  3. Segmentación: semántica e instancias
  4. OCR: leer texto en imágenes
  5. Búsqueda visual por similitud: embeddings
  6. El pipeline de un sistema real
  7. Ejemplo 1: clasificar y predecir con Keras
  8. Ejemplo 2: similitud coseno entre embeddings

El mapa de tareas: de clasificar a segmentar

Las tareas de reconocimiento se ordenan por la riqueza de su respuesta ante la misma foto:

Tarea Pregunta que responde Salida Caso TecnoMarket
Clasificación ¿Qué hay en la imagen? Una etiqueta (+ probabilidades) Categorizar la foto que sube un vendedor: "cafetera"
Clasificación + localización ¿Qué hay y dónde? Etiqueta + un rectángulo (bounding box) Comprobar que el producto está centrado y ocupa la foto
Detección de objetos ¿Qué objetos hay y dónde está cada uno? Lista de (etiqueta, caja, confianza) Encontrar todos los productos en una foto de catálogo o de estantería
Segmentación semántica ¿A qué clase pertenece cada píxel? Un mapa de etiquetas del tamaño de la imagen Separar producto/fondo para quitar el fondo automáticamente
Segmentación de instancias ¿Qué píxeles pertenecen a cada objeto? Una máscara por objeto Recortar cada uno de los 3 monitores de una foto de lote

Dos aclaraciones sobre la tabla:

  • Localización añade a la clasificación una regresión: además de las probabilidades softmax, la red produce 4 números (x, y, ancho, alto) del rectángulo. Mismo extractor convolucional, una "cabeza" de salida más — se entrena con una pérdida combinada (la CCE de clasificación de 02-04 más un MSE sobre las coordenadas).
  • La detección generaliza a N objetos, y ahí está la dificultad: no sabes cuántos hay de antemano.

Casos de uso concretos en TecnoMarket, que iremos conectando con cada técnica:

  1. Moderar fotos de vendedores (nuestro proyecto estrella): clasificar la categoría del producto y rechazar fotos que no corresponden (una foto borrosa, un objeto prohibido, una imagen sin producto).
  2. Detectar productos en imágenes de catálogo: un proveedor envía una foto con 12 artículos sobre una mesa; el sistema localiza y recorta cada uno.
  3. Búsqueda visual "productos parecidos": el cliente fotografía una lámpara que vio en casa de un amigo y la app encuentra las más similares del catálogo.
  4. Lectura de etiquetas: extraer el número de serie o el modelo de la foto de la etiqueta trasera de un electrodoméstico.

Detección de objetos: YOLO y SSD a vista de pájaro

¿Cómo encuentra una red un número variable de objetos? La idea ingenua —deslizar un clasificador por miles de ventanas de todos los tamaños posibles— funciona pero es lentísima. Las familias modernas lo resuelven en una sola pasada:

  • YOLO (You Only Look Once): divide la imagen en una rejilla (p. ej. 13×13). Cada celda predice, de golpe, unas pocas cajas candidatas con su confianza y su clase. Como todo sale de una única pasada por la CNN, es tan rápido que procesa vídeo en tiempo real.
  • SSD (Single Shot Detector): misma filosofía de una sola pasada, pero predice cajas desde varios niveles de la jerarquía convolucional: los mapas grandes de las primeras capas (alta resolución) detectan objetos pequeños, y los mapas pequeños y profundos detectan objetos grandes — un uso directo de la jerarquía de características de 03-01.

Piezas comunes que conviene conocer de nombre:

  • Confianza: cada caja lleva una probabilidad de "aquí hay un objeto"; las cajas por debajo de un umbral se descartan.
  • Supresión de no-máximos (NMS): varias celdas suelen proponer cajas casi idénticas sobre el mismo objeto; NMS conserva la de mayor confianza y elimina las solapadas.

Para la foto del proveedor con 12 artículos, un detector devuelve algo como [("monitor", caja1, 0.97), ("teclado", caja2, 0.91), ...], y con esas cajas el sistema recorta automáticamente cada producto para darlo de alta en el catálogo. Entrenar un detector requiere datasets anotados con cajas y pérdidas especializadas — queda fuera de este curso; lo importante aquí es saber qué pedirle a estas herramientas y reconocer sus piezas.

Segmentación: semántica e instancias

Cuando el rectángulo no basta —quitar el fondo de la foto de producto exige saber exactamente qué píxeles son producto— pasamos a la segmentación:

  • Semántica: cada píxel recibe una clase ("producto", "fondo", "mano del vendedor"). Dos cafeteras juntas forman una sola mancha "cafetera".
  • De instancias: además separa objetos individuales: cafetera nº 1 y cafetera nº 2 tienen máscaras distintas (es la combinación de detección + máscara por objeto).

La arquitectura conceptual de referencia para segmentación es la U-Net: tiene forma de U porque a la etapa convolucional habitual que encoge la imagen extrayendo características (el encoder, todo lo aprendido en 03-02) le sigue una etapa simétrica que la vuelve a expandir hasta el tamaño original (el decoder), produciendo una predicción por píxel. Las conexiones de salto entre niveles simétricos de la U (primas hermanas de las de ResNet, pero concatenando en vez de sumar) reinyectan el detalle fino de las primeras capas para que los contornos salgan precisos.

flowchart LR
    A["Imagen"] --> B["Encoder<br/>conv+pool<br/>(encoge)"]
    B --> C["Caracteristicas<br/>abstractas"]
    C --> D["Decoder<br/>upsampling<br/>(expande)"]
    D --> E["Mascara<br/>por pixel"]
    B -.->|"conexiones de salto<br/>(detalle fino)"| D

Uso en TecnoMarket: el recorte automático de fondo para que todas las fotos del catálogo tengan fondo blanco uniforme — segmentación semántica producto/fondo y sustitución de los píxeles de fondo.

OCR: leer texto en imágenes

El OCR (Optical Character Recognition) convierte imágenes con texto en texto digital. Un sistema moderno encadena dos etapas, ambas apoyadas en CNN:

  1. Detección de texto: localizar las regiones de la imagen que contienen texto (un problema de detección como el de la sección anterior, con "texto" como clase).
  2. Reconocimiento: leer cada región. Una CNN extrae características de la franja de imagen y un componente secuencial las transcribe carácter a carácter — el texto es una secuencia, y para modelar secuencias usaremos las redes recurrentes del módulo 4; aquí nos quedamos en el concepto.

En TecnoMarket, el OCR automatiza la lectura de etiquetas: el vendedor fotografía la etiqueta trasera del electrodoméstico y el sistema extrae modelo, número de serie y clase energética, rellenando la ficha sin teclear. En la práctica rara vez se entrena un OCR propio: se usan motores existentes (Tesseract, servicios en la nube) salvo necesidades muy específicas.

Búsqueda visual por similitud: embeddings

La aplicación más elegante del extractor de características: usar la CNN sin la capa de clasificación. Recuerda la anatomía de 03-01: tras la etapa convolucional (y el global average pooling de 03-03), la imagen queda resumida en un vector de, digamos, 128 números que condensan sus características visuales. Ese vector se llama embedding.

La propiedad clave: imágenes visualmente parecidas producen embeddings cercanos. Dos lámparas de diseño similar caen en puntos próximos de ese espacio de 128 dimensiones aunque sus píxeles difieran en todo (fondo, ángulo, iluminación); una lámpara y una freidora caen lejos.

Cómo se mide "cerca": con la similitud coseno, el coseno del ángulo entre los dos vectores:

similitud(a, b) = (a · b) / (‖a‖ × ‖b‖)

Vale 1 si apuntan en la misma dirección (muy similares), 0 si son perpendiculares (nada que ver) y −1 si son opuestos. Se prefiere a la distancia euclídea porque ignora la magnitud del vector (cuánto activa la imagen en total) y compara solo el patrón de características.

El sistema "productos parecidos" de TecnoMarket queda así:

  1. Indexado (una vez): pasar cada foto del catálogo por la CNN y guardar su embedding en una base de datos.
  2. Consulta (en caliente): el cliente sube su foto → embedding → similitud coseno contra el índice → devolver los K productos más cercanos.

Este patrón (codificar cualquier cosa como vector y buscar por cercanía) es hoy universal: lo reencontrarás con textos en el módulo 4 y con los autoencoders de 05-02.

El pipeline de un sistema real

Ninguna de estas redes trabaja sola. El sistema de moderación de fotos de TecnoMarket, de la subida del vendedor a la ficha publicada, encadena:

flowchart LR
    A["Foto del vendedor<br/>(3000x2000, JPG)"] --> B["Preprocesado<br/>redimensionar 224x224<br/>normalizar valores"]
    B --> C["Inferencia CNN<br/>clasificacion"]
    C --> D{"Confianza<br/>> umbral?"}
    D -->|"si"| E["Auto-etiquetar<br/>y publicar"]
    D -->|"no"| F["Cola de revision<br/>humana"]
  • Preprocesado: las fotos llegan en tamaños y formatos arbitrarios; se redimensionan al tamaño de entrada de la red y se normalizan los píxeles (por ejemplo de [0, 255] a [0, 1], como hicimos con MNIST en 02-05). Regla de hierro: la imagen de inferencia debe preprocesarse exactamente igual que las de entrenamiento.
  • Entrenamiento aparte: al entrenar (no en inferencia) se aplica además aumento de datos —girar, recortar, cambiar brillo— para multiplicar la variedad; es una técnica de regularización y la desarrollaremos en 05-04.
  • Inferencia: una pasada forward (02-03) del modelo ya entrenado. Sin backprop, sin gradientes: milisegundos por imagen.
  • Decisión con umbral: un sistema en producción nunca confía a ciegas en el softmax. Si la probabilidad máxima no supera un umbral (p. ej. 0.85), la foto va a revisión humana. El umbral regula el equilibrio entre automatizar mucho y equivocarse poco.

Ejemplo 1: clasificar y predecir con Keras

Metodología del curso: prototipo con dataset público antes de tocar los datos de TecnoMarket. Usamos CIFAR-10 (60 000 fotos en color de 32×32, 10 clases: avión, coche, pájaro...), que hace de sustituto de nuestras fotos de producto. Entrenamos brevemente una CNN pequeña y nos centramos en la parte nueva: predecir sobre imágenes y leer las predicciones. (El proyecto guiado completo, con más entrenamiento, evaluación fina y mejora iterativa, es el de la lección 07-01.)

import numpy as np
from tensorflow import keras
from tensorflow.keras import layers

# 1) Datos: CIFAR-10, normalizado a [0, 1] como en 02-05
(x_train, y_train), (x_test, y_test) = keras.datasets.cifar10.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
clases = ["avion", "coche", "pajaro", "gato", "ciervo",
          "perro", "rana", "caballo", "barco", "camion"]

# 2) Una CNN compacta con el patron mini-VGG de 03-03
modelo = keras.Sequential([
    keras.Input(shape=(32, 32, 3)),
    layers.Conv2D(32, (3, 3), padding="same", activation="relu"),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(64, (3, 3), padding="same", activation="relu"),
    layers.MaxPooling2D((2, 2)),
    layers.GlobalAveragePooling2D(),
    layers.Dense(10, activation="softmax"),
])
modelo.compile(optimizer="adam",                      # Adam, como en 02-04
               loss="sparse_categorical_crossentropy",
               metrics=["accuracy"])

# 3) Entrenamiento corto (suficiente para el ejemplo)
modelo.fit(x_train, y_train, epochs=5, batch_size=64,
           validation_split=0.1, verbose=2)

# 4) Lo nuevo: predecir sobre imagenes y leer la salida
probabilidades = modelo.predict(x_test[:4])           # 4 imagenes -> matriz 4x10
for i, probs in enumerate(probabilidades):
    top = np.argsort(probs)[::-1][:3]                 # indices de las 3 clases mas probables
    real = clases[int(y_test[i])]
    print(f"Imagen {i} (real: {real})")
    for k in top:
        print(f"   {clases[k]:8s} {probs[k]:6.1%}")

Salida típica (variará por la inicialización aleatoria):

Imagen 0 (real: gato)
   gato      54.2%
   perro     21.7%
   ciervo     8.3%
Imagen 1 (real: barco)
   barco     88.9%
   avion      6.1%
   camion     2.4%
...

Cómo leerlo con ojos de sistema de producción:

  • modelo.predict devuelve la distribución softmax completa (10 probabilidades por imagen), no una etiqueta. La etiqueta es decisión nuestra: np.argmax(probs).
  • El "barco" al 88.9 % superaría un umbral de 0.85 y se auto-etiquetaría; el "gato" al 54.2 % iría a revisión humana. Mostrar el top-3 ayuda al revisor: si las dos primeras opciones son "gato" y "perro", la duda es razonable; si son "gato" y "camión", algo raro pasa con la foto.
  • Para una foto nueva de TecnoMarket el flujo sería idéntico: cargar el JPG, redimensionar a 32×32 (o al tamaño de entrada del modelo), normalizar dividiendo por 255, añadir la dimensión de batch (np.expand_dims(img, 0)) y llamar a predict.

Ejemplo 2: similitud coseno entre embeddings

Ahora la búsqueda visual. Truco didáctico: en vez de entrenar una red de embeddings especializada, reutilizamos la CNN anterior cortándola antes de la capa softmax — la salida del GlobalAveragePooling2D (64 números) es nuestro embedding.

# 1) Modelo de embeddings: la misma red, sin la capa de clasificacion
extractor = keras.Model(
    inputs=modelo.inputs,
    outputs=modelo.layers[-2].output      # salida del GlobalAveragePooling2D (64 valores)
)

# 2) "Catalogo": embeddings de 1000 imagenes de test
catalogo = extractor.predict(x_test[:1000])          # matriz 1000x64

def similitud_coseno(a, b):
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

# 3) Consulta: el "cliente" sube la imagen 1500 (fuera del catalogo)
consulta = extractor.predict(x_test[1500:1501])[0]   # vector de 64

similitudes = np.array([similitud_coseno(consulta, e) for e in catalogo])
top5 = np.argsort(similitudes)[::-1][:5]             # los 5 mas parecidos

print(f"Consulta: {clases[int(y_test[1500])]}")
for idx in top5:
    print(f"  parecido: {clases[int(y_test[idx])]:8s} "
          f"similitud = {similitudes[idx]:.3f}")

Salida típica:

Consulta: caballo
  parecido: caballo  similitud = 0.983
  parecido: caballo  similitud = 0.971
  parecido: ciervo   similitud = 0.968
  parecido: caballo  similitud = 0.962
  parecido: perro    similitud = 0.955

Observaciones:

  • keras.Model(inputs=..., outputs=capa_intermedia.output) crea una "vista" de la red que termina donde digamos: así se extraen embeddings (y así se visualizan feature maps intermedios, como apuntamos en 03-02).
  • Los vecinos más cercanos comparten clase o son clases visualmente afines (caballo/ciervo): el espacio de embeddings organiza las imágenes por parecido visual, no por píxeles. Y nadie ha entrenado a la red "para buscar": es un efecto colateral de aprender a clasificar.
  • El sistema real de TecnoMarket seguiría este esquema con dos mejoras: un extractor mucho más potente (una red preentrenada — transfer learning, 05-03) y una base de datos vectorial para buscar entre millones de embeddings sin recorrerlos uno a uno.

Errores Comunes y Consejos

  • Elegir una tarea más cara de lo necesario. Si basta con saber qué producto es, no montes detección; si basta la caja, no montes segmentación. Cada salto en riqueza de salida multiplica el coste de anotar datos y de computar. Empieza por la tarea mínima que resuelve el problema.
  • Preprocesar distinto en entrenamiento y en inferencia. Si entrenaste con píxeles en [0, 1] y en producción llegan en [0, 255], el modelo verá basura y fallará sin dar error. Encapsula el preprocesado en una función única usada en ambos sitios.
  • Tratar el softmax como certeza. Un 99 % de softmax no es una garantía; ante una imagen rarísima (un producto que no existía al entrenar) la red repartirá probabilidades entre lo que conoce. De ahí los umbrales y la cola de revisión humana.
  • Olvidar la dimensión de batch al predecir una sola imagen. predict espera forma (N, alto, ancho, canales); con una imagen suelta de forma (32, 32, 3) fallará. Solución: np.expand_dims(imagen, axis=0).
  • Comparar embeddings con distancia euclídea sin normalizar. Dos imágenes con el mismo patrón de características pero distinta "intensidad" de activación quedarían lejos en euclídea; la similitud coseno (o normalizar los vectores antes) compara direcciones y es la práctica estándar.

Ejercicios

Ejercicio 1: elegir la tarea

Para cada necesidad de TecnoMarket, indica la tarea de visión adecuada (clasificación, localización, detección, segmentación semántica, segmentación de instancias, OCR o búsqueda por embeddings) y justifica en una frase:

  1. Rechazar automáticamente fotos donde el producto ocupa menos del 20 % de la imagen.
  2. Generar el fondo blanco uniforme de todas las fotos del catálogo.
  3. Contar cuántas unidades aparecen en la foto de un lote de auriculares idénticos y recortar cada una.
  4. Sugerir "otros clientes miraron estos productos parecidos" a partir de la foto de la ficha.
  5. Verificar que el número de serie de la foto coincide con el declarado en el formulario.

Ejercicio 2: similitud coseno a mano

Tres productos tienen estos embeddings simplificados de 3 dimensiones: lámpara A = (0.9, 0.1, 0.2), lámpara B = (0.8, 0.2, 0.1), freidora = (0.1, 0.9, 0.8). Calcula la similitud coseno entre lámpara A y lámpara B, y entre lámpara A y la freidora. ¿Confirman los números la intuición?

Ejercicio 3: diseñar el umbral

El clasificador de fotos de TecnoMarket automatiza la publicación si la probabilidad máxima supera el umbral T. Con T = 0.5 automatiza el 95 % de las fotos con un 8 % de errores; con T = 0.9 automatiza el 60 % con un 1 % de errores. ¿Qué umbral elegirías si (a) los errores de categoría son baratos de corregir a posteriori, (b) una foto mal clasificada puede publicar un producto en una categoría con requisitos legales (p. ej. equipos de gas)? ¿Qué tercera opción intermedia ofrece el pipeline visto en la lección?

Soluciones

Ejercicio 1:

  1. Clasificación + localización: basta una caja del producto para calcular qué fracción de la imagen ocupa.
  2. Segmentación semántica: hay que decidir píxel a píxel qué es producto y qué es fondo para sustituir el fondo.
  3. Segmentación de instancias (o detección, si basta la caja para recortar): los auriculares son idénticos y hay que separar unidad a unidad.
  4. Búsqueda por embeddings: es exactamente el caso de similitud visual entre catálogo y consulta.
  5. OCR: localizar y leer el texto del número de serie para compararlo con el formulario.

Ejercicio 2:

  • A · B = 0.9·0.8 + 0.1·0.2 + 0.2·0.1 = 0.76. ‖A‖ = √(0.81+0.01+0.04) = √0.86 ≈ 0.927. ‖B‖ = √(0.64+0.04+0.01) = √0.69 ≈ 0.831. Similitud = 0.76 / (0.927 × 0.831) ≈ 0.987.
  • A · F = 0.9·0.1 + 0.1·0.9 + 0.2·0.8 = 0.34. ‖F‖ = √(0.01+0.81+0.64) = √1.46 ≈ 1.208. Similitud = 0.34 / (0.927 × 1.208) ≈ 0.304.
  • Sí: las dos lámparas son casi colineales (0.987, prácticamente idénticas para el sistema) y la freidora queda lejos (0.304).

Ejercicio 3:

  • (a) Con errores baratos, T = 0.5: automatizar el 95 % ahorra muchísimo trabajo humano y el 8 % de errores se corrige después con poco coste.
  • (b) Con riesgo legal, T = 0.9 (o mayor): un 1 % de errores sigue siendo quizá demasiado para esa categoría concreta; incluso podría forzarse revisión humana siempre que la clase predicha sea una categoría regulada, independientemente de la confianza.
  • La tercera opción es la del pipeline: umbral + cola de revisión humana — las fotos por debajo del umbral no se rechazan, se revisan. Se puede afinar por categoría: umbral bajo para fundas de móvil, altísimo (o revisión obligatoria) para categorías sensibles.

Conclusión

Este módulo empezó con una limitación (las densas no escalan a imágenes) y termina con un panorama completo de lo que las CNN hacen posible. En esta lección has situado cada tarea en su lugar —clasificar, localizar, detectar (YOLO/SSD en una sola pasada), segmentar (U-Net con su encoder-decoder), leer texto y buscar por similitud— y las has mapeado a la operativa de TecnoMarket: moderación de fotos, alta automática de catálogo, fondo blanco uniforme, lectura de etiquetas y "productos parecidos". Has visto que un sistema real es un pipeline (preprocesado idéntico en entrenamiento e inferencia, umbrales de confianza, revisión humana), has hecho predicciones reales con Keras sobre CIFAR-10 leyendo el softmax con criterio de producción, y has construido un buscador por similitud reutilizando tu clasificador como extractor de embeddings — la demostración definitiva de que la etapa convolucional es un extractor de características de propósito general.

Con esto cerramos el módulo de CNN: sabes por qué existen (03-01), cómo se configuran sus capas (03-02), qué arquitecturas marcaron el camino (03-03) y todo lo que se construye con ellas (03-04). El proyecto guiado completo de clasificación de fotos de producto te espera en 07-01, y la reutilización de redes preentrenadas en 05-03. Pero antes, un cambio de tercio: las CNN dominan los datos con estructura espacial; el módulo 4 aborda los datos con estructura temporal o secuencial — las reseñas que escriben los clientes de TecnoMarket, sus historiales de compra, la demanda semana a semana. Para eso necesitamos redes con memoria: las redes neuronales recurrentes (RNN).

Curso de Deep Learning

Módulo 1: Introducción a Deep Learning

Módulo 2: Fundamentos de Redes Neuronales

Módulo 3: Redes Neuronales Convolucionales (CNN)

Módulo 4: Redes Neuronales Recurrentes (RNN)

Módulo 5: Técnicas Avanzadas en Deep Learning

Módulo 6: Herramientas y Frameworks

Módulo 7: Proyectos Prácticos

Módulo 8: Consideraciones Éticas y Futuro del Deep Learning

© Copyright 2026. Todos los derechos reservados