2017-11-24 13 views
0

파이썬의 opencv를 사용하여 이미지를 읽는 프로그램을 작성하고 3GB 이미지를로드하려고 시도했지만 프로그램이 중단되었습니다. 내 PC에 32GB의 메모리가 있지만이 프로그램을 실행하면 메모리가 부족합니다. 그 원인은 무엇입니까?opencv를 사용하여 파이썬 프로그램의 메모리 부족 현상이 발생하고 있습니까?

오류 메시지가 나타나지 않고 PC가 비정상적으로 무겁게됩니다. 나는 Ubuntu의 System Monitor로 그것을 확인했고 메모리와 스왑 공간이 부족했다.

이미지를 하나의 배열로 가져 와서 tensorflow 심층 학습 프로그램에 전달합니다. 이미지의 크기는 200 x 200 컬러 이미지입니다.

저는 64 비트 버전의 파이썬을 사용합니다. 메모리 부족에 대한

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에는 조금 더 큰 메타 정보가 있습니다. (I 정상화와 중앙 데이터없는 인 같이 uint8 일부 제한을가 인식) 가능한 uint8에서 float32로 변환

  • 이를 방지하기 위해 시도함으로써 제 크기를 곱한다.

가능한 해결 방법 :

  • 사용 numpy.memmap는 그레이 스케일로 변환 및/또는 해상도를 줄여
  • , 이미지의 품질을 감소 디스크
  • 에 저장 배열을 만들 수 있습니다.
  • 더 적은 수의 이미지에 모델을 조정하십시오.