【Tool】Keras 基礎(chǔ)學(xué)習(xí) III ImageDataGenerator()

圖片讀取ImageDataGenerator()

ImageDataGenerator()是keras.preprocessing.image模塊中的圖片生成器蝇摸,同時也可以在batch中對數(shù)據(jù)進行增強,擴充數(shù)據(jù)集大小律歼,增強模型的泛化能力险毁。比如進行旋轉(zhuǎn)畔况,變形慧库,歸一化等等。

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

參數(shù):

  • featurewise_center: Boolean. 對輸入的圖片每個通道減去每個通道對應(yīng)均值域庇。
  • samplewise_center: Boolan. 每張圖片減去樣本均值, 使得每個樣本均值為0听皿。
  • featurewise_std_normalization(): Boolean()
  • samplewise_std_normalization(): Boolean()
  • zca_epsilon(): Default 12-6
  • zca_whitening: Boolean. 去除樣本之間的相關(guān)性
  • rotation_range(): 旋轉(zhuǎn)范圍
  • width_shift_range(): 水平平移范圍
  • height_shift_range(): 垂直平移范圍
  • shear_range(): float, 透視變換的范圍
  • zoom_range(): 縮放范圍
  • fill_mode: 填充模式, constant, nearest, reflect
  • cval: fill_mode == 'constant'的時候填充值
  • horizontal_flip(): 水平反轉(zhuǎn)
  • vertical_flip(): 垂直翻轉(zhuǎn)
  • preprocessing_function(): user提供的處理函數(shù)
  • data_format(): channels_first或者channels_last
  • validation_split(): 多少數(shù)據(jù)用于驗證集

方法:

  • apply_transform(x, transform_parameters):根據(jù)參數(shù)對x進行變換
  • fit(x, augment=False, rounds=1, seed=None): 將生成器用于數(shù)據(jù)x,從數(shù)據(jù)x中獲得樣本的統(tǒng)計參數(shù), 只有featurewise_center, featurewise_std_normalization或者zca_whitening為True才需要
  • flow(x, y=None, batch_size=32, shuffle=True, sample_weight=None, seed=None, save_to_dir=None, save_prefix='', save_format='png', subset=None) ):按batch_size大小從x,y生成增強數(shù)據(jù)
  • flow_from_directory()從路徑生成增強數(shù)據(jù),和flow方法相比最大的優(yōu)點在于不用一次將所有的數(shù)據(jù)讀入內(nèi)存當(dāng)中,這樣減小內(nèi)存壓力,這樣不會發(fā)生OOM吗冤,血的教訓(xùn)。
  • get_random_transform(img_shape, seed=None): 返回包含隨機圖像變換參數(shù)的字典
  • random_transform(x, seed=None): 進行隨機圖像變換, 通過設(shè)置seed可以達到同步變換覆致。
  • standardize(x): 對x進行歸一化

實例:
mnist分類數(shù)據(jù)增強

 from keras.preprocessing.image import ImageDataGenerator
 from keras.datasets import mnist
 from keras.datasets import cifar10
 from keras.utils import np_utils
 import numpy as np
 import matplotlib.pyplot as plt
 num_classes = 10
 (x_train, y_train), (x_test, y_test) = mnist.load_data()
 x_train = np.expand_dims(x_train, axis = 3)
 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)
 
 data_iter = datagen.flow(x_train, y_train, batch_size=8)
 
