2017-11-24 11 views
0

私はPythonのopencvを使って画像を読み込み、3 GBの画像を読み込もうとしましたが、プログラムは中止されました。 私のPCには32 GBのメモリがありますが、このプログラムを実行するとそのメモリは使い果たされます。原因は何ですか?opencvを使用してPythonプログラムのメモリが不足する原因は何ですか?

エラーメッセージは表示されず、PCが異常に重くなります。私はUbuntuのシステムモニタでそれを確認しましたが、メモリとスワップが不足していました。

テンソルフローディープ学習プログラムに渡すために、イメージを1つの配列にインポートします。画像のサイズは200×200のカラー画像です。

私は64ビットバージョンのPythonを使用しています。メモリ不足のため

import os 
import numpy as np 
import cv2 

IMG_SIZE = 200 


def read_images(path): 
    dirnames = sorted(os.listdir(path)) 
    files = [sorted(os.listdir(path+dirnames[i]))\ 
     for i in range(len(dirnames))] 
    i = 0 
    images = [] 
    for fs in files: 
     tmp_images = [] 
     for f in fs: 
      img = cv2.imread(path +dirnames[i] + "/" + f) 
      img = cv2.resize(img, (IMG_SIZE, IMG_SIZE)) 
      img = img.flatten().astype(np.float32)/255.0 
      tmp_images.append(img) 
     i = i + 1 
     images.append(tmp_images) 

    return np.asarray(images) 
+1

エラーメッセージを投稿してください。 – voiDnyx

+1

あなたは32ビット版のPythonまたは64ビットを使用していますか? –

+0

私は64ビットバージョンを使用しています。 – pie

答えて

0

理由:

  • イメージ・ファイルのサイズとメモリ内の対応する配列の大きさが異なっています。画像(例えばPNG及びJPEGフォーマット)は圧縮される。ここでは、対応する非圧縮BMP画像のサイズがより適切です。また、ndarrayは、それを少し大きくするいくつかのメタ情報を保持しています。 uint8からfloat32への変換

  • は(私はuint8は、データを正規化し、中央にできないように、いくつかの制限を課して認識)可能な場合は、これを避けるために、4てみてサイズを乗算します。

可能な救済:

  • 使用numpy.memmapディスク
  • に格納された配列を作成するためにグレースケールに変換し、および/または分解能を減少させることによって、画像の品質を低下させます。
  • 少数の画像でモデルを調整します。
関連する問題