La Arquitectura SSD (Single Shot MultiBox Detector) es una arquitectura de Deep Learning para detectar objetos dentro de imágenes mediante una sola red neuronal que predice simultáneamente categorías y cajas delimitadoras.
SSD pertenece a la familia de los One-Stage Object Detectors, es decir, detectores que no requieren una fase independiente de generación de propuestas de regiones como la utilizada por Faster R-CNN.
Su diseño se basa en tres ideas fundamentales:
- Utilizar mapas de características de distintas resoluciones para localizar objetos de diferentes tamaños.
- Asociar varias Default Boxes a cada posición de estos mapas.
- Predecir, para cada Default Box, puntuaciones de clase y ajustes de localización.
SSD fue presentado por Wei Liu, Dragomir Anguelov, Dumitru Erhan, Christian Szegedy, Scott Reed, Cheng-Yang Fu y Alexander C. Berg en el trabajo SSD: Single Shot MultiBox Detector, publicado en ECCV 2016.
El artículo introdujo una arquitectura que eliminaba la etapa de propuestas de regiones utilizada por detectores basados en R-CNN y que empleaba múltiples mapas de características para generar detecciones directamente.
Entre sus contribuciones más importantes destacan:
- Predicción de objetos mediante una sola arquitectura.
- Uso de Default Boxes con distintas escalas y proporciones.
- Predicción multiescala.
- Localización mediante regresión de cajas.
- Entrenamiento con MultiBox Loss.
- Selección de ejemplos negativos difíciles.
- Estrategias de aumento de datos.
- Posprocesamiento mediante Non-Maximum Suppression.
SSD también inspiró versiones orientadas a dispositivos con recursos limitados, entre ellas SSDLite, que combina principios de SSD con redes eficientes como MobileNet.
En la actualidad, SSD sigue siendo una arquitectura importante para comprender los principios de la detección de objetos, aunque existen numerosas alternativas modernas, incluyendo diferentes generaciones de YOLO, RetinaNet y detectores basados en Transformers.
Su importancia no depende únicamente de su rendimiento en un benchmark concreto.
SSD introdujo una forma influyente de combinar detección multiescala, cajas de referencia y predicción convolucional de categorías y localizaciones.
En este artículo estudiaremos su funcionamiento, las diferencias frente a YOLO y Faster R-CNN, sus fórmulas y funciones de pérdida, sus aplicaciones y ejemplos prácticos con NumPy, PyTorch y Torchvision.
1. ¿Qué es SSD?
Definición breve: SSD es una arquitectura de detección de objetos de una etapa que genera puntuaciones de clase y ajustes de cajas delimitadoras sobre múltiples mapas de características, utilizando Default Boxes como referencias espaciales.
Su objetivo es responder simultáneamente a dos preguntas:
¿Qué objeto aparece en la imagen?
¿Dónde se encuentra?
Ejemplo
Una fotografía contiene:
- Dos automóviles.
- Una persona.
- Una bicicleta.
Un detector SSD puede producir cuatro predicciones con sus respectivas coordenadas y categorías.
¿Qué significa Single Shot?
Significa que el detector realiza las predicciones dentro de un procesamiento integrado de la red, sin una etapa independiente de propuestas de regiones seguida de otro detector.
¿Single Shot significa una sola Bounding Box?
No.
Una sola imagen puede contener decenas de detecciones.
2. ¿Por qué se desarrolló SSD?
Los primeros sistemas de detección basados en regiones utilizaban procedimientos que podían resultar costosos.
R-CNN procesaba regiones candidatas individualmente.
Fast R-CNN compartía características convolucionales, pero utilizaba propuestas externas.
Faster R-CNN incorporó una Region Proposal Network para aprender esas propuestas.
SSD propuso otra estrategia.
En lugar de generar propuestas que posteriormente se clasifican mediante una segunda etapa, SSD predice localización y clasificación directamente desde mapas de características.
¿Qué ventaja buscaba?
Una arquitectura más sencilla para integrar detección y procesamiento eficiente.
¿La eliminación de propuestas garantiza una mayor velocidad?
No universalmente.
La velocidad real depende del modelo, hardware, implementación y condiciones de inferencia.
3. ¿Qué significa MultiBox?
MultiBox hace referencia al uso de múltiples cajas candidatas asociadas a diferentes posiciones, escalas y proporciones.
En SSD, cada posición de determinados mapas de características puede tener varias Default Boxes.
Para cada una, la red predice:
- Puntuaciones de clase.
- Ajustes de localización.
Ejemplo
Una posición tiene cuatro Default Boxes.
Cada una puede representar una forma diferente:
- Cuadrada.
- Horizontal.
- Vertical.
- De otra escala.
¿Qué problema resuelve?
Permite representar objetos con geometrías diversas.
4. ¿Qué son los detectores One-Stage?
Un One-Stage Object Detector produce detecciones sin depender de una segunda fase separada que clasifique propuestas de regiones del estilo Faster R-CNN.
SSD, YOLO y RetinaNet pertenecen a esta familia en sus formulaciones características.
¿Qué distingue a SSD?
Su propuesta original utiliza Default Boxes sobre múltiples mapas de características.
¿Todos los One-Stage utilizan Anchors?
No.
Existen modelos Anchor-Free.
¿SSD original es Anchor-Free?
No.
Utiliza Default Boxes, estrechamente relacionadas con el concepto de Anchor Boxes.
5. Arquitectura general de SSD
La estructura principal puede representarse como:
Imagen → Backbone CNN → Feature Maps multiescala → Predicción de clases y cajas → NMS → Detecciones
SSD tiene tres bloques conceptuales.
Backbone
Extrae características visuales.
Capas adicionales y mapas multiescala
Generan representaciones de distintas resoluciones.
Predictores de localización y clasificación
Producen resultados para las Default Boxes asociadas a cada mapa.
¿Tiene una RPN?
No.
La arquitectura original elimina la etapa separada de propuestas.
6. ¿Qué es el Backbone de SSD?
El Backbone es una red encargada de extraer características.
La arquitectura SSD300 original utilizó una base VGG16 modificada.
¿Qué hace VGG16?
Aplica bloques convolucionales que construyen representaciones visuales progresivamente más profundas.
¿Por qué modificarla?
Porque un detector necesita características espaciales que permitan localizar objetos, no solamente una predicción global de clasificación.
¿Todos los SSD utilizan VGG16?
No.
SSDLite puede utilizar MobileNet y otras implementaciones pueden incorporar diferentes extractores.
7. ¿Qué significa SSD300?
SSD300 es una configuración conocida de SSD que utiliza una entrada nominal de:
300 × 300 píxeles.
¿Qué significa el número 300?
Hace referencia al tamaño de entrada del detector.
¿Solo puede recibir imágenes originales de 300 × 300?
No necesariamente.
Una implementación puede redimensionar internamente las imágenes recibidas.
¿Existe SSD512?
Sí.
El trabajo original también investigó configuraciones de mayor resolución, como SSD512.
¿SSD512 siempre mejora los resultados?
No en todos los escenarios.
Mayor resolución incrementa los costes y no garantiza mejoras para cualquier dataset.
8. ¿Qué son los mapas de características multiescala?
Un Feature Map es una representación espacial aprendida.
SSD utiliza varios mapas de diferentes tamaños.
Por ejemplo, en la configuración clásica SSD300 aparecen escalas espaciales como:
- 38 × 38.
- 19 × 19.
- 10 × 10.
- 5 × 5.
- 3 × 3.
- 1 × 1.
Cada escala permite generar candidatos de objetos utilizando un alcance contextual diferente.
¿Por qué utilizar varios mapas?
Porque los objetos de una escena pueden ocupar diferentes tamaños.
¿Una escala pequeña significa necesariamente un objeto pequeño?
Debemos distinguir el tamaño del mapa de características del tamaño de la caja predicha.
Habitualmente, los mapas de mayor resolución permiten localizar mejor objetos pequeños, mientras que mapas más profundos y reducidos pueden aportar contexto para objetos mayores.
9. ¿Cómo funciona la detección multiescala?
Supongamos una imagen con:
- Una botella pequeña.
- Una caja mediana.
- Un automóvil grande.
La arquitectura produce predicciones desde diferentes niveles.
Cada nivel tiene su propia resolución y conjunto de Default Boxes.
¿Qué ventaja ofrece?
Permite adaptar el proceso de detección a diferentes escalas de objeto.
¿Los mapas operan de forma completamente independiente?
No.
Proceden de una red cuyas representaciones están relacionadas.
¿Una caja solamente puede detectarse en un único mapa?
No necesariamente.
Puede haber múltiples candidatos y el posprocesamiento selecciona las detecciones finales.
10. ¿Qué son las Default Boxes?
Las Default Boxes son cajas de referencia asociadas a las posiciones de los mapas de características.
Definen geometrías iniciales a partir de las cuales el modelo aprende ajustes.
También se denominan Priors o se relacionan con los Anchor Boxes.
¿Qué parámetros tienen?
- Centro.
- Escala.
- Anchura.
- Altura.
- Aspect Ratio.
¿Son cajas finales?
No.
Son referencias que la red modifica mediante Box Regression.
11. ¿Cómo se distribuyen las Default Boxes?
Supongamos un mapa:
10 × 10
Cada posición tiene:
6 Default Boxes.
Entonces el total es:
10 × 10 × 6 = 600 Default Boxes.
¿Qué ocurre con varios mapas?
Sumamos las cajas de todos los niveles.
¿Por qué es importante?
Porque SSD puede evaluar numerosos candidatos sin ejecutar una CNN independiente sobre cada región.
12. Fórmula del número de Default Boxes
Si tenemos L mapas de características:
N = Σₖ Hₖ × Wₖ × Aₖ
Donde:
- Hₖ es la altura del mapa.
- Wₖ es la anchura del mapa.
- Aₖ es el número de Default Boxes por posición.
¿De qué depende N?
De las dimensiones de los mapas y de la configuración de cajas de cada nivel.
¿Es N igual al número final de objetos detectados?
No.
N es el número de candidatos iniciales.
Después se aplican puntuaciones y procedimientos de selección.
13. Ejemplo 1 — Calcular Default Boxes con Python
feature_maps = [ (38, 38, 4), (19, 19, 6), (10, 10, 6), (5, 5, 6), (3, 3, 4), (1, 1, 4)]total = 0for height, width, boxes_per_location in feature_maps: count = ( height * width * boxes_per_location ) total += count print( f"{height}x{width}:", count )print( "Total:", total)
Resultado esperado
38x38: 577619x19: 216610x10: 6005x5: 1503x3: 361x1: 4Total: 8732
¿Qué demuestra?
La configuración clásica de SSD300 puede producir 8.732 Default Boxes.
Precaución
El total corresponde a esta configuración específica.
No debe asumirse para todas las variantes SSD o SSDLite.
14. ¿Qué son los Aspect Ratios?
El Aspect Ratio describe la proporción entre anchura y altura.
Una definición habitual es:
r = anchura / altura
Ejemplos
- r = 1: caja cuadrada.
- r = 2: caja horizontal.
- r = 0,5: caja vertical.
¿Por qué importa?
Porque los objetos no tienen todos la misma forma.
Una botella puede ser relativamente alta.
Un automóvil puede ser relativamente ancho.
15. ¿Cómo se calcula la geometría de una Default Box?
Si utilizamos una escala normalizada s y una proporción r:
Anchura = s√r
Altura = s/√r
Estas magnitudes están expresadas como proporciones de una escala de referencia, según la convención de la implementación.
Ejemplo
Escala:
s = 0,20
Aspect Ratio:
r = 2
Anchura aproximada:
0,2828
Altura aproximada:
0,1414
¿Qué representa?
Una caja horizontal cuya anchura es el doble de su altura.
16. ¿Cómo selecciona SSD las escalas?
El diseño original distribuye las escalas de Default Boxes entre diferentes mapas de características.
Una formulación frecuente es:
sₖ = smin + (smax − smin)(k − 1)/(m − 1)
Donde:
- k identifica un nivel.
- m es el número de niveles considerado.
- smin y smax son las escalas de referencia.
¿Todas las implementaciones utilizan esta fórmula exactamente?
No.
Las configuraciones prácticas pueden fijar escalas específicas para determinados niveles.
¿Por qué importa?
Porque los tamaños de las Default Boxes influyen en qué objetos pueden emparejarse durante entrenamiento.
17. ¿Qué es la Default Box adicional de proporción 1:1?
El SSD original utiliza una segunda escala para determinadas cajas cuadradas.
Una formulación es:
s’ₖ = √(sₖ × sₖ₊₁)
Esta escala intermedia permite añadir otra caja de proporción 1:1.
¿Por qué se utiliza?
Para incrementar la variedad de tamaños disponibles.
¿Es lo mismo que duplicar todas las cajas?
No.
Se añade una referencia geométrica específica.
18. Ejemplo 2 — Generar una Default Box
import mathdef default_box( center_x, center_y, scale, aspect_ratio): width = ( scale * math.sqrt(aspect_ratio) ) height = ( scale / math.sqrt(aspect_ratio) ) return [ center_x - width / 2, center_y - height / 2, center_x + width / 2, center_y + height / 2 ]box = default_box( center_x=0.5, center_y=0.5, scale=0.2, aspect_ratio=2.0)print([ round(value, 4) for value in box])
Resultado esperado
[0.3586, 0.4293, 0.6414, 0.5707]
¿Qué demuestra?
Podemos construir una caja de referencia normalizada utilizando centro, escala y proporción.
19. ¿Qué predice SSD para cada Default Box?
Para cada caja de referencia, SSD predice normalmente:
- Cuatro parámetros de localización.
- Puntuaciones correspondientes a las clases.
Sea C el número de categorías de salida, incluyendo fondo.
Si tenemos A cajas por posición, una cabeza puede producir:
A × (C + 4)
valores por posición espacial.
¿Qué representan los cuatro valores?
Parámetros que permiten ajustar la posición y tamaño de la caja.
¿Qué representa C?
Las puntuaciones de clasificación para cada categoría de salida.
20. Ejemplo 3 — Dimensiones de la Detection Head
def ssd_head_channels( boxes_per_location, num_classes): classification = ( boxes_per_location * num_classes ) regression = ( boxes_per_location * 4 ) return { "classification": classification, "regression": regression, "total": ( classification + regression ) }print( ssd_head_channels( boxes_per_location=6, num_classes=21 ))
Resultado esperado
{ 'classification': 126, 'regression': 24, 'total': 150}
¿Qué demuestra?
SSD produce, en una misma posición, información para varias cajas candidatas.
21. ¿Qué es Box Regression?
Box Regression es el procedimiento mediante el cual la red aprende a ajustar las Default Boxes.
Una caja de referencia puede necesitar:
- Desplazamiento horizontal.
- Desplazamiento vertical.
- Cambio de anchura.
- Cambio de altura.
¿Por qué utilizar referencias?
Porque el modelo puede aprender transformaciones relativas a geometrías predefinidas.
¿El ajuste garantiza una caja correcta?
No.
Depende de los datos y del entrenamiento.
22. Fórmulas de codificación de cajas
Sean los parámetros de una Default Box:
(dₓ, dᵧ, dᵥ, dₕ)
y los de una caja real:
(gₓ, gᵧ, gᵥ, gₕ)
Una codificación típica es:
tₓ = (gₓ − dₓ)/dᵥ
tᵧ = (gᵧ − dᵧ)/dₕ
tᵥ = log(gᵥ/dᵥ)
tₕ = log(gₕ/dₕ)
En implementaciones prácticas pueden añadirse factores de escala o varianzas.
¿Por qué utilizar logaritmos?
Permiten representar cambios multiplicativos de tamaño.
23. Ejemplo 4 — Codificar y decodificar cajas
import mathdef encode_box( anchor, target): ax, ay, aw, ah = anchor gx, gy, gw, gh = target if min(aw, ah, gw, gh) <= 0: raise ValueError( "Anchuras y alturas deben ser positivas" ) return [ (gx - ax) / aw, (gy - ay) / ah, math.log(gw / aw), math.log(gh / ah) ]def decode_box( anchor, offsets): ax, ay, aw, ah = anchor tx, ty, tw, th = offsets return [ ax + tx * aw, ay + ty * ah, aw * math.exp(tw), ah * math.exp(th) ]anchor = [0.5, 0.5, 0.2, 0.3]target = [0.55, 0.48, 0.24, 0.25]encoded = encode_box( anchor, target)decoded = decode_box( anchor, encoded)print("Offsets:", encoded)print("Reconstruido:", decoded)
¿Qué demuestra?
La red puede aprender desplazamientos y escalados relativos a una caja de referencia.
Precaución
La representación se encuentra en formato centro, anchura y altura, no XYXY.
24. ¿Cómo se asignan etiquetas a las Default Boxes?
Durante entrenamiento, SSD debe relacionar sus cajas de referencia con los objetos verdaderos.
Este procedimiento se denomina Matching o Label Assignment.
Proceso conceptual
- Comparar las Default Boxes con las cajas reales.
- Calcular Intersection over Union.
- Identificar emparejamientos positivos.
- Asignar categorías.
- Etiquetar las cajas restantes como fondo o tratarlas según las reglas del algoritmo.
¿Por qué es necesario?
Porque SSD produce muchas más cajas candidatas que objetos reales.
25. ¿Qué es bipartite matching en SSD?
La formulación de SSD incorpora una estrategia que asegura emparejamientos entre objetos reales y Default Boxes.
Después puede añadir otras referencias cuyo IoU supere un umbral determinado.
¿Qué ventaja ofrece?
Ayuda a garantizar que cada objeto verdadero disponga de referencias positivas para entrenar.
¿Es lo mismo que el Hungarian Matching de determinados Transformers?
No exactamente.
Las reglas y objetivos de emparejamiento son diferentes.
26. ¿Qué es Intersection over Union?
Intersection over Union (IoU) mide el solapamiento de dos cajas.
Fórmula
IoU = Intersección / Unión
¿Para qué se utiliza en SSD?
Entre otras funciones:
- Asignación de Default Boxes.
- Evaluación de localización.
- Non-Maximum Suppression.
¿Los umbrales son iguales en todos estos procedimientos?
No.
Cada operación puede utilizar una configuración diferente.
27. Ejemplo 5 — Calcular IoU con Torchvision
import torchfrom torchvision.ops import box_ioudefault_boxes = torch.tensor([ [10., 10., 60., 60.], [15., 15., 65., 65.], [80., 20., 130., 70.]])ground_truth = torch.tensor([ [12., 12., 62., 62.]])ious = box_iou( default_boxes, ground_truth)print(ious)
¿Qué demuestra?
Podemos comparar múltiples Default Boxes con una caja verdadera.
¿Qué forma tiene la salida?
En este ejemplo:
[3, 1]
28. ¿Qué es MultiBox Loss?
MultiBox Loss es la función objetivo característica de SSD.
Combina errores de localización y clasificación.
Una formulación general es:
L = (Lconf + α Lloc)/N
Donde:
- Lconf es la pérdida de clasificación.
- Lloc es la pérdida de localización.
- α pondera la contribución de localización.
- N es el número de Default Boxes positivas utilizadas para normalizar, según la formulación.
¿Qué ocurre si N = 0?
La implementación necesita tratar ese caso de forma segura.
¿α es siempre igual a uno?
El trabajo original utilizó α = 1 en su configuración, pero el valor no debe considerarse obligatorio para todas las implementaciones.
29. ¿Qué es Localization Loss?
La Localization Loss penaliza diferencias entre las cajas predichas y las reales.
En SSD original se utiliza una formulación basada en Smooth L1.
¿Se aplica a todas las Default Boxes?
No.
Habitualmente se calcula sobre las cajas positivas emparejadas.
¿Por qué?
Porque las cajas negativas no representan objetos verdaderos con geometría que deba ajustarse.
30. ¿Qué es Confidence Loss?
La Confidence Loss penaliza errores de clasificación asociados a las Default Boxes.
En una formulación multiclase puede utilizarse Softmax Cross-Entropy.
¿Incluye fondo?
Sí.
Las Default Boxes negativas pueden utilizar la clase de fondo durante entrenamiento.
¿Qué problema aparece?
El número de negativas suele ser muy superior al de positivas.
31. ¿Qué es Hard Negative Mining?
Hard Negative Mining es una estrategia de entrenamiento que selecciona ejemplos negativos difíciles en lugar de utilizar indiscriminadamente todos los negativos disponibles.
¿Por qué es necesaria?
Una imagen puede generar miles de Default Boxes y contener solamente unos pocos objetos.
La mayoría de las cajas candidatas corresponden al fondo.
¿Qué ocurriría si todos los negativos dominaran el entrenamiento?
La función de pérdida podría concentrarse excesivamente en clasificar fondo.
¿Qué hace SSD?
Selecciona negativas con errores de clasificación relativamente elevados, según la configuración de entrenamiento.
32. ¿Qué significa una proporción 3:1?
En el SSD original se utiliza una estrategia habitual de:
3 negativos por cada positivo.
Ejemplo
Hay 20 cajas positivas.
Podemos seleccionar hasta:
60 cajas negativas.
¿Por qué seleccionar las negativas difíciles?
Porque son las que el modelo confunde más fácilmente con objetos.
¿La proporción 3:1 significa que todas las imágenes contienen exactamente esa cantidad?
No.
El número disponible depende de los emparejamientos y de las reglas de implementación.
33. Ejemplo 6 — Hard Negative Mining con NumPy
import numpy as npdef hard_negative_mining( losses, positive_mask, ratio=3): losses = np.asarray( losses, dtype=np.float64 ) positive_mask = np.asarray( positive_mask, dtype=bool ) num_positives = int( positive_mask.sum() ) candidates = np.flatnonzero( ~positive_mask ) if num_positives == 0: return np.zeros_like( positive_mask ) num_negatives = min( ratio * num_positives, len(candidates) ) ordered = candidates[ np.argsort( losses[candidates] )[::-1] ] selected = np.zeros_like( positive_mask ) selected[ ordered[:num_negatives] ] = True return selectedlosses = np.array([ 0.1, 0.8, 0.6, 0.4, 0.9, 0.2, 0.7, 0.3])positives = np.array([ 1, 0, 0, 0, 0, 1, 0, 0], dtype=bool)negative_selection = hard_negative_mining( losses, positives, ratio=3)print( "Positivos:", positives.sum())print( "Negativos seleccionados:", negative_selection.sum())
Resultado esperado
2 positivos y 6 negativos seleccionados.
¿Qué demuestra?
El algoritmo prioriza negativos con pérdidas elevadas y limita su cantidad.
¿Es el código completo de la pérdida SSD?
No.
Representa exclusivamente la estrategia de selección de negativas.
34. ¿Cómo funciona el entrenamiento de SSD?
Un entrenamiento típico incluye:
- Cargar imágenes y cajas anotadas.
- Aplicar transformaciones.
- Generar mapas de características.
- Generar Default Boxes.
- Emparejar las cajas con anotaciones reales.
- Calcular objetivos de localización.
- Obtener logits de clasificación.
- Seleccionar negativas difíciles.
- Calcular MultiBox Loss.
- Aplicar Backpropagation y actualizar pesos.
¿El procedimiento es idéntico en SSDLite?
Comparte conceptos, pero las implementaciones pueden tener detalles diferentes.
35. ¿Qué es Data Augmentation en SSD?
SSD original utiliza estrategias de aumento de datos importantes para el entrenamiento.
Entre ellas:
- Recortes aleatorios.
- Reflexión horizontal.
- Ajustes fotométricos.
- Cambios de escala.
- Selección de recortes condicionada por solapamiento.
¿Por qué resulta especialmente importante?
Porque los objetos pueden aparecer en distintas posiciones y tamaños.
¿Qué ocurre con las Bounding Boxes?
Deben modificarse de forma coherente con la transformación geométrica.
36. ¿Qué es Random Cropping con IoU?
Una estrategia es generar un recorte y comprobar que su relación con los objetos anotados cumple determinadas condiciones.
¿Por qué utilizar IoU?
Para controlar la relación entre el recorte y las cajas verdaderas.
¿Qué ventaja puede ofrecer?
Exponer al modelo a objetos con variaciones de escala y contexto.
¿Qué riesgo presenta?
Un recorte mal configurado puede eliminar objetos o producir anotaciones inconsistentes.
37. ¿Qué es Non-Maximum Suppression en SSD?
SSD puede generar varias detecciones para un mismo objeto.
Durante inferencia se utilizan procedimientos de selección, frecuentemente NMS.
Proceso
- Convertir logits en puntuaciones.
- Decodificar cajas.
- Eliminar candidatos por puntuación.
- Aplicar NMS por categoría o una variante compatible.
- Conservar las detecciones finales.
¿NMS es una capa que aprende pesos?
No.
Es un procedimiento de posprocesamiento.
38. Ejemplo 7 — NMS con PyTorch
import torchfrom torchvision.ops import nmsboxes = torch.tensor([ [10., 10., 100., 100.], [14., 14., 104., 104.], [150., 20., 230., 110.]])scores = torch.tensor([ 0.97, 0.89, 0.93])keep = nms( boxes, scores, iou_threshold=0.5)print( keep.tolist())
Resultado esperado
[0, 2]
¿Qué demuestra?
Dos predicciones muy solapadas pueden reducirse a una sola detección.
39. ¿Qué es SSD300 VGG16?
SSD300 VGG16 es una implementación representativa de la arquitectura SSD que utiliza una entrada nominal de 300 × 300 y un backbone relacionado con VGG16.
Torchvision proporciona:
ssd300_vgg16
¿Qué puede hacer?
- Cargar pesos preentrenados.
- Ejecutar inferencia.
- Adaptar el número de clases.
- Entrenar con datos propios.
- Producir cajas, etiquetas y puntuaciones.
¿La API es completamente estable?
Torchvision identifica su módulo de detección como Beta en su documentación.
Por eso es importante controlar las versiones utilizadas.
40. Ejemplo 8 — Cargar SSD300 preentrenado
import torchfrom torchvision.models.detection import ( ssd300_vgg16, SSD300_VGG16_Weights)weights = ( SSD300_VGG16_Weights.DEFAULT)model = ssd300_vgg16( weights=weights)model.eval()parameters = sum( p.numel() for p in model.parameters())print( "Parámetros:", f"{parameters / 1e6:.2f} millones")
Resultado orientativo
Alrededor de 35,6 millones de parámetros, para el checkpoint documentado.
¿Qué ocurre en la primera ejecución?
Puede ser necesario descargar los pesos.
41. ¿Cómo realizar inferencia con SSD300?
La implementación de Torchvision acepta una lista de tensores.
Cada imagen debe tener normalmente forma:
[3, H, W]
Los valores de entrada deben ser compatibles con el rango esperado por el modelo.
¿Por qué utilizar el procesador de los pesos?
Porque evita inconsistencias de preprocesamiento.
42. Ejemplo 9 — Detectar objetos en una imagen
import torchfrom PIL import Imagefrom torchvision.models.detection import ( ssd300_vgg16, SSD300_VGG16_Weights)weights = ( SSD300_VGG16_Weights.DEFAULT)model = ssd300_vgg16( weights=weights)model.eval()image = Image.open( "imagen.jpg").convert("RGB")preprocess = weights.transforms()image_tensor = preprocess( image)with torch.inference_mode(): predictions = model([ image_tensor ])result = predictions[0]print( "Boxes:", result["boxes"].shape)print( "Labels:", result["labels"].shape)print( "Scores:", result["scores"].shape)
¿Qué demuestra?
Podemos utilizar SSD300 para obtener detecciones estructuradas.
¿Qué formato tienen las cajas?
Torchvision devuelve normalmente:
[x1, y1, x2, y2]
en las coordenadas correspondientes a la imagen suministrada.
43. ¿Cómo filtrar detecciones?
Podemos establecer un umbral de puntuación.
Ejemplo 10
score_threshold = 0.65keep = ( result["scores"] >= score_threshold)boxes = result["boxes"][keep]labels = result["labels"][keep]scores = result["scores"][keep]print( "Detecciones:", len(boxes))
¿Por qué utilizar un umbral?
Para controlar las detecciones conservadas.
¿Un umbral más alto es siempre mejor?
No.
Puede reducir predicciones falsas, pero también omitir objetos reales.
44. ¿Cómo identificar los nombres de clase?
Los pesos preentrenados proporcionan metadatos sobre categorías.
Ejemplo 11
categories = weights.meta[ "categories"]for label, score in zip( labels.cpu().tolist(), scores.cpu().tolist()): if 0 <= label < len(categories): name = categories[label] else: name = f"Clase {label}" print( name, round(score, 3) )
¿Qué demuestra?
Podemos interpretar los identificadores del checkpoint.
¿Puede reconocer categorías comerciales arbitrarias?
No automáticamente.
Debe adaptarse a un dataset apropiado.
45. Ejemplo 12 — Visualizar Bounding Boxes
import matplotlib.pyplot as pltfrom torchvision.utils import ( draw_bounding_boxes)from torchvision.transforms.functional import ( pil_to_tensor)original = pil_to_tensor( image)descriptions = []for label, score in zip( labels.cpu().tolist(), scores.cpu().tolist()): descriptions.append( f"{categories[label]} {score:.2f}" )annotated = draw_bounding_boxes( original, boxes=boxes.cpu(), labels=descriptions, width=3)plt.figure(figsize=(10, 7))plt.imshow( annotated.permute( 1, 2, 0 ).numpy())plt.axis("off")plt.show()
¿Qué demuestra?
Podemos visualizar los objetos detectados con sus etiquetas.
Precaución
Las puntuaciones y las cajas deben mantenerse alineadas después del filtrado.
46. ¿Qué es SSDLite?
SSDLite es una variante de SSD orientada a reducir el coste computacional.
Su diseño puede utilizar convoluciones separables en profundidad para construir cabezas de detección más eficientes.
¿Qué significa?
Una convolución convencional puede sustituirse, en determinadas etapas, por una combinación de:
- Depthwise Convolution.
- Pointwise Convolution.
¿Por qué hacerlo?
Para reducir parámetros y operaciones en configuraciones apropiadas.
¿Es SSDLite idéntico a SSD300 VGG16?
No.
Las arquitecturas y sus backbones son diferentes.
47. SSDLite con MobileNetV3
Torchvision proporciona una implementación conocida:
ssdlite320_mobilenet_v3_large
Utiliza un backbone MobileNetV3-Large y una entrada nominal de 320 × 320.
¿Por qué es interesante?
Porque permite estudiar la detección de objetos con un número de parámetros mucho menor que SSD300 VGG16.
¿Es universalmente más rápida?
No necesariamente en todos los dispositivos, aunque fue diseñada con eficiencia en mente.
48. Comparación SSD300 frente a SSDLite320
Según los checkpoints preentrenados publicados en la documentación de Torchvision:
| Característica | SSD300 VGG16 | SSDLite320 MobileNetV3 |
|---|---|---|
| Resolución nominal | 300 × 300 | 320 × 320 |
| Parámetros aproximados | 35,6 M | 3,44 M |
| GFLOPs documentados | 34,86 | 0,58 |
| COCO Box AP documentado | 25,1 | 21,3 |
| Tamaño del archivo | 136 MB | 13,4 MB |
¿Qué demuestra?
SSDLite reduce considerablemente el tamaño y las operaciones reportadas, a cambio de una precisión inferior en esos checkpoints concretos.
¿Significa que será más rápido en cualquier CPU?
No.
La latencia real debe medirse sobre el dispositivo objetivo.
49. Ejemplo 13 — Inferencia con SSDLite
import torchfrom torchvision.models.detection import ( ssdlite320_mobilenet_v3_large, SSDLite320_MobileNet_V3_Large_Weights)weights = ( SSDLite320_MobileNet_V3_Large_Weights.DEFAULT)model = ssdlite320_mobilenet_v3_large( weights=weights)model.eval()preprocess = weights.transforms()image_tensor = preprocess( image)with torch.inference_mode(): prediction = model([ image_tensor ])[0]print( "Objetos detectados:", len(prediction["boxes"]))
¿Qué demuestra?
La misma estructura general de la API permite utilizar una variante ligera de SSD.
50. ¿Cómo funciona Transfer Learning en SSD?
Transfer Learning permite reutilizar representaciones aprendidas previamente.
Podemos comenzar con un backbone preentrenado y adaptar el detector a categorías nuevas.
Ejemplo
Una empresa quiere detectar:
- Tornillos.
- Conectores.
- Interruptores.
¿Qué necesita?
Imágenes representativas y cajas anotadas.
¿Podemos utilizar directamente un checkpoint COCO?
Puede servir como punto de partida, pero sus categorías no corresponden necesariamente a las clases empresariales.
51. ¿Cómo configurar SSD para categorías propias?
En Torchvision podemos construir un SSD con un número de clases específico.
Supongamos:
- Fondo.
- Botella.
- Caja.
Entonces:
num_classes = 3
Ejemplo 14 — Modelo personalizado
from torchvision.models.detection import ( ssd300_vgg16)from torchvision.models import ( VGG16_Weights)model = ssd300_vgg16( weights=None, weights_backbone=VGG16_Weights.IMAGENET1K_FEATURES, num_classes=3)print( "Clases configuradas:", 3)
¿Qué demuestra?
Podemos utilizar características preentrenadas de VGG16 y crear un detector SSD con una nueva cabeza de clasificación.
¿Qué no realiza?
No transfiere automáticamente los pesos de la cabeza de detección COCO.
¿La cabeza está entrenada?
No.
Debe aprender mediante anotaciones de la nueva tarea.
52. ¿Qué formato de Dataset necesita Torchvision?
Una muestra típica contiene:
Imagen
Tensor [3, H, W].
Anotaciones
Diccionario con:
boxes.labels.
Las cajas tienen forma:
[N, 4]
Las categorías:
[N]
¿Qué formato utilizan las cajas?
XYXY con valores en píxeles.
¿Se pueden utilizar etiquetas normalizadas del formato YOLO directamente?
No.
Deben convertirse al formato requerido por Torchvision.
53. Ejemplo 15 — Crear una muestra de entrenamiento
import torchimage = torch.rand( 3, 300, 300)target = { "boxes": torch.tensor( [ [25., 35., 110., 150.], [170., 90., 260., 210.] ], dtype=torch.float32 ), "labels": torch.tensor( [1, 2], dtype=torch.int64 )}print( image.shape)print( target["boxes"].shape)
¿Qué demuestra?
El formato básico para entrenar un detector SSD en Torchvision.
¿Podemos entrenar con esta muestra aleatoria?
Técnicamente podemos comprobar el funcionamiento del pipeline, pero una imagen aleatoria sin correspondencia real con sus cajas no permite aprender una detección útil.
54. ¿Cómo crear un Dataset sintético coherente?
Construiremos un dataset donde las cajas coincidan con rectángulos visibles.
Ejemplo 16
import numpy as npimport torchfrom torch.utils.data import Datasetclass RectanglesDataset(Dataset): def __init__( self, count=40, size=300, seed=42 ): self.count = count self.size = size self.seed = seed def __len__(self): return self.count def __getitem__(self, index): rng = np.random.default_rng( self.seed + index ) size = self.size image = np.zeros( (size, size, 3), dtype=np.float32 ) boxes = [] labels = [] for class_id, channel in [ (1, 0), (2, 1) ]: x1 = int( rng.integers(15, size - 100) ) y1 = int( rng.integers(15, size - 100) ) width = int( rng.integers(40, 75) ) height = int( rng.integers(40, 75) ) x2 = x1 + width y2 = y1 + height image[ y1:y2, x1:x2, channel ] = 0.9 boxes.append([ x1, y1, x2, y2 ]) labels.append( class_id ) image = torch.from_numpy( image.transpose(2, 0, 1) ).float() target = { "boxes": torch.tensor( boxes, dtype=torch.float32 ), "labels": torch.tensor( labels, dtype=torch.int64 ) } return image, target
¿Qué demuestra?
Podemos construir ejemplos donde los objetos y sus cajas tienen una relación geométrica válida.
¿Sustituye datos reales?
No.
Se utiliza para verificar código y formatos.
55. ¿Por qué utilizar una función collate_fn?
Cada imagen puede contener diferentes cantidades de objetos.
Por eso los targets no siempre pueden apilarse como tensores de dimensiones idénticas.
Ejemplo 17
from torch.utils.data import DataLoaderdef detection_collate(batch): images, targets = zip(*batch) return ( list(images), list(targets) )dataset = RectanglesDataset( count=40)train_loader = DataLoader( dataset, batch_size=2, shuffle=True, collate_fn=detection_collate)
¿Qué demuestra?
Podemos conservar una lista de imágenes y otra de anotaciones.
56. Ejemplo 18 — Entrenamiento básico de SSD
import torchfrom torchvision.models.detection import ( ssd300_vgg16)device = torch.device( "cuda" if torch.cuda.is_available() else "cpu")model = ssd300_vgg16( weights=None, weights_backbone=None, num_classes=3).to(device)optimizer = torch.optim.SGD( model.parameters(), lr=1e-3, momentum=0.9, weight_decay=5e-4)for epoch in range(2): model.train() total_loss = 0.0 for images, targets in train_loader: images = [ image.to(device) for image in images ] targets = [ { key: value.to(device) for key, value in target.items() } for target in targets ] optimizer.zero_grad() losses = model( images, targets ) loss = sum( value for value in losses.values() ) loss.backward() optimizer.step() total_loss += ( loss.item() ) print( f"Época {epoch + 1}:", round(total_loss, 4) )
¿Qué demuestra?
Podemos entrenar un SSD utilizando una combinación de pérdidas de regresión y clasificación.
¿Está listo para producción?
No.
Dos épocas y un dataset sintético pequeño solamente permiten comprobar el procedimiento.
¿Por qué utilizar weights_backbone=None?
Para evitar una descarga durante este ejemplo técnico.
Para un proyecto real conviene evaluar el uso de un backbone preentrenado.
57. ¿Qué pérdidas devuelve SSD en Torchvision?
La implementación puede devolver un diccionario con términos como:
bbox_regression.classification.
¿Qué representa bbox_regression?
El error de ajuste de las cajas.
¿Qué representa classification?
El error de categorías asociado a las Default Boxes seleccionadas.
¿Cómo obtener la pérdida total?
Sumando los términos conforme a la interfaz del modelo.
58. Ejemplo 19 — Inspeccionar las pérdidas
model.train()images, targets = next( iter(train_loader))images = [ image.to(device) for image in images]targets = [ { key: value.to(device) for key, value in target.items() } for target in targets]loss_dict = model( images, targets)for name, value in loss_dict.items(): print( name, round(float(value.detach()), 4) )
¿Qué demuestra?
Podemos examinar por separado los componentes del objetivo de entrenamiento.
¿Una pérdida decreciente garantiza buen mAP?
No.
La evaluación debe realizarse sobre datos independientes.
59. ¿Cómo evaluar SSD?
SSD utiliza métricas habituales de detección de objetos.
Entre ellas:
- Precision.
- Recall.
- Average Precision.
- Mean Average Precision.
- AP50.
- AP75.
- AP por tamaño de objeto.
¿Qué mide IoU?
El solapamiento entre cajas.
¿Qué mide AP?
La relación Precision-Recall bajo un protocolo de evaluación.
¿Es correcto comparar AP50 con mAP50-95?
No.
Son definiciones diferentes.
60. ¿Qué es mAP50-95?
La métrica COCO AP utiliza múltiples umbrales IoU:
0,50 a 0,95 con incrementos de 0,05.
¿Por qué es importante?
Porque una caja puede ser suficiente para un emparejamiento con IoU 0,50, pero no para uno con IoU 0,90.
¿Qué ventaja tiene utilizar múltiples umbrales?
Permite estudiar la precisión espacial de las detecciones.
61. Ejemplo 20 — Evaluar SSD con TorchMetrics
Instalación:
pip install torchmetrics pycocotools
Código:
import torchfrom torchmetrics.detection.mean_ap import ( MeanAveragePrecision)metric = MeanAveragePrecision( box_format="xyxy", iou_type="bbox")model.eval()with torch.inference_mode(): for images, targets in train_loader: images_device = [ image.to(device) for image in images ] predictions = model( images_device ) predictions_cpu = [ { key: value.detach().cpu() for key, value in result.items() } for result in predictions ] targets_cpu = [ { key: value.cpu() for key, value in target.items() } for target in targets ] metric.update( predictions_cpu, targets_cpu )results = metric.compute()print( "mAP:", float(results["map"]))print( "mAP50:", float(results["map_50"]))
¿Qué demuestra?
Podemos calcular métricas de detección a partir de las predicciones SSD.
Precaución importante
Este código utiliza el mismo DataLoader sintético del entrenamiento solo para demostrar la API.
En un proyecto real debemos utilizar Validation y Test Sets independientes.
62. ¿Cómo medir la latencia?
La latencia es importante cuando se utiliza SSD en aplicaciones con restricciones temporales.
Métricas importantes
- Milisegundos por imagen.
- Imágenes por segundo.
- Uso de CPU.
- Uso de GPU.
- Memoria.
- Tiempo de preprocesamiento.
- Tiempo de posprocesamiento.
¿Es suficiente medir los GFLOPs?
No.
Dos modelos con diferentes operaciones pueden presentar comportamientos inesperados en hardware específico.
63. Ejemplo 21 — Benchmark SSD300 frente a SSDLite
import timeimport torchfrom torchvision.models.detection import ( ssd300_vgg16, ssdlite320_mobilenet_v3_large)device = torch.device( "cuda" if torch.cuda.is_available() else "cpu")models = { "SSD300": ssd300_vgg16( weights=None, weights_backbone=None ), "SSDLite320": ssdlite320_mobilenet_v3_large( weights=None, weights_backbone=None )}image = torch.rand( 3, 320, 320, device=device)for name, model in models.items(): model = model.to(device) model.eval() times = [] with torch.inference_mode(): for _ in range(3): model([image]) if device.type == "cuda": torch.cuda.synchronize() for _ in range(10): start = time.perf_counter() model([image]) if device.type == "cuda": torch.cuda.synchronize() times.append( time.perf_counter() - start ) average = sum(times) / len(times) print( name, f"{average * 1000:.2f} ms" )
¿Qué demuestra?
Podemos comparar la latencia de dos arquitecturas bajo una configuración experimental básica.
¿El benchmark mide la precisión?
No.
Los modelos se crean sin pesos preentrenados.
Se utiliza para comparar aspectos técnicos de inferencia, no calidad predictiva.
¿Es un benchmark definitivo?
No.
Para una comparación rigurosa conviene utilizar condiciones repetibles, distintas imágenes, intervalos estadísticos y el dispositivo objetivo.
64. ¿Cómo afectan los objetos pequeños?
Los objetos pequeños pueden ocupar muy pocas posiciones espaciales.
Ejemplos
- Tornillos.
- Etiquetas.
- Objetos lejanos.
- Componentes electrónicos.
- Vehículos en imágenes aéreas.
¿Por qué resultan difíciles?
Porque la resolución puede ser insuficiente para conservar detalles relevantes.
¿Qué estrategias pueden ayudar?
- Aumentar resolución.
- Utilizar recortes.
- Reconsiderar Default Boxes.
- Mejorar datos de entrenamiento.
- Utilizar modelos especializados.
65. ¿Cómo afecta la oclusión?
Occlusion es la ocultación parcial de un objeto por otro.
Ejemplo
Una botella se encuentra parcialmente detrás de una caja.
¿Puede SSD detectarla?
Puede hacerlo si las características visibles son suficientes y el entrenamiento incluye patrones relevantes.
¿Qué debemos evaluar?
Imágenes con distintos niveles de oclusión.
66. ¿Qué es Sliding Window Detection?
Es procesar imágenes grandes mediante regiones sucesivas.
¿Cuándo puede ser útil?
Cuando necesitamos conservar detalles en fotografías de muy alta resolución.
¿Qué problema aparece?
Un objeto puede quedar dividido o detectarse varias veces en parches distintos.
¿Cómo mitigarlo?
Utilizando solapamiento entre parches y consolidación de detecciones en coordenadas globales.
67. ¿Cómo comparar SSD, YOLO y Faster R-CNN?
Estas arquitecturas representan enfoques diferentes.
| Característica | SSD | YOLO | Faster R-CNN |
|---|---|---|---|
| Familia histórica | One-Stage | One-Stage | Two-Stage |
| Cajas de referencia originales | Default Boxes | Depende de generación | Anchors de RPN |
| Propuestas separadas | No | No en formulación característica | Sí |
| Predicción multiescala | Sí | Frecuente en generaciones modernas | Posible con FPN |
| NMS convencional | Habitual | Depende de generación | Habitual |
| Modelos ligeros | SSDLite | Variantes compactas | Variantes optimizadas |
¿Qué arquitectura elegir?
Depende de:
- Dataset.
- Número de clases.
- Tamaño de objetos.
- Latencia requerida.
- Hardware.
- Memoria.
- Licencia y mantenimiento.
68. ¿SSD sigue siendo relevante?
Sí, por diferentes razones.
Razón 1. Valor educativo
SSD permite comprender Default Boxes, Matching y predicción multiescala.
Razón 2. Aplicaciones existentes
Algunos sistemas mantienen implementaciones SSD.
Razón 3. Arquitecturas ligeras
SSDLite sigue siendo un punto de referencia útil en detección eficiente.
Razón 4. Comparación tecnológica
SSD sirve como línea base frente a modelos modernos.
¿Debemos utilizar SSD obligatoriamente para un proyecto nuevo?
No.
Conviene evaluar alternativas actuales.
69. SSD en comercio electrónico
Un detector SSD puede utilizarse para identificar objetos en fotografías de productos.
Ejemplos
- Botellas.
- Cajas.
- Herramientas.
- Componentes.
- Artículos de catálogo.
¿Qué aporta?
Localización y categorización de objetos.
¿Puede identificar un SKU exacto?
No necesariamente.
Una categoría genérica, como botella, no equivale a una identidad comercial única.
70. SSD en inspección industrial
Una empresa puede entrenar SSD para detectar piezas específicas.
Aplicaciones
- Conteo de componentes.
- Localización de objetos.
- Inspección visual.
- Automatización de estaciones.
- Verificación de presencia.
¿Detecta automáticamente defectos?
Solo si el sistema incorpora entrenamiento y lógica apropiados para ese objetivo.
71. SSD en robótica
Los robots pueden utilizar detectores para localizar objetos visibles.
Ejemplo
Un robot identifica cajas sobre una mesa.
¿Qué aporta SSD?
Una caja y una categoría por objeto detectado.
¿Es suficiente para manipular el objeto?
No.
Pueden necesitarse profundidad, estimación de pose y planificación.
72. SSD en Edge AI
Las arquitecturas ligeras como SSDLite pueden utilizarse en sistemas con recursos limitados.
Ejemplos
- Cámaras inteligentes.
- Dispositivos embebidos.
- Equipos industriales.
- Sistemas portátiles.
¿Qué debemos medir?
- Latencia.
- Consumo energético.
- Memoria.
- Precisión.
- Temperatura.
- Compatibilidad de operadores.
¿Es suficiente tener pocos parámetros?
No.
La eficiencia depende del hardware y del runtime.
73. SSD y AI Visibility
Una plataforma de AI Visibility puede utilizar detección visual para analizar imágenes y activos comerciales.
Caso 1. Fotografías de productos
Localizar artículos individuales.
Caso 2. Capturas de páginas web
Detectar determinados elementos visuales.
Caso 3. Auditorías de catálogos
Contar objetos y registrar sus posiciones.
Caso 4. Procesamiento de imágenes de marca
Identificar elementos gráficos entrenados.
¿Qué aporta?
Datos estructurados sobre objetos presentes en imágenes.
¿Qué no aporta automáticamente?
No cambia las recomendaciones ni las referencias que otros asistentes generan sobre una marca.
74. ¿SSD mejora Recommendation Rate?
No directamente.
Recommendation Rate representa recomendaciones observadas bajo un método específico.
SSD es un detector visual.
Utilizar SSD en un sistema propio no altera automáticamente las respuestas de ChatGPT, Gemini, Claude o Perplexity.
75. ¿SSD mejora Citation Coverage?
No directamente.
Citation Coverage mide citas o referencias según una metodología.
Una Bounding Box no representa una cita a una fuente.
SSD puede contribuir al análisis de contenido visual, pero no genera directamente nuevas citas.
76. Errores frecuentes al utilizar SSD
Error 1. Confundir Single Shot con una sola detección
SSD puede producir múltiples objetos.
Error 2. Confundir SSD con Faster R-CNN
SSD no tiene una etapa independiente de propuestas como la RPN.
Error 3. Suponer que SSD es Anchor-Free
El SSD original utiliza Default Boxes.
Error 4. Confundir Default Boxes y detecciones finales
Son cajas de referencia, no predicciones definitivas.
Error 5. Suponer que todas las versiones producen 8.732 Default Boxes
Ese número corresponde a una configuración concreta.
Error 6. Interpretar todos los mapas como si tuvieran la misma resolución
SSD utiliza múltiples escalas.
Error 7. Confundir tamaño de Feature Map con tamaño real del objeto
Son conceptos relacionados pero distintos.
Error 8. Utilizar Aspect Ratios invertidos
Puede generar cajas con geometría incorrecta.
Error 9. Confundir XYXY y CXCYWH
Puede invalidar las transformaciones.
Error 10. Ignorar la normalización de coordenadas
Produce cajas desplazadas o deformadas.
Error 11. No realizar correctamente el Matching
Puede impedir que los objetos tengan referencias positivas.
Error 12. Utilizar todos los negativos sin controlar el desbalance
Puede perjudicar el entrenamiento.
Error 13. Confundir Hard Negative Mining con eliminar ejemplos difíciles
La estrategia selecciona negativos relevantes.
Error 14. Aplicar la pérdida de localización a todas las cajas negativas
No corresponde a la formulación convencional.
Error 15. Suponer que la pérdida de SSD tiene exactamente los mismos términos que YOLO
Depende de la arquitectura.
Error 16. Aplicar NMS sin respetar clases
Puede eliminar objetos legítimos.
Error 17. Utilizar un umbral de confianza demasiado elevado
Puede reducir Recall.
Error 18. Confundir AP50 con COCO mAP
Son métricas diferentes.
Error 19. Evaluar solamente la pérdida de entrenamiento
No sustituye mAP.
Error 20. Ignorar objetos pequeños
Puede ocultar limitaciones importantes.
Error 21. Utilizar anotaciones sin actualizar tras Data Augmentation
Produce ejemplos incorrectos.
Error 22. Suponer que SSD300 y SSDLite son idénticos
Sus backbones y costes son muy diferentes.
Error 23. Comparar GFLOPs como si fueran latencia real
No son equivalentes.
Error 24. Suponer que un checkpoint COCO conoce cualquier producto comercial
No necesariamente.
Error 25. Relacionar SSD directamente con Citation Coverage
No existe una mejora automática.
77. Buenas prácticas para SSD
- Comprender la arquitectura One-Stage.
- Diferenciar Default Boxes y detecciones finales.
- Documentar las escalas de características.
- Revisar las proporciones de las cajas.
- Verificar el número de candidatos.
- Utilizar correctamente el Matching.
- Controlar el desbalance de negativos.
- Comprender Hard Negative Mining.
- Documentar MultiBox Loss.
- Verificar los formatos de coordenadas.
- Utilizar anotaciones consistentes.
- Aplicar aumentos de datos sincronizados.
- Separar entrenamiento, validación y prueba.
- Utilizar checkpoints preentrenados cuando corresponda.
- Adaptar correctamente el número de clases.
- Evaluar mAP50 y mAP50-95.
- Examinar Precision y Recall.
- Revisar errores por clase.
- Analizar objetos pequeños y ocluidos.
- Ajustar umbrales mediante validación.
- Medir latencia real.
- Comparar SSD300 con SSDLite.
- Registrar versiones de PyTorch y Torchvision.
- Verificar licencias y dependencias.
- Evaluar sobre imágenes representativas del entorno final.
Preguntas frecuentes sobre SSD
¿Qué significa SSD?
Single Shot MultiBox Detector.
¿Qué es SSD?
Es una arquitectura de detección de objetos de una etapa basada en Default Boxes y mapas de características multiescala.
¿Quién desarrolló SSD?
Wei Liu y colaboradores.
¿Cuándo se publicó?
En ECCV 2016.
¿Qué significa Single Shot?
Que genera detecciones sin una etapa separada de propuestas del tipo Faster R-CNN.
¿SSD puede detectar múltiples objetos?
Sí.
¿Es una arquitectura CNN?
Sí, en su formulación original.
¿Qué es un One-Stage Detector?
Es un detector sin una segunda fase separada de clasificación de propuestas de regiones.
¿Qué es MultiBox?
Es el mecanismo de predicción de múltiples cajas candidatas.
¿Qué son Default Boxes?
Son cajas de referencia de diferentes formas y tamaños.
¿Son lo mismo que Anchors?
Son conceptos estrechamente relacionados.
¿SSD original utiliza Anchors?
Sí, en forma de Default Boxes.
¿Qué significa Aspect Ratio?
Es la relación entre anchura y altura.
¿Por qué utilizar varias escalas?
Para detectar objetos de distintos tamaños.
¿Qué es un Feature Map?
Es una representación espacial aprendida.
¿Qué es SSD300?
Es una configuración SSD con entrada nominal de 300 × 300.
¿Qué es SSD512?
Es una configuración de mayor resolución.
¿Qué es VGG16?
Es una arquitectura convolucional utilizada como backbone.
¿Qué es el Backbone?
Es el extractor de características.
¿Qué es Detection Head?
Es el componente que genera puntuaciones de clase y localización.
¿Cuántas Default Boxes genera SSD300 clásico?
Una configuración conocida utiliza 8.732 cajas de referencia.
¿Todos los SSD tienen 8.732 cajas?
No.
¿Qué es Box Regression?
Es aprender ajustes de localización y tamaño.
¿Qué es Matching?
Es relacionar Default Boxes con objetos verdaderos.
¿Qué es IoU?
Intersection over Union.
¿Qué es MultiBox Loss?
Es una pérdida combinada de clasificación y localización.
¿Qué es Localization Loss?
Es la pérdida asociada al ajuste de las cajas.
¿Qué es Confidence Loss?
Es la pérdida de clasificación de las cajas candidatas.
¿Qué es Hard Negative Mining?
Es seleccionar ejemplos negativos difíciles durante entrenamiento.
¿Por qué SSD utiliza Hard Negative Mining?
Porque el número de cajas de fondo puede ser muy grande.
¿Qué significa una proporción 3:1?
Seleccionar hasta tres negativas por cada positiva en la configuración correspondiente.
¿Es siempre 3:1?
No necesariamente en todas las variantes.
¿Qué es Cross-Entropy?
Es una función de pérdida de clasificación.
¿Qué es Smooth L1?
Es una función de pérdida utilizada en regresión.
¿Qué es Non-Maximum Suppression?
Es un procedimiento para reducir detecciones duplicadas.
¿SSD utiliza NMS?
Sí, en su formulación convencional de inferencia.
¿Qué es Confidence Threshold?
Es un umbral de puntuación para filtrar detecciones.
¿Qué es Precision?
Es la proporción de predicciones positivas correctas.
¿Qué es Recall?
Es la proporción de objetos reales detectados.
¿Qué es Average Precision?
Es una métrica que resume Precision y Recall bajo un protocolo.
¿Qué es mAP?
Mean Average Precision.
¿Qué significa AP50?
Es AP calculada con IoU 0,50.
¿Qué significa mAP50-95?
Es AP agregado sobre múltiples umbrales IoU desde 0,50 hasta 0,95.
¿SSD puede utilizarse con PyTorch?
Sí.
¿Torchvision ofrece SSD300?
Sí.
¿Qué es SSDLite?
Es una variante de SSD orientada a reducir el coste computacional.
¿Qué relación tiene SSDLite con MobileNet?
Puede utilizar MobileNet como backbone y convoluciones más eficientes.
¿Qué es MobileNetV3?
Es una arquitectura CNN ligera que puede utilizarse para extracción de características.
¿SSDLite tiene menos parámetros que SSD300?
En los checkpoints conocidos de Torchvision, sí.
¿SSDLite siempre es más precisa?
No.
¿Es obligatoria una GPU?
No.
¿Se puede ejecutar SSD en CPU?
Sí.
¿Qué es Transfer Learning?
Es reutilizar representaciones preentrenadas.
¿Qué es Fine-Tuning?
Es adaptar pesos de un modelo a datos nuevos.
¿Qué formato utiliza Torchvision para cajas?
Habitualmente XYXY.
¿Se deben incluir clases de fondo en num_classes?
Sí, en los constructores habituales de SSD de Torchvision.
¿Qué es Data Augmentation?
Es aplicar transformaciones a los datos de entrenamiento.
¿Qué es Random Cropping?
Es recortar regiones de imágenes siguiendo criterios definidos.
¿Qué es Small Object Detection?
Es la detección de objetos pequeños.
¿Qué es Occlusion?
Es la ocultación parcial de objetos.
¿Qué es Sliding Window?
Es procesar una imagen mediante regiones sucesivas.
¿SSD es mejor que YOLO?
Depende del modelo, los datos y el hardware.
¿SSD es más rápido que Faster R-CNN?
No puede afirmarse universalmente.
¿SSD puede detectar productos?
Sí, con entrenamiento adecuado.
¿Puede identificar SKU exactos?
No necesariamente.
¿Puede utilizarse en robótica?
Sí.
¿Puede utilizarse en inspección industrial?
Sí.
¿Puede utilizarse en Edge AI?
Sí, especialmente mediante variantes ligeras compatibles.
¿SSD mejora Recommendation Rate?
No directamente.
¿SSD aumenta Citation Coverage?
No directamente.
¿Por qué importa SSD para AI Visibility?
Puede utilizarse en herramientas que analizan productos y otros activos visuales comerciales.
Conceptos relacionados
- Inteligencia Artificial.
- Machine Learning.
- Deep Learning.
- Visión por Computadora.
- Detección de Objetos.
- SSD.
- Single Shot MultiBox Detector.
- One-Stage Detector.
- MultiBox.
- Default Boxes.
- Anchor Boxes.
- Aspect Ratio.
- Bounding Box.
- Box Regression.
- Feature Maps.
- Multi-Scale Detection.
- Detection Head.
- Backbone.
- VGG16.
- SSD300.
- SSD512.
- SSDLite.
- MobileNetV3.
- Depthwise Separable Convolution.
- Intersection over Union.
- Matching.
- MultiBox Loss.
- Localization Loss.
- Confidence Loss.
- Smooth L1.
- Cross-Entropy.
- Hard Negative Mining.
- Non-Maximum Suppression.
- Precision.
- Recall.
- Average Precision.
- Mean Average Precision.
- COCO.
- Transfer Learning.
- Fine-Tuning.
- Data Augmentation.
- PyTorch.
- Torchvision.
- TorchMetrics.
- NumPy.
- YOLO.
- Faster R-CNN.
- RetinaNet.
- Edge AI.
- AI Visibility.
Conclusión
La Arquitectura SSD (Single Shot MultiBox Detector) es una de las arquitecturas fundamentales para comprender la detección de objetos de una etapa.
Su propuesta consiste en producir predicciones de clases y cajas directamente sobre múltiples mapas de características, utilizando Default Boxes de diferentes tamaños y proporciones.
Esta organización permite generar candidatos de objetos de distintas escalas dentro de una sola red neuronal.
La arquitectura SSD original utilizó VGG16 como extractor de características y combinó predicción multiescala, regresión de cajas y MultiBox Loss.
Durante entrenamiento, Hard Negative Mining ayuda a controlar el desbalance entre las cajas asociadas a objetos y las numerosas referencias de fondo.
Durante inferencia, las predicciones pueden procesarse mediante filtros de puntuación y Non-Maximum Suppression.
Variantes como SSDLite muestran cómo adaptar estos principios a modelos ligeros basados en MobileNet.
PyTorch y Torchvision proporcionan implementaciones que permiten ejecutar inferencia, construir detectores personalizados y evaluar sus resultados.
Sin embargo, la elección entre SSD, YOLO y Faster R-CNN depende de la aplicación, la resolución, el tamaño de los objetos, las métricas de precisión y el hardware.
En aplicaciones de AI Visibility, SSD puede servir como componente para analizar fotografías comerciales y otros activos visuales, pero no genera directamente nuevas recomendaciones ni citas de marcas en asistentes externos.
La conclusión fundamental es que SSD integra detección multiescala, Default Boxes y predicción directa de clases y localizaciones en una arquitectura de una etapa. Su diseño constituye una referencia importante tanto para estudiar Object Detection como para desarrollar sistemas eficientes de reconocimiento visual.
