R-CNN系列核心思想簡單記錄
1. R-CNN
R-CNN系列的開山之作,思想很重要。
- 輸入一張圖像
- 提取一定數量的候選框
- 將候選框變形到固定的尺寸
- 將變形後的候選框送入CNN進行提特徵
- 將特徵送入SVM進行分類
- 將特徵送入迴歸器進行迴歸BBox
如何提取2000個候選框?
用Selective search算法選取,兼顧各個尺度。下面這個算法圖說的很清楚,其中初始化方法另一篇論文有說。
如何變形到固定尺寸?
原論文裏有比較了幾種方式,採用了不考慮圖像原始比率,變形到給定的固定的尺寸的辦法。
如何訓練?
CNN提特徵的網絡,先用ImageNet預訓練,然後在目標數據集微調,輸出21個類別(20物體+1背景)。然後再用訓練好的CNN去提特徵訓練SVM分類器和迴歸器。
關於CNN和SVM訓練樣本的問題
CNN把和GT(Ground Truth)IoU >=0.5的數據作爲正樣本,IoU < 0.5的作爲負樣本(背景)。而SVM在訓練的時候,用IoU < 0.3的數據作爲負樣本,GT作爲正樣本,其他的區間內的數據直接忽略不使用。
關於去除重複的候選框
NMS,非極大值抑制,核心思想是,在一個局部極值的鄰域內,將某個指標足夠大的區域剔除,只保留當前的極值區域。因爲極值區域就足夠代表當前這個鄰域的特徵了。
2. Fast R-CNN
改進R-CNN,主要在候選區域提特徵,和多任務訓練這裏。
- 輸入一張圖像
- 提取一定數量的候選框
- 將候選框區域映射到最後的featureMap上,提取對應的feature(每次尺寸都不一致)。
- 採用ROI pooling,就是將不同尺寸的feature劃分成相同尺寸的網格,然後沒有網格內取最大值,所以不同尺寸的feature可以統一變換到相同的尺寸。
- 將特徵向量經過全連接層進行分類、迴歸。
RoI pooling?
就是類似傳統CV的劃分區域的思想,雖然size各不相同,但是我都平均劃分成一樣的區域網格,最後得到的feature vector都是一樣的,便於後續網絡的訓練。
ROI projection?
本質上圖像變成featuremap後,featuremap和原始圖像的對應關係還是可以找到,所以可以在featuremap上找到和候選框對應的區域,然後選取這塊區域進行後續的計算。
Multi-Task?
將分類和迴歸放在一起進行,可以證明,提高了準確率,可以說相互促進吧。
相比於R-CNN
- 減少了CNN訓練時的冗餘,原來是一張圖分成多個區域,每個區域從頭進入CNN訓練,現在是圖片先進入CNN得到featuremap,然後在featuremap上用候選框選擇特徵然後進行計算。
- 將分類和迴歸整合在一起訓練,不用分開訓練。
- 還有SVD分解的小貢獻,提升速度,也不算核心的貢獻。
3. Faster R-CNN
繼續改進Fast R-CNN,候選框提取依然很慢(Selective Search),Faster R-CNN對候選框選取這裏進行優化。主要提出了RPN (Region Proposal Network)網絡,用來提取候選框。
- 輸入一張圖像
- 經過CNN提取特徵
- 對於特徵,每個位置對應9種不同的Anchor(候選框,尺寸人爲提前規定)。
- 對每個候選框進行分類和迴歸BBox,最後得出候選框。
- 有了featuremap和候選框,後面就和Fast R-CNN一樣了。
RPN?
核心貢獻,將候選框的選擇和加入到網絡的訓練中,認爲規定的Anchor基本可以覆蓋大多數目標。
相比於Faster R-CNN?
提升了速度和準確度,可以end to end訓練。
4. Mask R-CNN
對Faster R-CNN改進,可以進行實例分割任務,而且改動很簡單,主要是更換了ROI Pooling->ROI Align,以及增了一個分割的任務。
- Faster R-CNN 的步驟,提取feature map和候選框,其中ROI Pooling更換成了ROI Align。
- 後面,除了分類和迴歸,還額外增加了幾層網絡,用來輸出Mask。
ROI Align?
ROI Pooling在劃分網格的時候,不是均勻的劃分的,就是可能有的子區域大,有的小,但是最終都被一個數值來表示,例如3x3被pool成一個最大值,而2x2的區域也被pool成一個值,這樣可能讓feature產生了偏移。ROI Algin採用插值的思想,均勻的劃分,然後用插值來得到最後的值,可以緩解ROI Align的問題。