Я создал новый класс для некоторого пользовательского дополнения данных, и я пытаюсь увидеть, как это влияет на мои изображения из набора данных, поэтому после создания генератора я использую метод 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.