1. 程式人生 > >第二十六節,滑動窗口和 Bounding Box 預測

第二十六節,滑動窗口和 Bounding Box 預測

方框 you 但是 幸運 ont soft 添加 一點 技術分享

上節,我們學習了如何通過卷積網絡實現滑動窗口對象檢測算法,但效率很低。這節我們講講如何在卷積層上應用這個算法。

為了構建滑動窗口的卷積應用,首先要知道如何把神經網絡的全連接層轉化成卷積層。我們先講解這部分內容,並演示卷積的應用過程。

一 卷積的滑動窗口實現

技術分享圖片

假設對象檢測算法輸入一個 14×14×3 的圖像,圖像很小,不過演示起來方便。在這裏過濾器大小為 5×5,數量是 16, 14×14×3 的圖像在過濾器處理之後映射為 10×10×16。然後通過參數為 2×2 的最大池化操作,圖像減小到 5×5×16。然後添加一個連接 400 個單元的全連接層,接著再添加一個全連接層,最後通過 softmax 單元輸出y。為了跟下圖區分開,我先做一點改動,用 4 個數字來表示y,它們分別對應 softmax 單元所輸出的 4 個分類出現的概率。這 4 個分類可以是行人、汽車、摩托車和背景或其它對象。

技術分享圖片

現在我要演示的就是如何把這些全連接層轉化為卷積層,畫一個這樣的卷積網絡,它的前幾層和之前的一樣,而對於下一層,也就是這個全連接層,我們可以用 5×5 的過濾器來實現,數量是 400 個(編號 1 所示),輸入圖像大小為 5×5×16,用 5×5 的過濾器對它進行卷積操作,過濾器實際上是 5×5×16,因為在卷積過程中,過濾器會遍歷這 16 個通道,所以這兩處的通道數量必須保持一致,輸出結果為 1×1。假設應用 400 個這樣的 5×5×16 過濾器,輸出維度就是 1×1×400,我們不再把它看作一個含有 400 個節點的集合,而是一個 1×1×400的輸出層。從數學角度看,它和全連接層是一樣的,因為這 400 個節點中每個節點都有一個5×5×16 維度的過濾器,所以每個值都是上一層這些 5×5×16 激活值經過某個任意線性函數的輸出結果。

我們再添加另外一個卷積層(編號 2 所示),這裏用的是 1×1 卷積,假設有 400 個 1×1的過濾器,在這 400 個過濾器的作用下,下一層的維度是 1×1×400,它其實就是上個網絡中的這一全連接層。最後經由 1×1 過濾器的處理,得到一個 softmax 激活值,通過卷積網絡,我們最終得到這個 1×1×4 的輸出層,而不是這 4 個數字(編號 3 所示)。

以上就是用卷積層代替全連接層的過程,結果這幾個單元集變成了 1×1×400 和 1×1×4 的維度。

掌握了卷積知識,我們再看看如何通過卷積實現滑動窗口對象檢測算法。

技術分享圖片

假設向滑動窗口卷積網絡輸入 14×14×3 的圖片,為了簡化演示和計算過程,這裏我們依然用 14×14的小圖片。和前面一樣,神經網絡最後的輸出層,即 softmax單元的輸出是 1×1×4,我畫得比較簡單,嚴格來說, 14×14×3 應該是一個長方體,第二個 10×10×16 也是一個長方體,但為了方便,我只畫了正面。所以,對於 1×1×400 的這個輸出層,我也只畫了它 1×1 的那一面,所以這裏顯示的都是平面圖,而不是 3D 圖像。

技術分享圖片

假設輸入給卷積網絡的圖片大小是 14×14×3,測試集圖片是 16×16×3,現在給這個輸入圖片加上黃色條塊,在最初的滑動窗口算法中,你會把這片藍色區域輸入卷積網絡(紅色筆標記)生成 0 或 1 分類。接著滑動窗口,步幅為 2 個像素,向右滑動 2 個像素,將這個綠框區域輸入給卷積網絡, 運行整個卷積網絡,得到另外一個標簽 0 或 1。繼續將這個橘色區域輸入給卷積網絡,卷積後得到另一個標簽,最後對右下方的紫色區域進行最後一次卷積操作。我們在這個 16×16×3 的小圖像上滑動窗口,卷積網絡運行了 4 次,於是輸出了了 4 個標簽。

技術分享圖片


