Saltar al contenido

¿Es esta la forma correcta de blanquear una imagen en python?

Te doy la bienvenida a nuestra página, en este lugar encontrarás la resolución de lo que estás buscando.

Solución:

Repasemos esto. Como señala, CIFAR contiene imágenes que se almacenan en una matriz; cada imagen es una fila, y cada fila tiene 3072 columnas de uint8 números (0-255). Las imágenes son de 32×32 píxeles y los píxeles son RGB (color de tres canales).

# https://www.cs.toronto.edu/~kriz/cifar.html
# wget https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz
# tar xf cifar-10-python.tar.gz
import numpy as np
import cPickle
with open('cifar-10-batches-py/data_batch_1') as input_file: 
    X = cPickle.load(input_file)
X = X['data']   # shape is (N, 3072)

Resulta que las columnas están ordenadas un poco raro: todos los valores de píxeles rojos vienen primero, luego todos los píxeles verdes, luego todos los píxeles azules. Esto hace que sea complicado mirar las imágenes. Esta:

import matplotlib.pyplot as plt
plt.imshow(X[6].reshape(32,32,3))
plt.show()

da esto:

Canales de color mezclados

Entonces, solo para facilitar la visualización, mezclemos las dimensiones de nuestra matriz con reshape y transpose:

# output is of shape (N, 3, 32, 32)
X = X.reshape((-1,3,32,32))
# output is of shape (N, 32, 32, 3)
X = X.transpose(0,2,3,1)
# put data back into a design matrix (N, 3072)
X = X.reshape(-1, 3072)

Ahora:

plt.imshow(X[6].reshape(32,32,3))
plt.show()

da:

Un pavo real

Bien, pasemos al blanqueamiento ZCA. Con frecuencia se nos recuerda que es muy importante centrar los datos en cero antes de blanquearlos. En este punto, una observación sobre el código que incluye. Por lo que puedo decir, la visión por computadora ve los canales de color como una dimensión más; no hay nada especial en los valores RGB separados en una imagen, al igual que no hay nada especial en los valores de píxeles separados. Todas son solo funciones numéricas. Entonces, mientras está calculando el valor de píxel promedio, respetando los canales de color (es decir, su mean es una tupla de r,g,b valores), calcularemos el promedio imagen valor. Tenga en cuenta que X es una matriz grande con N filas y 3072 columnas. Trataremos cada columna como “el mismo tipo de cosas” que cualquier otra columna.

# zero-centre the data (this calculates the mean separately across
# pixels and colour channels)
X = X - X.mean(axis=0)

En este punto, hagamos también la Normalización de contraste global, que se aplica con bastante frecuencia a los datos de imagen. Usaré la norma L2, que hace que cada imagen tenga una magnitud vectorial 1:

X = X / np.sqrt((X ** 2).sum(axis=1))[:,None]

Se podría usar fácilmente otra cosa, como la desviación estándar (X = X / np.std(X, axis=0)) o escalado mínimo-máximo a algún intervalo como [-1,1].

Cerca de allí. En este punto, no hemos modificado mucho nuestros datos, ya que los hemos cambiado y escalado (una transformación lineal). Para mostrarlo, necesitamos recuperar los datos de la imagen en el rango [0,1], así que usemos una función auxiliar:

def show(i):
    i = i.reshape((32,32,3))
    m,M = i.min(), i.max()
    plt.imshow((i - m) / (M - m))
    plt.show()

show(X[6])

El pavo real se ve un poco más brillante aquí, pero eso es solo porque hemos estirado sus valores de píxeles para llenar el intervalo [0,1]:

Pavo real ligeramente más brillante

Blanqueamiento ZCA:

# compute the covariance of the image data
cov = np.cov(X, rowvar=True)   # cov is (N, N)
# singular value decomposition
U,S,V = np.linalg.svd(cov)     # U is (N, N), S is (N,)
# build the ZCA matrix
epsilon = 1e-5
zca_matrix = np.dot(U, np.dot(np.diag(1.0/np.sqrt(S + epsilon)), U.T))
# transform the image data       zca_matrix is (N,N)
zca = np.dot(zca_matrix, X)    # zca is (N, 3072)

Echando un vistazo (show(zca[6])):

Ahora el pavo real definitivamente se ve diferente. Puede ver que el ZCA ha girado la imagen a través del espacio de color, por lo que parece una imagen en un televisor antiguo con la configuración de Tono fuera de control. Sin embargo, sigue siendo reconocible.

Presumiblemente debido a la epsilon valor que utilicé, la covarianza de mis datos transformados no es exactamente identidad, pero está bastante cerca:

