风机桨叶故障诊断(七) 滑动窗与非极大值抑制NMS
風機槳葉故障診斷(七)滑動窗與非極大值一直NMS
? ? ?到目前為止,我已經利用自編碼神經網絡提取特征后訓練得到了BP神經網絡(參見:點擊打開鏈接),且在測試樣本集上表現不錯。下面我們就要應用到實際中來檢驗算法的好壞了。
? ? ?在目標檢測的問題中,當我們有了一個算法來判斷一幅圖像是否為目標物體時,在一幅大圖像中尋找目標物體,通常且比較簡單的方法是使用滑動窗(Sliding windows)。
? ? ?滑動窗很好理解,首先使用一個指定大小的檢測窗口,從圖像左上角開始,進行等間距的滑動,每次滑動的間距根據實際情況人為確定,每到一個位置,將窗口中對應的圖像(窗口的大小很可能與算法的輸入不同,這時我們需要縮放到統一的尺寸)輸入我們的算法中,算法會給出這個窗口中的圖像是否為我們的目標物體。直至滑動窗沿圖像的橫豎兩個方向遍歷了一遍后,我們就完成了某一個尺度窗口的滑動,如下圖所示:
??
? ? ?然后我們要做的是,變換滑動窗口的尺度,也就是滑動窗的大小。然后使用不同的尺度重復上面的工作。這里尺度大小的范圍,變化的比例,滑動窗滑動的間距都是根據實際情況人為設定的。
? ? ?我們的滑動窗每到一個位置,算法都會給出對于這個窗口是否屬于目標物體的一個打分,我們的輸出神經元使用的是sigmoid傳遞函數,所以神經網絡給出了我們一個0~1之間的打分。當這個分數高于我們之前設定的某個閾值比如0.7時,我們認為這個圖像就是我們尋找的目標物體,我們需要記錄下當前窗口的位置信息和對應的分數,以便后面進行非極大值抑制時使用。
? ? ?所以,當我們的滑動窗算法運行完畢后,我們應該得到的就是關于所有計算機認為包含所尋找的目標物體的窗口的信息,以一個矩陣來記錄,那么每行所要包含的信息是:[左上頂點x坐標,左上頂點y坐標,右下x坐標,右下y坐標,得分]
? ? ?下面是針對我的問題的matlab滑動窗實現代碼,大家如果使用需要根據實際情況修改部分代碼。函數需要提供一幅待檢測的完整圖像,和我們預測算法所需的信息,對于我們的神經網絡也就是權值矩陣了。
? ? ?滑動窗算法函數:
function [ location ] = ValidateImage( Theta1, Theta2, Theta3,image ) %驗證一幅灰度圖像中所有槳葉的可能位置 %返回描述所有槳葉位置的矩陣。每一行記錄 橫坐標 縱坐標 分數imageWid=size(image,2); imageHigh=size(image,1);location=[]; for width=250:75:400for i=1:35:imageHigh-widthfor j=1:35:imageWid-widthtempImage=image(i:i+width-1,j:j+width-1);%灰度矩陣轉列向量(逐列掃描)tempImage=Resize(tempImage, 25,25 );X=reshape(tempImage,625,1);result=PredictPaddle( Theta1, Theta2, Theta3,X' );if result>=0.6location=[location;i,j,i+width,j+width,result];endendend endend
? ? ?神經網絡的預測函數:
function [ p ] = PredictPaddle( Theta1, Theta2, Theta3,X ) %判斷一幅圖片是否為槳葉(以向量或矩陣的形式輸入圖像,請歸一化到25×25灰度圖后展開成行向量輸入)m = size(X, 1); p = zeros(size(X, 1), 1);h1 = sigmoid([ones(m, 1) X] * Theta1'); h2 = sigmoid([ones(m, 1) h1] * Theta2'); h3 = sigmoid([ones(m, 1) h2] * Theta3');p=h3;end
? ? ?運行我們的滑動窗算法,可以得到類似于下圖的識別圖像:
? ? ?可以看到,我們的算法很好的找到了目標的位置,但是對于同一目標,有很多相似且重疊的窗口覆蓋在一起。我們選出所有的窗口進行下一步的識別是沒有意義的,顯然前輩們也可肯定不是這么做的。在一個研究生學長的指點下,我了解到了一個叫做“非極大值抑制(Non-maximun suppression)”的算法,是專門來解決這類問題的。然后我搜到了下面兩篇blog進行學習,后面我給出的實現代碼也是直接在原作者給出的代碼上進行的修改和注釋。
http://blog.csdn.net/h2008066215019910120/article/details/25917609
http://blog.csdn.net/pb09013037/article/details/45477591
? ? ?我來描述一下我對與“非極大值抑制”的個人理解。首先無論面對什么物體的識別問題,我們現在得到的都是很多個被認為包含目標物體的窗口,并且我們記錄了它們的位置信息和分數信息。非極大值抑制中的這個“值”指的就是窗口的得分,因為我們的處于0~1之間的得分也可以理解為我們的算法認為這個窗口內包含目標物體的概率,或者自信程度。得分0.99自然比得分0.7更有可能是更好的包含目標物體的窗口,所以非極大值抑制就是想在窗口相互重疊的局部區域內選出得分的極大值代表的窗口,而抑制不是局部極大值的窗口。這樣最后剩下的都是每個局部區域內得分最高的窗口,不會出現過多的重疊情況。
? ? ?算法需要兩個輸入參數,一個參數boxs是記錄窗口位置和得分信息的,boxs的每一行的格式為[左上頂點x坐標,左上頂點y坐標,右下x坐標,右下y坐標,得分],所以到這里我們明白,上面滑窗時這樣格式化輸出就是為了與這里進行對應。還有要注意的是,上面的博客中對于這個參數的描述[x,y,width,height ,score ]對應于他給的代碼是錯誤的。
? ? ?另一個參數overlap是人為選定的覆蓋率。這是什么意思?我們上面對于非極大值抑制算法的描述有一個概念一直是模糊的,什么是局部?在這里我們定義:兩個窗口重疊
部分的面積除以兩個窗口中較小的面積=覆蓋率overlap。那么覆蓋率其實就可以用來描
述這個局部的概念。我們可以認為覆蓋率大于某一個閾值后,兩個窗口處于同一個局部
個人感覺這個overlap的選取和實際問題是有關系的,在我們的問題中,不同的槳葉的
窗口是不可能相互挨著的,所以我把overlap取的較小數0.1。
? ? matlab實現代碼如下:
function pick = nms(boxes, overlap) % pick = nms(boxes,overlap)% boxs 用來記錄所有潛在目標窗口的信息,每一行對應[x,y,x+width,y+height ,score ], % 即左上角,右下角兩定點坐標+系統對于當前窗口是目標物體可能性的打分0~1% overlap是介于0~1的實數% Non-maximumsuppression. 非極大值抑制 % Greedily selecthigh-scoring detections and skip detections % that are significantlycovered by a previously selected detection. % 貪婪選擇:得分檢測和跳躍檢測(被十分重要的包含于預先選擇檢測的步驟中)% boxes = boxes';if isempty(boxes)pick = []; elsex1 = boxes(:,1);y1 = boxes(:,2);x2 = boxes(:,3);y2 = boxes(:,4);%得分s = boxes(:,end);area = (x2-x1+1) .* (y2-y1+1);%結果為一列向量,記錄每一個窗口面積%將分數按從小到大排序% vals:重拍后的分數% I:重排后每個位置對應的原位置的索引[vals, I] = sort(s);pick = [];while ~isempty(I)last = length(I);%分數最高窗口的索引i = I(last);pick = [pick; i];suppress = [last];for pos = 1:last-1j = I(pos);%求當前窗口與分數最高窗口重疊部分對應矩形的信息xx1 = max(x1(i), x1(j));yy1 = max(y1(i), y1(j));xx2 = min(x2(i), x2(j));yy2 = min(y2(i), y2(j));w = xx2-xx1+1;h = yy2-yy1+1;if w > 0 && h > 0%說明存在重疊部分% compute overlap 計算重疊比例(重疊面積/當前兩個窗口面積較小的那個的面積)o = w * h / min(area(i),area(j)); % o = w/area(j);if o > overlap%覆蓋率超過設定值,加入抑制窗口列表suppress = [suppress; pos];endendend%將被抑制的窗口清空I(suppress) = [];end end ?
? ? 我們來看一下使用非極大值抑制后,槳葉識別的效果。
??
? ? 我們可以看到,“非極大值抑制”的效果還是不錯的。到目前為止,我們已經基本完
成了對槳葉識別的目標,對于每一幅圖,都能保證定位到1-2個槳葉,當然客觀的說,
還是存在一些問題,比如我們框出的目標物體不能保證包含整個槳葉,只能說是大部分
區域,如果有可能,后期還會繼續完善我們的系統。
? ? 今天又學到不少,繼續加油
總結
以上是生活随笔為你收集整理的风机桨叶故障诊断(七) 滑动窗与非极大值抑制NMS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 奇妙的安全旅行之RSA算法
- 下一篇: opencv视频读写和视频等间隔采样