1、grandfather: R-CNN網絡
結構如下:
工作流程:
Input(an image) Proposals(~2K個,在使用CNN提取特征之前還要先resize)
feature maps
每類得分,再經過NMS篩選,再使用手工設計的回歸器進行box regression;
缺點:
(1)速度慢,2K多個proposals都要經過CNN提取特征;
(2)先分類在再回歸,沒有實現end to end;
2、father: fast R-CNN網絡
結構如下:
工作流程:
Input(an Image,同時已經用SS提取了proposals,知道了它們的位置) 整圖的feature map(同時將proposals映射到了feature map上)
(經過Rol Pooling的resize操作)
再使用softmax分類以及box regssion
改進:
(1)不用再對每一個proposal單獨提取特征,大大提高了速度;
(2)引入了ROI Pooling層;
(3)將分類和回歸加入了網絡,且共享卷積層,不用再像R-CNN中那樣單獨訓練SVM和回歸器了;
缺點:
(1)依然在使用SS(selective search)提取候選框,很耗時;
為了摒棄SS,我們取而代之使用RPN網絡,即用CNN實現提取特征框的功能,這樣一來所有的操作都可以通過CNN實現了,真正實現了end to end,然后我們的豬腳登場了:
3、son : faster-rcnn的網絡結構如下:
如上圖所示,(im_info = [M , N , scale_factor]),說一下它的前向傳播流程:
(1)一般對於輸入的圖像,P*Q的原圖先統一縮放為M*N,並且在前面的特征提取層(也可稱“共享卷積層”)中,由於stride = 1 , pad = 1 , kernel size = 3 * 3,所以卷積前后圖像大小不變,只有四個Pool層起到了作用,因此原始圖像經過提取層后的feature map大小為(M / 16)* (N /16),這樣做也是為了使原始圖像到feature map的縮放系數為整數從而使得feature map上的每個特征點和M*N的原始圖像的區域坐標更方便地實現一一映射關系,這對后面生成proposal會有幫助;
(2)RPN結構中第一個層是一個3*3的卷積層,它作用在經過特征提取層后的feature map上,我覺得這個3*3的卷積作用是為了增加目標附近區域的語義理解;然后再經過兩條支路,每條都首先經過一個1*1的卷積。先看上面一條,這條的作用是對“foreground”和"background"進行二分類,所以經過1*1之后的深度為18(9*2,對應每個點生成9個anchors和每個anchor兩個類別),再看下面一條,也是經過一個1*1的卷積,深度為36(9*4)進行矩形框回歸,然后這兩條支路匯合,首先去除掉background類別,然后對於剩下的forground類別,利用im_info先將anchors放大到M*N的原始圖像上,這些放大后在原始圖像上的區域就是一開始的proposals,數量很多所以我們還要進行兩次篩選:第一次,判斷這些proposals是否大范圍超出圖像邊界,剔除嚴重超出邊界的;第二次,對剩下的proposals進行nms,然后對nms后的proposals根據cls scores進行排序,選取top-N個作為最終的proposals(一般在600個左右),其實到這里檢測任務差不多就完成了,但作者后面還加另一步,相當於一個refine;
(3)之后就涉及到ROI Pooling層了,由於RPN輸出的proposals對應的M*N的輸入圖像,所以我們先通過im_info中的scale_factor將其映射到特征提取層的feature map上,但由於后面需要經過全連接層,而這里每個proposals映射到feature map上的大小均不同,所以我們使用了ROI Pooling層將這些proposals映射后的大小固定(7*7或者6*6,好像論文和實現里稍微有點不同,看代碼就知道了),然后這塊固定的區域再經過全連接層進行分類和坐標框回歸;
關於如何訓練,參考這個:https://www.cnblogs.com/zf-blog/p/7142463.html
補充:
(1)bounding box regression: