天天看點

CV-筆記-重讀Faster R-CNN即region proposal network(RPN)區域建議網絡

目錄

    • RPN region proposal network
      • anchor
      • 參數量
    • 正負樣本選擇
    • RPN的損失函數
    • 訓練RPN
    • 實作細節
    • 整體的網絡結構就是這樣

Faster R-CNN主要是講區域建議網絡,而ROI pooling部分還是在Fast R-CNN裡面介紹的。

RPN region proposal network

  • 利用網絡産生region proposal(區域建立,候選區域),在網絡的最後一層增加幾個卷積層在一個固定的網格中回歸包圍框和目标分數來建構RPN。
  • 交替訓練region proposal和object detection。region proposal和object detection的基礎特征是共享的,是以效率非常高。
  • RPN使用了anchor,是以不需要利用圖像金字塔或者特征金字塔來進行多尺度的目标檢測,使用了anchor以後隻需要在一張特征圖上進行檢測出不同大小的目标。如果使用圖像金字塔就需要縮放,利用特征金字塔就需要在不同尺度的特征圖上檢測對應大小的目标(FPN其實也證明了特征金字塔是有效的,但是一直特征圖上檢測多個尺度的目标還是很必要的),如下圖c所示就是anchor機制,圖a是圖像金字塔,b是特征金字塔處理的效果。
    CV-筆記-重讀Faster R-CNN即region proposal network(RPN)區域建議網絡
  • RPN的輸入是任意形狀的圖像,輸出是一個長方形的目标建議區域和目标置信度。從這裡可以看到其實單單一個RPN就可以看做是一個完整的end-to-end網絡了。隻是說後面的二次分類是共用之前backbone的特征圖的。
  • 文章中的 top一般是指網絡的深層。down是指淺層。計算感受野從輸入到輸出的計算公式是 :
    • rf = 上一層rf + (kernel size - 1)* stride * dilated rate, 這個是遞推法,這裡的 stride是之前的是以stride累乘得到。
    • 這裡有個重點就是有stride的時候下一次才會乘stride,例如做max pooling的時候是不立即計算stride的,而是下一步加上stride計算。
    • 還有個是stride是累乘的。
    • 參考連結:
      • http://zike.io/posts/calculate-receptive-field-for-vgg-16/
      • https://blog.csdn.net/Fanniexia/article/details/102512267
  • 為了産生region proposal,用一個小的網絡進行卷積,文章中使用了一個3x3的卷積層作為小的網絡如下圖所示,然後文章中計算出來做了3x3的卷積以後的感受野是228,因為vgg16最後一個特征圖(不算最後的maxpooling)的感受野是196,根據上面給出的公式,那最後region proposal的感受野就是

    196+(3-1)*16=228

    。這裡的16是之前做了4次pooling,stride累乘就是16。
  • 想要了解這個RPN最好不要去看下圖的右邊的anchor和sliding window,這回讓人很難了解,不要去看就好了解了,就像分割一樣了。
    CV-筆記-重讀Faster R-CNN即region proposal network(RPN)區域建議網絡

anchor

  • anchor
    • 其實這一塊不用想的特别複雜,他雖然畫了一個anchor再上面,這裡畫出來隻是表示最終anchor的特征是在這裡提取的,重點不是在這個anchor上,anchor隻是一個虛拟的大小的寬,用來給坐标回歸提供一個相對位置的,或者說是一個參考的坐标系(類似于這個作用),但是其實做資料還是按照規定在固定的網格中做資料就可以了,對應的坐标和置信度,主要的還是這兩個分支。
    • anchor的個數限制了feature map上每個點可以預測幾個region proposal。這個其實就像平時分類一樣,我可以最後輸出4個神經元來預測四個類别,那我也可以輸出8個神經元來預測8個類别。一個道理,這裡假設規定了k個anchor,那麼我們就預測k個框就好了。
    • 這裡的feature map上的點可以怎麼了解呢,就是說每個feature map的點是預測k組(這裡的組是指坐标+置信度)目标,就像平時我們是把特征圖拉直或者是做過global avg pooling,因為分類是最終分出幾個類别,是根據整體的資訊來的 ,這裡隻是不再進行降維了,而是每個點我出來預測一個東西。這樣其實有個好處就是,特征圖上的每個點對應的感受野其實是原圖上的一塊區域的,而且通常來說感受野是輸入中越靠感受野中間的元素對特征的貢獻越大的,如下圖所示,出自論文understanding-the-effective-receptive-field-in-deep-convolutional-neural-networks。是以這樣來預測其實是符合計算的。
CV-筆記-重讀Faster R-CNN即region proposal network(RPN)區域建議網絡

* 我靠之前怎麼想不到,這個其實就是和分割差不多啊,分割的輸出也是不進行降維的,也是一個像素其實對應一塊區域的感受野的。

  • 文章中老是說滑動視窗(sliding windows on the feature map)太令人誤會了,其實就是加了一個卷積層然後再進行預測寬和置信度。
  • The design of multiscale anchors is a key component for sharing features without extra cost for addressing scales.

參數量

  • region proposal小網絡(文章中說小網絡,其實就是1個分支,也就是1個卷積層)提到了Each sliding window is mapped to a lower-dimensional feature (256-d for ZF and 512-d for VGG, with ReLU [33] following).和our output layer has 2.8 × 10 4 parameters (512 × (4 + 2) × 9 for VGG-16),這裡的512是指這個分支卷積層的channel數,就像隐藏層的參數個數一樣,他這邊的參數量應該不是所有的feature map上的點,因為輸入圖像大小不一樣,featuremap大小也是不一樣的。所有這裡說的參數是featuremap上一個點的region proposal的參數量,所有文章又補充說明了一下,如下圖:
CV-筆記-重讀Faster R-CNN即region proposal network(RPN)區域建議網絡

正負樣本選擇

二分類,是目标或者不是目标。每個anchor都有一個坐标和一個類别。

正樣本選擇,有兩種anchor都是算作正樣本:

  1. 和ground truth的 IOU最高的anchor;
  2. 和ground truth的 IOU大于0.7的anchor;

注:通常,第二個條件足以确定陽性樣本;但我們仍然采用第一種情況,因為在少數情況下,第二種情況可能找不到陽性樣本。

負樣本選擇:

  1. 和ground truth的 IOU小于0.3的算負樣本的anchor。

這樣哪個anchor是正樣本和負樣本配置設定好了就友善了,這樣資料做出來就是每個anchor的分類的label就有了,1或者0 。

RPN的損失函數

損失函數如下圖所示:

CV-筆記-重讀Faster R-CNN即region proposal network(RPN)區域建議網絡

可以看出又兩個損失函數組成,一個是分類loss,另外一個是坐标回歸的loss:

  • 帶星号的表示ground truth,即label,1表示正樣本,0表示負樣本。
  • 分類為log loss,也就是交叉熵。
  • 回歸為smooth L1,從公式可以看出乘以一個p星,說明隻計算正樣本的損失,負樣本是不計算損失的。
  • 乘以一個N分之一,這個是做一個歸一化,分類的N為batch-size的大小,回歸的N是batch-size乘以anchor數(即所有anchor的數量),這裡可以看到回歸是除以了是以anchor的數量,而分類的隻除以batch-size。然後這裡的lambda參數又是來平衡兩個loss,這裡論文中設定了一個10效果最好,那麼傻逼了,因為文章anchor是9,那麼乘10再除9 來平衡,tm的為什麼不直接除batch-size,幹嘛還乘一個anchor個數來平衡。
  • 坐标回歸的loss:
    CV-筆記-重讀Faster R-CNN即region proposal network(RPN)區域建議網絡
    文章中有一定沒提到,就是anchor的x,y的坐标是怎麼計算的,我想應該就是按照将圖像分割成

    特征圖大小的m*n個格子

    ,然後格子的中心點就是anchor的x,y的坐标(就像yolo一樣,就是格子的中心點,隻是yolo v1裡面寬高是按照圖像的邊緣大小回歸相對坐标的)。因為w和h都是自己定義的尺寸。

    可以看出這裡的label是經過轉換得到的,是以預測出來的結果還需要經過變換,轉換到原來的坐标和長寬。可以把回歸看做是和最接近的anchor計算相對位置的,因為做label(正負樣本)的時候就是選擇IOU(接近)大的anchor的。

訓練RPN

  • loss: SGD
  • batch size=256,由于單個圖像會存在非常多的正樣本和負樣本anchor,但是負樣本總是會比正樣本多,是以為了防止偏向于負樣本,是以每次選擇256個anchor進行計算loss作為mini-batch,這樣讓正負樣本接近1:1,如果正樣本少于128,則用負樣本填充。
  • backbone使用遷移ImageNet預訓練參數,其他層使用高斯分布随機初始化。
  • 初始學習率0.001訓練60k次,然後0.0001訓練20k次。
  • momentum = 0.9 , weight decay = 0.0005
  • 交替訓練RPN網絡和Fast R-CNN是交替訓練的。原文:Alternating training. In this solution, we first train RPN, and use the proposals to train Fast R-CNN. The network tuned by Fast R-CNN is then used to initialize RPN, and this process is iterated. This is the solution that is used in all experiments in this paper.

實作細節

  • Multi-scale feature extraction (using an image pyramid) may improve accuracy but does not exhibit a good speed-accuracy trade-off
  • total stride for both ZF and VGG nets on the last convolutional layer is 16 pixels,Even such a large stride provides good results, though accuracy may be further improved with a smaller stride.
  • For anchors, we use 3 scales with box areas of 128 2 , 256 2 , and 512 2 pixels, and 3 aspect ratios of 1:1, 1:2, and 2:1.
  • We note that our algorithm allows predictions that are larger than the underlying receptive field. Such predictions are not impossible—one may still roughly infer the extent of an object if only the middle of the object is visible.看見局部也可能認識整個物體,但是邊緣怎麼解釋呢,rpn怎麼知道物體多大,是以其實感受野還是大點好。
  • 訓練的适合超過邊框的anchor不計算loss,什麼叫超過邊框呢?因為anchor是以最後一層特征圖映射回到原圖的點作為中心點的,是以邊框是有可能超過圖像的。這個以前困擾我很多,因為很多部落格都畫了超過圖像大小的anchor,是以很困擾,其實那樣畫是有問題的,明明是不計算loss的,是以就不用設計無論怎麼樣都會超過圖像的邊框的anchor。測試的适合預測出來這種,就階段到邊緣就可以了,不是丢掉。
  • 一些RPN建議彼此高度重疊。為了減少備援,我們根據建議區域的cls評分,對其采用非最大抑制(non-maximum suppression, NMS)。我們将NMS的IoU門檻值設為0.7,這樣每個圖像就有大約2000個建議區域。
  • 在NMS之後,我們使用排名前n的建議區域進行檢測。下面,我們使用2000個RPN建議來訓練Fast R-CNN,但是在測試時評估不同數量的建議。

整體的網絡結構就是這樣

ROI Pooling結構可以仔細看Fast R-CNN,這篇文章沒有仔細介紹。

CV-筆記-重讀Faster R-CNN即region proposal network(RPN)區域建議網絡

繼續閱讀