很久之前試着寫一篇深度學習的基礎知識,無奈下筆之后發現這個話題確實太大,今天發一篇最近看的論文Fast RCNN。這篇文章是微軟研究院的Ross Girshick大神的一篇作品,主要是對RCNN的一些改進,但是效果十分明顯,paper和項目的地址都能從Ross Girshick的主頁找到:http://people.eecs.berkeley.edu/~rbg/
剛剛接觸深度學習,難免紕漏很多,還請大神指教。
自己的百度雲里也有一些相關內容http://pan.baidu.com/s/1o79NZ2E
文字內容大多是自己講解時的PPT的內容。
背景介紹
Fast rcnn是針對RCNN+SPP-NET的改進,改進的原因是:
1.Training is a multi-stage pipeline.
2.Training is expensive in space and time
3.Object detection is slow
1.RCNN
RCNN的結構示意圖
首先看一下RCNN的框架圖,大概的工作過程是:
- takes an input image,
- extracts around 2000 bottom-up region proposals,
- computes features for each proposal using a large convolutional neural network (CNN)
- classifies each region using class-specific linear SVMs.
詳細的說一下就是:首先輸入一張圖片,通過selective search獲得約2K個proposal(也就是candidate object locations),之后對圖像進行伸縮變換,把圖像變為固定尺寸的照片,之后把固定尺寸之后的圖片傳入CNN網絡中進行提取特征等操作,之后使用SVM分類器進行分類。
由此可以看出RCNN有這樣的缺點:
-
訓練的時候,多pipeline分離,首先提取proposal,之后使用CNN提取特征,最后使用SVM分類然后進行boundingbox regression。
-
訓練時間和空間開銷大。RCNN中ROI-centric的運算開銷大,所以FRCN用了image-centric的訓練方式來通過卷積的share特性來降低運算開銷;RCNN提取特征給SVM訓練時候需要中間要大量的磁盤空間存放特征,FRCN去掉了SVM這一步,所有的特征都暫存在顯存中,就不需要額外的磁盤空間了。
由此看一看出RCNN的問題所在,首先在提取完proposal之后,整個網絡對提取到的RCNN中的所有的proposal都進行了整套的提取特征這些操作,這些操作是非常耗時,耗費空間的。事實上我們並不需要對每個proposal都進行CNN操作,只需要對原始的整張圖片進行CNN操作即可,因為我們所提取到的proposal屬於整張圖片,因此對整張圖片提取出feature map之后,再找出對應proposal在feature map中對應的區域,進行對比分類即可。第二個問題所在就是在框架中2-3過程中的對提取到的區域進行變形,我們知道CNN提取特征的過程對圖像的大小並無要求,只是在提取完特征,進行全連接的時候才需要固定尺寸的特征,然后使用SVM等分類器進行分類操作,當然這兩個問題在SPP -NET中得到了很好的解決。
2.SPP NET
引入原因:在RCNN中,使用完ss提取proposal之后,對每個proposal都進行了CNN提取特征+SVM分類。
解決方法:因為region proposal都是圖像的一部分,我們只需要對圖像提一次卷積層特征,然后將region proposal在原圖的位置映射到卷積層特征圖上,這樣對於一張圖像我們只需要提一次卷積層特征,然后將每個region proposal的卷積層特征輸入到全連接層做后續操作。
更直白的講就是SPP-NET代替卷積網絡中最后一個pooling層,而且這pooling層是多scale的。
接下來看一下SPPNET的框架圖
SPPNET框架圖
圖中疊在一起的四個黑色方框是輸入圖像經過卷積層得到的特征圖(feature maps of conv5),圖中叫window的方框就是我們proposal在feature map中的對應位置,之后我們使用空間金字塔pooling層對這塊區域進行池化,得到一個固定尺寸的向量,之后再加入到全連接層中。
(這一篇論文正在看,先寫一部分大概內容,以后進行系統點補充)
關於Fast RCNN
FRCNN針對RCNN在訓練時是multi-stage pipeline和訓練的過程中很耗費時間空間的問題進行改進。
- 最后一個卷積層后加了一個ROI pooling layer。ROI pooling layer首先可以將image中的ROI定位到feature map,然后是用一個單層的SPP layer將這個feature map patch池化為固定大小的feature之后再傳入全連接層。
- 損失函數使用了多任務損失函數(multi-task loss),將邊框回歸直接加入到CNN網絡中訓練。
接下來看一下FRCNN的框架圖
FRCNN的框架圖
圖中省略了通過ss獲得proposal的過程,第一張圖中紅框里的內容即為通過ss提取到的proposal,中間的一塊是經過深度卷積之后得到的conv feature map,圖中灰色的部分就是我們紅框中的proposal對應於conv feature map中的位置,之后對這個特征經過ROI pooling layer處理,之后進行全連接。在這里得到的ROI feature vector最終被分享,一個進行全連接之后用來做softmax回歸,用來進行分類,另一個經過全連接之后用來做bbox回歸。
關於multi-task loss
參數含義:
p = (p0; : : : ; pK), over K + 1 categories.P是通過k+1個全連接層輸出使用softmax計算得到的。
v=
未完待續....