关于Faster R-CNN的一切——笔记3:Faster R-CNN
生活随笔
收集整理的這篇文章主要介紹了
关于Faster R-CNN的一切——笔记3:Faster R-CNN
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
博主課題需要研究Faster RCNN,先后看了RCNN、Fast RCNN和Faster RCNN三篇paper,然而有點(diǎn)懵逼= =所以準(zhǔn)備再捋一遍總結(jié)一下~
關(guān)于Faster R-CNN的一切——筆記1:R-CNN
關(guān)于Faster R-CNN的一切——筆記2:Fast R-CNN
三、Faster?R-CNN【Faster R-CNN--Towards Real-Time Object Detection with Region Proposal Networks.2015NIPS】
理解了R-CNN和Fast R-CNN之后,我們終于可以昂首闊步進(jìn)入Faster R-CNN的解讀啦~\(≧▽≦)/~啦啦啦
SPPnet和Fast R-CNN都加速了R-CNN的檢測過程,然而瓶頸問題:region proposal computation卻沒有考慮。因此,Faster R-CNN的核心改進(jìn)就是設(shè)計(jì)了一個(gè)Region Proposal Network(RPN),在每個(gè)圖像位置輸出一個(gè)預(yù)測的object bounding box和objectness score,這個(gè)網(wǎng)絡(luò)與原來的Fast R-CNN共享conv feature map,所以幾乎不增加計(jì)算量。
1.什么結(jié)構(gòu)
網(wǎng)絡(luò)輸入是一張image? ↓ 經(jīng)過RPN生成一系列rectangular object proposals ↓ image和它的object proposals一起送入Fast R-CNN網(wǎng)絡(luò),輸出最終的檢測結(jié)果
顯然,最重要的就是這個(gè)Region Proposal Network(RPN)怎么設(shè)計(jì),下面分析。
? ? ? ? ?例如對于VGG16,結(jié)構(gòu)如下:
【image→conv3-64→conv3-64→pool2→conv3-128→conv3-128→pool2→conv3-256→conv3-256→conv3-256→pool2→ conv3-512→conv3-512→conv3-512→pool2→conv3-512→conv3-512→conv3-512→pool2→FC4096→FC4096→FC1000】
? ? ? ? ?那么從image到最后一個(gè)conv3-512層這13個(gè)卷積層和4個(gè)pooling層是RPN和Fast R-CNN共享的,對于VGG16,最后一個(gè)conv3-512層輸出的是512通道的W*H大小的(W和H=原圖像寬高/16,因?yàn)橛?個(gè)pooling層,每次大小減半)conv feature map,接下來的RPN操作就是基于這個(gè)conv feature map。
(2)在conv feature map的每個(gè)sliding window位置上生成特征向量
? ? ? ? ?用一個(gè)n*n(本文是3*3)大小的滑動(dòng)窗口(可以理解為卷積核)以1為步長在conv feature map上滑動(dòng)。在每個(gè)sliding位置上,卷積核與它覆蓋的conv featue map對應(yīng)元素相乘并相加輸出對應(yīng)值,也就是卷積了。注意:conv feature map是3維的,對于VGG16而言是第三維是512通道,則每個(gè)通道獨(dú)立的與卷積核作用,所以最后卷積核在每個(gè)滑動(dòng)窗口位置都會生成一個(gè)1*512維的向量。然后,這個(gè)1*512維的向量被送入兩個(gè)并列的FC層,一個(gè)分類的FC層輸出分類結(jié)果,一個(gè)回歸的FC層輸出box regressor也就是物體位置坐標(biāo)。
? ? ? ? ?上面所說的sliding window模式,在所有的空間位置上的FC層的參數(shù)是共享的,所以這樣的結(jié)構(gòu)很自然的可以被應(yīng)用為一個(gè)n*n的卷積層和兩個(gè)并列的1*1的卷積層【1*1的卷積層其實(shí)就是每個(gè)卷積核通道數(shù)與輸入通道數(shù)相同,卷積核的個(gè)數(shù)就是你想要的輸出維數(shù)。例如對于VGG16,每個(gè)卷積核是512通道。】。但是注意這樣的n*n“卷積層”和我們平常理解的不太一樣,我來解釋一下:
? ? ? ? ?我們平時(shí)理解的卷積層操作如下圖所示。例如這是一個(gè)有2個(gè)filter的卷積層(因此輸出是2通道的),每個(gè)filter是3通道的(與輸入通道數(shù)相同)。輸出volume中第1個(gè)通道里第一個(gè)位置的結(jié)果10是由filter w0的三個(gè)通道分別與輸入volume的第一個(gè)receptive field的三個(gè)通道分別相乘然后相加的結(jié)果:10=1+4+4+1bias。
? ? ? ? ?但是本文里面想表達(dá)的其實(shí)是如下圖的意思:
? ? ? ? ? ? ? ? ? ?所以如果要是想和普通的卷積層一樣的話,應(yīng)該如下圖這么設(shè)置,簡單地說第i個(gè)filter只有第i個(gè)通道是n*n個(gè)系數(shù),其他通道都全為0,每個(gè)filter的n*n個(gè)系數(shù)文章中沒有說一樣不一樣誒,可能需要實(shí)際跑一邊代碼看看了~。這樣就可以應(yīng)用普通的卷積層來完成RPN想要的sliding window模式。
(3)每個(gè)sliding window位置的特征向量送入兩個(gè)并列的FC層做預(yù)測
? ? ? ? ?有了特征向量,顯然可以分類了,那么分幾類?文章說我們要在這個(gè)sliding window位置根據(jù)它的特征向量同時(shí)預(yù)測出k個(gè)region proposals,那么回歸的FC層輸出就是4k維的了,因?yàn)槊總€(gè)proposal有4個(gè)坐標(biāo)嘛~分類的FC層輸出2k個(gè)分?jǐn)?shù)來估計(jì)每個(gè)proposal是物體的概率和不是物體的概率。但是這k個(gè)proposal不是憑空整出來的,而是要相對一個(gè)參照,叫做archors,這也是RPN網(wǎng)絡(luò)很核心的一個(gè)概念,下面詳細(xì)說明:
附上原paper的圖總結(jié)一下RPN網(wǎng)絡(luò)的結(jié)構(gòu):
(4)根據(jù)分類的score對region proposals進(jìn)行非極大值抑制
先去掉所有IoU小于0.7的那些proposal,然后剩下的運(yùn)行NMS(和以前一樣了啦不再詳細(xì)說)。然后用前N個(gè)region proposal送入Fast R-CNN進(jìn)行物體檢測。
2.怎么訓(xùn)練
顯然,我們需要訓(xùn)練RPN和Fast R-CNN兩個(gè)網(wǎng)絡(luò)。首先以預(yù)訓(xùn)練的VGG16為例比較兩個(gè)網(wǎng)絡(luò)的結(jié)構(gòu):
所以為了共享conv feature map,兩個(gè)網(wǎng)絡(luò)的交替訓(xùn)練流程應(yīng)該是:
用預(yù)訓(xùn)練模型初始化網(wǎng)絡(luò)參數(shù),然后fine-tune訓(xùn)練RPN ↓ 用同一個(gè)預(yù)訓(xùn)練模型初始化網(wǎng)絡(luò)參數(shù),然后fine-tune訓(xùn)練Fast R-CNN,使用RPN網(wǎng)絡(luò)輸出的region proposals ↓ 用Fast R-CNN初始化RPN(肯定是共有部分啦),固定共有的conv層(參數(shù)不再變化),只fine-tuned RPN獨(dú)有的層 ↓ 固定共有的conv層,fine-tune Fast R-CNN的FC層
Fast R-CNN不說了,就是和原Fast R-CNN的訓(xùn)練一毛一樣只不過產(chǎn)生region proposals的方法由selective search變成RPN網(wǎng)絡(luò)啦~
? ? ? ? ?(1)首先是loss function怎么定義
? ? ? ? ?先明確一下有兩個(gè)任務(wù):一是分類任務(wù),即判斷這個(gè)anchor是不是物體;二是回歸任務(wù),即給出bounding box的預(yù)測坐標(biāo)。所以說這種multi task的東東,肯定有兩個(gè)loss項(xiàng)啦:
? ? ? ?? ? ? ? ? ?i是一個(gè)mini-batch(在本文就是一張image和它里面的所有anchor)里的anchor的index;pi是算法輸出的anchor i是物體的概率;pi*是anchor i的ground-thuth label;ti是一個(gè)四元素的向量,是算法預(yù)測的bounding box的參數(shù)化坐標(biāo);ti*是與一個(gè)正anchor相關(guān)的ground-truth box。 ?? ? ? ? ? ?分類loss是兩類上的log loss(是物體和不是物體),回歸loss和Fast R-CNN中的定義一樣。
? ? ? ? ?關(guān)于ti和ti*,都是參數(shù)化的坐標(biāo),也就是都相對于anchor而定義,如下圖,所以你可以理解為:在原image上有很多ground-truth box,現(xiàn)在人為的規(guī)定了很多anchor box,你的算法要做的事情其實(shí)就是把a(bǔ)nchor box回歸到離它最近的ground-truth box那里去~ ? ? ? ? ? ? ? ?(2)anchor的標(biāo)簽怎么定義
? ? ? ? ?有兩種情況anchor的標(biāo)簽是正:一種是與某個(gè)ground-truth box有最大的IoU的那些;另一種是與任何ground-truth的IoU都大于0.7的那些。
? ? ? ? ?有一種情況anchor的標(biāo)簽是負(fù):與所有的gound-truth box的IoU都小于0.3。
? ? ? ? ?(3)其他訓(xùn)練細(xì)節(jié)
? ? ? ? ?Mini-batch怎么采樣:先隨機(jī)采樣一張圖片,然后以1:1的比例從這張圖隨機(jī)采樣256個(gè)anchors,如果正樣本的數(shù)目少于128的話,只好用負(fù)樣本填充mini-batch啦。也就是說1個(gè)mini-batch就是1張image和它的256個(gè)正負(fù)anchors。
? ? ? ? ?新的卷積層用均值為0,標(biāo)準(zhǔn)差為0.01的高斯分布初始化,共享的那些層就用預(yù)訓(xùn)練的模型初始化啦。
? ? ? ? ?前60k個(gè)mini-batch用學(xué)習(xí)率0.001,后20k個(gè)mini-batch用學(xué)習(xí)率0.0001。momentum是0.9,weight decay是0.0005.在PASCAL數(shù)據(jù)集喔~ ??? 3.怎么測試
測試就簡單啦~對于一張測試image,先運(yùn)行RPN生成2000個(gè)region proposal,然后把這些region proposal投影到conv feature map上進(jìn)行后續(xù)的Fast R-CNN網(wǎng)絡(luò)的操作就行啦。由于共享了conv feature map,一張圖只用計(jì)算一次,大的縮短時(shí)間。
來一個(gè)三個(gè)網(wǎng)絡(luò)的運(yùn)行時(shí)間對比: ? ? ? ? R-CNN : 47s/img ? ? ? ? Fast R-CNN:3s/img ? ? ? ? Faster R-CNN:0.2s/img
--The End?of Faster?R-CNN--
關(guān)于Faster R-CNN的一切——筆記1:R-CNN
關(guān)于Faster R-CNN的一切——筆記2:Fast R-CNN
三、Faster?R-CNN【Faster R-CNN--Towards Real-Time Object Detection with Region Proposal Networks.2015NIPS】
理解了R-CNN和Fast R-CNN之后,我們終于可以昂首闊步進(jìn)入Faster R-CNN的解讀啦~\(≧▽≦)/~啦啦啦
SPPnet和Fast R-CNN都加速了R-CNN的檢測過程,然而瓶頸問題:region proposal computation卻沒有考慮。因此,Faster R-CNN的核心改進(jìn)就是設(shè)計(jì)了一個(gè)Region Proposal Network(RPN),在每個(gè)圖像位置輸出一個(gè)預(yù)測的object bounding box和objectness score,這個(gè)網(wǎng)絡(luò)與原來的Fast R-CNN共享conv feature map,所以幾乎不增加計(jì)算量。
1.什么結(jié)構(gòu)
網(wǎng)絡(luò)輸入是一張image? ↓ 經(jīng)過RPN生成一系列rectangular object proposals ↓ image和它的object proposals一起送入Fast R-CNN網(wǎng)絡(luò),輸出最終的檢測結(jié)果
顯然,最重要的就是這個(gè)Region Proposal Network(RPN)怎么設(shè)計(jì),下面分析。
- RPN的整體結(jié)構(gòu)
? ? ? ? ?例如對于VGG16,結(jié)構(gòu)如下:
【image→conv3-64→conv3-64→pool2→conv3-128→conv3-128→pool2→conv3-256→conv3-256→conv3-256→pool2→ conv3-512→conv3-512→conv3-512→pool2→conv3-512→conv3-512→conv3-512→pool2→FC4096→FC4096→FC1000】
? ? ? ? ?那么從image到最后一個(gè)conv3-512層這13個(gè)卷積層和4個(gè)pooling層是RPN和Fast R-CNN共享的,對于VGG16,最后一個(gè)conv3-512層輸出的是512通道的W*H大小的(W和H=原圖像寬高/16,因?yàn)橛?個(gè)pooling層,每次大小減半)conv feature map,接下來的RPN操作就是基于這個(gè)conv feature map。
(2)在conv feature map的每個(gè)sliding window位置上生成特征向量
? ? ? ? ?用一個(gè)n*n(本文是3*3)大小的滑動(dòng)窗口(可以理解為卷積核)以1為步長在conv feature map上滑動(dòng)。在每個(gè)sliding位置上,卷積核與它覆蓋的conv featue map對應(yīng)元素相乘并相加輸出對應(yīng)值,也就是卷積了。注意:conv feature map是3維的,對于VGG16而言是第三維是512通道,則每個(gè)通道獨(dú)立的與卷積核作用,所以最后卷積核在每個(gè)滑動(dòng)窗口位置都會生成一個(gè)1*512維的向量。然后,這個(gè)1*512維的向量被送入兩個(gè)并列的FC層,一個(gè)分類的FC層輸出分類結(jié)果,一個(gè)回歸的FC層輸出box regressor也就是物體位置坐標(biāo)。
? ? ? ? ?上面所說的sliding window模式,在所有的空間位置上的FC層的參數(shù)是共享的,所以這樣的結(jié)構(gòu)很自然的可以被應(yīng)用為一個(gè)n*n的卷積層和兩個(gè)并列的1*1的卷積層【1*1的卷積層其實(shí)就是每個(gè)卷積核通道數(shù)與輸入通道數(shù)相同,卷積核的個(gè)數(shù)就是你想要的輸出維數(shù)。例如對于VGG16,每個(gè)卷積核是512通道。】。但是注意這樣的n*n“卷積層”和我們平常理解的不太一樣,我來解釋一下:
? ? ? ? ?我們平時(shí)理解的卷積層操作如下圖所示。例如這是一個(gè)有2個(gè)filter的卷積層(因此輸出是2通道的),每個(gè)filter是3通道的(與輸入通道數(shù)相同)。輸出volume中第1個(gè)通道里第一個(gè)位置的結(jié)果10是由filter w0的三個(gè)通道分別與輸入volume的第一個(gè)receptive field的三個(gè)通道分別相乘然后相加的結(jié)果:10=1+4+4+1bias。
? ? ? ? ?但是本文里面想表達(dá)的其實(shí)是如下圖的意思:
? ? ? ? ? ? ? ? ? ?所以如果要是想和普通的卷積層一樣的話,應(yīng)該如下圖這么設(shè)置,簡單地說第i個(gè)filter只有第i個(gè)通道是n*n個(gè)系數(shù),其他通道都全為0,每個(gè)filter的n*n個(gè)系數(shù)文章中沒有說一樣不一樣誒,可能需要實(shí)際跑一邊代碼看看了~。這樣就可以應(yīng)用普通的卷積層來完成RPN想要的sliding window模式。
(3)每個(gè)sliding window位置的特征向量送入兩個(gè)并列的FC層做預(yù)測
? ? ? ? ?有了特征向量,顯然可以分類了,那么分幾類?文章說我們要在這個(gè)sliding window位置根據(jù)它的特征向量同時(shí)預(yù)測出k個(gè)region proposals,那么回歸的FC層輸出就是4k維的了,因?yàn)槊總€(gè)proposal有4個(gè)坐標(biāo)嘛~分類的FC層輸出2k個(gè)分?jǐn)?shù)來估計(jì)每個(gè)proposal是物體的概率和不是物體的概率。但是這k個(gè)proposal不是憑空整出來的,而是要相對一個(gè)參照,叫做archors,這也是RPN網(wǎng)絡(luò)很核心的一個(gè)概念,下面詳細(xì)說明:
- 平移不變的Anchors
附上原paper的圖總結(jié)一下RPN網(wǎng)絡(luò)的結(jié)構(gòu):
(4)根據(jù)分類的score對region proposals進(jìn)行非極大值抑制
先去掉所有IoU小于0.7的那些proposal,然后剩下的運(yùn)行NMS(和以前一樣了啦不再詳細(xì)說)。然后用前N個(gè)region proposal送入Fast R-CNN進(jìn)行物體檢測。
2.怎么訓(xùn)練
顯然,我們需要訓(xùn)練RPN和Fast R-CNN兩個(gè)網(wǎng)絡(luò)。首先以預(yù)訓(xùn)練的VGG16為例比較兩個(gè)網(wǎng)絡(luò)的結(jié)構(gòu):
所以為了共享conv feature map,兩個(gè)網(wǎng)絡(luò)的交替訓(xùn)練流程應(yīng)該是:
用預(yù)訓(xùn)練模型初始化網(wǎng)絡(luò)參數(shù),然后fine-tune訓(xùn)練RPN ↓ 用同一個(gè)預(yù)訓(xùn)練模型初始化網(wǎng)絡(luò)參數(shù),然后fine-tune訓(xùn)練Fast R-CNN,使用RPN網(wǎng)絡(luò)輸出的region proposals ↓ 用Fast R-CNN初始化RPN(肯定是共有部分啦),固定共有的conv層(參數(shù)不再變化),只fine-tuned RPN獨(dú)有的層 ↓ 固定共有的conv層,fine-tune Fast R-CNN的FC層
Fast R-CNN不說了,就是和原Fast R-CNN的訓(xùn)練一毛一樣只不過產(chǎn)生region proposals的方法由selective search變成RPN網(wǎng)絡(luò)啦~
- 預(yù)訓(xùn)練
- RPN網(wǎng)絡(luò)的fine-tune
? ? ? ? ?(1)首先是loss function怎么定義
? ? ? ? ?先明確一下有兩個(gè)任務(wù):一是分類任務(wù),即判斷這個(gè)anchor是不是物體;二是回歸任務(wù),即給出bounding box的預(yù)測坐標(biāo)。所以說這種multi task的東東,肯定有兩個(gè)loss項(xiàng)啦:
? ? ? ?? ? ? ? ? ?i是一個(gè)mini-batch(在本文就是一張image和它里面的所有anchor)里的anchor的index;pi是算法輸出的anchor i是物體的概率;pi*是anchor i的ground-thuth label;ti是一個(gè)四元素的向量,是算法預(yù)測的bounding box的參數(shù)化坐標(biāo);ti*是與一個(gè)正anchor相關(guān)的ground-truth box。 ?? ? ? ? ? ?分類loss是兩類上的log loss(是物體和不是物體),回歸loss和Fast R-CNN中的定義一樣。
? ? ? ? ?關(guān)于ti和ti*,都是參數(shù)化的坐標(biāo),也就是都相對于anchor而定義,如下圖,所以你可以理解為:在原image上有很多ground-truth box,現(xiàn)在人為的規(guī)定了很多anchor box,你的算法要做的事情其實(shí)就是把a(bǔ)nchor box回歸到離它最近的ground-truth box那里去~ ? ? ? ? ? ? ? ?(2)anchor的標(biāo)簽怎么定義
? ? ? ? ?有兩種情況anchor的標(biāo)簽是正:一種是與某個(gè)ground-truth box有最大的IoU的那些;另一種是與任何ground-truth的IoU都大于0.7的那些。
? ? ? ? ?有一種情況anchor的標(biāo)簽是負(fù):與所有的gound-truth box的IoU都小于0.3。
? ? ? ? ?(3)其他訓(xùn)練細(xì)節(jié)
? ? ? ? ?Mini-batch怎么采樣:先隨機(jī)采樣一張圖片,然后以1:1的比例從這張圖隨機(jī)采樣256個(gè)anchors,如果正樣本的數(shù)目少于128的話,只好用負(fù)樣本填充mini-batch啦。也就是說1個(gè)mini-batch就是1張image和它的256個(gè)正負(fù)anchors。
? ? ? ? ?新的卷積層用均值為0,標(biāo)準(zhǔn)差為0.01的高斯分布初始化,共享的那些層就用預(yù)訓(xùn)練的模型初始化啦。
? ? ? ? ?前60k個(gè)mini-batch用學(xué)習(xí)率0.001,后20k個(gè)mini-batch用學(xué)習(xí)率0.0001。momentum是0.9,weight decay是0.0005.在PASCAL數(shù)據(jù)集喔~ ??? 3.怎么測試
測試就簡單啦~對于一張測試image,先運(yùn)行RPN生成2000個(gè)region proposal,然后把這些region proposal投影到conv feature map上進(jìn)行后續(xù)的Fast R-CNN網(wǎng)絡(luò)的操作就行啦。由于共享了conv feature map,一張圖只用計(jì)算一次,大的縮短時(shí)間。
來一個(gè)三個(gè)網(wǎng)絡(luò)的運(yùn)行時(shí)間對比: ? ? ? ? R-CNN : 47s/img ? ? ? ? Fast R-CNN:3s/img ? ? ? ? Faster R-CNN:0.2s/img
--The End?of Faster?R-CNN--
總結(jié)
以上是生活随笔為你收集整理的关于Faster R-CNN的一切——笔记3:Faster R-CNN的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Faster RCNN 训练自己的检测模
- 下一篇: Fast R-CNN论文详解