2016-11-07 63 views
1

我在包含多個尺寸圖像的數據集上訓練/測試ML模型。我知道Keras允許我們使用target_size參數提取固定大小的隨機補丁:用Keras提取同一圖像的多個補丁

gen = ImageDataGenerator(width_shift_range=.9, height_shift_range=.9) 
data = gen.flow_from_directory('/path/to/dataset/train', 
      target_size=(224, 224), 
      classes=10, 
      batch_size=32, 
      seed=0) 

for _ in range(data.N // data.batch_size): 
    X, y = next(data) 

對於每次迭代,X包含32個補丁(每個不同樣品)。在所有迭代中,我可以訪問數據集中每個樣本的一個補丁。

問題:提取同一樣本的多個補丁的最佳方法是什麼?

喜歡的東西:

data = gen.flow_from_directory(..., nb_patches=10) 
X, y = next(data) 
# X contains 320 rows (10 patches for each 32 sample in the batch) 

我知道我可以寫一個第二個for循環,並在數據集迭代多次,但是這似乎有點凌亂。我也想更強有力地保證我真的獲取樣本樣本的補丁。

+1

一個簡單的解決辦法是在某些方面進行過採樣所需的圖像。當我在不平衡的數據集上訓練CNN模型時,我這樣做了。 –

回答

1

我決定自己實施它。這就是它是如何結束:

n_patches = 10 
labels = ('class1', 'class2', ...) 

for label in labels: 
    data_dir = os.path.join('path-to-dir', label) 

    for name in os.listdir(data_dir): 
     full_name = os.path.join(data_dir, name) 
     img = Image.open(full_name).convert('RGB') 

     patches = [] 

     for patch in range(n_patches): 
      start = (np.random.rand(2) * (img.width - image_shape[1], 
           img.height -image_shape[0])).astype('int') 
      end = start + (image_shape[1], image_shape[0]) 
      patches.append(img_to_array(img.crop((start[0], start[1], 
                end[0], end[1])))) 

     X.append(patches) 
     y.append(label) 

X, y = np.array(X, dtype=np.float), np.array(y, dtype=np.float)