1. 程式人生 > >深度學習訓練中關於資料處理方式--原始樣本採集以及資料增廣

深度學習訓練中關於資料處理方式--原始樣本採集以及資料增廣

         好久沒有寫部落格,一直想重新調整自己的部落格,想盡可能寫的前後連貫一點,同時希望自己寫的更通熟易懂些,可是遲遲沒有動筆修改曾經的博文,哎,還是慢慢跟著自己的理解再修改之前的文章吧,今兒就寫寫關於深度學習訓練中最關鍵的一步,資料問題,也就是樣本庫的建立!來記錄一下自己的心得以及思考!

緒言

        為啥要寫資料,又說資料是深度學習中最關鍵的一步呢?演算法是重要,但是呢,真正實際工程中,業務需求 > 資料  > 演算法!根據業務需求來選擇適合的資料,我們對資料的處理也是來源業務的需求!而資料選擇何種增廣方式也需要根據實際做的專案來確定的,舉個例子!比如:做車型識別,大家可以想象到,車型識別是幹嘛的?嗯,“型”是什麼?就是形狀有所差別吧!很多人可能已經想到了,對,處理資料是,我們就先從幾何形狀來增廣資料!那麼如果是車身顏色呢?又有小夥伴會想到是不是先從顏色來入手來增廣資料呢?對了嘛,就是的呢!不過,你不能排除其他的影響,你可以先從你可以想到的角度入手,也要測試一下其他的變化方式!比如說,車型對形狀敏感,做完形狀之後,你來改變一下亮度或者對比度的變化等等!

        本文程式碼實現是用的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程式碼實現:

  1. bmp = imread(filname);

  2. 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程式碼實現:

  1. I = imread(filename);

  2. Img = I;

  3. Img(1:up, left:right,:) = 0;

  4. Img(down:row, left:right,:) = 0;

  5. Img(up:down, 1:left,:) = 0;

  6. Img(up:down, right:col,:) = 0;

     (4)旋轉

  matlab程式碼實現:

  1. bmp = imread(filename);

  2. I = imrotate(bmp, 10, 'bilinear', 'crop');

這裡10只是一個數值,可以改為你想旋轉的度數。正數向右,負數向左!

這個比較簡單,如圖所示:

    (5)截切

matlab程式碼實現:

  1. RGB=imread('1,jpg');

  2. RGB1=imcrop(RGB,[60,255,400,425]);

注意,剪下的時候,在原始的資料上剪下!其實,我覺得這個功能有類似於平移的功能!發生一些位置的偏移!

     (6)縮放(scale)

這個其實就是現實圖片放大或者縮小功能!這裡的縮放不同於訓練前資料統一調整到一樣大小的縮放!這只是在原始中稍微改動一些擷取的區域,也就是增加或者較少背景的調整,最終還是需要將這些資料調整到你規定的訓練資料大小的!

      幾何變換暫時先寫這麼多,後續再進行補充!

2,畫素變換

    (1)增加噪聲和濾波

matlab程式碼實現:

  1. bmp = imread(filename);

  2. I1 = imnoise(bmp, 'salt & pepper'); %椒鹽噪聲

  3. w = [1 2 1; 2 4 2; 1 2 1];

  4. I2 = imfilter(bmp, w, 'corr', 'replicate'); %高斯噪聲

  5. w = [1 1 1; 1 1 1; 1 1 1] / 9;

  6. I3 = imfilter(bmp, w, 'corr', 'replicate'); %平均平滑

  7. 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)調整對比度和亮度

         這個模擬了不同光照的影響!這個暫時先不講了,百度太多了,再寫就是重複工作(不過,不排除之後還是補充寫一下,哈哈)

其實關於資料畫素除了的也還有,就如我剛剛在開頭寫的都已經幫大家列出來了!

結束語

       寫這篇文章的目的其實為了梳理一下,在資料處理方便的方法有哪些,如果大家還有一些好的方法,希望大家可以指點我一下!知識在於分享,你知道一個給我一個,我知道一個分享一個給你,那麼我們就有兩個知識!