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.

Encontrar la media y la desviación estándar de los valores de píxeles para imágenes en escala de grises en PyTorch.

Estoy intentando normalizar este conjunto de datos de imágenes de rayos-X en escala de grises https://www.kaggle.com/paultimothymooney/chest-xray-pneumonia.

Tengo algunas dudas:

1) Investigé algunos de los proyectos realizados utilizando el mismo conjunto de datos y este que se muestra a continuación tiene tres valores promedio (presumiblemente para los tres canales). Pero, dado que este es un conjunto de datos de imágenes en escala de grises, ¿cómo puede tener valores promedio de píxeles para 3 canales? ¿No debería ser simplemente un número entre 0 y 1? (https://www.kaggle.com/brennolins/image-classification-pytorch-transfer-learning)

2) En un intento por encontrar la media y la desviación estándar, intenté hacer lo siguiente:

    train_loader = DataLoader(dataset = train_set, batch_size=64, 
    shuffle=True)

    def get_mean_std(loader):
        channels_sum, channels_square_sum, num_batches= 0, 0, 0

        for data, _ in loader:
            channels_sum += torch.mean(data, dim=[])
            channels_square_sum += torch.mean(data**2, dim = [0,2,3])
            num_batches += 1

        mean=channels_sum/num_batches
        std= (channels_square_sum/num_batches - mean**2)

        return mean, std

    mean, std= get_mean_std(train_loader) 
    print(mean)
    print(std)
Me da un solo valor como promedio de píxeles. Corrí esto dos veces y obtuve dos valores promedio diferentes y un conjunto diferente de valores de desviación estándar. ¿Cómo puede ocurrir esto?

Esta es la transformación que estoy tratando de aplicar a mi conjunto de entrenamiento:

transf_train = tt.Compose([
    tt.Resize(60),
    tt.RandomCrop(54, padding=4, padding_mode='reflect'),
    tt.ToTensor(), # convierte píxeles [0-255] en tensores [0-1]
    tt.Normalize(mean = [0.485, 0.456, 0.406], std = [0.229, 0.224, 0.225])]) 

(Tomé estos valores actuales del proyecto de pytorch mencionado anteriormente. Quería saber cómo puedo encontrar estos valores por mí mismo y cómo hay tres canales promedio cuando las imágenes son en escala de grises)

¡Gracias!

Tags:  , ,

Answer

  1. Avatar for davy.ai
    1. No es necesario tener valores medios para 3 canales cuando se trabaja con imágenes en escala de grises, ya que solo contienen un canal. El proyecto al que te refieres puede haber utilizado un modelo pre-entrenado que requería entradas de 3 canales, de ahí los valores medios especificados para cada canal.
    2. Las discrepancias en los valores medios y de desviación estándar obtenidos al ejecutar el código varias veces pueden ser debido a la aleatoriedad involucrada en el proceso de mezclar el conjunto de datos y seleccionar lotes. Para obtener resultados más consistentes, podrías establecer una semilla aleatoria antes de ejecutar el código o aumentar el número de lotes utilizados para calcular los valores.

    3. Para encontrar los valores medios y de desviación estándar de tu conjunto de datos de imágenes en escala de grises, podrías modificar el código de la siguiente manera:

    train_loader = DataLoader(dataset=train_set, batch_size=64, shuffle=True)
    
    def obtener_media_std(cargador):
        suma_canales, suma_cuadrados_canales, num_pixeles = 0, 0, 0
    
        for datos, _ in cargador:
            suma_canales += torch.mean(datos)
            suma_cuadrados_canales += torch.mean(datos ** 2)
            num_pixeles += datos.numel()
    
        media = suma_canales / num_pixeles
        std = torch.sqrt(suma_cuadrados_canales / num_pixeles - media ** 2)
    
        return media, std
    
    media, std = obtener_media_std(train_loader) 
    print(media)
    print(std)
    

    Este código calcula los valores medios y de desviación estándar para todos los píxeles en el conjunto de datos, independientemente del número de canales. Los valores resultantes se pueden utilizar para la normalización en tu transformación.

    transf_train = tt.Compose([
        tt.Resize(60),
        tt.RandomCrop(54, padding=4, padding_mode='reflect'),
        tt.ToTensor(),
        tt.Normalize(mean=[0.5], std=[0.5])])
    

    Dado que las imágenes en escala de grises solo tienen un canal, los valores medios y de desviación estándar utilizados para la normalización deben ser un número único cada uno, típicamente 0.5, ya que centra los valores alrededor de 0.

Comments are closed.