丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號(hào)安全和更好的產(chǎn)品體驗(yàn),強(qiáng)烈建議使用更快更安全的瀏覽器
此為臨時(shí)鏈接,僅用于文章預(yù)覽,將在時(shí)失效
人工智能開發(fā)者 正文
發(fā)私信給汪思穎
發(fā)送

0

圖片數(shù)據(jù)集太少?看我七十二變,Keras Image Data Augmentation 各參數(shù)詳解

本文作者: 汪思穎 2017-11-19 16:35
導(dǎo)語(yǔ):Keras Image Data Augmentation 各參數(shù)詳解

雷鋒網(wǎng) AI科技評(píng)論按,本文作者Professor ho,該文首發(fā)于知乎專欄Keras花式工具箱,雷鋒網(wǎng) AI科技評(píng)論獲其授權(quán)轉(zhuǎn)載。

圖像深度學(xué)習(xí)任務(wù)中,面對(duì)小數(shù)據(jù)集,我們往往需要利用Image Data Augmentation圖像增廣技術(shù)來(lái)擴(kuò)充我們的數(shù)據(jù)集,而keras的內(nèi)置ImageDataGenerator很好地幫我們實(shí)現(xiàn)圖像增廣。但是面對(duì)ImageDataGenerator中眾多的參數(shù),每個(gè)參數(shù)所得到的效果分別是怎樣的呢?本文針對(duì)Keras中ImageDataGenerator的各項(xiàng)參數(shù)數(shù)值的效果進(jìn)行了詳細(xì)解釋,為各位深度學(xué)習(xí)研究者們提供一個(gè)參考。

我們先來(lái)看看ImageDataGenerator的官方說(shuō)明(https://keras.io/preprocessing/image/):

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

官方提供的參數(shù)解釋因?yàn)樘L(zhǎng)就不貼出來(lái)了,大家可以直接點(diǎn)開上面的鏈接看英文原介紹,我們現(xiàn)在就從每一個(gè)參數(shù)開始看看它會(huì)帶來(lái)何種效果。

我們測(cè)試選用的是kaggle dogs vs cats redux 貓狗大戰(zhàn)的數(shù)據(jù)集,隨機(jī)選取了9張狗狗的照片,這9張均被resize成224×224的尺寸,如圖1:

圖片數(shù)據(jù)集太少?看我七十二變,Keras Image Data Augmentation 各參數(shù)詳解

圖1

1. featurewise

datagen = image.ImageDataGenerator(featurewise_center=True,
   featurewise_std_normalization=True)

featurewise_center的官方解釋:"Set input mean to 0 over the dataset, feature-wise." 大意為使數(shù)據(jù)集去中心化(使得其均值為0),而samplewise_std_normalization的官方解釋是“ Divide inputs by std of the dataset, feature-wise.”,大意為將輸入的每個(gè)樣本除以其自身的標(biāo)準(zhǔn)差。這兩個(gè)參數(shù)都是從數(shù)據(jù)集整體上對(duì)每張圖片進(jìn)行標(biāo)準(zhǔn)化處理,我們看看效果如何:

圖片數(shù)據(jù)集太少?看我七十二變,Keras Image Data Augmentation 各參數(shù)詳解

圖2

與圖1原圖相比,經(jīng)過(guò)處理后的圖片在視覺(jué)上稍微“變暗”了一點(diǎn)。

2. samplewise

datagen = image.ImageDataGenerator(samplewise_center=True,
   samplewise_std_normalization=True)

samplewise_center的官方解釋為:“ Set each sample mean to 0.”,使輸入數(shù)據(jù)的每個(gè)樣本均值為0;samplewise_std_normalization的官方解釋為:“Divide each input by its std.”,將輸入的每個(gè)樣本除以其自身的標(biāo)準(zhǔn)差。這個(gè)月featurewise的處理不同,featurewise是從整個(gè)數(shù)據(jù)集的分布去考慮的,而samplewise只是針對(duì)自身圖片,效果如圖3:

圖片數(shù)據(jù)集太少?看我七十二變,Keras Image Data Augmentation 各參數(shù)詳解

圖3

看來(lái)針對(duì)自身數(shù)據(jù)分布的處理在貓狗大戰(zhàn)數(shù)據(jù)集上沒(méi)有什么意義,或許在mnist這類灰度圖上有用?讀者可以試試。

3. zca_whtening

