#python #tensorflow #keras
Вопрос:
Я пытаюсь выполнить простое увеличение данных для своих данных с помощью ImageDataGenerator. Однако мой генератор выдает мои искаженные изображения из-за параметра масштабирования. Я бы хотел, чтобы случайный масштаб увеличивал только мои данные, а при увеличении применял тот же масштаб по ширине и высоте (чтобы избежать искажения выходных данных изображения).
gen = ImageDataGenerator(featurewise_center=False, featurewise_std_normalization=False,
samplewise_center = True, samplewise_std_normalization=True,
rotation_range=180, width_shift_range=0, height_shift_range=0,
shear_range=0, zoom_range=0.4, fill_mode='reflect',
horizontal_flip=True, rescale=1./255)
На данный момент полученные изображения приведены ниже.
Комментарии:
1. AFAIK, использование увеличения
ImageDataGenerator
дает небольшой контроль, вместо этого используйте пользовательский генератор данных для применения такого увеличения.2. У @M. Innat
ImageDataGenerator
есть аргументpreprocessing_function
, который позволяет вам делать практически все, что угодно3. О, да, я совсем забыл. Спасибо.
4. Вы проверили библиотеку imgaug? проверьте здесь: github.com/aleju/imgaug Это лучше по сравнению с keras IDG с дополнительными преимуществами
Ответ №1:
То, что вы ищете, — это случайное обрезание:
def random_crop(image):
height, width = image.shape[:2]
random_array = numpy.random.random(size=4);
w = int((width*0.5) * (1 random_array[0]*0.5))
h = int((height*0.5) * (1 random_array[1]*0.5))
x = int(random_array[2] * (width-w))
y = int(random_array[3] * (height-h))
image_crop = image[y:h y, x:w x, 0:3]
image_crop = resize(image_crop, image.shape)
return image_crop
# Data generator
datagen = ImageDataGenerator(rotation_range=0.2,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest',
preprocessing_function=random_crop)
Источник здесь.
Комментарии:
1. Большое вам спасибо, вы отлично решили мою проблему!