Функция предварительной обработки Keras из ImageDataGenerator вызывается во время потока, но не влияет на изображения - PullRequest
0 голосов
/ 18 марта 2019

Я создал новый класс для некоторого пользовательского дополнения данных, и я пытаюсь увидеть, как это влияет на мои изображения из набора данных, поэтому после создания генератора я использую метод flow для получения дополненных изображений,Проблема в том, что пользовательская обработка, которую я определил в новом классе, похоже, не влияет на мои изображения во время flow.Однако если я сохраню изображения при вызове класса, мои изображения будут изменены.

Я что-то упускаю из-за того, как используется параметр preprocessing_function?Или что-то не так?

Я пытался использовать простую функцию вместо класса, но безуспешно.Я знаю, что есть другие методы для реализации пользовательского дополнения данных, такие как изменение image.py от keras, но они кажутся хаком.Я надеюсь, что вы можете мне помочь.

Это новый класс для пользовательского увеличения данных.

import imutils
import numpy as np
import cv2


class CustomDataAugmentation(object):
    def __init__(self,
             contrast_range=None,
             brightness_range=None,
             fixed_rotation=None):

        if brightness_range is not None:
            if len(brightness_range) != 2:
                raise ValueError(
                   '`brightness_range should be tuple or list of two floats. '
                    'Received: %s' % (brightness_range,))
        if contrast_range is not None:
            if len(contrast_range) != 2:
                raise ValueError(
                '`contrast_range should be tuple or list of two floats. '
                'Received: %s' % (contrast_range,))

        self.contrast_range = contrast_range
        self.brightness_range = brightness_range
        self.fixed_rotation = fixed_rotation

    def __call__(self, x):

        if self.brightness_range:
            b = np.random.choice(np.arange(self.brightness_range[0], self.brightness_range[1]), 1)
            x = imutils.adjust_brightness_contrast(x, brightness=b)

        c = None
        if self.contrast_range:
            c = np.random.choice(np.arange(self.contrast_range[0], self.contrast_range[1]), 1)
            print("Constrast", c)
            x = imutils.adjust_brightness_contrast(x, contrast=c)

        if self.fixed_rotation:
            if isinstance(self.fixed_rotation, list):
                angle = np.random.choice(self.fixed_rotation, 1)
            else:
                angle = self.fixed_rotation

            x = imutils.rotate(x, angle=angle)
        # images are changed
        cv2.imwrite("C://Users//andre//Desktop//" + "{}.jpg".format(c), x)

        return x

И вот как я генерирую дополненные изображения

custom_data_aug = CustomDataAugmentation(contrast_range=(0, 50),
                                         # brightness_range=(0, 50),
                                         # fixed_rotation=180
                                        )

aug = ImageDataGenerator(preprocessing_function=custom_data_aug)

img = cv2.imread(img_name)
x = img_to_array(img)
x = x.reshape((1,) + x.shape)

if not os.path.exists(preview_folder):
    os.makedirs(preview_folder)

i = 0
# images are not changed
for batch in aug.flow(x, batch_size=1,
                      save_to_dir=preview_folder, save_prefix='scan', save_format='jpg',):
    i += 1
    print(i)
    if i > 20:
        break

Iесть Keras 2.2.4 и Tensorflow 1.10.0 на Windows 10.

...