2017-09-15 73 views
2

我明白如何以及爲什麼要使用ImageDataGenerator,但我有興趣就ImageDataGenerator如何影響我的圖像投下眼球,以便我可以決定是否選擇了一個好的數量的緯度來增加我的數據。我看到我可以迭代來自發生器的圖像。我正在尋找一種方法來查看它是原始圖像還是修改後的圖像,並且如果後者在我正在查看的特定實例中修改了哪些參數。我如何/能看到這個?Keras ImageDataGenerator如何查看圖像被修改的參數

回答

1

大部分轉換(除了翻轉)都會總是修改輸入圖像。例如,如果您指定rotation_range,從源代碼:

theta = np.pi/180 * np.random.uniform(-self.rotation_range, self.rotation_range) 

這是不可能的隨機數將完全0

有沒有打印出應用於轉換的金額方便的方法每張圖片。您必須修改源代碼並在ImageDataGenerator.random_transform()中添加一些打印功能。

如果您不想觸摸源代碼(例如,在共享機器上),則可以擴展ImageDataGenerator並覆蓋random_transform()

import numpy as np 
from keras.preprocessing.image import * 


class MyImageDataGenerator(ImageDataGenerator): 
    def random_transform(self, x, seed=None): 
     # these lines are just copied-and-pasted from the original random_transform() 
     img_row_axis = self.row_axis - 1 
     img_col_axis = self.col_axis - 1 
     img_channel_axis = self.channel_axis - 1 

     if seed is not None: 
      np.random.seed(seed) 

     if self.rotation_range: 
      theta = np.pi/180 * np.random.uniform(-self.rotation_range, self.rotation_range) 
     else: 
      theta = 0 

     if self.height_shift_range: 
      tx = np.random.uniform(-self.height_shift_range, self.height_shift_range) * x.shape[img_row_axis] 
     else: 
      tx = 0 

     if self.width_shift_range: 
      ty = np.random.uniform(-self.width_shift_range, self.width_shift_range) * x.shape[img_col_axis] 
     else: 
      ty = 0 

     if self.shear_range: 
      shear = np.random.uniform(-self.shear_range, self.shear_range) 
     else: 
      shear = 0 

     if self.zoom_range[0] == 1 and self.zoom_range[1] == 1: 
      zx, zy = 1, 1 
     else: 
      zx, zy = np.random.uniform(self.zoom_range[0], self.zoom_range[1], 2) 

     transform_matrix = None 
     if theta != 0: 
      rotation_matrix = np.array([[np.cos(theta), -np.sin(theta), 0], 
             [np.sin(theta), np.cos(theta), 0], 
             [0, 0, 1]]) 
      transform_matrix = rotation_matrix 

     if tx != 0 or ty != 0: 
      shift_matrix = np.array([[1, 0, tx], 
            [0, 1, ty], 
            [0, 0, 1]]) 
      transform_matrix = shift_matrix if transform_matrix is None else np.dot(transform_matrix, shift_matrix) 

     if shear != 0: 
      shear_matrix = np.array([[1, -np.sin(shear), 0], 
            [0, np.cos(shear), 0], 
            [0, 0, 1]]) 
      transform_matrix = shear_matrix if transform_matrix is None else np.dot(transform_matrix, shear_matrix) 

     if zx != 1 or zy != 1: 
      zoom_matrix = np.array([[zx, 0, 0], 
            [0, zy, 0], 
            [0, 0, 1]]) 
      transform_matrix = zoom_matrix if transform_matrix is None else np.dot(transform_matrix, zoom_matrix) 

     if transform_matrix is not None: 
      h, w = x.shape[img_row_axis], x.shape[img_col_axis] 
      transform_matrix = transform_matrix_offset_center(transform_matrix, h, w) 
      x = apply_transform(x, transform_matrix, img_channel_axis, 
           fill_mode=self.fill_mode, cval=self.cval) 

     if self.channel_shift_range != 0: 
      x = random_channel_shift(x, 
            self.channel_shift_range, 
            img_channel_axis) 
     if self.horizontal_flip: 
      if np.random.random() < 0.5: 
       x = flip_axis(x, img_col_axis) 

     if self.vertical_flip: 
      if np.random.random() < 0.5: 
       x = flip_axis(x, img_row_axis) 

     # print out the trasformations applied to the image 
     print('Rotation:', theta/np.pi * 180) 
     print('Height shift:', tx/x.shape[img_row_axis]) 
     print('Width shift:', ty/x.shape[img_col_axis]) 
     print('Shear:', shear) 
     print('Zooming:', zx, zy) 

     return x 

我只是在函數的末尾添加了5個print s。其他行從原始源代碼複製並粘貼。 現在你可以用,例如使用它,

gen = MyImageDataGenerator(rotation_range=15, 
          width_shift_range=0.1, 
          height_shift_range=0.1, 
          zoom_range=0.5) 
flow = gen.flow_from_directory('data', batch_size=1) 
img = next(flow) 

,看到這樣的印在終端上的信息:

Rotation: -9.185074669096467 
Height shift: 0.03791625365979884 
Width shift: -0.08398553078553198 
Shear: 0 
Zooming: 1.40950509832 1.12895574928 
+0

哇,這真的很有幫助。謝謝! – doogFromMT

相關問題