datagen = image.ImageDataGenerator(zca_whitening=True)

zca白化的作用是針對(duì)圖片進(jìn)行PCA降維操作,減少圖片的冗余信息,保留最重要的特征,細(xì)節(jié)可參看:Whitening transformation--維基百科,Whitening--斯坦福

很抱歉的是,本人使用keras的官方演示代碼,并沒(méi)有復(fù)現(xiàn)出zca_whitening的效果,當(dāng)我的圖片resize成224×224時(shí),代碼報(bào)內(nèi)存錯(cuò)誤,應(yīng)該是在計(jì)算SVD的過(guò)程中數(shù)值太大。后來(lái)resize成28×28,就沒(méi)有內(nèi)存錯(cuò)誤了,但是代碼運(yùn)行了一晚上都不結(jié)束,因此使用貓狗大戰(zhàn)圖片無(wú)法復(fù)現(xiàn)效果,這里轉(zhuǎn)發(fā)另外一個(gè)博客使用mnist復(fù)現(xiàn)出的結(jié)果,如下圖4。針對(duì)mnist的其它DataAugmentation結(jié)果可以看這個(gè)博客:Image Augmentation for Deep Learning With Keras,有修改意見(jiàn)的朋友歡迎留言。

圖片數(shù)據(jù)集太少?看我七十二變,Keras Image Data Augmentation 各參數(shù)詳解

圖4

4. rotation range

datagen = image.ImageDataGenerator(rotation_range=30)

rotation range的作用是用戶指定旋轉(zhuǎn)角度范圍,其參數(shù)只需指定一個(gè)整數(shù)即可,但并不是固定以這個(gè)角度進(jìn)行旋轉(zhuǎn),而是在 [0, 指定角度] 范圍內(nèi)進(jìn)行隨機(jī)角度旋轉(zhuǎn)。效果如圖5:

圖片數(shù)據(jù)集太少?看我七十二變,Keras Image Data Augmentation 各參數(shù)詳解

圖5

5. width_shift_range & height_shift_range

datagen = image.ImageDataGenerator(width_shift_range=0.5,height_shift_range=0.5)

width_shift_range & height_shift_range 分別是水平位置評(píng)議和上下位置平移,其參數(shù)可以是[0, 1]的浮點(diǎn)數(shù),也可以大于1,其最大平移距離為圖片長(zhǎng)或?qū)挼某叽绯艘詤?shù),同樣平移距離并不固定為最大平移距離,平移距離在 [0, 最大平移距離] 區(qū)間內(nèi)。效果如圖6:

圖片數(shù)據(jù)集太少?看我七十二變,Keras Image Data Augmentation 各參數(shù)詳解

圖6

平移圖片的時(shí)候一般會(huì)出現(xiàn)超出原圖范圍的區(qū)域,這部分區(qū)域會(huì)根據(jù)fill_mode的參數(shù)來(lái)補(bǔ)全,具體參數(shù)看下文。當(dāng)參數(shù)設(shè)置過(guò)大時(shí),會(huì)出現(xiàn)圖7的情況,因此盡量不要設(shè)置太大的數(shù)值。

圖片數(shù)據(jù)集太少?看我七十二變,Keras Image Data Augmentation 各參數(shù)詳解

圖7

6. shear_range

datagen = image.ImageDataGenerator(shear_range=0.5)

shear_range就是錯(cuò)切變換,效果就是讓所有點(diǎn)的x坐標(biāo)(或者y坐標(biāo))保持不變,而對(duì)應(yīng)的y坐標(biāo)(或者x坐標(biāo))則按比例發(fā)生平移,且平移的大小和該點(diǎn)到x軸(或y軸)的垂直距離成正比。

如圖8所示,一個(gè)黑色矩形圖案變換為藍(lán)色平行四邊形圖案。狗狗圖片變換效果如圖9所示。

圖片數(shù)據(jù)集太少?看我七十二變,Keras Image Data Augmentation 各參數(shù)詳解

圖8

圖片數(shù)據(jù)集太少?看我七十二變,Keras Image Data Augmentation 各參數(shù)詳解

圖9

7. zoom_range

datagen = image.ImageDataGenerator(zoom_range=0.5)

