Extraiga imágenes del archivo .idx3-ubyte o GZIP a través de Python

He creado una función simple para reconocimiento facial utilizando el reconocimiento de rostro de OpenCV. Funciona bien con imágenes de personas.

Ahora me gustaría hacer una prueba utilizando caracteres escritos a mano en lugar de personas. Encontré el conjunto de datos MNIST, pero almacenan imágenes en un archivo extraño que nunca había visto antes.

Simplemente necesito extraer algunas imágenes de:

train-images.idx3-ubyte 

y guárdalos en una carpeta como .gif

O estoy mal entendido esto MNIST En caso afirmativo, ¿dónde podría obtener un conjunto de datos de este tipo?

EDITAR

También tengo el archivo gzip:

 train-images-idx3-ubyte.gz 

Estoy intentando leer el contenido, pero show() no funciona y si read() veo símbolos aleatorios.

 images = gzip.open("train-images-idx3-ubyte.gz", 'rb') print images.read() 

EDITAR

Gestionado para obtener algunos resultados útiles mediante el uso de:

 with gzip.open('train-images-idx3-ubyte.gz','r') as fin: for line in fin: print('got line', line) 

De alguna manera tengo que convertir esto ahora en una imagen, salida:

introduzca la descripción de la imagen aquí

Descarga las imágenes y tags de entrenamiento / prueba:

  • train-images-idx3-ubyte.gz: imágenes de conjunto de entrenamiento
  • train-labels-idx1-ubyte.gz: entrenamiento de tags de conjuntos
  • t10k-images-idx3-ubyte.gz: conjunto de imágenes de prueba
  • t10k-labels-idx1-ubyte.gz: tags de conjunto de prueba

Y descomprímelos en un workdir, digamos samples/ .

Obtenga el paquete python-mnist de PyPi:

 pip install python-mnist 

Importe el paquete mnist y lea las imágenes de entrenamiento / prueba:

 from mnist import MNIST mndata = MNIST('samples') images, labels = mndata.load_training() # or images, labels = mndata.load_testing() 

Para mostrar una imagen a la consola:

 index = random.randrange(0, len(images)) # choose an index ;-) print(mndata.display(images[index])) 

Obtendrás algo como esto:

 ............................ ............................ ............................ ............................ ............................ .................@@......... ..............@@@@@......... ............@@@@............ ..........@@................ ..........@................. ...........@................ ...........@................ ...........@...@............ ...........@@@@@.@.......... ...........@@@...@@......... ...........@@.....@......... ..................@......... ..................@@........ ..................@@........ ..................@......... .................@@......... ...........@.....@.......... ...........@....@@.......... ............@@@@............ .............@.............. ............................ ............................ ............................ 

Explicación:

  • Cada imagen de la lista de imágenes es una list de Python de bytes sin firmar.
  • Las tags son una array de Python de bytes sin firmar.

(Usando solo matplotlib, gzip y numpy)
Extraer datos de la imagen:

 import gzip f = gzip.open('train-images-idx3-ubyte.gz','r') image_size = 28 num_images = 5 import numpy as np f.read(16) buf = f.read(image_size * image_size * num_images) data = np.frombuffer(buf, dtype=np.uint8).astype(np.float32) data = data.reshape(num_images, image_size, image_size, 1) 

Imprimir imágenes:

 import matplotlib.pyplot as plt image = np.asarray(data[2]).squeeze() plt.imshow(image) plt.show() 

introduzca la descripción de la imagen aquí

Imprime las primeras 50 tags:

 f = gzip.open('train-labels-idx1-ubyte.gz','r') f.read(8) for i in range(0,50): buf = f.read(1) labels = np.frombuffer(buf, dtype=np.uint8).astype(np.int64) print(labels) 

Use esto para extraer la base de datos mnist a imágenes y tags csv en python:

https://github.com/sorki/python-mnist

Podría usar el paquete idx2numpy disponible en PyPI. Es extremadamente simple de usar y convierte directamente los datos en numerosos arreglos. Esto es lo que tienes que hacer:

Descargando los datos

Descargue el conjunto de datos MNIST del sitio web oficial .
Si está utilizando Linux, puede usar wget para obtenerlo desde la propia línea de comandos. Solo corre:

 wget http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz wget http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz wget http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz wget http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz 

Descomprimir los datos

Descomprima o descomprima los datos. En Linux, puedes usar gzip

En última instancia, debe tener los siguientes archivos:

 data/train-images-idx3-ubyte data/train-labels-idx1-ubyte data/t10k-images-idx3-ubyte data/t10k-labels-idx1-ubyte 

El prefijo de data/ es solo porque los he extraído en una carpeta llamada data . Parece que tu pregunta está bien hecha hasta aquí, así que sigue leyendo.

Utilizando idx2numpy

Aquí hay un código Python simple para leer todo desde los archivos descomprimidos como matrices numpy.

 import idx2numpy import numpy as np file = 'data/train-images-idx3-ubyte' arr = idx2numpy.convert_from_file(file) # arr is now a np.ndarray type of object of shape 60000, 28, 28 

Ahora puede usarlo con OpenCV juts de la misma manera que muestra cualquier otra imagen, usando algo como

 cv.imshow("Image", arr[4]) 

Para instalar idx2numpy, puede usar PyPI (administrador de paquetes pip ). Simplemente ejecute el comando:

 pip install idx2numpy