結果發現,這 4 次卷積操作中很多計算都是重復的。所以執行滑動窗口的卷積時使得卷積網絡在這 4 次前向傳播過程中共享很多計算,尤其是在這一步操作中(編號 1),卷積網絡運行同樣的參數,使得相同的 5×5×16 過濾器進行卷積操作,得到 12×12×16 的輸出層。然後執行同樣的最大池化(編號 2) ,輸出結果 6×6×16。照舊應用 400 個 5×5 的過濾器(編號3),得到一個 2×2×400 的輸出層,現在輸出層為 2×2×400,而不是 1×1×400。應用 1×1 過濾器(編號 4)得到另一個 2×2×400 的輸出層。再做一次全連接的操作(編號 5),最終得到2×2×4 的輸出層,而不是 1×1×4。最終,在輸出層這 4 個子方塊中,藍色的是圖像左上部分14×14 的輸出(紅色箭頭標識),右上角方塊是圖像右上部分(綠色箭頭標識)的對應輸出,左下角方塊是輸入層左下角(橘色箭頭標識),也就是這個 14×14 區域經過卷積網絡處理後的結果,同樣,右下角這個方塊是卷積網絡處理輸入層右下角 14×14 區域(紫色箭頭標識)的結果。

技術分享圖片

如果你想了解具體的計算步驟,以綠色方塊為例,假設你剪切出這塊區域(編號 1),傳遞給卷積網絡,第一層的激活值就是這塊區域(編號 2),最大池化後的下一層的激活值是這塊區域(編號 3),這塊區域對應著後面幾層輸出的右上角方塊(編號 4, 5, 6)。

所以該卷積操作的原理是我們不需要把輸入圖像分割成四個子集,分別執行前向傳播,而是把它們作為一張圖片輸入給卷積網絡進行計算,其中的公共區域可以共享很多計算,就像這裏我們看到的這個 4 個 14×14 的方塊一樣。

技術分享圖片

下面我們再看一個更大的圖片樣本,假如對一個 28×28×3 的圖片應用滑動窗口操作,如果以同樣的方式運行前向傳播,最後得到 8×8×4 的結果。跟上一個範例一樣,以 14×14 區域滑動窗口,首先在這個區域應用滑動窗口,其結果對應輸出層的左上角部分。接著以大小為2 的步幅不斷地向右移動窗口,直到第 8 個單元格,得到輸出層的第一行。然後向圖片下方移動,最終輸出這個 8×8×4 的結果。因為最大池化參數為 2,相當於以大小為 2 的步幅在原始圖片上應用神經網絡。

技術分享圖片

總結一下滑動窗口的實現過程,在圖片上剪切出一塊區域,假設它的大小是 14×14,把它輸入到卷積網絡。繼續輸入下一塊區域,大小同樣是 14×14,重復操作,直到某個區域識別到汽車。

但是正如在前一頁所看到的,我們不能依靠連續的卷積操作來識別圖片中的汽車,比如,我們可以對大小為 28×28 的整張圖片進行卷積操作,一次得到所有預測值,如果足夠幸運,神經網絡便可以識別出汽車的位置。

技術分享圖片

以上就是在卷積層上應用滑動窗口算法的內容,它提高了整個算法的效率。不過這種算法仍然存在一個缺點,就是邊界框的位置可能不夠準確。下面,我們將學習如何解決這個問題。

二 Bounding Box 預測

上面,你們學到了滑動窗口法的卷積實現,這個算法效率更高,但仍然存在問題,不能輸出最精準的邊界框。在這裏,我們看看如何得到更精準的邊界框。

技術分享圖片

在滑動窗口法中,你取這些離散的位置集合,然後在它們上運行分類器,在這種情況下,這些邊界框沒有一個能完美匹配汽車位置,也許這個框(編號 1)是最匹配的了。還有看起來這個真實值,最完美的邊界框甚至不是方形,稍微有點長方形(紅色方框所示),長寬比有點向水平方向延伸,有沒有辦法讓這個算法輸出更精準的邊界框呢?

技術分享圖片

其中一個能得到更精準邊界框的算法是 YOLO 算法, YOLO(You only look once)意思是你只看一次,這是由 Joseph Redmon, Santosh Divvala, Ross Girshick 和 Ali Farhadi 提出的算法。

第二十六節,滑動窗口和 Bounding Box 預測