Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
Kaiming
He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun
The
13th European Conference on Computer Vision (ECCV), 2014
聲明:本文所有圖片均來自原始文章,自己的理解也未必正確,請查看原圖并拍磚
本文的兩個亮點:
1. 多尺度訓練CNN。
2. 將圖像分割后的特征轉換為最小計算量,大大加速了detection的速度。
關于第一點:我們知道,卷積保留了圖像的spatial信息,同時卷積層其實是不受輸入圖像大小的限制的,之所以在訓練CNN時,需要固定圖像尺寸,主要是由于全連接層的輸入需要固定維度的。但是,如果在進全連接層之前的一層,我們把無論多大的圖都轉換到相同維度,這樣前面其實是不限制圖像大小的。SPP在這里就起到了這個作用。這樣做一呢,解除了圖像大小的限制,二呢,可以多尺度圖像同時進行訓練CNN。從作者的實驗結果來看,確實是效果提升的。而在VGG的工作中,人為random選擇輸入圖像尺寸進行變換,然后再裁圖到224X224進行CNN訓練,就提高了分類效果。SPP的這種做法是另外一種多尺度吧,和VGG的這種不是很一樣其實,如下圖所示,在用SPP的效果,以及用了SPP同時采用多尺度的分類效果,多尺度進行訓練CNN效果要比之前提高不少。
Spp在cnn中的框架應用圖,基本思路就是用spp代替CNN中最后一個pooling層。其實,用更直白的話理解就是,由一個pooling變成了多個scale的pooling了。這種多尺度的應用,必定會給分類帶來好處的,這也是這個文章的一個亮點。如下圖所示,只是在pooling的時候,需要注意一下,文章中說到的1X1,2X2,…不是pooling的窗口大小,而是pooling后的大小,即pooling后變成了1x1的一個bin,2X2的4個bins,等等,這個就是multi level的過程,而傳統的滑動窗口的方式是single level的方式。于是,在pooling過程中,窗口的大小和步長的大小都需要去計算,這樣也有個好處,就是進來的conv5的輸出無論出來多大維度的信息,都可以將其pooling到同一個維度上。如下圖所示,再把1X1,2X2,…等這些信息組合展開作為fc6的輸入。
至此,SPP在CNN中用于分類的效果可見一斑。比較一下,這部分工作還是很牛的,簡單的幾層CNN,只是多了一個spp ,分類效果提升了不少。對比當今的網絡結構,他們只用了最原始的幾層CNN,沒有做深度加深,就提升了不少效果,速度快,訓練起來也是很靈活的,即使你只有CPU也可以,單個GPU也可以,不用去搭建多機多卡什么的,效果就不錯了。
上面是SPP在分類中的應用,那么在檢測中怎么用呢?其實,很多人贊這篇文章,可能大多數是因為這個(竊以為啊)。我們知道,目前做物體檢測的,或者說做視覺的,效果基本上被各種CNN刷新了。檢測也是,是基于CNN的R-CNN,也就是region CNN,也是berkely那幫人搞的,原理其實也不算復雜,但是其實相當復雜的。R-CNN的圖可以見下圖,其流程就是先對一張圖用圖像分割,比如selective search, random prime, bing等方法分割成若干個小的regions,當然這些regions其實基本上是被視為是一個完整物體的regions,然后將這些regions作為CNN的輸入,利用CNN提取這些regions的圖像特征,當然是最后一層softmax去掉的,然后進SVM分類器,從而得到這些regions是哪一類,當然由于你已經得到regions了,因而你也能得到這些regions在原始圖中的坐標,于是物體檢測的任務就完成了。當然,說著是不算復雜,但是仔細分析,其中涉及到幾個大模塊:1. 分割,regions提取,這個有專門的研究吧,比如selective search, random prime, bing等等,效果下降趨勢,當然速度上升趨勢。2.
Cnn的fine tuning或者訓練,你需要用這些待檢測或者與檢測物體相關的圖像做訓練數據集,怎么選,這個也會決定其效果的。3. SVM模塊,分類器SVM的訓練,學問大大的奧。我是菜鳥,不多說了,看原始文章和代碼吧https://github.com/rbgirshick/rcnn。
RCNN簡直是劃時代的出現,刷新了各種物體檢測效果。但是,其有個最大問題就是計算量問題。你想啊,那么多regions都進CNN,而根據我們做圖像分割的經驗,這些regions之間肯定存在重疊的,所以計算量一下子多了太多。Ss的方式,400X500的圖,大概有2000多個regions生成啊。
而SPP用在detection中,恰恰就避免了R-CNN重復計算的問題。
其實,之前我們也看過不少文章,比如regionlets等等(文章:Generic Object Detection With Dense Neural Patterns and Regionlets),但是這個方法效果并不是很好,原因是其用直方圖的方式將最后卷積層出來的特征統一維度,這樣做將CNN中具有spatial的特征全部抹掉了,而且直方圖本身也將CNN的良好描述能力抹殺了不少啊。在看看regionlets的文章,我覺得可能有兩個原因效果沒那么好,一個是圖的尺寸太小,另外一個原因是region是隨機組合選取的,可能按照selective search等這種方式來選取region再做histogram,我感覺就是average pooling效果應該不錯。當時看到regionlets這篇文章時,我們也想用別的組合方式,將最后一層的特征進行組合,但是沒想到合適的,水平啊……
SPP用在CNN中用來做detection的框架圖如下圖所示:
其實,在這里也是要做圖像分割的,但是,并不是要所有2000個regions都進CNN提取特征,而是一張原始圖進CNN提取特征,這2000個regions不是有坐標嗎?因此在conv5之后,也能知道對應的windows是哪里。然后,我們要對這些windows用上面介紹的SPP的方式,用多個尺度的pooling分別進fc層,然后是SVM,從而判斷這些windows進而對應的regions是否是某一個目標。這樣做能夠節省大量計算量,因為在CNN中,其實卷積和pooling占據了80%左右的計算時間,而SPP只是放在最后一個pooling層了,因此,時間節省是大大的,根據作者文章說的,大概快了20-60倍啊。原來我們覺得可能這樣以來,就可以工程應用了,但是目前來看,估計時間還是瓶頸,因為其實前面region分割的時間也不少,selective search大約要1s呢。
值得提到的一點是,在文中,作者用的圖像大小最小是480的,猜測可能用過小尺寸,但是效果不好。想想也知道,如果用特別小的原始圖像,經過一系列conv和pooling后,有些小的region可能會被干掉了。但是把原始圖放大了,應該在最后還有保留的。具體原始圖像中的坐標怎么和最后conv5出來的對應上,作者文章中給了附錄,計算方式和另外一篇文章Generic Object Detection With Dense Neural Patterns and Regionlets中給出的類似,原理就是conv和pooling降維的尺寸一個一個計算。文章第二版的信息量很大,值得好好研讀的,細節的東西不少,期待作者早點放出來代碼。
代碼:https://github.com/ShaoqingRen/SPP_net
PS.最近兩周多,在自己機器上搭建caffe windows和spp_net,折騰人的很啊,最終還是搞定了。
測試了一下,個人普通臺式機,CPU下,多尺度(5個尺度)的spp下,一張pascal的圖大概要50s的時間,這個也是可以理解的,畢竟都要cnn卷積一遍,這個是很費時間的。單個尺度的話,10s一張圖。實際測試下來,當圖片輸入是480時,典型的目標已經無法得到了。
另外,由于要求輸入的圖像可以是大圖片的,而且一次性存了不少張,我懷疑我的GPU不夠用,在申請空間時,GPU掛掉。CPU比GPU存儲大,就沒事。
總結
以上是生活随笔為你收集整理的Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BeanFactory – BeanFa
- 下一篇: hihoCoder #1183 : 连