深度學習訓練中關於資料處理方式--原始樣本採集以及資料增廣
好久沒有寫部落格,一直想重新調整自己的部落格,想盡可能寫的前後連貫一點,同時希望自己寫的更通熟易懂些,可是遲遲沒有動筆修改曾經的博文,哎,還是慢慢跟著自己的理解再修改之前的文章吧,今兒就寫寫關於深度學習訓練中最關鍵的一步,資料問題,也就是樣本庫的建立!來記錄一下自己的心得以及思考!
緒言
為啥要寫資料,又說資料是深度學習中最關鍵的一步呢?演算法是重要,但是呢,真正實際工程中,業務需求 > 資料 > 演算法!根據業務需求來選擇適合的資料,我們對資料的處理也是來源業務的需求!而資料選擇何種增廣方式也需要根據實際做的專案來確定的,舉個例子!比如:做車型識別,大家可以想象到,車型識別是幹嘛的?嗯,“型”是什麼?就是形狀有所差別吧!很多人可能已經想到了,對,處理資料是,我們就先從幾何形狀來增廣資料!那麼如果是車身顏色呢?又有小夥伴會想到是不是先從顏色來入手來增廣資料呢?對了嘛,就是的呢!不過,你不能排除其他的影響,你可以先從你可以想到的角度入手,也要測試一下其他的變化方式!比如說,車型對形狀敏感,做完形狀之後,你來改變一下亮度或者對比度的變化等等!
本文程式碼實現是用的Matlab!
一, 原始樣本的採集製作
訓練的第一步就是採集資料製作樣本!這個我覺得還是挺關鍵的,我看了很多視訊課以及一些部落格什麼的,很多沒有在這裡寫一些東西,來告知我們一些注意的問題,就是儘可能能保持現實生活中真實的模樣,那麼是增廣的資料也需要注意模擬現實生活中資料模樣,通熟一點就是,貼近現實生活場景!
舉例子:
我們需要從圖a中截取出Bus,扣出來的圖片,當我們送去訓練的時候,還需要將所有樣本調整到一樣的大小!假定我們調整的到128*128大小,如果我們不做任何補缺部分,我們就會出現圖b中的左邊的圖,這個圖是發生改變的,也就是說形狀發生了改變與真實資料有了偏差!但是我們在確實部分有0來補缺,就會像圖b中的左圖!如果你來選擇你會選擇哪一張圖呢?毋庸置疑,圖b中的左圖作為訓練資料,同時這個資料還模擬了現實生活中那些被遮擋的資料,你說是不是呢?從這裡你有沒有得到一個啟發,就是如果這是一個完整的車,你可不可以通過將部分置黑來起到資料增廣的作用呢?
圖 a
圖 b
二, 資料增廣
在不改變影象類別的情況下,增加資料量,能提高模型的泛化能力!自然影象的資料增廣方式包括很多!從幾何角度來看,常用的有:水平翻轉(也就通差說的是映象), 一定程度的位移,裁剪,旋轉等!從畫素變換來看,常用的有:顏色抖動(color jittering),增加噪聲,例如椒鹽噪聲,高斯噪聲等。此外還可以嘗試多種操作的組合, 例如同時做旋轉和隨機尺度變換,此外還可以把每個patch中所有畫素在HSV顏色空間中的飽和度和明度提升0.25-4次冪方,乘以0.7-1.4之間的一個因子,再加一個-0.1-0.1之間的值。同樣你可以在色調通道(H)對每張圖片或patch的所有畫素增加一個-0.1-0.1之間的值。
1. 幾何變換
(1)翻轉
例如:水平翻轉,豎直翻轉!其實翻轉也不是隨意翻轉的,要根據實際情況來翻轉,比如,關於人臉,你上下翻轉了就變成倒的人臉了,這個就沒有了實際意義,如果是左右翻轉了,也沒有太大的實際意義,因為人臉是對稱的,你翻轉之後還是一樣的!但是對於那些沒有對稱結構的物體圖片,你做翻轉還是挺有作用的,就相當於有兩條資料了啊!不過你,你做測試的時候,可以看看對這個翻轉資料敏感不敏感,如果敏感,你就把那些檢測錯誤的資料新增到樣本庫,或者以低於某個概率的樣本增加到樣本庫!這就起到它的作用了!
matlab程式碼實現:
-
bmp = imread(filname);
-
I = fliplr(bmp);
filename是圖片的檔名路徑;映象操作之後的圖片如下圖所示:
(2)平移
這個位置的移動,模擬了現實生活中的那些圖片不居中的情況,發生位置的擾動!
matlab程式碼實現:
bmp = imread(filename); %讀入圖片
se= translate(strel(1), [y, x]);
Img = imdilate(bmp, se);
strel用來建立形態學結構元素;
translate(se, [y, x])在原結構元素se上進行上下偏移,以及左右偏移,y>0 是向下移動,y<0是向上移動;x>0是向左,x<0是向右;
imdilate是形態學膨脹。
平移之後的圖片,最左邊是原圖,中間是向下以及向左平移,最右邊的是向上以及向左平移的結果!
(3)部分置黑
這個資料模擬了那些被部分遮擋的資料樣本
matlab程式碼實現:
-
I = imread(filename);
-
Img = I;
-
Img(1:up, left:right,:) = 0;
-
Img(down:row, left:right,:) = 0;
-
Img(up:down, 1:left,:) = 0;
-
Img(up:down, right:col,:) = 0;
(4)旋轉
matlab程式碼實現:
-
bmp = imread(filename);
-
I = imrotate(bmp, 10, 'bilinear', 'crop');
這裡10只是一個數值,可以改為你想旋轉的度數。正數向右,負數向左!
這個比較簡單,如圖所示:
(5)截切
matlab程式碼實現:
-
RGB=imread('1,jpg');
-
RGB1=imcrop(RGB,[60,255,400,425]);
注意,剪下的時候,在原始的資料上剪下!其實,我覺得這個功能有類似於平移的功能!發生一些位置的偏移!
(6)縮放(scale)
這個其實就是現實圖片放大或者縮小功能!這裡的縮放不同於訓練前資料統一調整到一樣大小的縮放!這只是在原始中稍微改動一些擷取的區域,也就是增加或者較少背景的調整,最終還是需要將這些資料調整到你規定的訓練資料大小的!
幾何變換暫時先寫這麼多,後續再進行補充!
2,畫素變換
(1)增加噪聲和濾波
matlab程式碼實現:
-
bmp = imread(filename);
-
I1 = imnoise(bmp, 'salt & pepper'); %椒鹽噪聲
-
w = [1 2 1; 2 4 2; 1 2 1];
-
I2 = imfilter(bmp, w, 'corr', 'replicate'); %高斯噪聲
-
w = [1 1 1; 1 1 1; 1 1 1] / 9;
-
I3 = imfilter(bmp, w, 'corr', 'replicate'); %平均平滑
-
I4 = medfilt2(bmp, [3, 3]); %中值濾波
噪聲的方式也比較多,比如椒鹽噪聲,高斯噪聲,中值濾波等等!
(2)變換通道
就是調整RBG三個通道的順序
matlab程式碼實現:
bmp = imread(filename);
I1 = cat(3, bmp(:,:,3), bmp(:,:,2), bmp(:,:,1));
I2 = cat(3, bmp(:,:,1), bmp(:,:,3), bmp(:,:,2));
(3)調整對比度和亮度
這個模擬了不同光照的影響!這個暫時先不講了,百度太多了,再寫就是重複工作(不過,不排除之後還是補充寫一下,哈哈)
其實關於資料畫素除了的也還有,就如我剛剛在開頭寫的都已經幫大家列出來了!
結束語
寫這篇文章的目的其實為了梳理一下,在資料處理方便的方法有哪些,如果大家還有一些好的方法,希望大家可以指點我一下!知識在於分享,你知道一個給我一個,我知道一個分享一個給你,那麼我們就有兩個知識!