《Rich feature hierarchies for accurate object detection and semantic segmentation》閱讀筆記
R-CNN:Regions with CNN features
CNN一般用於分類,而R-CNN則用於目標檢測,這裏摘取VOC(Visual Object Classes)數據集官網中的一段話,說明二者的區別:
Classification: For each of the twenty classes, predicting presence/absence of an example of that class in the test image.
Detection: Predicting the bounding box and label of each object from the twenty target classes in the test image.
文中作者也提到了二者的區別:“Unlike image classification, detection requires localizing (likely many) objects within an image. ”目標檢測首先需要定位圖片中的對象,然後給出對象的標籤。分類只需要對每個類別依次判斷該圖片是否屬於這個類別。
所以我個人認爲目標檢測比分類問題多了一個步驟,即給出對象可能出現的region proposal。過去解決定位問題有兩種方法:
- 將定位過程看成迴歸問題,但是實際效果不是很好;
- .使用滑動窗口定位。但是Alexnet網絡pool5層輸出的特徵圖上的像素在輸入圖像上有很大的感受野(195 × 195 )和步長(32×32),會使得定位精度不高。
感受野(receptive fields)
感受野的定義
在卷積神經網絡中,感受野的定義是 卷積神經網絡每一層輸出的特徵圖(feature map)上的像素點在原始圖像上映射的區域大小。
感受野大小的計算
感受野計算時有下面的幾個情況需要說明:
- 第一層卷積層的輸出特徵圖像素的感受野的大小等於濾波器的大小;
- 深層卷積層的感受野大小和它之前所有層的濾波器大小和步長有關係;
- 計算感受野大小時,忽略了圖像邊緣的影響,即不考慮padding的大小。
關於感受野大小的計算採用top to down的方式, 即先計算最深層在前一層上的感受野,然後逐漸傳遞到第一層,使用的公式可以表示如下:
RF = 1 #待計算的feature map上的感受野大小
for layer in (top layer To down layer):
RF = ((RF -1)* stride) + fsize
stride 表示卷積的步長; fsize表示卷積層濾波器的大小。
步長的計算
這裏的每一個卷積層還有一個strides的概念,這個strides是之前所有層stride的乘積。
strides(i) = stride(1) * stride(2) * ...* stride(i-1)
以上摘自:卷積神經網絡物體檢測之感受野大小計算
R-CNN以AlexNet爲模型,計算感受野和步長時需要考慮conv層和pool層,即可驗證“have very large receptive fields (195 × 195 pixels) and strides (32×32 pixels) in the input image”這句話。
模塊設計
Extract Region proposals
使用selective search(選擇性搜索)提取輸入圖片中對象可能出現的位置,即一組bounding box。關於選擇性搜索可以參考 Selective Search for Object Recognition解讀 。
Compute CNN features
對每個提取到的Region proposals使用CNN提取特徵。由於每個Region的大小不一致,而CNN要求固定大小(227 × 227)的輸入,因此需要warp region(利用插值進行圖像變形)。在warping之前,將最緊密的包圍盒擴大p個像素,使得變形後的圖像塊融入一些圖像背景( Prior to warping, we dilate the tight bounding box so that at the warped size there are exactly p pixels of warped image context around the original box (we use p = 16))。
Classify regions
使用線性SVM進行分類。
Non-Maximum Suppression
該部分參考高效的非極大值抑制算法