【问题标题】:how to define my own customized image preprocess function when using keras.preprocess.image.ImageDataGenerator使用 keras.preprocess.image.ImageDataGenerator 时如何定义我自己的自定义图像预处理功能
【发布时间】:2018-04-14 13:26:41
【问题描述】:

我发现keras.preprocess.image.ImageDataGenerator中没有包含一些图像预处理功能

那么我如何在ImageDataGenerator 中添加我自己的自定义预处理功能,比如改变亮度、饱和度、颜色抖动、图像裁剪等。

【问题讨论】:

  • 这是 github 上一个非常好的帖子:github.com/fchollet/keras/issues/3338。请参考。
  • 感谢您的建议。不知道有没有官方接口可以让我把我的预处理函数和ImageDataGenerator结合起来?

标签: image-processing deep-learning keras


【解决方案1】:

实际上 - 您可以指定自己的预处理函数并将其设置在您的 ImageGenerator 中。例如:

def preprocessor(image):
    # perform augmentations here

然后:

image_generator = ImageDataGenerator(..., preprocessing_function=preprocessor)

【讨论】:

  • 谢谢。这意味着您可以在 ImageDataGenerator 之前进行自己的预处理。 preprocess_function 可以是函数列表而不是单个函数吗?
  • 您可以定义应用一系列预处理函数的函数:)
  • @AbrahamBen - 我的回答有帮助吗?
【解决方案2】:

为了让 Marcin 解决方案对我有用,我必须在 ImageDataGenerator 中定义 preprocessing_function:

train_datagen=ImageDataGenerator( ... preprocessing_function= preprocessor(image).all(), ... )

【讨论】:

    【解决方案3】:

    只需制作你的预处理函数并将其作为参数传递给ImageDataGeneratorpreprocessing_function 函数。您还可以在 ImageDataGenerator 中传递多个预处理函数,方法是在一个 preprocess() 函数中调用所有这些函数。

    如果您尝试只传递一个预处理函数:-

    def preprocess():
        # operations
    

    如果您尝试传递多个预处理函数:-

    def preprocess():
        another preprocess_function()
            # operations
    

    然后在 ImageDataGenerator 中传递 preprocess() :-

    train_gen = ImageDataGenerator(preprocessing_function=preprocess())
    

    【讨论】:

      【解决方案4】:
      def get_random_eraser(p=0.5, s_l=0.02, s_h=0.4, r_1=0.3, r_2=1/0.3, v_l=0, v_h=255, pixel_level=False):
          def eraser(input_img):
              img_h, img_w, img_c = input_img.shape
              p_1 = np.random.rand()
      
              if p_1 > p:
                  return input_img
      
              while True:
                  s = np.random.uniform(s_l, s_h) * img_h * img_w
                  r = np.random.uniform(r_1, r_2)
                  w = int(np.sqrt(s / r))
                  h = int(np.sqrt(s * r))
                  left = np.random.randint(0, img_w)
                  top = np.random.randint(0, img_h)
      
                  if left + w <= img_w and top + h <= img_h:
                      break
      
              if pixel_level:
                  c = np.random.uniform(v_l, v_h, (h, w, img_c))
              else:
                  c = np.random.uniform(v_l, v_h)
      
              input_img[top:top + h, left:left + w, :] = c
      
              return input_img
      
          return eraser
      
      
          datagen = ImageDataGenerator(preprocessing_function=get_random_eraser(v_l=0, v_h=1), zoom_range=0.0, horizontal_flip=False)
      

      【讨论】:

      • 此功能对我有用,它是侧面“橡皮擦”功能中的随机橡皮擦,您可以根据您的要求更改。
      猜你喜欢
      • 1970-01-01
      • 2013-06-13
      • 2021-10-10
      • 1970-01-01
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-23
      相关资源
      最近更新 更多