如何在keras中使用ImageDataGenerator和flow_从_目录保存调整大小的图像

如何在keras中使用ImageDataGenerator和flow_从_目录保存调整大小的图像,keras,keras-2,Keras,Keras 2,我正在使用以下代码调整存储在文件夹(两个类)中的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_for

我正在使用以下代码调整存储在文件夹(两个类)中的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>
找到了271张属于2类的图像。
出[12]:

如何保存图像?

如输出中所述,
flow\u from\u 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\u生成器
方法即可。实际上不需要执行for循环:

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

Keras只会在加载图像并通过在生成器上迭代进行增强后保存图像

这里有一个非常简单的版本,可以在任何地方保存一张图像的增强图像:

第一步。初始化图像数据生成器 在这里,我们将确定要对原始图像进行哪些更改,并生成增强图像
您可以在此处阅读有关差异效应的信息-

步骤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:选择要保存增强图像的位置 第四步。我们符合原始图像 步骤5:迭代图像并使用“save_to_dir”参数保存
这只是一个声明,您必须使用该生成器,例如,
.next()


然后,您将在
/home/resized

中看到图像。如果您希望将图像保存在与标签同名的文件夹下,则可以在标签列表上循环,并在循环中调用增强代码

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])

您可以尝试此简单的代码示例,并根据需要进行修改:

(它从您的数据生成增强图像,然后将其保存到其他文件夹中)


请告诉我保存图像需要添加哪些行。还有一件事,如果我们不保存图像,那么keras在哪里保存和处理它。keras是否使用ram?只需使用发电机进行循环或训练即可。Keras将使用RAM,不管它是否保存图像。我不想训练。只想保存图像,我通过
save_to_dir='/home/resized'
to keras指示了这一点。我确实理解for循环for迭代器,但我不理解我在for循环之后写了什么,我通过
数据集给出了所有指令。当我写
I=1
循环无限运行时,从\u目录中流出\u,我手动停止get,并获取100个og图像。我不能理解输出,我忘了那部分。。。。keras生成器确实是无限的。他们将无限期地重复自己。您必须自己定义循环的结束。
range(10)
有点混乱。相反,可以使用
batch\u size=图像总数
。可以使用
中断
而不是
通过

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()
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) 
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))
from keras.preprocessing.image import ImageDataGenerator


data_dir = 'data/train' #Due to the structure of ImageDataGenerator, you need to have another folder under train contains your data, for example: data/train/faces
save_dir = 'data/resized'


datagen = ImageDataGenerator(rescale=1./255)


resized = datagen.flow_from_directory(data_dir, target_size=(224, 224),
                                save_to_dir=save_dir,
                                color_mode="rgb", # Choose color mode
                                class_mode='categorical',
                                shuffle=True,
                                save_prefix='N',
                                save_format='jpg', # Formate
                                batch_size=1)


for in in range(len(resized)):
    resized.next()