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