Image processing 如何在使用keras.preprocess.image.ImageDataGenerator时定义自己的自定义图像预处理函数

Image processing 如何在使用keras.preprocess.image.ImageDataGenerator时定义自己的自定义图像预处理函数,image-processing,deep-learning,keras,Image Processing,Deep Learning,Keras,我发现有一些图像预处理函数未包含在keras.preprocess.image.ImageDataGenerator 因此,我如何将自己定制的预处理函数添加到ImageDataGenerator,如更改亮度、饱和度、颜色抖动、图像裁剪等。实际上,您可以指定自己的预处理函数并在自己的应用程序中设置它。例如: def preprocessor(image): # perform augmentations here 然后: image_generator = ImageDataGenera

我发现有一些图像预处理函数未包含在
keras.preprocess.image.ImageDataGenerator


因此,我如何将自己定制的预处理函数添加到
ImageDataGenerator
,如更改亮度、饱和度、颜色抖动、图像裁剪等。

实际上,您可以指定自己的预处理函数并在自己的应用程序中设置它。例如:

def preprocessor(image):
    # perform augmentations here
然后:

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

为了让Marcin解决方案为我工作,我必须在ImageDataGenerator中定义预处理函数:

列车\数据发生器=图像数据发生器( ... 预处理函数=预处理器(图像).all(), ... )


只需创建预处理函数,并将其作为参数传递给
ImageDataGenerator
preprocessing\u函数。您还可以通过在一个
preparse()
函数中调用所有预处理函数,在
ImageDataGenerator
中传递多个预处理函数

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

def preprocess():
    # operations
如果您试图传递多个预处理函数:-

def preprocess():
    another preprocess_function()
        # operations
然后只需在ImageDataGenerator中传递该预处理()-

train_gen = ImageDataGenerator(preprocessing_function=preprocess())
def get_random_橡皮擦(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,像素级=False):
def擦除器(输入图像):
img_h,img_w,img_c=输入img.shape
p_1=np.random.rand()
如果p_1>p:
返回输入信号
尽管如此:
s=np.随机.均匀(s_l,s_h)*img_h*img_w
r=np.随机.均匀(r_1,r_2)
w=整数(np.sqrt(s/r))
h=int(np.sqrt(s*r))
左=np.random.randint(0,img_w)
top=np.random.randint(0,img_h)

如果左+w,这是github上非常好的线程:。请参考。谢谢你的建议。我想知道是否有任何官方界面可以让我将预处理功能与ImageDataGenerator结合起来?谢谢。这意味着您可以在ImageDataGenerator之前进行自己的预处理。预处理函数是否可以是一个函数列表而不是单个函数?您可以定义应用一系列预处理函数的函数:)@AbrahamBen-我的答案有用吗?此函数对我有效,它是“橡皮擦”函数中的随机橡皮擦,可以根据您的要求进行更改。
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)