es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Trabajando con datos de imagen desde la memoria en PyTorch.

Pregunta:

Si tengo un arreglo en memoria con dimensiones (n, altura, ancho, canales) y quiero alimentar un clasificador de Pytorch para obtener un arreglo con predicciones de clase para cada una de las n imágenes en el arreglo, ¿cómo puedo hacer eso?

Antecedentes:

Estoy trabajando en un problema de visión por computadora donde modifico algunas imágenes usando código preexistente y quiero enviar las imágenes modificadas a un clasificador CNN de Pytorch (no desarrollado ni controlado por mí). Estoy más acostumbrado a Tensorflow/Keras que a Pytorch.

Con modelos de Tensorflow/Keras, puedes darles un montón de imágenes en un arreglo numpy y ellos las procesarán a través del modelo.

PD:

Un colega sugirió guardar todas las imágenes en disco primero y luego leerlas con DataLoader, pero eso es innecesario cuando ya tengo las imágenes en memoria.

Disculpa si es una pregunta tonta, intenté encontrar una solución en otro lugar pero obviamente no tuve mucho éxito.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para alimentar un conjunto de imágenes con dimensiones (n, altura, ancho, canales) a un clasificador de Pytorch y obtener predicciones de clase para cada una de las n imágenes, puedes seguir estos pasos:

    1. Crea un dataset de Pytorch utilizando el conjunto de imágenes.
    from torch.utils.data import Dataset
    
    class MyDataset(Dataset):
        def __init__(self, images):
            self.images = images
    
        def __len__(self):
            return len(self.images)
    
        def __getitem__(self, idx):
            image = self.images[idx]
            return image
    
    1. Crea un dataloader de Pytorch para cargar el dataset en lotes.
    from torch.utils.data import DataLoader
    
    tamaño_lote = 32
    dataset = MyDataset(images)
    dataloader = DataLoader(dataset, batch_size=tamaño_lote)
    
    1. Crea una instancia de tu clasificador de Pytorch y carga los pesos preentrenados si es necesario.
    from torchvision.models import resnet18
    
    clasificador = resnet18(pretrained=True)
    
    1. Establece el clasificador en modo de evaluación.
    clasificador.eval()
    
    1. Itera sobre el dataloader para alimentar las imágenes a través del clasificador y obtener las predicciones de clase.
    import torch
    
    predicciones = []
    with torch.no_grad():
        for imágenes in dataloader:
            salidas = clasificador(imágenes)
            _, preds = torch.max(salidas, 1)
            predicciones += preds.cpu().tolist()
    

    predicciones será una lista de enteros que representan las clases predichas para cada imagen en el conjunto original.

    Ten en cuenta que los pasos anteriores asumen que tu clasificador de Pytorch toma imágenes con dimensiones (altura, ancho, canales) como entrada. Si tu clasificador espera imágenes con dimensiones (canales, altura, ancho), deberás transponer los ejes de la imagen en el paso 1 y modificar el método __getitem__ en consecuencia.

Comments are closed.