卷積的滑動窗口實現(Convolutional implementation of sliding windows)
假設對象檢測算法輸入一個 14×14×3 的圖像,圖像很小。在這里過濾器大小為 5×5,數量是 16, 14×14×3 的圖像在過濾器處理之后映射為 10×10×16。然后通過參數為 2×2 的最大池化操作,圖像減小到 5×5×16。然后添加一個連接 400 個單元的全連接層,接着再添加一個全連接層,最后通過 softmax 單元輸出。這里用 4 個數字來表示y,它們分別對應 softmax 單元所輸出的 4 個分類出現的概率。這 4 個分類可以是行人、汽車、摩托車和背景或其它對象。
現在我要把這些全連接層轉化為卷積層,畫一個這樣的卷積網絡,它的前幾層和之前的一樣,而對於下一層,也就是這個全連接層,我們可以用 5×5 的過濾器來實現,數量是 400 個。
輸入圖像大小為 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 激活值經過某個任意線性函數的輸出結果。
我們再添加另外一個卷積層,這里用的是 1×1 卷積,假設有 400 個 1×1的過濾器,在這 400 個過濾器的作用下,下一層的維度是 1×1×400,它其實就是上個網絡中的這一全連接層。最后經由 1×1 過濾器的處理,得到一個 softmax 激活值,通過卷積網絡,我們最終得到這個 1×1×4 的輸出層,而不是這 4 個數字。
以上就是用卷積層代替全連接層的過程,結果這幾個單元集變成了 1×1×400 和 1×1×4 的維度。
假設向滑動窗口卷積網絡輸入 14×14×3 的圖片,和前面一樣,神經網絡最后的輸出層,即 softmax單元的輸出是 1×1×4。
假設輸入給卷積網絡的圖片大小是 14×14×3,測試集圖片是 16×16×3,現在給這個輸入圖片加上黃色條塊,在最初的滑動窗口算法中,你會把這片藍色區域輸入卷積網絡(紅色筆
標記)生成 0 或 1 分類。接着滑動窗口,步幅為 2 個像素,向右滑動 2 個像素,將這個綠框區域輸入給卷積網絡,運行整個卷積網絡,得到另外一個標簽 0 或 1。繼續將這個橘色區域輸入給卷積網絡,卷積后得到另一個標簽,最后對右下方的紫色區域進行最后一次卷積操作。我們在這個 16×16×3 的小圖像上滑動窗口,卷積網絡運行了 4 次,於是輸出了了 4 個標簽。
結果發現,這 4 次卷積操作中很多計算都是重復的。所以執行滑動窗口的卷積時使得卷積網絡在這 4 次前向傳播過程中共享很多計算,卷積網絡運行同樣的參數,使得相同的 5×5×16 過濾器進行卷積操作,得到 12×12×16 的輸出層。然后執行同樣的最大池化,輸出結果 6×6×16。照舊應用 400 個 5×5 的過濾器,得到一個 2×2×400 的輸出層,現在輸出層為 2×2×400,而不是 1×1×400。應用 1×1 過濾器得到另一個 2×2×400 的輸出層。再做一次全連接的操作,最終得到2×2×4 的輸出層,而不是 1×1×4。最終,在輸出層這 4 個子方塊中,藍色的是圖像左上部分14×14 的輸出(紅色箭頭標識),右上角方塊是圖像右上部分(綠色箭頭標識)的對應輸出,左下角方塊是輸入層左下角(橘色箭頭標識),也就是這個 14×14 區域經過卷積網絡處理后的結果,同樣,右下角這個方塊是卷積網絡處理輸入層右下角 14×14 區域(紫色箭頭標識)的結果。
所以該卷積操作的原理是我們不需要把輸入圖像分割成四個子集,分別執行前向傳播,而是把它們作為一張圖片輸入給卷積網絡進行計算,其中的公共區域可以共享很多計算,就像這里我們看到的這個 4 個 14×14 的方塊一樣。
再看一個更大的圖片樣本,假如對一個 28×28×3 的圖片應用滑動窗口操作,如果以同樣的方式運行前向傳播,最后得到 8×8×4 的結果。跟上一個范例一樣,以 14×14 區域滑動窗口,首先在這個區域應用滑動窗口,其結果對應輸出層的左上角部分。接着以大小為2 的步幅不斷地向右移動窗口,直到第 8 個單元格,得到輸出層的第一行。然后向圖片下方移動,最終輸出這個 8×8×4 的結果。因為最大池化參數為 2,相當於以大小為 2 的步幅在原始圖片上應用神經網絡。
總結一下滑動窗口的實現過程,在圖片上剪切出一塊區域,假設它的大小是 14×14,把它輸入到卷積網絡。繼續輸入下一塊區域,大小同樣是 14×14,重復操作,直到某個區域識別到汽車。
我們不能依靠連續的卷積操作來識別圖片中的汽車,比如,我們可以對大小為 28×28 的整張圖片進行卷積操作,一次得到所有預測值,如果足夠幸運,神經網絡便可以識別出汽車的位置。
過這種算法仍然存在一個缺點,就是邊界框的位置可能不夠准確。