ソースコード
全文は長いので該当行のみ。
import漏れは補完いただけると幸いです。
Python
1import cv2 2import gc 3class Region: 4 def __init__(self, x, y, width, height): 5 self.X = x 6 self.Y = y 7 self.Width = width 8 self.Height = height 9 10 def size(self): 11 return (self.Width, self.Height) 12 def width(self): 13 return self.Width 14 def height(self): 15 return self.Height 16 17 def left(self): 18 return self.X 19 def right(self): 20 return self.X + self.Width 21 def top(self): 22 return self.Y 23 def bottom(self): 24 return self.Y + self.Height 25 26class SubImage: 27 _image_cache = ('', None) 28 def __init__(self, ID, image_prefix, region): 29 self.ID = ID 30 self.image_filename = image_prefix + '.jpg' 31 self.region = region 32 33 def get_image(self): 34 image = None 35 if self.image_filename == Target._image_cache[0]: 36 image = SubImage._image_cache[1] 37 else: 38 image = cv2.imread(self.image_filename)) 39 #del Target._image_cache 40 #gc.collect() 41 SubImage._image_cache = (self.image_filename, image) 42 return image[self.region.top():self.region.bottom(), self.region.left():self.region.right(), :] 43 44 @staticmethod 45 def deleteCache(): 46 #del Target._image_cache 47 #gc.collect() 48 SubImage._image_cache = ('', None) 49
疑問点
Pythonで大量の部分画像を生成しようとすると異常にメモリを消費してしまう。
コメントアウトしている以下の2文を追加するとこのメモリ消費が収まるが、どうして手動による解放が必要なのか理解できない。
ガーベジコレクションで自動解法されないのでしょうか?
メモリの消費についてより具体的に述べると、8000枚ほどの画像から5万枚の部分画像が必要な場合手動によるメモリ解放を行わない場合35.2GBのメモリを消費するのに対して、手動によるメモリ解放を行った場合16GBしか消費しない。
#コードについての補足
以下のようなデータベースから画像と部分画像を生成しようとしています。
画像のID | 画像ファイル名(拡張子なし) | 部分画像のx座標 | 部分画像のy座標 | 部分画像の幅 | 部分画像の高さ |
---|---|---|---|---|---|
ID1 | ファイル名1 | x11 | y11 | w11 | h13 |
ID2 | ファイル名1 | x12 | y12 | w12 | h13 |
ID3 | ファイル名1 | x13 | y13 | w13 | h13 |
ID4 | ファイル名2 | x21 | y21 | w21 | h21 |
ID5 | ファイル名2 | x22 | y22 | w22 | h22 |
実際にこれを読み込んで
Python
1img = SubImage(ID1, ファイル名1, Region(x11, y11, w11, h11)) 2sub_image = img.get_image()
みたいにして使います。
#補足情報(言語/FW/ツール等のバージョンなど)
Windows環境
- Windows 8.1/10
- Python 3.6.2
- OpenCV 3.2
- numpy 1.11
よろしくお願いします。

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/07/07 21:44 編集
2017/07/08 00:54
2017/07/08 00:59
2017/07/08 01:11 編集
2017/07/09 15:43