目標檢測

阿蘇爾發表於2018-04-24

本文來自於網易雲課堂

目標定位

這裡寫圖片描述
目標定位不僅僅是要識別出圖片有沒有那個東西還要用方框標記出目標的位置。對於一個多分類問題,我們可以利用softmax來表示輸出,那麼圖形的邊框該如何表示呢?我們可以採用表框的引數化表示,如bx,by,bh,bw。下面我們介紹一下約定:圖片左上角為(0,0),右下角為(1,1),要想確定邊界框的具體位置,需要指定邊框的中心為(bx,by),邊界框的高度為bh,寬度為bw。因此訓練集不僅包括神經網路要預測的分類標籤,還包含邊界的四個引數。接著採用監督學習演算法,輸出一個標籤還有4個引數值。
這裡寫圖片描述
那麼如何為監督學習任務定義目標標籤y呢?
這裡寫圖片描述
對於上圖中的4類,神經網路輸出的是這4個資料和一個分類標籤或分類標籤出現的概率。目標標籤的定義如下,它是一個向量,第一個元件Pc表示是否含有物件,如果有物件,則Pc為1,如果是背景,Pc為0.這裡只針對圖片中只有一個物件的情況。
這裡寫圖片描述
那麼對應的損失函式定義如下
這裡寫圖片描述

特徵點檢測

上節課講了如何利用神經網路獲得邊框,即輸出邊框的四個引數,更概括的說,神經網路可以通過輸出圖片上特徵點的(x,y)座標來實現對目標特徵的識別。
假設你正在構建一個人臉識別應用,出於某種原因,你希望眼角能給出演算法的具體位置,眼角座標為(x,y),那麼你可以讓神經網路的最後一層輸出兩個座標(x1,y1),同樣你也可以對其他的部位進行特徵點標記,比如嘴,臉型以及鼻子的關鍵特徵點等。選定特徵點,並生成特定的標籤集,然後利用神經網路輸出臉部關鍵特徵點的位置。
這裡寫圖片描述
你可能玩過人臉上帶皇冠的應用,這是微信的玩法,就是利用了人臉識別來做的。再比如說人體姿態識別,可以標記胸部,腿,腰的位置來實現檢測。

目標檢測

假如你想構建一個汽車檢測演算法,步驟是首先訓練一個(x,y),這些輸入可以適當剪下一下,讓汽車在中間。然後可以開始訓練卷積網路了,訓練完以後,你就可以利用滑動視窗來實現目標檢測了。
這裡寫圖片描述
具體步驟如下,假設給定一張測試圖片,如下所示。你要做的是首先選定一個特定大小的視窗,比如圖片下方的這個視窗,將這個紅色小視窗輸入卷積網路。具體過程就是以固定步幅滑動視窗,遍歷影像的每個區域,把這些剪下過的小影像輸入卷積網路,對每個位置進行0和1分類,這就是所謂的影像滑動視窗操作。然後重複選擇更大的視窗重複進行該步驟。這種方法具有明顯的缺點,即計算成本問題。
這裡寫圖片描述
這裡寫圖片描述

卷積的滑動視窗實現

通過卷積網路實現滑動視窗物件檢測演算法,但是效率很低。如果在卷積層上應用這個演算法會有明顯的改觀。我們來看一下這個過程。
為了構建滑動視窗的卷積應用,首先要知道如何把神經網路的全連線層轉換為卷積層。卷積層替代全連線層的過程從下圖就可以很明顯的看出來。
這裡寫圖片描述
這裡寫圖片描述
在此基礎上,那麼如何通過卷積實現滑動視窗物件檢測演算法呢?首先在圖片上剪出一片區域,假設是14*14,然後把它放到卷積中,繼續輸入一下個,同樣是14*14,重複操作,直到某個區域識別出汽車。但我們不用依靠連續的卷積操作,來識別圖中的汽車,而是一次輸出所有的結果。
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這個演算法明顯提高了效率,但是任然存在缺點就是它的邊界框的位置可能不太準確。那麼該如何解決這個問題呢?請看下一節。

邊界框預測

這裡寫圖片描述
對於上面這個圖來說,可能藍色的框是最接近的輸出了。但實際上紅色的框才是應該的邊界框,並且它的形狀可能還不是標準的正方形。那麼如何得到更精準的邊框呢?這裡就用到了yolo演算法,它是you only look once的意思,就是你只看一次。具體是這麼做的,比如你的輸入影像時100*100,然後在一個影像上放一個網路,為了簡單一些,這裡採用3*3的網格,實際中可能使用更精細。基本思路是使用影像分類和定位演算法,然後將演算法逐一應用到9個格子上。更具體一點,你需要這樣定義標籤,對於每個格子指定一個標籤y,y是8維向量,和之前的一樣。所以,這張圖有9個格子,每個格子都有一個向量。
這裡寫圖片描述
對於中間的格子,即使裡面有2個物件我們也把它當做沒有。這個演算法的優點在於,其能精準的輸出邊框。所以測試的時候你要做的是喂輸入影像,然後跑正向傳播,得到一個輸出y,然後對應於每個格子你就可以得到每個格子是1還是0,就可以確定位置。只要一個格子不超過一個物件,這個演算法就是ok的。實際上可能會用19*19的格子,這樣的格子小得多,那麼一個格子會有多個物體的概率也會小的多。把物件分配到一個格子的過程是,觀察物件的中點,然後將這個物件分配到其中點所在的格子。所以即使物件橫跨多個格子,也只會分配到其中一個格子中。這裡有2件事情要注意,這和影像分類和定位演算法非常像,它顯示的輸出邊界座標,所以這能讓神經網路輸出邊框,可以具有任意高寬比,並且能輸出更精確的座標,不會受到滑動視窗演算法的步長限制。其次這是一個卷積實現,並沒有在3*3的網格上跑9次演算法。如果你用的是19*19,那麼就要跑361次。所以不需要跑361次,相反這是一個單次卷積實現。這也是它受歡迎的原因,這樣跑的速度就會非常快,基本上能達到實時的程度。
還有一個關於如何編碼bx,by,bh,bw的小細節。bx,by,bh,bw是相對格子尺度的比例,bx,by必須在0和1之間,以為它肯定在格子內部,而bh,bw有可能大於格子尺度,
這裡寫圖片描述

交併比

如何判斷物件檢測演算法執行良好呢?交併比函式可以用來評價物件檢測演算法。交併比函式計算預測輸出與標準輸出下,交集與並集之比。一般約定,在計算機檢測任務中,如果IoU大於0.5就認為是正確的。0.5是人為約定的,如果你想嚴格一下可以定為0.6或者0.7。IoU衡量了兩個邊界狂重疊的大小。
這裡寫圖片描述

非極大值抑制

目前為止,學到的物件檢測的一個問題是你的演算法可能對同一個物體做出多次檢測,非極大值抑制可以確保只做出一次檢測。
這裡寫圖片描述
假設你需要在這張圖裡檢測行人和汽車。你可能會放19*19的網格,理論上這輛車只有一箇中點,所以它應該只分配到一個格子裡。實踐中,你跑物件分類和定位演算法時,對於某個格子都有跑一次,中心點旁邊的格子可能都會認為自己裡面有物件。
這裡寫圖片描述
那麼非極大值抑制是如何起作用的呢?因為你要在361個格子上都要跑一次,所以可能有好多個格子都會說我的Pc或者我的概率會比較高,而不是隻有2個格子。所以最後可能會檢測出多個結果。
這裡寫圖片描述
而非極大值抑制就是要清理這些多出來的結果。它通過比較概率值,將最大的那個變亮而把小的變暗。如果把小的刪除,那麼就只剩下最亮的那個。
這裡寫圖片描述
具體來說,對於每個格子都會有8個維度的輸出,這裡我們只檢測汽車,所以省略後面的分類。具體過程如下圖
這裡寫圖片描述

anchor boxes

如果你想讓一個格子檢測出多個物件,那麼就可以使用anchor box這個概念。
這裡寫圖片描述
這裡寫圖片描述

相關文章