Hasta aquí, en esta parte del curso, trabajamos sobre todo con clasificación de imágenes. En ese tipo de problema, el sistema recibe una imagen completa y responde con una clase. Pero en muchos escenarios reales eso no alcanza.
Si una imagen contiene varios objetos, o si queremos saber dónde está cada uno, ya no estamos ante un problema de clasificación simple. Entramos en el terreno de la detección de objetos.
En este tema veremos qué significa detectar objetos, qué información debe producir un detector, por qué este problema es más complejo que la clasificación y cuáles son las ideas básicas que dan forma a los modelos modernos de detección.
La diferencia esencial puede resumirse así:
En una foto con varios objetos, un clasificador tradicional no puede describir correctamente la escena completa. Solo produce una salida global, mientras que un detector debe localizar múltiples instancias dentro de la misma imagen.
Un detector de objetos suele producir, para cada objeto encontrado:
Es decir, la salida ya no es una única clase global, sino una lista de predicciones estructuradas.
La forma más habitual de localizar objetos es mediante cajas rectangulares. Cada caja intenta encerrar la región donde aparece un objeto.
Una bounding box suele representarse con coordenadas, por ejemplo:
(x_min, y_min, x_max, y_max)
o con alguna variante equivalente basada en centro, ancho y alto.
Detectar objetos parece sencillo a primera vista, pero en realidad es un problema bastante exigente. El sistema debe enfrentarse a:
Por eso la detección de objetos suele considerarse un paso más complejo que la clasificación.
Imaginemos una foto callejera donde aparecen dos autos, una bicicleta y una persona. Un clasificador global podría devolver una sola etiqueta dominante o una lista aproximada de clases presentes. Un detector, en cambio, debe producir cuatro predicciones separadas, cada una con su caja y su clase.
Esto muestra que en detección no solo importa reconocer, sino también separar instancias.
La detección combina dos subproblemas:
Esta combinación vuelve el problema más difícil que la clasificación pura, porque la red debe optimizar simultáneamente predicciones semánticas y geométricas.
Una idea clásica para detectar objetos era recorrer la imagen con muchas ventanas y clasificar cada región. Aunque conceptualmente simple, este enfoque resulta muy costoso e ineficiente en la práctica.
Además, obliga a probar muchas escalas y posiciones, lo que hace explotar el número de regiones a analizar.
Los detectores modernos surgieron justamente para resolver este problema de forma mucho más eficiente.
Una diferencia central respecto de la clasificación es que una imagen puede contener cero, uno o muchos objetos relevantes. Eso significa que la salida de un detector tiene tamaño variable según la escena.
Este hecho introduce una complejidad adicional tanto en el diseño del modelo como en la evaluación.
Además de la clase y la caja, los detectores suelen producir un puntaje de confianza para cada predicción. Ese valor intenta reflejar cuán segura está la red de que esa detección corresponde realmente a un objeto de cierta clase.
Luego puede aplicarse un umbral para descartar detecciones débiles o dudosas.
En detección, es común que el modelo proponga varias cajas muy parecidas sobre el mismo objeto. Si no hacemos nada, terminaríamos con múltiples detecciones redundantes para una sola instancia real.
Por eso aparece una técnica muy importante: la supresión no máxima, o Non-Maximum Suppression (NMS).
La idea de NMS es conservar, entre cajas muy superpuestas, solo las detecciones más confiables y eliminar las redundantes.
Esto ayuda a que la salida final sea más limpia y se acerque mejor a la idea de una detección por objeto.
Para comparar cajas suele usarse la métrica Intersection over Union o IoU. Esta mide cuánto se superponen dos cajas respecto de su unión total.
Si dos cajas coinciden mucho, su IoU será alta. Si casi no se tocan, será baja.
IoU es clave tanto para entrenamiento como para evaluación de detectores.
Una buena detección no es solo acertar la clase. También requiere que la caja tenga una localización razonablemente correcta. Si la clase es correcta pero la caja está muy corrida o muy mal ajustada, la detección sigue siendo deficiente.
Por eso la evaluación en detección es más exigente que en clasificación.
Mientras que en clasificación cada imagen suele tener una etiqueta global, en detección cada imagen necesita anotaciones más ricas:
Esto vuelve la preparación del dataset más costosa y más delicada.
Una imagen puede tener múltiples objetos y, por lo tanto, múltiples cajas. Una anotación típica podría verse conceptualmente así:
imagen_001.jpg
- caja: (34, 50, 180, 220), clase: persona
- caja: (210, 80, 360, 250), clase: bicicleta
Esto ya muestra por qué el problema es más complejo que asignar una única etiqueta por imagen.
A muy alto nivel, los detectores modernos suelen agruparse en dos grandes familias:
Más adelante veremos ejemplos concretos, pero por ahora conviene retener esta división conceptual.
En estos métodos suele existir primero una etapa que propone regiones candidatas y luego otra que las clasifica y refina. Históricamente, esta familia incluye modelos muy influyentes como Faster R-CNN.
Suelen ofrecer muy buen desempeño, aunque no siempre son los más rápidos.
En esta familia, el modelo intenta predecir directamente cajas y clases en un solo flujo más integrado. Aquí aparecen enfoques como SSD o YOLO.
La gran ventaja suele ser la velocidad, lo cual resulta especialmente importante en tiempo real.
Aunque ambas tareas localizan objetos, no son lo mismo. En detección usamos cajas rectangulares. En segmentación, en cambio, queremos delimitar con mucho más detalle los píxeles que pertenecen al objeto.
La detección es una localización más gruesa pero muy útil en muchísimas aplicaciones.
La detección de objetos aparece en muchos escenarios reales:
En todos estos casos, saber que un objeto existe no basta; también necesitamos localizarlo.
En detección se usan métricas más complejas que en clasificación. Una de las más importantes es mAP (mean Average Precision), que considera tanto clasificación correcta como calidad de localización.
No entraremos aquí en toda la matemática, pero sí es importante saber que evaluar detectores requiere criterios más ricos que una simple accuracy.
PyTorch y torchvision ofrecen modelos de detección ya implementados. Por ejemplo, se pueden cargar variantes preentrenadas de Faster R-CNN.
Un ejemplo básico de carga sería:
from torchvision.models.detection import fasterrcnn_resnet50_fpn
from torchvision.models.detection import FasterRCNN_ResNet50_FPN_Weights
weights = FasterRCNN_ResNet50_FPN_Weights.DEFAULT
model = fasterrcnn_resnet50_fpn(weights=weights)
model.eval()
Esto no significa que ya sepamos entrenar o interpretar por completo el detector, pero sí muestra que también en detección existen modelos preentrenados reutilizables.
Cuando ejecutamos inferencia con un detector, la salida suele ser una estructura más rica que la de un clasificador. Por ejemplo, puede incluir diccionarios con claves como:
boxeslabelsscoresEs decir, PyTorch ya nos entrega explícitamente las cajas, clases y niveles de confianza para cada detección.
Una inferencia conceptual con una imagen podría verse así:
import torch
from PIL import Image
from torchvision.models.detection import fasterrcnn_resnet50_fpn
from torchvision.models.detection import FasterRCNN_ResNet50_FPN_Weights
weights = FasterRCNN_ResNet50_FPN_Weights.DEFAULT
model = fasterrcnn_resnet50_fpn(weights=weights)
model.eval()
preprocess = weights.transforms()
imagen = Image.open("foto1.jpg").convert("RGB")
entrada = preprocess(imagen).unsqueeze(0)
with torch.no_grad():
salida = model(entrada)
print(salida[0].keys())
Este ejemplo permite ver que la salida ya no es un vector de clases, sino un conjunto estructurado de detecciones.
torchvision ofrece detectores preentrenados listos para exploración e inferencia.La detección de objetos abre una etapa nueva y muy importante en visión por computadora. A partir de aquí, los modelos ya no se limitan a clasificar imágenes completas, sino que deben entender escenas con múltiples instancias y localizar regiones específicas dentro de la imagen.
Eso hace que el problema sea más desafiante, pero también mucho más útil para aplicaciones del mundo real. Comprender bounding boxes, confianza, IoU y estructuras de salida es la base necesaria para avanzar hacia detectores concretos.
En el próximo tema estudiaremos una tarea relacionada pero diferente: la segmentación de imágenes, donde en lugar de cajas rectangulares buscaremos una localización mucho más precisa a nivel de píxel.