代码之家  ›  专栏  ›  技术社区  ›  doogFromMT

Keras ImageDataGenerator如何查看修改图像的参数

  •  2
  • doogFromMT  · 技术社区  · 7 年前

    我理解如何以及为什么使用ImageDataGenerator,但我感兴趣的是关注ImageDataGenerator如何影响我的图像,这样我就可以决定在增加数据时是否选择了足够的纬度。我看到我可以迭代来自生成器的图像。我正在寻找一种方法来查看它是原始图像还是修改后的图像,如果是后者,我正在查看的特定实例中修改了哪些参数。我怎么看这个?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Yu-Yang    7 年前

    大多数转换(翻转除外)将 总是 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