吳恩達深度學習筆記(95)-目標檢測之卷積網絡滑動窗口實現

卷積的滑動窗口實現(Convolutional implementation of sliding windows)

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

為了構建滑動窗口的卷積應用,首先要知道如何把神經網絡的全連接層轉化成卷積層。我們先講解這部分內容,下一張圖,我們將按照這個思路來演示卷積的應用過程。

吳恩達深度學習筆記(95)-目標檢測之卷積網絡滑動窗口實現

假設對象檢測算法輸入一個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個分類可以是行人、汽車、摩托車和背景或其它對象。

吳恩達深度學習筆記(95)-目標檢測之卷積網絡滑動窗口實現

下方開車,請做好扶好~

現在我要演示的就是如何把這些全連接層轉化為卷積層,畫一個這樣的卷積網絡,它的前幾層和之前的一樣,而對於下一層,也就是這個全連接層,我們可以用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的維度。

參考論文:Sermanet, Pierre, et al. "OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks." Eprint Arxiv (2013).

掌握了卷積知識,我們再看看如何通過卷積實現滑動窗口對象檢測算法。講義中的內容借鑑了屏幕下方這篇關於OverFeat的論文,它的作者包括Pierre Sermanet,David Eigen,張翔,Michael Mathieu,Rob Fergus,Yann LeCun。

吳恩達深度學習筆記(95)-目標檢測之卷積網絡滑動窗口實現

假設向滑動窗口卷積網絡輸入14×14×3的圖片,為了簡化演示和計算過程,這裡我們依然用14×14的小圖片。

和前面一樣,神經網絡最後的輸出層,即softmax單元的輸出是1×1×4,我畫得比較簡單,嚴格來說,14×14×3應該是一個長方體,第二個10×10×16也是一個長方體,但為了方便,我只畫了正面。所以,對於1×1×400的這個輸出層,我也只畫了它1×1的那一面,所以這裡顯示的都是平面圖,而不是3D圖像。

吳恩達深度學習筆記(95)-目標檢測之卷積網絡滑動窗口實現

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

繼續將這個橘色區域輸入給卷積網絡,卷積後得到另一個標籤,最後對右下方的紫色區域進行最後一次卷積操作。我們在這個16×16×3的小圖像上滑動窗口,卷積網絡運行了4次,於是輸出了了4個標籤。

吳恩達深度學習筆記(95)-目標檢測之卷積網絡滑動窗口實現

結果發現,這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區域(紫色箭頭標識)的結果。

吳恩達深度學習筆記(95)-目標檢測之卷積網絡滑動窗口實現

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

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

吳恩達深度學習筆記(95)-目標檢測之卷積網絡滑動窗口實現

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

吳恩達深度學習筆記(95)-目標檢測之卷積網絡滑動窗口實現

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

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

吳恩達深度學習筆記(95)-目標檢測之卷積網絡滑動窗口實現

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


分享到:


相關文章: