La forma más python de cargar por lotes y procesar imágenes.

El siguiente código carga las imágenes jpeg en una matriz de ndarrays numpy. Actualmente funciona bien, pero creo que debe haber una forma más pythonica de hacer esto.

import scipy.ndimage as spimg import numpy as np # Read images into scipy and flatten to greyscale # Using generator function instead of list comprehension # for memory efficiency human_files_convert = (spimg.imread(path, flatten=True) for path in human_files[:2099]) 

Usando una función generadora de arriba para que cada imagen se procese individualmente, aquí falla la comprensión de la lista.

 batch_size = 1000 step = 0 human_files_ndarray = np.empty((1, 250, 250)) # Create empty list, to append empty image arrays human_files_list = [] batch = 1 total_processed = 0 # iterate through image arrays for path in human_files_convert: # Append to list human_files_list.append(path) # Stack list of arrays step += 1 total_processed += 1 if (step % batch_size == 0) or (len(human_files[:2099]) == total_processed): new_stack = np.stack(human_files_list) print("Batch: ", batch) print(new_stack.shape) step = 0 human_files_ndarray = np.concatenate((human_files_ndarray, new_stack)) print(human_files_ndarray.shape) print(total_processed) # Create empty list, to append empty image arrays human_files_list = [] batch += 1 

¿Alguna idea sobre cómo hacer que este código sea más eficiente o pythonic?

Usando la sugerencia de @sascha anterior, envié la salida de mi función de generador a un archivo hdf5 . Al hacer esto, el uso de memoria de> 4 GB para el conjunto fue inferior a 200 MB. La ventaja añadida es que ahora tengo una copia de disco del conjunto de datos cargado, como un archivo pickle.

 # Confirm correct import of images import scipy.ndimage as spimg import numpy as np import h5py import tqdm np.set_printoptions(threshold=1000) # Use h5py to store large uncompressed image arrays img = h5py.File("images.hdf5", "w") human_dset = img.create_dataset("human_images", (len(human_files), 250, 250)) # Read images into scipy and flatten to greyscale # Using generator function instead of list comprehension # for memory efficiency slice = len(human_files) human_files_convert = (spimg.imread(path, flatten=True) for path in human_files[:slice]) i = 0 for r in tqdm.tqdm(human_files_convert, total=slice): # Rescale [0,255] --> [0,1] r = r.astype('float32')/255 # Insert Row into dset human_dset[i] = r i += 1 img.close()