Keras-圖片預處理

圖片預處理

圖片生成器ImageDataGenerator

keras.preprocessing.image.ImageDataGenerator(featurewise_center=False,
    samplewise_center=False,
    featurewise_std_normalization=False,
    samplewise_std_normalization=False,
    zca_whitening=False,
    zca_epsilon=1e-6,
    rotation_range=0.,
    width_shift_range=0.,
    height_shift_range=0.,
    shear_range=0.,
    zoom_range=0.,
    channel_shift_range=0.,
    fill_mode='nearest',
    cval=0.,
    horizontal_flip=False,
    vertical_flip=False,
    rescale=None,
    preprocessing_function=None,
    data_format=K.image_data_format())

用以生成一個batch的圖像數據,支持實時數據提高。訓練時該函數無限生成數據,知道達到規定的epoch次數爲止。git

參數

  • featurewise_center:布爾值,使輸入數據集去中心化(均值爲0)按feature執行
  • samplewise_center:布爾值,使輸入數據的每一個樣本均值爲0
  • featurewise_std_normalization:布爾值,將輸入除以數據集的標準差以完成標準化,按feature執行
  • samplewise_std_normalization:布爾值,將輸入的每一個樣本除以其自身的標準差
  • zca_whitening:布爾值,對輸入數據施加ZCA白化
  • zca_epsilon:ZCA使用的eposilon,默認是1e-6
  • rotation_range:整數,數據加強時圖片隨機轉動的角度
  • width_shift_range:浮點數,圖片寬度的某個比例,數據加強時圖片水平偏移的幅度
  • height_shift_range:浮點數,圖片高度的某個比例,數據提高時圖片豎直偏移的幅度
  • shear_range:浮點數,剪切強度(逆時針方向的剪切變換角度)
  • zoom_range:浮點數或形如[lower,upper]的列表,隨機縮放的幅度,若爲浮點數,則至關於[lower,upper] = [ 1 - zoom_range, 1 + zoom_range ]
  • channel_shift_range:浮點數,隨機通道偏移的幅度
  • fill_mode:'constant','nearest','reflect','wrap'之一,當進行變換時超出邊界的點將根據本參數給定的方法進行處理
  • cval:浮點數或整數,當fill_model=constant時,指定要向超出邊界的點填充的值
  • horizontal_flip:布爾值,進行隨機水平翻轉
  • vertical_flip:布爾值,進行隨機豎值翻轉
  • rescale:重放縮因子,默認爲None,若是爲None或0則不進行放縮,不然會將該數值乘到數據上(在應用其餘變換以前)
  • preprocessing_function:將被應用於每一個輸入的函數。該函數將在任何其餘修改以前運行。該函數接受一個參數,爲一張圖片(秩爲3的numpy array),而且輸出一個具備相同shape的numpy array
  • data_format:字符串,「channel_first」或「channel_last」之一,表明圖像的通道維的位置。該參數是Keras 1.x中的image_dim_ordering,「channel_last」對應本來的「tf」,「channel_first」對應本來的「th」。以128x128的RGB圖像爲例,「channel_first」應將數據組織爲(3,128,128),而「channel_last」應將數據組織爲(128,128,3)。該參數的默認值是~/.keras/keras.json中設置的值,若從未設置過,則爲「channel_last」

方法

  • fit(x, augment=False, rounds=1):計算依賴於數據的變換所須要的統計信息(均值方差等),只有使用featurewise_centerfeaturewise_std_normalizationzca_whitening時須要此函數。
    • X:numpy array,樣本數據,秩應爲4.在黑白圖像的狀況下channel軸的值爲1,在彩色圖像狀況下值爲3github

    • augment:布爾值,肯定是否使用隨即提高過的數據json

    • round:若設augment=True,肯定要在數據上進行多少輪數據提高,默認值爲1數組

    • seed: 整數,隨機數種子app

  • flow(self, X, y, batch_size=32, shuffle=True, seed=None, save_to_dir=None, save_prefix='', save_format='png'):接收numpy數組和標籤爲參數,生成通過數據提高或標準化後的batch數據,並在一個無限循環中不斷的返回batch數據
    • x:樣本數據,秩應爲4.在黑白圖像的狀況下channel軸的值爲1,在彩色圖像狀況下值爲3ide

    • y:標籤函數

    • batch_size:整數,默認32oop

    • shuffle:布爾值,是否隨機打亂數據,默認爲Trueui

    • save_to_dir:None或字符串,該參數能讓你將提高後的圖片保存起來,用以可視化編碼

    • save_prefix:字符串,保存提高後圖片時使用的前綴, 僅當設置了save_to_dir時生效

    • save_format:"png"或"jpeg"之一,指定保存圖片的數據格式,默認"jpeg"

    • yields:形如(x,y)的tuple,x是表明圖像數據的numpy數組.y是表明標籤的numpy數組.該迭代器無限循環.

    • seed: 整數,隨機數種子

  • flow_from_directory(directory): 以文件夾路徑爲參數,生成通過數據提高/歸一化後的數據,在一個無限循環中無限產生batch數據
    • directory: 目標文件夾路徑,對於每個類,該文件夾都要包含一個子文件夾.子文件夾中任何JPG、PNG、BNP、PPM的圖片都會被生成器使用.詳情請查看此腳本
    • target_size: 整數tuple,默認爲(256, 256). 圖像將被resize成該尺寸
    • color_mode: 顏色模式,爲"grayscale","rgb"之一,默認爲"rgb".表明這些圖片是否會被轉換爲單通道或三通道的圖片.
    • classes: 可選參數,爲子文件夾的列表,如['dogs','cats']默認爲None. 若未提供,則該類別列表將從directory下的子文件夾名稱/結構自動推斷。每個子文件夾都會被認爲是一個新的類。(類別的順序將按照字母表順序映射到標籤值)。經過屬性class_indices可得到文件夾名與類的序號的對應字典。
    • class_mode: "categorical", "binary", "sparse"或None之一. 默認爲"categorical. 該參數決定了返回的標籤數組的形式, "categorical"會返回2D的one-hot編碼標籤,"binary"返回1D的二值標籤."sparse"返回1D的整數標籤,若是爲None則不返回任何標籤, 生成器將僅僅生成batch數據, 這種狀況在使用model.predict_generator()model.evaluate_generator()等函數時會用到.
    • batch_size: batch數據的大小,默認32
    • shuffle: 是否打亂數據,默認爲True
    • seed: 可選參數,打亂數據和進行變換時的隨機數種子
    • save_to_dir: None或字符串,該參數能讓你將提高後的圖片保存起來,用以可視化
    • save_prefix:字符串,保存提高後圖片時使用的前綴, 僅當設置了save_to_dir時生效
    • save_format:"png"或"jpeg"之一,指定保存圖片的數據格式,默認"jpeg"
    • flollow_links: 是否訪問子文件夾中的軟連接

例子

使用.flow()的例子

(x_train, y_train), (x_test, y_test) = cifar10.load_data()
y_train = np_utils.to_categorical(y_train, num_classes)
y_test = np_utils.to_categorical(y_test, num_classes)

datagen = ImageDataGenerator(
    featurewise_center=True,
    featurewise_std_normalization=True,
    rotation_range=20,
    width_shift_range=0.2,
    height_shift_range=0.2,
    horizontal_flip=True)

# compute quantities required for featurewise normalization
# (std, mean, and principal components if ZCA whitening is applied)
datagen.fit(x_train)

# fits the model on batches with real-time data augmentation:
model.fit_generator(datagen.flow(x_train, y_train, batch_size=32),
                    steps_per_epoch=len(x_train), epochs=epochs)

# here's a more "manual" example
for e in range(epochs):
    print 'Epoch', e
    batches = 0
    for x_batch, y_batch in datagen.flow(x_train, y_train, batch_size=32):
        loss = model.train(x_batch, y_batch)
        batches += 1
        if batches >= len(x_train) / 32:
            # we need to break the loop by hand because
            # the generator loops indefinitely
            break

 

使用.flow_from_directory(directory)的例子

train_datagen = ImageDataGenerator(
        rescale=1./255,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True)

test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
        'data/train',
        target_size=(150, 150),
        batch_size=32,
        class_mode='binary')

validation_generator = test_datagen.flow_from_directory(
        'data/validation',
        target_size=(150, 150),
        batch_size=32,
        class_mode='binary')

model.fit_generator(
        train_generator,
        steps_per_epoch=2000,
        epochs=50,
        validation_data=validation_generator,
        validation_steps=800)

同時變換圖像和mask

# we create two instances with the same arguments
data_gen_args = dict(featurewise_center=True,
                     featurewise_std_normalization=True,
                     rotation_range=90.,
                     width_shift_range=0.1,
                     height_shift_range=0.1,
                     zoom_range=0.2)
image_datagen = ImageDataGenerator(**data_gen_args)
mask_datagen = ImageDataGenerator(**data_gen_args)

# Provide the same seed and keyword arguments to the fit and flow methods
seed = 1
image_datagen.fit(images, augment=True, seed=seed)
mask_datagen.fit(masks, augment=True, seed=seed)

image_generator = image_datagen.flow_from_directory(
    'data/images',
    class_mode=None,
    seed=seed)

mask_generator = mask_datagen.flow_from_directory(
    'data/masks',
    class_mode=None,
    seed=seed)

# combine generators into one which yields image and masks
train_generator = zip(image_generator, mask_generator)

model.fit_generator(
    train_generator,
    steps_per_epoch=2000,
    epochs=50)
相關文章
相關標籤/搜索