知識點
- mAP:detection quality.
Abstract
- 本文提出一種基於快速區域的卷積網絡方法(快速R-CNN)用於對象檢測。
- 快速R-CNN採用多項創新技術來提高訓練和測試速度,同時提高檢測精度。
- 採用VGG16的網絡:VGG: 16 layers of 3x3 convolution interleaved with max pooling + 3 fully-connected layers
Introduction
- 物體檢測相對於圖像分類是更復雜的,應爲需要物體準確的位置。
- 首先,必須處理許多候選對象位置(通常稱爲“proposal”)。
- 其次,這些候選者只提供粗略的定位,必須進行精確定位才能實現精確定位。
- 這些問題的解決方案經常損害 速度 , 準確性 或 簡單性 。
R-CNN and SPPnet
- R-CNN(Region-based Convolution Network)具有幾個顯著的缺點:
- 訓練是一個多級管道。
- 訓練在空間和時間上是昂貴的。
- 物體檢測速度很慢。
- R-CNN是慢的,因爲它對每個對象proposal執行ConvNet正向傳遞,而不共享計算(sharing computation)。
- Spatial pyramid pooling networks(SPPnets),利用sharing computation對R-CNN進行了加速,但是SPPnets也具有明顯的缺點,像R-CNN一樣,SPPnets也需要:
- 訓練是一個多階段流程,
- 涉及提取特徵,
- 用對數損失精簡網絡
- 訓練SVM
- 賦予邊界框迴歸。
- 特徵也需要也寫入磁盤。
- 但與R-CNN 不同 ,在[11]中提出的fine-tuning算法不能更新在空間金字塔池之前的卷積層。 不出所料,這種限制(固定的卷積層)限制了非常深的網絡的精度。
Contributions
- Fast R-CNN優點:
- 比R-CNN,SPPnet更高的檢測質量(mAP)
- 訓練是單階段的,使用多任務損失(multi-task loss)
- 訓練可以更新所有網絡層
- 特徵緩存不需要磁盤存儲
Fast R-CNN architecture and training
整體框架
快速R-CNN網絡將整個圖像和一組對象位置作爲輸入。
- 網絡首先使用幾個卷積(conv)和最大池層來處理整個圖像,以產生conv feature map。
- 然後,對於每個對象proposal, 感興趣區域(RoI)池層 從特徵圖中抽取固定長度的特徵向量。
- 每個特徵向量被饋送到完全連接(fc)層序列,其最終分支成兩個同級輸出層:
- 一個產生對K個對象類加上全部捕獲的“背景”類的softmax概率估計(one that produces softmax probability estimates over K object classes plus a catch-all “background” class)
- 另一個對每個K對象類輸出四個實數,每組4個值編碼提煉定義K個類中的一個的的邊界框位置。(another layer that outputs four real-valued numbers for each of the K object classes. Each set of 4 values encodes refined bounding-box positions for one of the K classes.)
The RoI pooling layer
- Rol pooling layer的作用主要有兩個:
- 一個是將image中的RoI定位到feature map中對應patch
- 另一個是用一個單層的SPP layer將這個feature map patch下采樣爲大小固定的feature再傳入全連接層。
- RoI池層使用最大池化將任何有效的RoI區域內的特徵轉換成具有H×W(例如,7×7)的固定空間範圍的小feature map,其中H和W是層超參數 它們獨立於任何特定的RoI。
- 在本文中,RoI是conv feature map中的一個矩形窗口。
- 每個RoI由定義其左上角(r,c)及其高度和寬度(h,w)的四元組(r,c,h,w)定義。
- RoI層僅僅是Sppnets中的spatial pyramid pooling layer的特殊形式,其中只有一個金字塔層
Initializing from pre-trained networks
- 用了3個預訓練的ImageNet網絡(CaffeNet/ VGG_CNN_M_1024 /VGG16)。預訓練的網絡初始化Fast RCNN要經過三次變形:
- 最後一個max pooling層替換爲RoI pooling層,設置H’和W’與第一個全連接層兼容。
- 最後一個全連接層和softmax(原本是1000個類)替換爲softmax的對K+1個類別的分類層,和bounding box 迴歸層。
- 輸入修改爲兩種數據:一組N個圖形,R個RoI,batch size和ROI數、圖像分辨率都是可變的。
Fine-tuning for detection
- 利用反向傳播算法進行訓練所有網絡的權重是Fast R-CNN很重要的一個能力。
- 我們提出了一種更有效的訓練方法,利用在訓練期間的特徵共享(feature sharing during training)。
- 在Fast R-CNN訓練中, 隨機梯度下降(SGD)小批量分層採樣 ,首先通過採樣N個圖像,然後通過從每個圖像採樣 R/N個 RoIs。
- 關鍵的是,來自同一圖像的RoI在向前和向後傳遞中 共享計算 和存儲。
- 此外爲了分層採樣,Fast R-CNN使用了一個流水線訓練過程,利用一個fine-tuning階段來聯合優化一個softmax分類器和bounding box迴歸,而非訓練一個softmax分類器,SVMs,和regression在三個獨立的階段。
Multi-task loss:
- 兩個loss,以下分別介紹:
- 對於分類loss,是一個N+1路的softmax輸出,其中的N是類別個數,1是背景。
- 對於迴歸loss,是一個4xN路輸出的regressor,也就是說對於每個類別都會訓練一個單獨的regressor的意思,比較有意思的是,這裏regressor的loss不是L2的,而是一個平滑的L1,形式如下:
我們利用一個multi-task loss L 在每個被標註的RoI上來聯合訓練分類器和bounding box regression
- Mini-batch sampling:在微調時,每個SGD的mini-batch是隨機找兩個圖片,R爲128,因此每個圖上取樣64個RoI。從object proposal中選25%的RoI,就是和ground-truth交疊至少爲0.5的。剩下的作爲背景。
Back-propagation through RoI pooling layers:
- RoI pooling層計算損失函數對每個輸入變量x的偏導數,如下:
y是pooling後的輸出單元,x是pooling前的輸入單元,如果y由x pooling而來,則將損失L對y的偏導計入累加值,最後累加完R個RoI中的所有輸出單元。下面是我理解的x、y、r的關係:
Scale invariance
- 這裏討論object的scale問題,就是網絡對於object的scale應該是要不敏感的。這裏還是引用了SPP的方法,有兩種:
- brute force (single scale),也就是簡單認爲object不需要預先resize到類似的scale再傳入網絡,直接將image定死爲某種scale,直接輸入網絡來訓練就好了,然後期望網絡自己能夠學習到scale-invariance的表達。
- image pyramids (multi scale),也就是要生成一個金字塔,然後對於object,在金字塔上找到一個大小比較接近227x227的投影版本,然後用這個版本去訓練網絡。
- 可以看出,2應該比1更加好,作者也在5.2討論了,2的表現確實比1好,但是好的不算太多,大概是1個mAP左右,但是時間要慢不少,所以作者實際採用的是第一個策略,也就是single scale。
- 這裏,FRCN測試之所以比SPP快,很大原因是因爲這裏,因爲SPP用了2,而FRCN用了1。
Fast R-CNN detection
- 大型全連接層很容易的可以通過將他們與 truncated SVD(奇異值分解) 壓縮來加速計算。
Main results
- All Fast R-CNN results in this paper using VGG16 fine-tune layers conv3 1 and up; all experments with models S and M fine-tune layers conv2 and up.
Design evaluation
Do we need more training data?
- 在訓練期間,作者做過的唯一一個數據增量的方式是水平翻轉。 作者也試過將VOC12的數據也作爲拓展數據加入到finetune的數據中,結果VOC07的mAP從66.9到了70.0,說明對於網絡來說, 數據越多就是越好的。