吳恩達深度學習筆記(98)-目標檢測之NMS非極大值抑制

非極大值抑制(Non-max suppression)

到目前為止你們學到的對象檢測中的一個問題是,你的算法可能對同一個對象做出多次檢測,所以算法不是對某個對象檢測出一次,而是檢測出多次。非極大值抑制這個方法可以確保你的算法對每個對象只檢測一次.

來,我們吃一顆栗子:

吳恩達深度學習筆記(98)-目標檢測之NMS非極大值抑制

假設你需要在這張圖片裡檢測行人和汽車,你可能會在上面放個19×19網格,理論上這輛車只有一箇中點,所以它應該只被分配到一個格子裡,左邊的車子也只有一箇中點,所以理論上應該只有一個格子做出有車的預測。

吳恩達深度學習筆記(98)-目標檢測之NMS非極大值抑制

實踐中當你運行對象分類和定位算法時,對於每個格子都運行一次,所以這個格子(編號1)可能會認為這輛車中點應該在格子內部,這幾個格子(編號2、3)也會這麼認為。對於左邊的車子也一樣,所以不僅僅是這個格子,如果這是你們以前見過的圖像,不僅這個格(編號4)子會認為它裡面有車,也許這個格子(編號5)和這個格子(編號6)也會,也許其他格子也會這麼認為,覺得它們格子內有車。

我們分步介紹一下非極大抑制是怎麼起效的

因為你要在361個格子上都運行一次圖像檢測和定位算法,那麼可能很多格子都會舉手說我的p_c,我這個格子裡有車的概率很高,而不是361個格子中僅有兩個格子會報告它們檢測出一個對象。所以當你運行算法的時候,最後可能會對同一個對象做出多次檢測,所以非極大值抑制做的就是清理這些檢測結果。這樣一輛車只檢測一次,而不是每輛車都觸發多次檢測。

吳恩達深度學習筆記(98)-目標檢測之NMS非極大值抑制

所以具體上,這個算法做的是,首先看看每次報告每個檢測結果相關的概率p_c。現在我們就說,這個p_c檢測概率,首先看概率最大的那個,這個例子(右邊車輛)中是0.9,然後就說這是最可靠的檢測,所以我們就用高亮標記,就說我這裡找到了一輛車。這麼做之後,非極大值抑制就會逐一審視剩下的矩形,所有和這個最大的邊框有很高交併比,高度重疊的其他邊界框,那麼這些輸出就會被抑制。所以這兩個矩形p_c分別是0.6和0.7,這兩個矩形和淡藍色矩形重疊程度很高,所以會被抑制,變暗,表示它們被抑制了。

吳恩達深度學習筆記(98)-目標檢測之NMS非極大值抑制

接下來,逐一審視剩下的矩形,找出概率最高,p_c最高的一個,在這種情況下是0.8,我們就認為這裡檢測出一輛車(左邊車輛),然後非極大值抑制算法就會去掉其他loU值很高的矩形。所以現在每個矩形都會被高亮顯示或者變暗,如果你直接拋棄變暗的矩形,那就剩下高亮顯示的那些,這就是最後得到的兩個預測結果。

所以這就是非極大值抑制,非最大值意味著你只輸出概率最大的分類結果,但抑制很接近,但不是最大的其他預測結果,所以這方法叫做非極大值抑制。

我們來看看算法的細節,首先這個19×19網格上執行一下算法,你會得到19×19×8的輸出尺寸。不過對於這個例子來說,我們簡化一下,就說你只做汽車檢測,我們就去掉c_1、c_2和c_3,然後假設這條線對於19×19的每一個輸出,對於361個格子的每個輸出,你會得到這樣的輸出預測,就是格子中有對象的概率(p_c),然後是邊界框參數(b_x、b_y、b_h和b_w)。如果你只檢測一種對象,那麼就沒有c_1、c_2和c_3這些預測分量。

吳恩達深度學習筆記(98)-目標檢測之NMS非極大值抑制

現在要實現非極大值抑制,你可以做的第一件事是,去掉所有邊界框,我們就將所有的預測值,所有的邊界框p_c小於或等於某個閾值,比如p_c≤0.6的邊界框去掉

我們就這樣說,除非算法認為這裡存在對象的概率至少有0.6,否則就拋棄,所以這就拋棄了所有概率比較低的輸出邊界框。所以思路是對於這361個位置,你輸出一個邊界框,還有那個最好邊界框所對應的概率,所以我們只是拋棄所有低概率的邊界框。

吳恩達深度學習筆記(98)-目標檢測之NMS非極大值抑制

接下來剩下的邊界框,沒有拋棄沒有處理過的,你就一直選擇概率p_c最高的邊界框,然後把它輸出成預測結果,這個過程就是上一張幻燈片,取一個邊界框,讓它高亮顯示,這樣你就可以確定輸出做出有一輛車的預測。

吳恩達深度學習筆記(98)-目標檢測之NMS非極大值抑制

接下來去掉所有剩下的邊界框,任何沒有達到輸出標準的邊界框,之前沒有拋棄的邊界框,把這些和輸出邊界框有高重疊面積和上一步輸出邊界框有很高交併比的邊界框全部拋棄

所以while循環的第二步是上一張幻燈片變暗的那些邊界框,和高亮標記的邊界重疊面積很高的那些邊界框拋棄掉

在還有剩下邊界框的時候,一直這麼做,把沒處理的都處理完,直到每個邊界框都判斷過了,它們有的作為輸出結果,剩下的會被拋棄,它們和輸出結果重疊面積太高,和輸出結果交併比太高,和你剛剛輸出這裡存在對象結果的重疊程度過高。

在這張幻燈片中,我只介紹了算法檢測單個對象的情況,如果你嘗試同時檢測三個對象,比如說行人、汽車、摩托,那麼輸出向量就會有三個額外的分量。

事實證明,正確的做法是獨立進行三次非極大值抑制,對每個輸出類別都做一次,我們可以自己試試在多個對象類別檢測時做非極大值抑制。

這就是非極大值抑制,如果你能實現我們說過的對象檢測算法,你其實可以得到相當不錯的結果。但結束我們對YOLO算法的介紹之前,最後我還有一個細節想給大家分享,可以進一步改善算法效果,就是anchor box的思路,我們下一個筆記再介紹。


分享到:


相關文章: