arxiv 論文: https://arxiv.org/abs/1406.4729
簡介
雖然 R-CNN 開啟了深度學習應用在 Object Detection 的時代,但仍然存在許多缺點
- 浪費硬碟空間
- 部份訊息遺失
- 重複提取特徵
為了提升準確度與訓練速度,SPP-Net 主要是要解決部份訊息遺失以及重複提取特徵的問題
訓練
首先我們要先了解 R-CNN 的問題成因
部份訊息遺失
因為 CNN 內的 fully-connected layer 必須跟每個 pixel 做連接,需要指定 input/output 的 neuron 個數,因此 R-CNN 的作法是在輸入 CNN 之前就先對每個 Region Proposal 做切割或是變形 (Crop/Warp) 來 resize 成一樣的大小,但是這種作法會導致部份訊息的遺失
重複提取特徵
每個 Region Proposal 都會輸入 CNN 來提取特徵,但是會有大量的 Region Proposal 是出自同一張圖片,這其實是對同一張圖片上的某些部份重複提取特徵,這也是 R-CNN 非常耗時的原因之一
SPP-Net 解法
既然最終目的是取得每個 Region Proposal 各自的特徵,而且這些特徵都出自同一張圖,那麼我們是否將原始圖片輸入 CNN 取得整張圖片的特徵之後,再透過「某種 Mapping」找到每個 Region Proposal 在整張圖片的特徵中相對應的位置,最後再透過「某種 resize」把所有特徵變成同樣的大小,最後再經過 fully-connected layer 就好?
如上圖所示,在 CNN 裏面的原圖經過多層 convolution 跟 pooling 之後產生的 feature map 相對位置還是不變的,基於這個特性,我們可以從原圖上 Region Proposal 的位置找到他映射在 feature map 上的位置,而這個「某種 Mapping」就是根據 convolution layer 中 filter 的 stride 去計算相對位置,細節請參考 Reference 或是論文
剩下的問題是: 要如何把這些在 feature map 上透過相對位置取得的 Region Proposal resize 成相同大小而又不遺失太多訊息?
這就是 SPP-Net 的核心貢獻,Spatial Pyramid Pooling (SPP), 主要的想法是先決定 output 大小,然後所有圖片再設計各自的 filter 參數 (window size, stride) 讓最後的每個 feature 大小都一樣,另外這邊之所以叫作 Pyramid Pooling (金字塔 Pool ㄛ ng) 是因為考慮到每個 Region Proposal 大小細節不一,所以同一個 Region Proposal 需要經過多個不同 scale 的 filter 然後再做 concat
結果
以網路結構來說,SPP-Net 主要更改了 CNN 的架構,前面透過 SS 演算法取得 Region Proposal 的方式以及最後經過 SVM 分類 + bounding box regression 的算法都跟 R-CNN 一樣,論文中也實驗了多種 input size 或是使用不同的 CNN model 等等其他方式,我這邊就不贅述
SPP-Net 發現透過整張圖片取特徵再抓相對位置比起 Region Proposal 個別經過 CNN 取得的特徵還要準,這邊我會把他解釋成有些特徵是需要綜觀全圖才會得知,所以不應該以 Region Proposal 當作 input image
以下附上 R-CNN 作者 (rbg 大神) 在 ICCV 2015 的投影片中比較 R-CNN 跟 SPP-Net (Kaiming He 大神) 的數據
Reference
補充
這邊同樣的很多數學跟演算法我比較沒有去深究,原因是這些方法還是存在一些冗餘,在接下來的論文中就會被取代了
但是這邊可以注意的是 R-CNN 作者跟 SPP-Net 作者都是出自 FAIR (Facebook AI Research)…
- rbg homepage: http://www.rossgirshick.info/
- Kaiming He Homepage: http://kaiminghe.com/