zoom_range參數(shù)可以讓圖片在長(zhǎng)或?qū)挼姆较蜻M(jìn)行放大,可以理解為某方向的resize,因此這個(gè)參數(shù)可以是一個(gè)數(shù)或者是一個(gè)list。當(dāng)給出一個(gè)數(shù)時(shí),圖片同時(shí)在長(zhǎng)寬兩個(gè)方向進(jìn)行同等程度的放縮操作;當(dāng)給出一個(gè)list時(shí),則代表[width_zoom_range, height_zoom_range],即分別對(duì)長(zhǎng)寬進(jìn)行不同程度的放縮。而參數(shù)大于0小于1時(shí),執(zhí)行的是放大操作,當(dāng)參數(shù)大于1時(shí),執(zhí)行的是縮小操作。

參數(shù)大于0小于1時(shí),效果如圖10:

圖片數(shù)據(jù)集太少?看我七十二變,Keras Image Data Augmentation 各參數(shù)詳解

圖10

參數(shù)等于4時(shí),效果如圖11:

圖片數(shù)據(jù)集太少?看我七十二變,Keras Image Data Augmentation 各參數(shù)詳解

圖11

8. channel_shift_range

datagen = image.ImageDataGenerator(channel_shift_range=10)

channel_shift_range可以理解成改變圖片的顏色,通過(guò)對(duì)顏色通道的數(shù)值偏移,改變圖片的整體的顏色,這意味著是“整張圖”呈現(xiàn)某一種顏色,像是加了一塊有色玻璃在圖片前面一樣,因此它并不能單獨(dú)改變圖片某一元素的顏色,如黑色小狗不能變成白色小狗。當(dāng)數(shù)值為10時(shí),效果如圖12;當(dāng)數(shù)值為100時(shí),效果如圖13,可見(jiàn)當(dāng)數(shù)值越大時(shí),顏色變深的效果越強(qiáng)。

圖片數(shù)據(jù)集太少?看我七十二變,Keras Image Data Augmentation 各參數(shù)詳解

圖12

圖片數(shù)據(jù)集太少?看我七十二變,Keras Image Data Augmentation 各參數(shù)詳解

圖13

9. horizontal_flip & vertical_flip

datagen = image.ImageDataGenerator(horizontal_flip=True)

horizontal_flip的作用是隨機(jī)對(duì)圖片執(zhí)行水平翻轉(zhuǎn)操作,意味著不一定對(duì)所有圖片都會(huì)執(zhí)行水平翻轉(zhuǎn),每次生成均是隨機(jī)選取圖片進(jìn)行翻轉(zhuǎn)。效果如圖14。

圖片數(shù)據(jù)集太少?看我七十二變,Keras Image Data Augmentation 各參數(shù)詳解

圖14

datagen = image.ImageDataGenerator(vertical_flip=True

vertical_flip是作用是對(duì)圖片執(zhí)行上下翻轉(zhuǎn)操作,和horizontal_flip一樣,每次生成均是隨機(jī)選取圖片進(jìn)行翻轉(zhuǎn),效果如圖15。

圖片數(shù)據(jù)集太少?看我七十二變,Keras Image Data Augmentation 各參數(shù)詳解

圖15

當(dāng)然了,在貓狗大戰(zhàn)數(shù)據(jù)集當(dāng)中不適合使用vertical_flip,因?yàn)橐话銢](méi)有倒過(guò)來(lái)的動(dòng)物。

10. rescale

datagen = image.ImageDataGenerator(rescale= 1/255, width_shift_range=0.1)

rescale的作用是對(duì)圖片的每個(gè)像素值均乘上這個(gè)放縮因子,這個(gè)操作在所有其它變換操作之前執(zhí)行,在一些模型當(dāng)中,直接輸入原圖的像素值可能會(huì)落入激活函數(shù)的“死亡區(qū)”,因此設(shè)置放縮因子為1/255,把像素值放縮到0和1之間有利于模型的收斂,避免神經(jīng)元“死亡”。

圖片經(jīng)過(guò)rescale之后,保存到本地的圖片用肉眼看是沒(méi)有任何區(qū)別的,如果我們?cè)趦?nèi)存中直接打印圖片的數(shù)值,可以看到以下結(jié)果:

圖片數(shù)據(jù)集太少?看我七十二變,Keras Image Data Augmentation 各參數(shù)詳解

圖16

可以從圖16看到,圖片像素值都被縮小到0和1之間,但如果打開保存在本地的圖片,其數(shù)值依然不變,如圖17。