>>> (np.cov(zca, rowvar=True).argmax(axis=1) == np.arange(zca.shape[0])).all()
True

Actualización 29 de enero

No estoy del todo seguro de cómo solucionar los problemas que tiene; su problema parece estar en la forma de sus datos sin procesar en este momento, por lo que le aconsejo que lo solucione primero antes de intentar pasar al centrado cero y ZCA.

Por un lado, el primer gráfico de los cuatro gráficos de su actualización se ve bien, lo que sugiere que ha cargado los datos CIFAR de la manera correcta. La segunda trama es producida por toimage, Creo, que determinará automáticamente qué dimensión tiene los datos de color, lo cual es un buen truco. Por otro lado, las cosas que vienen después se ven raras, por lo que parece que algo va mal en alguna parte. Confieso que no puedo seguir el estado de su script, porque sospecho que está trabajando de forma interactiva (cuaderno), volviendo a intentar cosas cuando no funcionan (más sobre esto en un segundo) y que está usando código que no ha mostrado en su pregunta. En particular, no estoy seguro de cómo está cargando los datos CIFAR; su captura de pantalla muestra la salida de algunos print declaraciones (Reading training data..., etc.), y luego cuando copie train_data dentro X e imprime el shape de X, la forma ya ha sido remodelada en (N, 3, 32, 32). Como digo, el gráfico de actualización 1 tendería a sugerir que la remodelación se ha realizado correctamente. De las parcelas 3 y 4, creo que estás obteniendo mixed sobre las dimensiones de la matriz en algún lugar, por lo que no estoy seguro de cómo está haciendo la remodelación y la transposición.

Tenga en cuenta que es importante tener cuidado con la remodelación y la transposición, por la siguiente razón. los X = X.reshape(...) y X = X.transpose(...) el código está modificando la matriz en su lugar. Si hace esto varias veces (como por accidente en el cuaderno de jupyter), mezclará los ejes de su matriz una y otra vez, y el trazado de los datos comenzará a verse realmente extraño. Esta imagen muestra la progresión, mientras iteramos las operaciones de remodelación y transposición:

Incrementar las iteraciones de remodelación y transposición

Esta progresión no retrocede, o al menos, no se repite rápidamente. Debido a las regularidades periódicas en los datos (como la estructura de fila de 32 píxeles de las imágenes), tiende a aparecer bandas en estas imágenes transpuestas de forma incorrecta. Me pregunto si eso es lo que está sucediendo en el tercero de sus cuatro gráficos en su actualización, que parece mucho menos aleatorio que las imágenes en la versión original de su pregunta.

El cuarto gráfico de su actualización es un color negativo del pavo real. No estoy seguro de cómo lo está obteniendo, pero puedo reproducir su salida con:

plt.imshow(255 - X[6].reshape(32,32,3))
plt.show()

lo que da:

Color negativo del pavo real

Una forma de obtener esto es si estuviera usando mi show función auxiliar, y tú mixed hasta m y M, como esto:

def show(i):
    i = i.reshape((32,32,3))
    m,M = i.min(), i.max()
    plt.imshow((i - M) / (m - M))  # this will produce a negative img
    plt.show()

Tuve el mismo problema: los valores proyectados resultantes están apagados:

Se supone que una imagen flotante está en [0-1.0] valores para cada

def toimage(data):
    min_ = np.min(data)
    max_ = np.max(data)
    return (data-min_)/(max_ - min_)

AVISO: ¡utilice esta función solo para visualización!

Sin embargo, observe cómo se calcula la matriz de “descorrelación” o “blanqueamiento” @wildwilhelm

zca_matrix = np.dot(U, np.dot(np.diag(1.0/np.sqrt(S + epsilon)), U.T))

Esto se debe a que la matriz U de los vectores propios de la matriz de correlación es en realidad esta: SVD (X) = U, S, V pero U es la EigenBase de X * X no de X https://en.wikipedia.org/ wiki / Descomposición de valores singulares

Como nota final, prefiero considerar las unidades estadísticas solo los píxeles y los canales RGB sus modalidades en lugar de las imágenes como unidades estadísticas y los píxeles como modalidades. Probé esto en la base de datos CIFAR 10 y funciona bastante bien.

EJEMPLO DE IMAGEN: La imagen superior tiene valores RGB “blanqueados”, la parte inferior es la original.

Image1

EJEMPLO DE IMAGEN 2: NO ZCA transforma el rendimiento en tren y pérdida

Image2

EJEMPLO DE IMAGEN 3: Rendimiento de transformación ZCA en tren y pérdida

Image1

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *