检测系列--RCNN系列
一.RCNN
框架:
1.selective search
2,區域預處理,尺寸縮放到227×227
3.利用Alexnet(去掉最后分類層,4096維向量),做特征提取,一個物體一個SVM分類,(當時認為SVM比softmax分類好)bounding box回歸
4.正負樣本選擇方法
全連接層最后一層換成分類數+背景,IOU>0.5,正樣本,IOU<0.5,負樣本,每個類別對應一個SVM分類器
5.回歸,利用的是第五層卷積特征做回歸
6.測試,測試出來的最大分值的框,做NMS去掉多余的框
7.評價指標,召回率例如是壞人就抓回監獄
速度慢的原因:每個區域都需要卷積,用于SVM、b-box 回歸的特征需要存儲到磁盤中,這將需要占用大量的磁盤空間,而且提取這些特征也會耗費好多時間。
問題:訓練時間很長(84小時),Fine-tune(18)+ 特征提取(63)+ SVM/Bbox訓練(3),測試階段很慢:VGG16一張圖片47s,復雜的多階段訓練。
二.SPP-Net
1.改進:(1)共享卷積,直接在Conv5用特征
(2)引入空間金字塔池化(spp),為不同尺寸的區域在conv5輸出上提取特征,映射到尺寸固定的全連接層
2.spp網絡結構
3.分塊,塊里面做最大池化
4.特征位置與原圖對應
5.訓練過程:注意與RCNN區別,凍結卷積層權重
問題:
? 繼承了R-CNN的剩余問題,需要存儲大量特征,復雜的多階段訓練,訓練時間仍然長(25.5小時),Fine-tune(16)+ 特征提取(5.5)+ SVM/Bbox訓練(4),帶來了新問題,SPP層之前的所有卷積層參數不能fine tune,誤差過不了spp層,因為計算困難。
三.Fast R-CNN
1.改進:
比R-CNN,SPP-Net更快的trainng/test,更高的mAP,?實現end-to-end(端對端)單階段訓練,多任務損失函數(Multi-task loss),?所有層的參數都可以fine tune,?不需要離線存儲特征文件
2.引入新技術
感興趣區域池化層(RoI pooling layer)替換spp層,?多任務損失函數(Multi-task loss)
3.roi pooling,注意:spp和roi的區域都是通過slective search選擇的,此時誤差可傳過roi了。
roi pooling缺點:
由于兩次量化帶來的誤差;
(1)將候選框邊界量化為整數點坐標值。
(2)將量化后的邊界區域平均分割成 k x k 個單元(bin),對每一個單元的邊界進行量化。
針對修改的roi align
- 遍歷每一個候選區域,保持浮點數邊界不做量化。
- 將候選區域分割成k x k個單元,每個單元的邊界也不做量化。
- 在每個單元中計算固定四個坐標位置,用雙線性內插的方法計算出這四個位置的值,然后進行最大池化操作。
對小目標檢測有很大改善?
https://www.cnblogs.com/zf-blog/p/9934086.html
4.重疊區域誤差傳播做法
5
5.修正框
6.損失函數
7.奇異值分解,加速全連接
8.性能比較
四,Faster R-CNN
1.網絡結構
如上圖,一副P*Q的圖像,先縮放到M*N大小,然后進入backbone提取特征,對于RPN,先用3*3卷積,在兩個1*1卷積分別生成positive anchors和對應bounding box regression偏移量,然后proposal層負責綜合positive anchors和對應bounding box regression偏移量獲取proposals.而roi pooling則利用proposals提取出相應的feature map進入后續的全連接分類.
2.改進
RPN理解
https://blog.csdn.net/bingochenjx/article/details/78422290
rpn代替selective search
3.RPN,conv5經3x3卷積核,1x1卷積核得到的特征去做回歸,另一個1x1卷積核得到的特征去做分類。
4.anchor選擇方法,一般k=9
首先我們需要知道 anchor 的本質是什么,本質是 SPP(spatial pyramid pooling) 思想的逆向。而SPP本身是做什么的呢,就是將不同尺寸的輸入 resize 成為相同尺寸的輸出。所以SPP的逆向就是,將相同尺寸的輸出,倒推得到不同尺寸的輸入。接下來是 anchor 的窗口尺寸,這個不難理解,三個面積尺寸(128^2,256^2,512^2),然后在每個面積尺寸下,取三種不同的長寬比例(1:1,1:2,2:1).這樣一來,我們得到了一共9種面積尺寸各異的 anchor 。示意圖如下?
?
至于這個 anchor 到底是怎么用的,這個是理解整個問題的關鍵。?
下面是整個 Faster RCNN 結構的示意圖:?
利用anchor是從第二列這個位置開始進行處理,這個時候,原始圖片已經經過一系列卷積層和池化層以及relu,得到了這里的 feature:51x39x256(256是層數)
在這個特征參數的基礎上,通過一個3x3的滑動窗口,在這個51x39的區域上進行滑動,stride=1,padding=2,這樣一來,滑動得到的就是51x39個3x3的窗口。對于每個3x3的窗口,作者就計算這個滑動窗口的中心點所對應的原始圖片的中心點。
然后作者假定,這個3x3窗口,是從原始圖片上通過SPP池化得到的,而這個池化的區域的面積以及比例,就是一個個的anchor。換句話說,對于每個3x3窗口,作者假定它來自9種不同原始區域的池化,但是這些池化在原始圖片中的中心點,都完全一樣。這個中心點,就是剛才提到的,3x3窗口中心點所對應的原始圖片中的中心點。
如此一來,在每個窗口位置,我們都可以根據9個不同長寬比例、不同面積的anchor,逆向推導出它所對應的原始圖片中的一個區域,這個區域的尺寸以及坐標,都是已知的。而這個區域,就是我們想要的?proposal。所以我們通過滑動窗口和anchor,成功得到了?51x39x9?個原始圖片的?proposal。
接下來,每個 proposal 我們只輸出6個參數:每個 proposal 和 ground truth 進行比較,把與ground truth 中重疊最大的 bounding box 的iou當成是這個proposal的iou,?iou>0.7, 認為這個proposal是positive;iou<0.3, 認為這proposal是negative,我們希望positive的proposal包含前景的概率高一些,negative包含背景的概率高一些;iou位于這之間的不做處理。?
然后對每個proposal進行分類和bounding box regression:得到的前景概率和背景概率(2個參數)(對應圖上的 cls_score);由于每個 proposal 和 ground truth 位置及尺寸上的差異,從 proposal 通過平移放縮得到 ground truth 需要的4個平移放縮參數(對應圖上的 bbox_pred)。?
所以根據我們剛才的計算,我們一共得到了多少個anchor box呢??51 x 39 x 9 = 17900?
約等于?20 k
4,訓練過程,先訓練rpn做好anchor,在做fast rcnn,注意共享卷積層以后,要凍結卷積層
5,性能比較
6,網絡總體比較
fast rcnn多任務損失函數
7.帶FPN的RPN
? ? ? ??
對于FPN的話,也就是需要將每一層feature map逐個輸入到RPN網絡,同時每個feature map負責不同大小的目標.
?
五.R-FCN
1,全連接會喪失空間信息
2,紅色框是R-FCN的特有之處,所有通道數等于分類數+背景
3,每類對應每層通道
4,feature map? ?可視化
5,損失函數
六.cascade rcnn
faster rcnn存在問題:
train時:RPN階段選擇2000左右proposals,在選擇IOU大于一定閾值,比如0.5的,一般會選擇128個,滿足1:3比例,在進入fast rcnn經過roi pooling 在進行分類與回歸;
inference:RPN階段選擇300左右proposals,直接roi pooling進行分類與回歸,那么這里就沒有iou的選擇。這里就能看出train和inference時,回歸的框質量明顯不一樣,也就是mismatch問題。通常閾值取0.5時,mismatch問題還不會很嚴重
從實驗看出來推理時只有RPN選擇的iou和訓練時候的iou接近是,性能才最好,否則就是mismatch問題.也就看出來了單一閾值訓練出的檢測器效果非常有限,單一閾值不能對所有的Proposals都有很好的優化作用.
上圖就是cascade rcnn框架,RPN提出的proposals大部分質量不高,導致沒辦法直接使用高閾值的detector,Cascade R-CNN使用cascade回歸作為一種重采樣的機制,逐stage提高proposal的IoU值,從而使得前一個stage重新采樣過的proposals能夠適應下一個有更高閾值的stage。對于(b)detector會改變樣本的分布,這時候再使用同一個共享的H對檢測肯定是有影響的;對于(c)c3高質量檢測頭容易過擬合,但是還要去預測低質量框,檢測效果更差。
參考:
https://zhuanlan.zhihu.com/p/32702387
https://zhuanlan.zhihu.com/p/31426458
https://zhuanlan.zhihu.com/p/145842317
https://zhuanlan.zhihu.com/p/42553957
總結
以上是生活随笔為你收集整理的检测系列--RCNN系列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android下利用Bitmap切割图片
- 下一篇: 链表中的指针