while True:
     x_batch, y_batch = data_iter.next()
     for i in range(8):
         print(i//4)
         plt.subplot(2,4,i+1)
         plt.imshow(x_batch[i].reshape(28,28), cmap='gray')
     plt.show()
5FGhke.png

portrait分割數(shù)據(jù)增強,需要對image和mask同步處理:
featurewise結(jié)果:

from keras.preprocessing.image import ImageDataGenerator
from keras.datasets import mnist
from keras.datasets import cifar10
from keras.utils import np_utils
import numpy as np
import matplotlib.pyplot as plt
num_classes = 10
seed = 1
# featurewise需要數(shù)據(jù)集的統(tǒng)計信息儡羔,因此需要先讀入一個x_train汰蜘,用于對增強圖像的均值和方差處理族操。
x_train = np.load('images-224.npy')
imagegen = ImageDataGenerator(
    featurewise_center=True,
    featurewise_std_normalization=True,
    rotation_range=20,
    width_shift_range=0.2,
    height_shift_range=0.2,
    horizontal_flip=True)

maskgen = ImageDataGenerator(
     rescale = 1./255,
     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)
imagegen.fit(x_train)
image_iter = imagegen.flow_from_directory('../data/images',target_size=(224,224), class_mode=None, batch_size=8, seed=seed)
mask_iter = maskgen.flow_from_directory('../data/masks', color_mode='rgb', target_size=(224,224), class_mode=None, batch_size=8, seed=seed)
data_iter = zip(image_iter, mask_iter)
while True:
    for x_batch, y_batch in data_iter:
        for i in range(8):
            print(i//4)
            plt.subplot(2,8,i+1)
            plt.imshow(x_batch[i].reshape(224,224,3))
            plt.subplot(2,8,8+i+1)
            plt.imshow(y_batch[i].reshape(224,224, 3), cmap='gray')
        plt.show()
5FGPpR.png

samplewise結(jié)果:

from keras.preprocessing.image import ImageDataGenerator
from keras.datasets import mnist
from keras.datasets import cifar10
from keras.utils import np_utils
import numpy as np
import matplotlib.pyplot as plt
num_classes = 10
seed = 1
imagegen = ImageDataGenerator(
    samplewise_center=True,
    samplewise_std_normalization=True,
    rotation_range=20,
    width_shift_range=0.2,
    height_shift_range=0.2,
    horizontal_flip=True)
maskgen = ImageDataGenerator(
     rescale = 1./255,
     rotation_range=20,
     width_shift_range=0.2,
     height_shift_range=0.2,
     horizontal_flip=True)
image_iter = imagegen.flow_from_directory('../data/images',target_size=(224,224), class_mode=None, batch_size=8, seed=seed)
mask_iter = maskgen.flow_from_directory('../data/masks', color_mode='rgb', target_size=(224,224), class_mode=None, batch_size=8, seed=seed)
data_iter = zip(image_iter, mask_iter)
while True:
    for x_batch, y_batch in data_iter:
        for i in range(8):
            print(i//4)
            plt.subplot(2,8,i+1)
            plt.imshow(x_batch[i].reshape(224,224,3))
            plt.subplot(2,8,8+i+1)
            plt.imshow(y_batch[i].reshape(224,224, 3), cmap='gray')
        plt.show()

5FGa1r.png

注意:flow_from_directory需要提供的路徑下面需要有子目錄,因此我的目錄形式如下:

data/
...images/
........./images
...masks/
........./masks

只有這樣提供才能保證正確讀取圖片姐赡,沒有子目錄會檢測不到圖片柠掂。
此外正如github上的issue:https://github.com/keras-team/keras/pull/3052/commits/81fb0fa7c332b1b9d2669d68797fda041de17088

for subdir in sorted(os.listdir(directory)):
                if os.path.isdir(os.path.join(directory, subdir)):
                    classes.append(subdir)

flow_from_directory()會從路徑推測label, 在進行映射之前涯贞,會先對路徑進行排序,具體順序是alphanumerically州疾, 也是os.listdir()對子目錄排序的結(jié)果严蓖。這樣你才知道具體來說哪個路徑的類對應(yīng)哪個label氧急。
原圖:


5FGcqY.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末毒姨,一起剝皮案震驚了整個濱河市钉寝,隨后出現(xiàn)的幾起案子闸迷,更是在濱河造成了極大的恐慌腥沽,老刑警劉巖鸠蚪,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邓嘹,死亡現(xiàn)場離奇詭異,居然都是意外死亡矿筝,警方通過查閱死者的電腦和手機窖维,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門铸史,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怯伊,“玉大人,你說我怎么就攤上這事崭篡“娠酰” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵颠毙,是天一觀的道長蛀蜜。 經(jīng)常有香客問我涵防,道長,這世上最難降的妖魔是什么偏瓤? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任厅克,我火速辦了婚禮橙依,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘女责。我一直安慰自己,他們只是感情好抵知,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布刷喜。 她就那樣靜靜地躺著掖疮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浊闪。 梳的紋絲不亂的頭發(fā)上吐葵,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天温峭,我揣著相機與錄音,去河邊找鬼凤藏。 笑死堕伪,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蹄梢。 我是一名探鬼主播禁炒,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼幕袱!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起涯捻,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤障癌,失蹤者是張志新(化名)和其女友劉穎辩尊,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝗拿,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡哀托,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年劳秋,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗽冒。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡添坊,死狀恐怖箫锤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情阳准,我是刑警寧澤馏臭,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站乱灵,受9級特大地震影響七冲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜澜躺,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一耘戚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧收津,春花似錦浊伙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至卧蜓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間榨惠,已是汗流浹背其爵。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工摩渺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留摇幻,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓枉侧,卻偏偏與公主長得像狂芋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子帜矾,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容