Как сохранить изображения с измененным размером с помощью ImageDataGenerator и flow_from_directory в керасе

Я изменяю размеры моих RGB-изображений, хранящихся в папке (два класса), используя следующий код:

from keras.preprocessing.image import ImageDataGenerator
dataset=ImageDataGenerator()
dataset.flow_from_directory('/home/1',target_size=(50,50),save_to_dir='/home/resized',class_mode='binary',save_prefix='N',save_format='jpeg',batch_size=10)

Мое дерево данных выглядит следующим образом:

1/
 1_1/
     img1.jpg
     img2.jpg
     ........
 1_2/
     IMG1.jpg
     IMG2.jpg
     ........
resized/
        1_1/ (here i want to save resized images of 1_1)
        2_2/ (here i want to save resized images of 1_2)

После запуска кода я получаю следующий вывод, но не изображения:

Found 271 images belonging to 2 classes.
Out[12]: <keras.preprocessing.image.DirectoryIterator at 0x7f22a3569400>

Как сохранить изображения?

6 ответов

Вот очень простая версия сохранения дополненных изображений одного изображения, где вы хотите:

Шаг 1. Инициализируйте генератор данных изображения

Здесь мы выясняем, какие изменения мы хотим внести в исходное изображение, и генерируем дополненные изображения.
Вы можете прочитать о различных эффектах здесь - https://keras.io/preprocessing/image/

datagen = ImageDataGenerator(rotation_range=10, width_shift_range=0.1, 
height_shift_range=0.1,shear_range=0.15, 
zoom_range=0.1,channel_shift_range = 10, horizontal_flip=True)

Шаг 2: Здесь мы выбираем исходное изображение, чтобы выполнить увеличение на

читать на картинке

image_path = 'C:/Users/Darshil/gitly/Deep-Learning/My 
Projects/CNN_Keras/test_augment/caty.jpg'

image = np.expand_dims(ndimage.imread(image_path), 0)

Шаг 3: выберите, куда вы хотите сохранить дополненные изображения

save_here = 'C:/Users/Darshil/gitly/Deep-Learning/My 
Projects/CNN_Keras/test_augment'

Шаг 4. Подходим к исходному изображению

datagen.fit(image)

Шаг 5: переберите изображения и сохраните их, используя параметр "save_to_dir"

for x, val in zip(datagen.flow(image,                    #image we chose
        save_to_dir=save_here,     #this is where we figure out where to save
         save_prefix='aug',        # it will save the images as 'aug_0912' some number for every new augmented image
        save_format='png'),range(10)) :     # here we define a range because we want 10 augmented images otherwise it will keep looping forever I think
pass

Это всего лишь объявление, вы должны использовать этот генератор, например, .next()

from keras.preprocessing.image import ImageDataGenerator
dataset=ImageDataGenerator()
image = dataset.flow_from_directory('/home/1',target_size=(50,50),save_to_dir='/home/resized',class_mode='binary',save_prefix='N',save_format='jpeg',batch_size=10)
image.next()

тогда вы увидите изображения в /home/resized

flow_from_directory Метод дает вам "итератор", как описано в вашем выводе. Итератор ничего не делает сам по себе. Он ожидает повторения, и только тогда фактические данные будут прочитаны и сгенерированы.

Итератор в Keras для подгонки должен использоваться следующим образом:

generator = dataset.flow_from_directory('/home/1',target_size=(50,50),save_to_dir='/home/resized',class_mode='binary',save_prefix='N',save_format='jpeg',batch_size=10)

for inputs,outputs in generator:

    #do things with each batch of inputs and ouptus

Обычно вместо того, чтобы выполнять цикл выше, вы просто передаете генератор fit_generator метод. Нет реальной необходимости делать цикл for:

model.fit_generator(generator, ......)

Keras будет сохранять изображения только после их загрузки и дополнения путем итерации по генератору.

Вы можете попробовать этот простой пример кода и изменить его в соответствии с вашими потребностями:

(Он генерирует расширенные изображения из ваших данных, а затем сохраняет их в другой папке)

      from keras.preprocessing.image import ImageDataGenerator


data_dir = 'data/train'
save_dir = 'data/Aug'


datagen = ImageDataGenerator(rescale=1./255)


Augmented = datagen.flow_from_directory(data_dir, target_size=(224, 224),
                                save_to_dir=save_dir,
                                color_mode="rgb",
                                class_mode='categorical',
                                shuffle=True,
                                save_prefix='N',
                                save_format='jpg',
                                batch_size=10)


for inputs, outputs in Augmented:
    Augmented.next()

Если вы хотите сохранить изображения в папке с тем же именем, что и метка, вы можете перебрать список меток и вызвать код дополнения в цикле.

from tensorflow.keras.preprocessing.image import ImageDataGenerator  

# Augmentation + save augmented images under augmented folder

IMAGE_SIZE = 224
BATCH_SIZE = 500
LABELS = ['lbl_a','lbl_b','lbl_c']

for label in LABELS:
  datagen_kwargs = dict(rescale=1./255)  
  dataflow_kwargs = dict(target_size=(IMAGE_SIZE, IMAGE_SIZE), 
                        batch_size=BATCH_SIZE, interpolation="bilinear")

  train_datagen = tf.keras.preprocessing.image.ImageDataGenerator(
    rotation_range=40,
    horizontal_flip=True,
    width_shift_range=0.1, height_shift_range=0.1,
    shear_range=0.1, zoom_range=0.1,
    **datagen_kwargs)

  train_generator = train_datagen.flow_from_directory(
      'original_images', subset="training", shuffle=True, save_to_dir='aug_images/'+label, save_prefix='aug', classes=[label], **dataflow_kwargs)
  
  # Following line triggers execution of train_generator
  batch = next(train_generator) 

Так зачем это делать, если генератор можно напрямую передать модели? В случае, если вы хотите использовать tflite-model-maker который не принимает генератор и принимает помеченные данные в папке для каждой метки:

from tflite_model_maker import ImageClassifierDataLoader
data = ImageClassifierDataLoader.from_folder('aug_images')

Результат

aug_images
| 
|__ lbl_a
|   |
|   |_____aug_img_a.png
|
|__ lbl_b
|   |
|   |_____aug_img_b.png
| 
|__ lbl_c
|   |
|   |_____aug_img_c.png

Примечание. Убедитесь, что папки уже существуют.

      datagen = ImageDataGenerator(preprocessing_function=preprocess_input,
                     rotation_range =15, 
                     width_shift_range = 0.2, 
                     height_shift_range = 0.2, 
                     shear_range=0.2, 
                     zoom_range=0.2, 
                     horizontal_flip = True, 
                     fill_mode = 'nearest', 
                     brightness_range=[0.5, 1.5])

DATA_DIR = 'splited/train/' save_here = 'aug dataset/train/normal2/'

cancer = os.listdir(DATA_DIR + 'cancer/') for i, image_name in enumerate(cancer): try: if (image_name.split('.')[1] == 'png'): image = np.expand_dims(cv2.imread(DATA_DIR +'classs 1/' + image_name), 0) for x, val in zip(datagen.flow(image, #image we chose save_to_dir=save_here, #this is where we figure out where to save save_prefix='aug', # it will save the images as 'aug_0912' some number for every new augmented image save_format='png'),range(10)) : # here we define a range because we want 10 augmented images otherwise it will keep looping forever I think pass except Exception: print("Could not read image {} with name {}".format(i, image_name))

Другие вопросы по тегам