圖片數(shù)據(jù)集太少?看我七十二變,Keras Image Data Augmentation 各參數(shù)詳解

圖17

應(yīng)該是在保存到本地的時(shí)候,keras把圖像像素值恢復(fù)為原來(lái)的尺度了,在內(nèi)存中查看則不會(huì)。

11. fill_mode

datagen = image.ImageDataGenerator(fill_mode='wrap', zoom_range=[4, 4])

fill_mode為填充模式,如前面提到,當(dāng)對(duì)圖片進(jìn)行平移、放縮、錯(cuò)切等操作時(shí),圖片中會(huì)出現(xiàn)一些缺失的地方,那這些缺失的地方該用什么方式補(bǔ)全呢?就由fill_mode中的參數(shù)確定,包括:“constant”、“nearest”(默認(rèn))、“reflect”和“wrap”。這四種填充方式的效果對(duì)比如圖18所示,從左到右,從上到下分別為:“reflect”、“wrap”、“nearest”、“constant”。

圖片數(shù)據(jù)集太少?看我七十二變,Keras Image Data Augmentation 各參數(shù)詳解

圖18

當(dāng)設(shè)置為“constant”時(shí),還有一個(gè)可選參數(shù),cval,代表使用某個(gè)固定數(shù)值的顏色來(lái)進(jìn)行填充。圖19為cval=100時(shí)的效果,可以與圖18右下角的無(wú)cval參數(shù)的圖對(duì)比。

圖片數(shù)據(jù)集太少?看我七十二變,Keras Image Data Augmentation 各參數(shù)詳解

圖19

自己動(dòng)手來(lái)測(cè)試?

這里給出一段小小的代碼,作為進(jìn)行這些參數(shù)調(diào)試時(shí)的代碼,你也可以使用jupyter notebook來(lái)試驗(yàn)這些參數(shù),把圖片結(jié)果打印到你的網(wǎng)頁(yè)上。

%matplotlib inline
import matplotlib.pyplot as plt
from PIL import Image
from keras.preprocessing import image
import glob

# 設(shè)置生成器參數(shù)
datagen = image.ImageDataGenerator(fill_mode='wrap', zoom_range=[4, 4])

gen_data = datagen.flow_from_directory(PATH,
                                      batch_size=1,
                                      shuffle=False,
                                      save_to_dir=SAVE_PATH,
                                      save_prefix='gen',
      target_size=(224, 224))

# 生成9張圖
for i in range(9):
   gen_data.next()


# 找到本地生成圖,把9張圖打印到同一張figure上
name_list = glob.glob(gen_path+'16/*')
fig = plt.figure()
for i in range(9):
   img = Image.open(name_list[i])
   sub_img = fig.add_subplot(331 + i)
   sub_img.imshow(img)
plt.show()

結(jié)語(yǔ)

面對(duì)小數(shù)據(jù)集時(shí),使用DataAugmentation擴(kuò)充你的數(shù)據(jù)集就變得非常重要,但在使用DataAugmentation之前,先要了解你的數(shù)據(jù)集需不需要這類圖片,如貓狗大戰(zhàn)數(shù)據(jù)集不需要上下翻轉(zhuǎn)的圖片,以及思考一下變換的程度是不是合理的,例如把目標(biāo)水平偏移到圖像外面就是不合理的。多試幾次效果,再最終確定使用哪些參數(shù)。上面所有內(nèi)容已經(jīng)公布在我的github(https://github.com/JustinhoCHN/keras-image-data-augmentation)上面,附上了實(shí)驗(yàn)時(shí)的jupyter notebook文件,大家可以玩一玩,have fun!

雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知。

圖片數(shù)據(jù)集太少?看我七十二變,Keras Image Data Augmentation 各參數(shù)詳解

分享:
相關(guān)文章

編輯

關(guān)注AI學(xué)術(shù),例如論文
當(dāng)月熱門文章
最新文章
請(qǐng)?zhí)顚懮暾?qǐng)人資料
姓名
電話
郵箱
微信號(hào)
作品鏈接
個(gè)人簡(jiǎn)介
為了您的賬戶安全,請(qǐng)驗(yàn)證郵箱
您的郵箱還未驗(yàn)證,完成可獲20積分喲!
請(qǐng)驗(yàn)證您的郵箱
立即驗(yàn)證
完善賬號(hào)信息
您的賬號(hào)已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
立即設(shè)置 以后再說(shuō)