Single Shot MultiBox Detection (SSD) en PyTorch: Implementación y práctica

Single Shot MultiBox Detection (SSD) en PyTorch

El modelo Single Shot MultiBox Detection (SSD) es una arquitectura eficiente para la detección de objetos, que utiliza una red base para extraer características y bloques de características multiescala para manejar objetos de diferentes tamaños. A continuación, se detalla su implementación y algunos ejercicios prácticos en PyTorch.

Arquitectura del modelo SSD

SSD se compone de una red base (comúnmente VGG o ResNet) que genera un mapa de características de alta resolución. Posteriormente, se aplican bloques de reducción de escala para crear mapas de características más pequeños, ampliando el campo receptivo. Cada nivel produce anclas con diferentes tamaños, permitiendo detectar objetos pequeños y grandes. Las predicciones de clases y desplazamientos de cajas delimitadoras se realizan en cada nivel usando capas convolucionales.

Capa de predicción de clases

Para predecir clases de anclas, se utiliza una capa convolucional que preserva las dimensiones espaciales del mapa de características. Esto reduce parámetros en comparación con capas totalmente conectadas. El número de canales de salida se establece como num_anclas × (num_clases + 1), donde el +1 representa la clase de fondo. Cada posición espacial en el mapa de salida codifica predicciones para todas las anclas en esa ubicación.

Ejemplo de capa de predicción de clases en PyTorch:

import torch
from torch import nn

def crear_capa_prediccion_clases(canales_entrada, num_anclas, num_clases):
    """Capa convolucional para predecir clases de anclas."""
    return nn.Conv2d(
        in_channels=canales_entrada,
        out_channels=num_anclas * (num_clases + 1),
        kernel_size=3,
        padding=1
    )

Capa de predicción de cajas delimitadoras

Similar a la capa de clases, se emplea una capa convolucional para predecir 4 coordenadas de desplazamiento por cada ancla. El canal de salida se calcula como num_anclas × 4.

def crear_capa_prediccion_cajas(canales_entrada, num_anclas):
    """Capa convolucional para predecir cajas delimitadoras."""
    return nn.Conv2d(
        in_channels=canales_entrada,
        out_channels=num_anclas * 4,
        kernel_size=3,
        padding=1
    )

Conexión de predicciones multiescala

En SSD, las predicciones provienen de mapas de características con diferentes dimensiones. Por ejemplo, un mapa de 20x20 con 5 anclas por celda y 10 clases produce un tensor de forma (tamaño_lote, 55, 20, 20), mientras que un mapa de 10x10 con 3 anclas produce (tamaño_lote, 33, 10, 10). Para combinar estas predicciones, se reorganizan los tensores a un formato bidimensional (tamaño_lote, alto × ancho × canales) y luego se concatenan a lo largo de la dimensión 1.

Demostración con datos simulados:

def ejecutar_bloque(x, bloque):
    return bloque(x)

# Crear tensores de ejemplo para mapas de características
mapa1 = torch.zeros(2, 8, 20, 20)  # 2 ejemplos, 8 canales, 20x20
mapa2 = torch.zeros(2, 16, 10, 10)  # 2 ejemplos, 16 canales, 10x10

# Obtener predicciones de clases
pred_clases1 = ejecutar_bloque(mapa1, crear_capa_prediccion_clases(8, 5, 10))
pred_clases2 = ejecutar_bloque(mapa2, crear_capa_prediccion_clases(16, 3, 10))

# Verificar formas
print(pred_clases1.shape)  # Salida: torch.Size([2, 55, 20, 20])
print(pred_clases2.shape)  # Salida: torch.Size([2, 33, 10, 10])

Para el procesamiento posterior, se transforman los tensores meidante operaciones como permutación y aplanamiento, facilitando la concatenación y la eficiecnia computacional en el entrenamiento.

Etiquetas: PyTorch SSD Detección de Objetos redes neuronales convolucionales aprendizaje profundo

Publicado el 7-15 22:53