En detección de objetos aprendimos a localizar instancias con cajas rectangulares. Esa aproximación es muy útil, pero en muchos problemas no alcanza. A veces necesitamos una delimitación mucho más precisa, capaz de indicar exactamente qué píxeles pertenecen a cada objeto o región de interés.
Ahí aparece la segmentación de imágenes. En lugar de decir solo “hay un objeto aquí” mediante una caja, la segmentación busca producir una representación más fina, normalmente a nivel de píxel.
En este tema veremos qué significa segmentar, qué tipos principales de segmentación existen, por qué esta tarea es más exigente que la clasificación y la detección, y cómo se representa de forma general en visión por computadora moderna.
Segmentar una imagen significa asignar etiquetas a regiones o píxeles de la imagen para separar estructuras relevantes. Conceptualmente, se trata de dividir la imagen en partes con significado visual.
Dependiendo del problema, esas partes pueden representar:
Podemos comparar las tres tareas así:
La segmentación ofrece un nivel de detalle superior, pero justamente por eso también implica más complejidad en el modelo, en los datos y en la evaluación.
La representación más típica en segmentación es la máscara. Una máscara es una imagen o matriz donde cada píxel indica si pertenece o no a cierta región, o qué clase representa.
Por ejemplo, en un problema binario simple podríamos tener:
0 para fondo.1 para objeto.En problemas multiclase, cada valor puede corresponder a una categoría distinta.
En segmentación semántica, cada píxel recibe una clase, pero no se distingue entre distintas instancias del mismo tipo de objeto.
Por ejemplo, si en una imagen hay tres autos, todos los píxeles de los autos pueden recibir simplemente la clase “auto”, sin separar cuál pertenece a cada vehículo individual.
En segmentación de instancias, en cambio, sí se distinguen objetos individuales. Si hay tres autos, cada uno debe tener su propia máscara separada.
Esto hace que la tarea sea más rica y más difícil, porque ya no basta con asignar clases por píxel: hay que separar instancias distintas dentro de la misma clase.
Existe además una formulación más amplia llamada segmentación panóptica, que intenta combinar lo mejor de ambos mundos: clases semánticas para toda la escena e identificación separada de cada instancia donde corresponda.
No la desarrollaremos en detalle aquí, pero conviene conocer el término porque aparece en literatura moderna.
Porque en muchos problemas no alcanza con saber que hay un objeto ni con encerrarlo en una caja. Hace falta una delimitación fina. Eso ocurre, por ejemplo, en:
En estas aplicaciones, la geometría precisa de la región es parte esencial del problema.
Imaginemos una radiografía donde queremos delimitar exactamente una lesión. Una caja rectangular sería demasiado gruesa. Lo importante no es solo señalar la zona general, sino identificar con precisión qué píxeles forman parte de la estructura de interés.
La segmentación responde mucho mejor a ese tipo de necesidad.
Como la salida es más fina, también las anotaciones del dataset son más costosas. En lugar de una clase global o una bounding box, necesitamos máscaras.
Eso implica más trabajo de etiquetado y también más cuidado en la calidad de las anotaciones.
Una máscara semántica simple puede verse como una matriz del mismo tamaño que la imagen, donde cada píxel almacena una etiqueta. Por ejemplo:
0 = fondo
1 = carretera
2 = persona
3 = auto
La predicción del modelo debe aproximarse a esta estructura píxel por píxel.
En segmentación semántica, la salida del modelo suele ser un tensor donde, para cada píxel, se estiman puntajes para cada clase posible. Luego se toma la clase más probable en cada posición.
En otras palabras, el modelo produce una “clasificación por píxel”.
La segmentación exige predicciones densas sobre toda la imagen. No basta con un solo vector final. El modelo debe mantener y refinar información espacial con mucho más detalle.
Eso suele implicar:
En segmentación aparecen arquitecturas y familias muy conocidas, por ejemplo:
Cada una resuelve de distinta forma el desafío de producir salidas densas y espacialmente precisas.
Una de las arquitecturas más conocidas en segmentación, especialmente en imágenes biomédicas, es U-Net. Su idea central es combinar una ruta de contracción, que extrae contexto, con una ruta de expansión, que recupera detalle espacial.
Esto la vuelve especialmente adecuada cuando necesitamos precisión local fina.
Una forma útil de pensar esta tarea es imaginar que cada píxel debe clasificarse, pero no de manera aislada. La decisión para cada posición depende del contexto espacial amplio de la imagen.
Por eso los modelos de segmentación deben combinar información local y global al mismo tiempo.
La segmentación de instancias está conceptualmente cerca de la detección, porque también debe separar objetos individuales. La diferencia es que en lugar de devolver solo cajas, genera además máscaras detalladas para cada objeto detectado.
Por eso modelos como Mask R-CNN pueden entenderse como una extensión de detectores con una salida adicional de segmentación.
La evaluación en segmentación no suele basarse en accuracy global simple. Algunas métricas muy importantes son:
Estas métricas intentan medir qué tan bien coinciden las máscaras predichas con las reales.
Porque en segmentación suele haber una gran cantidad de píxeles de fondo. Un modelo podría acertar casi todo el fondo y, aun así, segmentar muy mal las regiones realmente importantes.
Por eso métricas como IoU o Dice suelen ser más informativas para este tipo de tarea.
Como ya ocurría con detección, en segmentación no basta con transformar la imagen. Si hacemos augmentation geométrica, también debemos aplicar transformaciones consistentes a la máscara correspondiente.
De lo contrario, la relación entre imagen y anotación se rompe y el entrenamiento se vuelve incorrecto.
PyTorch y torchvision también incluyen modelos de segmentación preentrenados. Por ejemplo, una opción conocida es fcn_resnet50 para segmentación semántica.
from torchvision.models.segmentation import fcn_resnet50
from torchvision.models.segmentation import FCN_ResNet50_Weights
weights = FCN_ResNet50_Weights.DEFAULT
model = fcn_resnet50(weights=weights)
model.eval()
Esto permite empezar a explorar la salida de un modelo de segmentación sin necesidad de implementarlo desde cero.
En modelos de segmentación semántica de torchvision, la salida suele incluir un tensor en una clave como out. Ese tensor contiene puntajes por clase para cada posición espacial.
Luego podemos tomar la clase con mayor valor en cada píxel para construir la máscara final.
Un flujo conceptual muy simple podría verse así:
import torch
from PIL import Image
from torchvision.models.segmentation import fcn_resnet50
from torchvision.models.segmentation import FCN_ResNet50_Weights
weights = FCN_ResNet50_Weights.DEFAULT
model = fcn_resnet50(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)["out"]
mascara = salida.argmax(dim=1)
print(mascara.shape)
Este ejemplo muestra la lógica general: la red produce puntajes densos y luego se deriva una máscara por píxel.
La segmentación aparece en muchos contextos donde la localización precisa es esencial:
Algunos errores conceptuales frecuentes son:
torchvision ofrece modelos preentrenados para comenzar a explorar esta tarea.La segmentación de imágenes lleva la comprensión visual un paso más allá que la detección. Ya no basta con decir qué objeto está presente ni con rodearlo aproximadamente: necesitamos delimitar con precisión qué píxeles pertenecen a cada región relevante.
Eso la convierte en una tarea muy poderosa y también muy exigente, tanto desde el punto de vista del modelado como de los datos y la evaluación. Sin embargo, precisamente por ese nivel de detalle, resulta esencial en numerosos problemas reales.
En el próximo tema abordaremos otra familia muy influyente de detectores: una introducción a redes YOLO y detección en tiempo real, donde el foco estará en combinar detección con velocidad y eficiencia operativa.