2017-09-15 10 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を関数の最後に追加します。他の行は元のソースコードからコピーされ貼り付けられます。 は今、あなたは、と例えば、

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

関連する問題