1. 程式人生 > >[論文學習]《Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 》

[論文學習]《Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 》

  • faster R-CNN的主要貢獻
    • 提出了 region proposal network(RPN),通過該網路我們可以將提取region proposal的過程也納入到深度學習的過程之中。這樣做既增加了Accuracy,由降低了耗時。之所以說增加Accuracy是因為,RPN是可以通過反向傳播訓練的,所以他提取的proposal也會更準確一些。
  • The Flowchart of the Faster RCNN
    image
  • faster R-CNN 的幾個主要概念(按照網路的結構順序來)

    • RPN block,如下圖所示。他的輸入就是feature map,輸出是K個anchor,以及對應的score和coordinates。其中score代表的是這個bbox是前景(foreground, fg)還是背景(background, bg),coordinates代表是bounding box 的座標。
      image

      • RPN中首先將每一個slide Windows變成一個256/512(ZF/VGG respectively)維的向量,代表的是提取特徵。因為我們要對每個slide window做這一步操作,所以這步操作也可以通過卷積來完成,卷積kernel的size就是slide window的大小。假設,我們Feature map 的大小為w*h, 我們每個anchor的size和長寬比都有三種,所以針對每個pixel,我們可以得到的anchor的個數為9個。(注意,一開始anchor是針對每個pixel都提取的,只不過後來通過一些演算法剔除了一些)。
      • proposal score:在第一步,我們得到了中間層,抽象來講就是每個pixel的特徵向量,要知道這裡的pixel對應到原圖中就是16倍的(vgg16為例)。然後我們再通過一個卷積層來預測每個pixel的每個anchor的得分。所以這裡的輸出就是w*h*18。
      • proposal bbox location:同上一步,這裡的輸入也是第一步的輸出。在上一步中,我們已經得到了bounding box的座標,這一步的作用是對上面的座標進行微調(平移和縮放)。也需要4個引數。所以這裡的輸出就是w*h*36。
    • 到目前為止,我們就已經可以訓練RPN了。下面是訓練RPN中的知識點:
      • Loss function 是由兩部分組成,第一部分是對proposal score計算交叉熵,第二部分是對proposal bbox計算Smooth L1 loss。
      • 對proposal score計算交叉熵:首先是通過Softmax得到概率。既然計算交叉熵,那麼我們的label是什麼呢?我們知道我們已經得到了許多anchor,每個anchor都可以對映到原圖上去,而原圖也是有ground truth的。所以我們的label主要是通過anchor與ground truth(bounding box)的IoU的值來決定的。原文將anchor的label分為三種類型:1,0,和-1。它們分別代表fg,bg和don’t care。其中fg有兩個條件:1、IoU的值大於0.7。2、ground truth對應IoU最大的anchor。兩者只要滿足其一就認為是fg。bg的話就是IoU不滿足條件。don’t care一般是指anchor不合法,比如說越界等情況。為了減少計算量,文中提出了一種優化方法,也就是限制fg和bg的個數。文中限制的總數不超過256個,fg的個數不超過128個。然後計算交叉熵的時候,我們只關注fg和bg。
      • 對於proposal bbox location計算Smooth L1 loss。其中Smooth L1 loss的定義如下所示:
        x i = w i n ( t i v i ) i { x , y , w , h } L 1 ( x i ) = { 0.5 x i 2 σ 2 | x i σ | < 1 | x i | 0.5 σ 2 o t h e r w i s e S m o o t h L 1 = w o u t i x , y , w , h L 1 ( x i )
        -其中 w i n 是選擇那些fg的anchor,其餘的都為0。 w o u t 是為了正則化。總的來說,就是我們只對fg計算Smooth L1 loss。
    • 到目前為止,我們已經可以提取proposal了(bounding box),為了消除提取proposal的冗餘性,我們使用non-maximum suppression(nms,非最大抑制)。
      • 演算法流程:
        • 按照得分從高到低將N個矩陣排序,假設排序好的最高得分的是R1,並且得分依次遞減,Rn的得分最低。
        • 從前往後找到第一個未被確定的矩陣x
        • 從該位置往後遍歷,計算每一個矩陣y與矩陣x的IoU值,如果該值大於閾值,則刪除矩陣y,否則繼續該步驟。直到遍歷完成整個矩陣集合。
        • 重複步驟2,直到集合中的所有元素都已經確定。
      • 注意,演算法裡面的score就是我們之前預測的每個anchor的score。
    • 到目前位置我們已經找到了將要輸入R-CNN的proposal,接下來就是給所有的proposal賦予相應的label,這是依據他對某個ground truth的IoU值來確定的。
    • 到目前為止,我們得到了proposal和label。但是在輸入到R-CNN前還有一問題,那就是我們的proposal的大小是不一致的,但是我們在輸入到fully connected layer之前必須將他們的維度變成一致的。在這裡,作者採用了RoI pooling的方法。RoI Pooling最直觀的介紹如下圖所示。通過RoI Pooling, 我們將所有的proposal的都變成了7*7的大小。
      RoI Pooling
    • 最後再將ROI Pooling的結果展開輸入到fully connected layer中去,實現object classification。
  • 實現程式碼:upcoder/MyFasterRCNN

  • 參考文獻: