对于keras的图片生成器ImageDataGenerator对image和mask的同时数据生成

一 单张图片+flow函数

###图片来源形式

"""
E:/tmp/0010.jpg
E:/tmp/0010.png
"""
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img

datagen = ImageDataGenerator(
        rotation_range=40,
        width_shift_range=0.2,
        height_shift_range=0.2,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True,
        fill_mode='nearest')

img_x = load_img('E:/tmp/0010.jpg')  # this is a PIL image
x = img_to_array(img_x)  # this is a Numpy array with shape (267, 400, 3)
x1 = x.reshape((1,) + x.shape)  # this is a Numpy array with shape (1, 267, 400, 3)

img_y = load_img('E:/tmp/0010.png')  # this is a PIL image
y = img_to_array(img_y)  # this is a Numpy array with shape (267, 400, 3)
y1 = y.reshape((1,) + y.shape)  # this is a Numpy array with shape (1, 267, 400, 3)

# the .flow() command below generates batches of randomly transformed images
# and saves the results to the `preview/` directory

seed = 1
i = 0
for batch in datagen.flow(x1, batch_size=1,seed=seed,
                          save_to_dir='E:/tmp/augment', save_format='jpg'):
    i += 1
    if i > 20:
        break  # otherwise the generator would loop indefinitely
        
i = 0
for batch in datagen.flow(y1, batch_size=1,seed=seed,
                          save_to_dir='E:/tmp/augment', save_format='png'):
    i += 1
    if i > 20:

        break  

 
  
  

二  多张图片+flow函数

###图片来源形式应该为

"""
E:/tmp/augment1/image/1.jpg   # flow_from_directory(directory='E:/tmp/augment1',
                     /2.jpg
                     /3.jpg
                     ...
                     /n.jpg
E:/tmp/augment3/mask/1.png    # flow_from_directory(directory='E:/tmp/augment3',
                    /2.png
                    /3.png
                    ...
                    /n.png
"""
### import module
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
import numpy as np
import os
from skimage import io, transform  # python的Image和skimage处理图片

### path
data_path = 'E:/tmp/augment1/image/'
label_path = 'E:/tmp/augment3/mask/'

### parameters
w = 224
h = 224
c = 3

### read the data 
def read_img(path):
    imgs = []
    for filename in os.listdir(path):
    #     print(filename)
        img = io.imread(path + filename)  
        x = transform.resize(img, (w, h, c))   # this is a Numpy array with shape (w, h, 3))
        imgs.append(x)    # this is a Numpy array with shape (images_number, w, h, 3)
    return np.asarray(imgs, np.float32)     

data = read_img(data_path)
label = read_img(label_path)

### ImageDataGenerator
datagen = ImageDataGenerator(
        rotation_range=40,
        width_shift_range=0.2,
        height_shift_range=0.2,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True,
        fill_mode='nearest')

seed = 1
i = 0
for batch in datagen.flow(data, batch_size=1,seed=seed,
                          save_to_dir='E:/tmp/augment', save_format='jpg'):
    i += 1
    if i > 20:
        break  
        
i = 0
for batch in datagen.flow(label, batch_size=1,seed=seed,
                          save_to_dir='E:/tmp/augment', save_format='png'):
    i += 1
    if i > 20:
        break  

三 单张image和单张mask


### error

""" Found 0 images belonging to 0 classes.
current_index = (self.batch_index * self.batch_size) % self.n
ZeroDivisionError: integer division or modulo by zero
"""
### error_reason
"""
E:/tmp/augment2/0010.jpg
'E:/tmp/augment1'文件夹下直接是图片,不可以。
"""
### modify_error
"""
flow_from_directory(dire)
dire文件夹下必须有子文件夹才行,子文件夹下再放图片
E:/tmp/augment2/0010.jpg   >>>  E:/tmp/augment2/train/0010.jpg
"""
###error_modified_succeeded
"""Found 1 images belonging to 1 classes."""
###图片来源形式应该为
"""
E:/tmp/augment1/image/i.jpg   # flow_from_directory(directory='E:/tmp/augment1',
        
E:/tmp/augment3/mask/i.png    # flow_from_directory(directory='E:/tmp/augment3',
"""
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img

train_datagen = ImageDataGenerator(
        rescale=1./255,
        rotation_range=40,
        width_shift_range=0.2,
        height_shift_range=0.2,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True,
        fill_mode='nearest')
seed= 1

train_images_generator = train_datagen.flow_from_directory(
        'E:/tmp/augment1',
        target_size=(224, 224),
        batch_size=1,
        color_mode="rgb",
        class_mode=None,
        save_to_dir='E:/tmp/augment2', 
        save_format='jpg',
        seed=seed)
train_masks_generator = train_datagen.flow_from_directory(
        'E:/tmp/augment3',
        target_size=(224, 224),
        batch_size=1,
        color_mode="grayscale",
        class_mode=None,
        save_to_dir='E:/tmp/augment2', 
        save_format='png',
        seed=seed)

i = 0
for batch in train_images_generator:
    i += 1
    if i > 20:
        break  # otherwise the generator would loop indefinitely
# result: 20 images, 与 batch_size=1选项无关。
             
i = 0
for batch in train_masks_generator:
    i += 1
    if i > 20:
        break  # otherwise the generator would loop indefinitely        


四 多张images和多张masks

###图片来源形式应该为
"""
E:/tmp/augment1/image/1.jpg   # flow_from_directory(directory='E:/tmp/augment1',
                     /2.jpg
                     /3.jpg
                     ...
                     /n.jpg
E:/tmp/augment3/mask/1.png    # flow_from_directory(directory='E:/tmp/augment3',
                    /2.png
                    /3.png
                    ...
                    /n.png
"""
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img


train_datagen = ImageDataGenerator(
        rescale=1./255,
        rotation_range=10,
        width_shift_range=0.1,
        height_shift_range=0.1,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True,
        vertical_flip=True,
        fill_mode='nearest')
seed = 1

train_images_generator = train_datagen.flow_from_directory(
        'E:/tmp/augment1',
        target_size=(224, 224),
        batch_size=1,
        color_mode="rgb",
        class_mode=None,
        save_to_dir='E:/tmp/augment4', 
        save_format='jpg',
        seed=seed,
        shuffle=True)
train_masks_generator = train_datagen.flow_from_directory(
        'E:/tmp/augment3',
        target_size=(224, 224),
        batch_size=1,
        color_mode="grayscale",
        class_mode=None,
        save_to_dir='E:/tmp/augment5', 
        save_format='png',
        seed=seed,
        shuffle=True)

i = 0
for batch in train_images_generator:
    i += 1    
    if i > 20:
        break  # otherwise the generator would loop indefinitely
    if i == 1:
        print(batch.shape)  # this is a Numpy array with shape (1, 224, 224, 3)
        
i = 0
for batch in train_masks_generator:
    i += 1
    if i > 20:
        break  # otherwise the generator would loop indefinitely 
    if i == 1:
        print(batch.shape)  # this is a Numpy array with shape (1, 224, 224, 1)
### result: 20 images,
"""与 batch_size=1选项无关。
与'E:/tmp/augment3'的文件夹flower下的图片数无关。新生成的图片数量只与i有关,文件夹下数目为n,
1)i=10,n=5;则10/5=2,每张图片变形新生成两张;总生成10张图片
2)i=10,n=15;则10/15,随机10张图片变形新生成1张;总生成10张图片
"""


 
 
 

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值