13

Pythonで約40000〜50000枚の画像を含む2つの巨大なファイルを処理しようとしています。しかし、データセットを numpy 配列に変換しようとするたびに、メモリ エラーが発生します。私は約8GBのRAMしか持っていませんが、Pythonの経験が不足しているため、私が知らないPythonライブラリを使用して、またはおそらく私のコードを最適化?この件についてご意見をお聞きしたいです。

私の画像処理コード:

from sklearn.cluster import MiniBatchKMeans
import numpy as np
import glob
import os
from PIL import Image
from sklearn.decomposition import PCA

image_dir1 = "C:/Users/Ai/Desktop/KAGA FOLDER/C/train"
image_dir2 = "C:/Users/Ai/Desktop/KAGA FOLDER/C/test1"
Standard_size = (300,200)
pca = PCA(n_components = 10)
file_open = lambda x,y: glob.glob(os.path.join(x,y))


def matrix_image(image):
    "opens image and converts it to a m*n matrix" 
    image = Image.open(image)
    print("changing size from %s to %s" % (str(image.size), str(Standard_size)))
    image = image.resize(Standard_size)
    image = list(image.getdata())
    image = map(list,image)
    image = np.array(image)
    return image
def flatten_image(image):  
    """
    takes in a n*m numpy array and flattens it to 
    an array of the size (1,m*n)
    """
    s = image.shape[0] * image.shape[1]
    image_wide = image.reshape(1,s)
    return image_wide[0]

if __name__ == "__main__":
    train_images = file_open(image_dir1,"*.jpg")
    test_images = file_open(image_dir2,"*.jpg")
    train_set = []
    test_set = []

    "Loop over all images in files and modify them"
    train_set = [flatten_image(matrix_image(image))for image in train_images]
    test_set = [flatten_image(matrix_image(image))for image in test_images]
    train_set = np.array(train_set) #This is where the Memory Error occurs
    test_set = np.array(test_set)

小さな編集:私は64ビットのPythonを使用しています

4

2 に答える 2

7

各ピクセルが 4 バイトの整数であると仮定すると、(4*300*200*50000 / (1024)**3) で約 11.2 GB のデータを保持しようとしています。2 バイト整数の半分。

いくつかのオプションがあります:

  1. メモリに保持しようとしている画像の数またはサイズを減らします
  2. メモリの代わりにファイルまたはデータベースを使用してデータを保持します (一部のアプリケーションでは遅すぎる場合があります)。
  3. あなたが持っているメモリをより効果的に使用してください...

ここで行うように、list から numpy にコピーする代わりに、一時的に 2 倍の量のメモリを使用します。

test_set = [flatten_image(matrix_image(image))for image in test_images]
test_set = np.array(test_set)

これを行う:

n = len(test_images)
test_set = numpy.zeros((n,300*200),dtype=int)
for i in range(n):
    test_set[i] = flatten_image(matrix_image(test_images[i]))
于 2013-10-18T16:44:16.450 に答える