Faster R-CNN算法解析

論文地址:

Faster R-CNN: Towards Real-Time ObjectDetection with Region Proposal Networks

Python實現(xiàn):

https://github.com/rbgirshick/py-faster-rcnn

簡介

Fast R-CNN算法采用SppNet的思想解決了R-CNN中圖像warp操作栖疑,并且避免了特征的重復(fù)計算(參見ROI Pooling的相關(guān)理解及Fast R-CNN與R-CNN的簡單對比)哨免,使區(qū)域 + 分類/回歸的檢測框架有了實時的可能到千。但是 region proposal 的生成仍是算法的一個速度瓶頸。

為了解決這一問題整吆,作者提出了Region Proposal Network(RPN),RPN 網(wǎng)絡(luò)共享輸入圖像的卷積特征壳繁,能夠快速生成候選區(qū)域坟募,計算代價小。生成的候選區(qū)送入Fast R-CNN網(wǎng)絡(luò)進行 detection番川。因此 Faster R-CNN 也可以理解為 RPN + Fast R-CNN(文中作者稱 RPN 具有attention的意味到涂,即告訴網(wǎng)絡(luò)關(guān)注的區(qū)域在哪里)脊框。

Faster R-CNN

RPN網(wǎng)絡(luò)

RPN 網(wǎng)絡(luò)的作用是輸入一張圖像,輸出一批候選矩形區(qū)域(region proposal)践啄,同時輸出的還有區(qū)域得分浇雹。RPN為全卷積網(wǎng)絡(luò),以 ZF 網(wǎng)絡(luò)或 VGG 網(wǎng)絡(luò)為 base 網(wǎng)絡(luò)屿讽,下圖是以 ZF-5 為參考的RPN網(wǎng)絡(luò)結(jié)構(gòu)(圖片是用Netscope在線生成的http://ethereon.github.io/netscope/#/editor

rpn結(jié)構(gòu)

黑線以上是 ZF-5 網(wǎng)絡(luò)的卷積過程昭灵,黑線以下是 RPN 網(wǎng)絡(luò)的特有結(jié)構(gòu)。對于 ZF-5 卷積得到的 feature map伐谈,采用n*n大小的 sliding window 進行滑動處理(即filter大小為n*n的卷積烂完,文中 n=3),然后通過1*1卷積輸出兩路诵棵,分別用于分類和回歸抠蚣。

如圖是 sliding window 的處理過程:

圖中的一些解釋

256-d:ZF-5 的最后一層輸出 filter 的個數(shù)是256,因此每一個滑動窗輸出是一個256維的向量履澳。

2k和 4k:首先解釋一下k嘶窄,在每一個滑動窗口的中心位置,預(yù)測k個候選區(qū)距贷,這些候選區(qū)被稱為 anchor(后文會解釋)柄冲。2k是因為分類層的輸出為目標(biāo)為 foreground 和 background 的概率,4k則是每個 anchor box 包含4 個位置坐標(biāo)忠蝗。

Anchor 的解釋

Anchor 是 RPN 網(wǎng)絡(luò)的核心现横,后續(xù)的一些目標(biāo)檢測網(wǎng)絡(luò)如 YOLOv2、SSD什湘、YOLOv3 也借鑒了這一機制长赞。

在 ZF-5 輸出的 feature map 上進行滑窗操作拳氢,是為了獲取滑窗對應(yīng)的感受野內(nèi)是否存在目標(biāo)(概率透敌,以及目標(biāo)的位置坐標(biāo))醇蝴,由于目標(biāo)大小和長寬比例可能不一豌鹤,因此需要多個窗口蝶防。Anchor 的機制是碟联,以滑動窗的中心為采樣點芥驳,采用不同的 scale 和 ratio码撰,生成不同大小共k個 anchor 窗口闸餐。對于一個W*H大小的 feature map 來說饱亮,生成的 anchor 總數(shù)為W*H*k。例如 scale 為(128舍沙,256近上,512),ratio 為(1:2拂铡,1:1壹无,2:1)時葱绒,則生成 9 種 anchor。

注:目標(biāo)識別任務(wù)應(yīng)具有平移不變性和尺度不變性斗锭,傳統(tǒng)的做法是采用 image pyramid 或 filter pyramid地淀,anchor 的機制滿足這樣的要求,且相比較兩種做法更加的 cost-efficient

采用 Anchor 機制能夠從整圖的 feature map 上直接提取候選區(qū)域(映射到原圖)及其特征岖是,相比較 R-CNN 和 Fast R-CNN 中 selective search(或EdgeBoxes) 的方法帮毁,避免了大量的額外運算,且整個過程融合到一個網(wǎng)絡(luò)中豺撑,方便訓(xùn)練和測試

訓(xùn)練

RPN 網(wǎng)絡(luò)的 loss 函數(shù)同樣是一個多任務(wù)的loss烈疚,包含兩個部分,classification 的 loss 和 regression 的 loss前硫。

首先胞得,對于 classification來說荧止,論文中將滿足以下兩種規(guī)則的 anchor 判定為 positive:1)anchor 與任一目標(biāo)的 ground truth box 的IoU值最大屹电;2)anchor 與任一目標(biāo)的 ground truth box 的IoU值 > 0.7。因此跃巡,存在一個 ground truth 對應(yīng)多個 anchor 的情況危号。當(dāng) IoU 值 < 0.3 時,則認(rèn)為 anchor 為 non-positive素邪,即背景外莲。除此之外,其他的 anchor 不參與訓(xùn)練兔朦。

如此偷线,loss 函數(shù)定義為(可惡的簡書不支持公式編輯。沽甥。声邦。)

式中,i是一個 mini-batch 下 anchor 的索引摆舟。p_i是 anchor 為目標(biāo)的概率亥曹。當(dāng)anchor為目標(biāo)時,p^*_i為1恨诱,否則為0媳瞪。t_i是預(yù)測框的位置坐標(biāo),t^*_i是ground truth的坐標(biāo)照宝。

L_{cls}是目標(biāo)與非目標(biāo)的對數(shù)損失蛇受,即

L_{reg}則采用 Fast R-CNN 中的平滑 L1 loss,不采用 R-CNN 和 SPP 中平滑 L2 loss 的原因是厕鹃,在防止梯度爆炸問題上兢仰,L1 loss 敏感性較低笼呆,學(xué)習(xí)率更容易調(diào)節(jié)。L1 loss 的形式為

其中旨别,

p^*_iL_{reg}表示 regression loss 只在 anchor 為 positive 時有效诗赌。

L_{cls}和L_{reg}分別由N_{cls}、N_{reg}進行歸一化秸弛,同時乘上系數(shù)\lambda铭若。論文作者發(fā)布的代碼中,N_{cls}為mini-batch的大械堇馈(如N_{cls}= 256)叼屠,N_{reg}為anchor的數(shù)量(如N_{cls}~ 2400)。另外绞铃,設(shè)置\lambda為10镜雨,則cls項和reg項的權(quán)重大體一致(事實上\lambda的影響不大,如下表所示)儿捧。

λ0.1110100

mAP(%)67.268.969.969.1

在計算 bbox 的 regression 時荚坞,采用以下計算方法

式中,x菲盾,y颓影,w,h表示框的中心坐標(biāo)及寬高懒鉴。x诡挂,x_a,x^*分別表示預(yù)測框临谱,anchor 框和 ground truth 框(y璃俗,w,h同理)悉默。

RPN 通過 Back Propagation 和 SGD 的方法進行端到端的訓(xùn)練城豁。參照Fast R-CNN 中 “image - centric” 的采樣策略。每個 mini-batch 由包含很多圖像的單張圖像組成麦牺,如果采用所有的 anchors 優(yōu)化 loss 函數(shù)钮蛛,可能會向負(fù)樣本傾斜,因為它們比重較大剖膳。因而魏颓,論文中采取隨機從一張圖像中采樣 256 個 anchors 的做法來訓(xùn)練一個 mini-batch,256個 anchors 中正負(fù)樣本的比重是1:1吱晒。如果正樣本數(shù)少于128甸饱,則用負(fù)樣本填充。

新增層的參數(shù)用均值為0,標(biāo)準(zhǔn)差為0.01的高斯分布來進行初始化叹话,其余層(都是共享的卷積層偷遗,與VGG共有的層)參數(shù)用 ImageNet 分類預(yù)訓(xùn)練模型來初始化。前60k個mini-batch進行迭代驼壶,學(xué)習(xí)率設(shè)為0.001氏豌;后20k個mini-batch進行迭代,學(xué)習(xí)率設(shè)為 0.0001热凹;設(shè)置動量momentum = 0.9泵喘,權(quán)重衰減 weightdecay = 0.0005。實現(xiàn)方式為Caffe般妙。

RPN 和 Fast R-CNN特征共享

以上描述了如何訓(xùn)練 RPN 網(wǎng)絡(luò)纪铺,而沒有考慮基于 region proposal 的目標(biāo)檢測網(wǎng)絡(luò)如何利用這些 proposals。對于檢測網(wǎng)絡(luò)碟渺,作者采用了 Fast R-CNN鲜锚。RPN 和 Fast R-CNN 如果都獨立訓(xùn)練,需要單獨修改它們的卷積層苫拍。因此有需要開發(fā)一種允許兩個網(wǎng)絡(luò)間共享卷積層的技術(shù)芜繁,而不是分別學(xué)習(xí)兩個網(wǎng)絡(luò)。論文中作者描述了 3 種方法用來實現(xiàn)特征共享:

交替訓(xùn)練怯疤。首先訓(xùn)練 RPN浆洗,用 RPN 輸出的 proposals 訓(xùn)練 Fast R-CNN催束。Fast R-CNN 精調(diào)后用于初始化 RPN 網(wǎng)絡(luò)參數(shù)集峦,如此循環(huán)迭代。開源的 matlab 版本就是這種訓(xùn)練方法抠刺。

近似聯(lián)合訓(xùn)練塔淤。RPN 和 Fast R-CNN 整合到一個網(wǎng)絡(luò)里一起訓(xùn)練。但是該方法忽略了 wrt 導(dǎo)數(shù)速妖,開源的 python 版本就是這么訓(xùn)練的高蜂,可以減少 25-50% 的訓(xùn)練時間。為什么呢罕容?因為 caffe 中所有層都是 c++ 實現(xiàn)的备恤,所以 python_layer 就沒有進行 back_ward,當(dāng)然訓(xùn)練的時候必須顯式指定loss_weight:1锦秒。

聯(lián)合訓(xùn)練露泊。超出論文范疇,作者未實現(xiàn)旅择。

基于交替訓(xùn)練法惭笑,作者描述了一種4-step的訓(xùn)練方式:

step 1.訓(xùn)練 RPN 網(wǎng)絡(luò),采用 ImageNet 預(yù)訓(xùn)練的模型進行初始化,并進行微調(diào)

step 2.利用 step1 的RPN生成 proposal沉噩,由 Fast R-CNN 訓(xùn)練一個單獨的檢測網(wǎng)絡(luò)捺宗,該網(wǎng)絡(luò)同樣由ImageNet預(yù)訓(xùn)練模型進行初始化。此時川蒙,兩個網(wǎng)絡(luò)還未共享卷積層

step 3.用檢測網(wǎng)絡(luò)初始化 RPN 訓(xùn)練蚜厉,固定共享的卷積層,只微調(diào) RPN 獨有的層畜眨,現(xiàn)在兩個網(wǎng)絡(luò)實現(xiàn)了卷積層共享

step 4.保持共享的卷積層固定弯囊,微調(diào) Fast R-CNN 的 fc 層。這樣胶果,兩個網(wǎng)絡(luò)共享相同的卷積層匾嘱,構(gòu)成一個統(tǒng)一的網(wǎng)絡(luò)

實現(xiàn)細(xì)節(jié)

訓(xùn)練時(eg:600*1000的圖像),如果 anchor box 的邊界超過了圖像邊界早抠,我們將其舍棄不用霎烙,因為這樣的 anchor 會導(dǎo)致訓(xùn)練無法收斂。一幅 600*1000 的圖像經(jīng)過 VGG16 后大約為 40*60蕊连,則此時的 anchor 數(shù)為 40*60*9悬垃,約為 20k 個 anchor? boxes,再去除與邊界相交的 anchor boxes 后甘苍,剩下約為 6k 個尝蠕,這么多數(shù)量的anchor boxes之間肯定是有很多重疊區(qū)域,因此需要使用非極大值抑制法(NMS载庭,non-maximum suppression)將 IoU>0.7 的區(qū)域全部合并看彼,最后就剩下約 2k 個 anchor boxes(同理,在最終檢測端囚聚,可以設(shè)置將概率大約某閾值P且IoU大約某閾值T的預(yù)測框采用 NMS 方法進行合并靖榕,注意:這里的預(yù)測框指的不是 anchor boxes)。NMS不會影響最終的檢測準(zhǔn)確率顽铸,但是大幅地減少了建議框的數(shù)量茁计。NMS之后,我們用建議區(qū)域中的top-N個來檢測谓松。

實驗結(jié)果

與Selective Search方法(黑線SS)相比星压,當(dāng)每張圖生成的proposal從2000減少到300時,RPN方法(紅藍)的召回率下降不大鬼譬。說明RPN方法的目的性更明確(attention機制~~)娜膘。

Recall vs IoU

使用更大的MS COCO庫訓(xùn)練,直接在PASCAL VOC上測試拧簸,準(zhǔn)確率提升6%劲绪。說明faster RCNN遷移性良好,沒有over fitting。

結(jié)語

此時可以放出 R-CNN贾富、Fast R-CNN歉眷、Faster R-CNN的對比了。如下所示(此處表格參考https://blog.csdn.net/qq_17448289/article/details/52871461

名稱方法缺點優(yōu)點

R-CNN1颤枪、SS提取RP汗捡;

2、CNN提取特征畏纲;

3扇住、SVM分類;

4盗胀、BBox回歸艘蹋。

1、 訓(xùn)練步驟繁瑣(微調(diào)網(wǎng)絡(luò)+訓(xùn)練SVM+訓(xùn)練bbox)票灰;

2女阀、 訓(xùn)練、測試均速度慢 屑迂;

3浸策、 訓(xùn)練占空間

1、 從DPM HSC的34.3%直接提升到了66%(mAP)惹盼;

2庸汗、 引入RP+CNN

Fast R-CNN1、SS提取RP手报;

2蚯舱、CNN提取特征;

3昧诱、softmax分類晓淀;

4、多任務(wù)損失函數(shù)邊框回歸盏档。

1、 依舊用SS提取RP(耗時2-3s燥爷,特征提取耗時0.32s)蜈亩;

2、 無法滿足實時應(yīng)用前翎,沒有真正實現(xiàn)端到端訓(xùn)練測試稚配;

3、 利用了GPU港华,但是區(qū)域建議方法是在CPU上實現(xiàn)的道川。

1、 由66.9%提升到70%;

2冒萄、 每張圖像耗時約為3s臊岸。

Faster R-CNN1、RPN提取RP尊流;

2帅戒、CNN提取特征;

3崖技、softmax分類逻住;

4、多任務(wù)損失函數(shù)邊框回歸迎献。

1瞎访、 還是無法達到實時檢測目標(biāo);

2吁恍、 獲取region proposal装诡,再對每個proposal分類計算量還是比較大。

1践盼、 提高了檢測精度和速度鸦采;

2、? 真正實現(xiàn)端到端的目標(biāo)檢測框架咕幻;

3渔伯、? 生成建議框僅需約10ms。

Faster R-CNN 將 two-stage 的檢測框架在實時的進程中推進了一大步肄程,但是仍有提升的空間锣吼。由Microsoft Research的Jifeng Dai等人提出的R-FCN網(wǎng)絡(luò)即是一個例子。

作者:Kaami

鏈接:http://www.reibang.com/p/4891042ef7ef

來源:簡書

簡書著作權(quán)歸作者所有蓝厌,任何形式的轉(zhuǎn)載都請聯(lián)系作者獲得授權(quán)并注明出處玄叠。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市拓提,隨后出現(xiàn)的幾起案子读恃,更是在濱河造成了極大的恐慌,老刑警劉巖代态,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寺惫,死亡現(xiàn)場離奇詭異,居然都是意外死亡蹦疑,警方通過查閱死者的電腦和手機西雀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來歉摧,“玉大人艇肴,你說我怎么就攤上這事腔呜。” “怎么了再悼?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵核畴,是天一觀的道長。 經(jīng)常有香客問我帮哈,道長膛檀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任娘侍,我火速辦了婚禮咖刃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘憾筏。我一直安慰自己嚎杨,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布氧腰。 她就那樣靜靜地躺著枫浙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪古拴。 梳的紋絲不亂的頭發(fā)上箩帚,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機與錄音黄痪,去河邊找鬼紧帕。 笑死,一個胖子當(dāng)著我的面吹牛桅打,可吹牛的內(nèi)容都是我干的是嗜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼挺尾,長吁一口氣:“原來是場噩夢啊……” “哼鹅搪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起遭铺,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤丽柿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后掂僵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體航厚,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年锰蓬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片眯漩。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡芹扭,死狀恐怖麻顶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情舱卡,我是刑警寧澤辅肾,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站轮锥,受9級特大地震影響矫钓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜舍杜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一新娜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧既绩,春花似錦概龄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至救欧,卻和暖如春衰粹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背笆怠。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工铝耻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人骑疆。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓田篇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親箍铭。 傳聞我的和親對象是個殘疾皇子泊柬,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容