深度学习训练中关于数据处理方式--原始样本采集以及数据增广
版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/SMF0504/article/details/78695908
???????? 好久沒有寫博客,一直想重新調整自己的博客,想盡可能寫的前后連貫一點,同時希望自己寫的更通熟易懂些,可是遲遲沒有動筆修改曾經的博文,哎,還是慢慢跟著自己的理解再修改之前的文章吧,今兒就寫寫關于深度學習訓練中最關鍵的一步,數據問題,也就是樣本庫的建立!來記錄一下自己的心得以及思考!
緒言
??????? 為啥要寫數據,又說數據是深度學習中最關鍵的一步呢?算法是重要,但是呢,真正實際工程中,業務需求 > 數據? > 算法!根據業務需求來選擇適合的數據,我們對數據的處理也是來源業務的需求!而數據選擇何種增廣方式也需要根據實際做的項目來確定的,舉個例子!比如:做車型識別,大家可以想象到,車型識別是干嘛的?嗯,“型”是什么?就是形狀有所差別吧!很多人可能已經想到了,對,處理數據是,我們就先從幾何形狀來增廣數據!那么如果是車身顏色呢?又有小伙伴會想到是不是先從顏色來入手來增廣數據呢?對了嘛,就是的呢!不過,你不能排除其他的影響,你可以先從你可以想到的角度入手,也要測試一下其他的變化方式!比如說,車型對形狀敏感,做完形狀之后,你來改變一下亮度或者對比度的變化等等!
??????? 本文代碼實現是用的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)調整對比度和亮度
???????? 這個模擬了不同光照的影響!這個暫時先不講了,百度太多了,再寫就是重復工作(不過,不排除之后還是補充寫一下,哈哈)
?
其實關于數據像素除了的也還有,就如我剛剛在開頭寫的都已經幫大家列出來了!
??
結束語
?????? 寫這篇文章的目的其實為了梳理一下,在數據處理方便的方法有哪些,如果大家還有一些好的方法,希望大家可以指點我一下!知識在于分享,你知道一個給我一個,我知道一個分享一個給你,那么我們就有兩個知識!
總結
以上是生活随笔為你收集整理的深度学习训练中关于数据处理方式--原始样本采集以及数据增广的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习中的数据增广
- 下一篇: 转载+记录数据增广的八种常用方式