目標檢測two-stage經典方法總結


最近將幾個經典的兩階段檢測算法進行了一個系統性的學習,網上的資料很多,我根據自己在學習過程中的思考寫了這篇博文。

計算機視覺的三大任務

  • 分類(是什麼):給定一張圖片,爲每張圖片打一個標籤,說出圖片是什麼物體。然而因爲一張圖片中往往有多個物體,因此我們允許你取出概率最大的5個,只要前五個概率最大的包含了我們人工標定標籤,就認定正確(top-k預測)
  • 定位(在哪兒):除了需要預測出圖片的類別,你還要定位出這個物體的位置,同時規定你定位的這個物體框與正確位置差不能超過規定的閾值
  • 檢測(在哪兒有什麼):給定一張圖片,你把圖片中的所有物體全部給我找出來(包括位置、類別)

OverFeat

《OverFeat: Integrated Recognition, Localization and Detection using Convolutional Networks》

在早期方法中,通常使用以下的傳統框架進行目標檢測任務(這裏以人臉檢測作爲一個例子):

在這裏插入圖片描述

可以看到傳統的框架通常使用下面的步驟進行檢測任務:

  1. 首先利用大量圖片訓練一個目標檢測的分類器
  2. 在不同尺度的待檢測圖像中使用密集滑窗進行滑動,對每一個滑窗的位置使用第1步訓練的分類器進行分類來判斷是否爲待檢測目標
  3. 將密集滑窗策略得到的待檢測目標的檢測框進行NMS合併

在上面的步驟中很明顯可以發現傳統檢測方法是將分類和定位任務分開進行,並利用滑窗策略來對圖像中的所有位置進行定位(後面簡稱爲滑窗定位策略),即將分類和滑窗定位策略合併起來最終完成檢測任務。

引入問題

上面的傳統方法檢測框架中直覺上主要的改進可以朝着兩個方向進行:

  1. 對於分類器的改進,使用區別於早期方法的更有效的分類器,在AlexNet取得非常好的結果之後,基本上均是使用卷積神經網絡來代替傳統分類器,因此在這一點上主要關注的就是卷積神經網絡主幹網絡的發展
  2. 對於滑動窗口方法的改進,OverFeat論文中主要指出幾點:

The first idea in addressing this is to apply a ConvNet at multiple locations in the image, in a sliding window fashion, and over multiple scales. Even with this, however, many viewing windows may contain a perfectly identifiable portion of the object (say, the head of a dog), but not the entire object, nor even the center of the object. This leads to decent classification but poor localization and detection.

The second idea is to train the system to not only produce a distribution over categories for each window, but also to produce a prediction of the location and size of the bounding box containing the object relative to the window.

The third idea is to accumulate the evidence for each category at each location and size.

OverFeat改進方法

Overfeat方法便是在以上框架的基礎上利用深度學習的卷積神經網絡進行改進,將分類,定位和檢測任務用一個網絡完成,主要改進點爲:

  • 改進AlexNet分類網絡作爲主幹網絡,也即本文提出的OverFeat,它是將該主幹網絡作爲一個特徵提取算子,提取出特徵爲後面的分類和定位任務做準備
  • 利用在OverFeat後面接上全連接層進行訓練,來完成分類任務;然後將全連接層替換成FCN網絡,保持訓練分類任務的OverFeat結構參數不變,訓練檢測框迴歸任務(可以看出早期的深度學習方法還是延續了傳統方法的思想,即利用類似於SIFT和HOG這些特徵提取算子來提取特徵,然後再在後面接各種不同任務的分類器進行分類,實際上在卷積神經網絡中是可以將所有方法合併成一個end-to-end的任務的),從而實現將分類、定位和檢測集成在一個網絡中
  • 引入offset pooling(即一種特徵圖滑窗策略)來替代傳統的在輸入圖片上進行的密集滑窗策略,並且對特徵圖中每一個像素點(即每一次滑窗的位置)直接進行迴歸任務,預測出檢測框的位置,而不是原始的密集滑窗策略那樣由每一次滑動窗口的位置作爲檢測框的位置,這樣就避免了固定尺寸的檢測框會切斷物體

OverFeat整體流程圖如下所示:

在這裏插入圖片描述

Offset Pooling

Offset pooling可以看做是一種特徵圖滑窗策略,用於針對同一尺度下的輸入圖片產生的特徵圖中不同位置進行分類和檢測,用於替代傳統方法中在輸入圖片上進行密集滑窗策略這種耗時的操作。在論文中的解釋如下:

在這裏插入圖片描述

具體操作步驟爲:

在這裏插入圖片描述在這裏插入圖片描述

其中的layer5即對應OverFeat整體流程圖中特徵圖2

FCN

在這裏插入圖片描述

分類任務

OverFeat論文中的特徵提取模型是在AlexNet的基礎上進行改進(注意後面的分析均是基於高精度模型):

  1. 沒有使用局部響應歸一化層;
  2. 沒有采用重疊池化的方法(即每一次池化層的卷積核的stride爲卷積核大小的一半,因此卷積核在滑動的過程中沒有重疊部分);
  3. 在第一層卷積層,stride作者是選擇了2,這個與AlexNet中的4不用,如果stride選擇比較大得話,雖然可以減少網絡層數,提高速度,但是會降低精度

在此基礎上,作者構造出了快速模型和高精度模型兩種架構:

  • 快速模型架構

在這裏插入圖片描述

  • 高精度模型架構
    在這裏插入圖片描述

模型訓練

在分類任務的訓練階段,OverFeat採用AlexNet的圖像增強方法:

  • 對於訓練數據集中每一張256×256圖片及其鏡像,隨機crop成一張224×224的圖片
  • 利用PCA來處理RGB三通道的值

AlexNet的詳細處理步驟爲:
在這裏插入圖片描述

再將上述圖像增強後的圖片輸入網絡進行訓練

模型測試

AlexNet在模型測試階段的方法爲:

  • 對於輸入的一張256×256圖片,首先進行multi-view crop,即分別從圖片的四個角以及中心裁剪出5張224×224的圖片,把原始圖片水平翻轉一下,再用同樣的方式進行裁剪,又可以得到5張圖片
  • 把這10張224×224圖片作爲輸入,分別進行預測分類,在softmax得到10張crop圖片對應的每一類的概率,再對其取平均值,得到最終每一類的概率值(這也是爲什麼caffe中AlexNet的網絡模型中input的第一維也即是batch的大小是10的原因)

由於AlexNet的測試方法對於檢測任務來說,存在以下缺點:

  1. multi-view crop在檢測中很容易將待檢測物體截斷,使crop之後的圖片中待檢測物體不完整
  2. multi-view crop得到的圖片中,各個圖片塊之間存在很大的重疊面積,因此在測試的過程中存在計算冗餘
  3. multi-view crop的方式只是在單一尺度上進行

針對以上問題OverFeat採用以下測試方法:

  • 對原圖做以下放大處理(由於通常檢測問題中對於大尺寸物體的檢測效果較好,對於小物體的檢測效果不好,所以構造多尺度輸入的時候只放大圖片)得到6個尺寸的圖片,並對所有尺寸的圖片做翻轉作爲輸入。

在這裏插入圖片描述

  • 將以上圖片輸入模型直接進行測試,並在此處引入offset pooling來實現原始檢測框架中的密集滑窗策略,從而對於每一個尺寸的輸入圖片產生如上表最後一列所示數量的特徵向量
  • 對於網絡輸出的各個尺度對應的特徵向量,例如第一個尺度產生的輸出3x3xC,則是對於每一個類別對應的3x3個特徵向量取平均值,得到該尺度下每一個類別的概率值,以此類推到各個尺度,便可以求出各個尺度中各個類別的概率。最後將各個尺度中相同類別的概率值做平均,便可以得到最終的各個類別的概率,根據評價指標的需要取最大的一個概率對應的類別作爲top-1,或者最大的5個概率對應的類別作爲top-5.

定位任務

模型訓練

保持分類模型中訓練好的OverFeat模型參數不變,在模型後面加上定位任務的網絡進行訓練,從而得到最終的定位網絡(文中並沒有給出訓練迴歸任務的loss函數)

模型定位步驟

在這裏插入圖片描述

從上圖可以看到,以281x317的輸入尺寸爲例,OverFeat論文中對於上面OverFeat整體流程圖中特徵圖2首先進行一個5x5的pooling層得到2x3的特徵圖,然後經過4096x1x1和1000x1x1的全連接層(這裏使用FCN實現)之後最終輸出每一個尺度產生的每一個特徵圖中的每一個像素點映射到原圖中的檢測框的座標值,即圖中的(top, left, right, right box edges)。對此,作者通過下面的幾組圖片分析了多尺度策略,offset pooling策略對模型產生檢測框的密集度:

  • 利用不同的尺寸來進行預測,由於尺寸越大,對應的第五層產生的特徵圖的大小也越大,而特徵圖中每一個像素點都對應一個檢測框,因此原圖尺寸越大,越會產生更多的檢測框
    在這裏插入圖片描述
  • 在上面的基礎上,運用offset pooling 即滑窗的方法,因此在每一個scale又產生了不同的3x3個不同滑動窗口,因此進一步的增加了檢測窗口的數量
    在這裏插入圖片描述
  • 此處展示的是上面的每一個尺寸的每一滑窗的每一個像素點對應的位置迴歸網絡產生的四個座標點回歸值
    在這裏插入圖片描述
  • 結合上圖中各個尺度各個滑窗上產生的檢測框
    在這裏插入圖片描述
    在這裏插入圖片描述

分類和定位任務

整體上OverFeat利用OverFeat特徵提取器來提取特徵,將該特徵運用於後面的分類和定位任務,即可以看作對於後面產生的特徵圖中的每一個像素點映射到原始圖中的區域,在該區域預測出分類任務中各個類別的概率以及迴歸任務中檢測框的座標值,下面同樣以281x317的輸入尺寸爲例,給出網絡同時進行兩項任務的示意圖:

在這裏插入圖片描述

參考資料:

https://zhum.in/blog/project/TrafficSignRecognition/OverFeat論文閱讀筆記/

R-CNN

《Rich feature hierarchies for accurate object detection and semantic segmentation》

2012年,AlexNet第一次利用卷積神經網絡在ILSVRC比賽上獲得了超越第二名幾乎一半的成績,引起了極大的反響,在目標檢測領域,主要爭論的問題是:

To what extent do the CNN classification results on ImageNet generalize to object detection results on the PASCAL VOC Challenge?

ImageNet上的CNN分類結果在何種程度上能夠應用到PASCAL VOC挑戰的物體檢測任務上?

針對這個問題,本文主要關注兩個方面:

  1. localizing objects with a deep network(主要關注如何使用AlexNet中的深度網絡來完成定位問題)
  2. training a high-capacity model with only a small quantity of annotated detection data(主要關注如何將AlexNet中深度網絡的權重遷移到定位問題上)

下面就上面兩個問題進行分析R-CNN的脈絡

使用深度網絡來定位物體

在圖像中定位物體通常使用一下兩種方法:

  1. 將定位問題看作是迴歸問題(OverFeat採用的方法),R-CNN論文中利用Szegedy等的工作說明這種方法不是很好
  2. 構造一個滑動窗口檢測器(R-CNN中採用的方法)

下面具體說明R-CNN的具體構造:

在這裏插入圖片描述

如上圖所示,R-CNN的測試部分主要分爲三個模塊:

  1. 產生類別無關的候選框
  2. 卷積神經網絡產生定長的特徵向量
  3. 指定類別的SVM線性分類器

產生類別無關的候選框

R-CNN採用論文《Selective search for object recognition》中的Selective Search方法來產生2000個後面需要的候選框,這個方法主要有三個優勢:

  • 捕捉不同尺度(Capture All Scales)
  • 多樣化(Diversification)
  • 快速計算(Fast to Compute)

Selective Search算法主要包含兩個內容

  • Hierarchical Grouping Algorithm
  • Diversification Strategies

Hierarchical Grouping Algorithm

  1. 使用論文《Efficient Graph-Based Image Segmentation》中的方法在圖像中產生初始區域(參考:https://blog.csdn.net/ttransposition/article/details/38024557)
  2. 計算所有鄰近區域之間的相似性
  3. 兩個最相似的區域被組合在一起
  4. 計算合併區域和相鄰區域的相似度
  5. 重複2、3過程,直到整個圖像變爲一個地區。

Diversification Strategies

這個部分涉及到多樣性的一些策略,使得抽樣多樣化,主要有下面三個不同方面:

  1. 利用各種不同不變性的色彩空間
  2. 採用不同的相似性度量
  3. 通過改變起始區域,作者對比了一些初始化區域的方法,發現《Efficient Graph-Based Image Segmentation》中的方法效果最好

主要參考:https://zhuanlan.zhihu.com/p/39927488

卷積神經網絡產生定長的特徵向量

  1. 將第一步中產生的類別無關的候選框risize成227x227大小的圖片

在這裏插入圖片描述

上圖中展示了作者在附錄A中實驗的幾種resize方式:

(B)考慮context(圖像中context指RoI周邊像素)的各向同性變形,檢測框向周圍像素擴充到227×227,若遇到圖像邊界則用候選框像素的均值進行填充

©不考慮context的各向同性變形,直接用建議框像素均值填充至227×227

(D)各向異性變形,簡單粗暴對圖像resize至227×227

變形前先進行邊界像素填充padding處理,即向外擴展建議框邊界,以上三種方法中第一行爲採用padding=0,第二行爲採用padding=16

作者採用的方法即爲上圖中(D)那一列的下面那一行的方式,在候選框周圍加上16的padding(即向外擴展候選框邊界),再進行各向異性縮放,作者對比了各種方法後,發現這種方法最好,使得mAp提高了3到5個百分點

  1. 將1中resize以後的候選框圖片使用AlexNet中五個卷積層和兩個全連接層進行前向傳播,最終得到一個4096x1維的特徵向量

指定類別的SVM線性分類器

通過對每個類別訓練出來的SVM對以上每個候選框產生的4096維特徵向量進行打分,然後給出一張圖像中所有的打分區域,然後使用NMS(每個類別是獨立進行的),拒絕掉一些和高分區域的IOU大於閾值的候選框。

訓練網絡

CNN的訓練

由於目標檢測的數據集標註數據較少,訓練AlexNet這樣的大型網絡較爲困難,於是產生了上面提到的第二個問題:

training a high-capacity model with only a small quantity of annotated detection data

  1. 利用ImageNet數據集進行預訓練
  2. 將ImageNet專用的1000-way分類層,換成了一個隨機初始化的21-way分類層(其中20是VOC的類別數,1代表背景)而卷積部分都沒有改變
  3. 將PASCAL VOC數據集利用Selective Search方法產生候選框,利用所有候選框區域的圖片作爲訓練數據,其中和真實標註的框的IoU>=0.5就認爲是正例,否則就是負例
  4. 利用3中的數據進行finetune,SGD開始的learning_rate爲0.001(是初始化預訓練時的十分之一),這使得調優得以有效進行而不會破壞初始化的成果。每輪SGD迭代,統一使用32個正例窗口(跨所有類別)和96個背景窗口,即每個mini-batch的大小是128。另外傾向於採樣正例窗口,因爲和背景相比他們很稀少。

SVM分類器的訓練

與上面CNN的finetune過程一樣,同樣採用步驟3中的方法來產生訓練SVM的數據集,但是其中IoU低於0.3的被作爲負例,GT作爲正例,其餘的全部丟棄。然後將這些候選框區域利用上面訓練好的CNN提取特徵,,對應標籤數據,來訓練SVM。但是由於這裏訓練數據太大,難以裝進內存,所以R-CNN採用hard negative mining方法,hard negative mining方法使得訓練能夠很快的收斂,並且mAP在一個epoch之後就停止增長。

hard negative mining:難負例挖掘算法,用途就是解決正負例數量不均衡,而負例分散代表性又不夠的問題,用分類器對樣本進行分類,把其中錯誤分類的樣本(hard negative)放入負樣本集合再繼續訓練分類器。

這裏存在一個問題:當數據量過大的時候,並且其中大部分是負例的時候,沒有辦法將所有的數據全部裝入內存進行訓練,所以作者採用難負例來作爲負例給SVM進行訓練,但是作者並沒有說是怎樣產生這些難負例的。個人認爲,這裏的難負例應該是訓練CNN的時候產生的,因爲SVM作爲一個接在CNN之後的分類器,實際上充當的是CNN最後softmax分類的作用,由於其接受的是CNN提取到的特徵,而由於CNN的訓練樣本沒有非常清晰的分類邊界(下一小節"CNN和SVM訓練中的問題"中會講到),所以肯定會產生很多的false positive例子,而將這些例子進一步給SVM訓練,便可以有效的增強SVM對於分類邊界的判斷。所以SVM的訓練樣本中的負例一方面來自CNN產生的難分負例,另一方面來自將候選框區域和某一單一類別的真實標註框進行對比,IoU閾值小於0.3的負例

CNN和SVM訓練中的問題

一、 爲什麼使用不同的正負例IoU閾值

首先,兩者的不同在於

  • 在CNN的訓練中,是將候選框區域和真實標註的框的IoU>=0.5就認爲是正例,否則就是負例,其中候選框區域是針對所有類別的,因此每次匹配的時候只要和任意一個真是標註框的IoU>=0.5就認爲是正例
  • 在SVM的訓練中,是將候選框區域和某一單一類別的真實標註框進行對比,當IoU閾值小於0.3的時候爲負例,而正例爲真實標註框

而產生兩種不同策略的原因在於:

CNN的模型複雜度遠遠高於SVM,在訓練CNN的時候採用上面的策略會使得正例的數目是真正正例(即GT)的數目的30倍,這樣一方面可以避免CNN過擬合,另一方面可以爲SVM的訓練抽取到足夠有表現力的特徵(因爲如果採用SVM那種數據處理方式,會使得CNN得到的數據樣本很少)

由於SVM的模型是採用上面訓練好的CNN模型輸出的4096-D的特徵來進行訓練,因此SVM不需要採用過多的樣本來抽取特徵;同時SVM模型的複雜度很低,爲了獲取到足夠大的類間距,所以採用上面訓練SVM的策略,這樣可以讓SVM更容易區分正例和負例的區別

二、爲什麼不採用CNN後面接SoftMax直接進行分類,而是要在後面使用SVM分類

在上面的訓練策略中,爲了CNN抽取到訓練樣本中足夠豐富的特徵,採用上面介紹的CNN訓練數據的生成方法,引入了大量“jittered”樣本(與真實標註框的IoU閾值在0.5到1之間的候選框樣本)極大的擴充了正例,避免了CNN過擬合,但是由於“jittered”樣本與真實標註框之間存在很大的偏差,CNN很難有效的區分正例和負例之間的區別,因此CNN網絡在預測精確的定位位置上表現不佳

CNN的訓練中採用的是隨機選取正負例,保證兩者之間的比例爲1:3,而沒有采用SVM中的hard negative mining方法,同樣導致直接使用CNN進行分類的效果沒有使用功能SVM的好

Ablation studies

作者通過在上面提出的模型的基礎上分別用Pool5、fc6以及fc7產生的特徵來訓練SVM,並使用SVM進行分類後的mAP指標如下:

在這裏插入圖片描述

  • 前三行數據說明調優之前的模型中fc7的特徵泛化能力不如fc6的特徵,同時移除fc6和fc7,僅僅使用pool5的特徵,只使用CNN參數的6%也能有非常好的結果。可見CNN的主要表達力來自於卷積層,而不是全連接層
  • 中間三行數據說明調優之後的模型提升非常明顯,mAP提升了8個百分點,達到了54.2%。fc6和fc7的提升明顯優於pool5,這說明pool5從ImageNet學習的特徵通用性很強,在它之上層的大部分提升主要是在學習領域相關的非線性分類器(上面是文中的觀點,但是個人覺得這個數據實際上在一定程度上反駁了上邊關於全連接層對於模型的特徵表達沒有作用的觀點)

檢測錯誤分析

在這裏插入圖片描述

(這裏沒有看的太明白)

Bounding-box迴歸

通過上面的檢測錯誤分析,作者指出:

As an immediate consequence of this analysis, we demonstrate that a simple bounding-box regression method significantly reduces mislocalizations, which are the dominant error mode.

從而在SVM對每一個候選框進行分類後,針對預測有類別的候選框進行Bounding-box迴歸。詳細參考:https://blog.csdn.net/zijin0802034/article/details/77685438
(個人覺得這篇博客很贊,詳細的解釋了此處迴歸的loss函數的設計原理)

自己的一些問題

  • R-CNN中產生候選框位置的算法是Selective Search方法,該方法還是在利用傳統特徵的思想來提取後面需要檢測的位置,但是最後又使用了深卷積網絡提取到的特徵做Bounding-box迴歸來進行校正
  • 在產生正負例樣本的時候採用的是1:3的比例,感覺後的很多方法都沿用了這一比例

SPP-Net

《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》

提出問題以及產生問題的原因

流行的CNN結構通常都需要輸入圖像的尺寸是固定的,這限制了輸入圖像的長寬比和縮放尺度。當遇到任意尺寸的圖像時,都是先將圖像利用裁剪和變形縮放的方式來適應成固定尺寸。但裁剪會導致信息的丟失,變形會導致位置信息的扭曲,就會影響識別的精度。另外,一個預先定義好的尺寸在物體是縮放可變的時候就不適用了。

在這裏插入圖片描述

產生問題的原因主要來自網絡的全連接層,也即是網絡的最後階段。

解決問題的方案

解決上面CNN輸入固定問題的解決方案當然是本文的主角SPP了,即空間金字塔池化,論文首先說明了該結構的來歷以及優點

SPP的由來

SPP來源於SPM(Spatial Pyramid Matching),是論文《Beyond bags of features: Spatial pyramid matching for recognizing natural scene categories》提出的觀點,出現的背景是將BOVW(Bag of visual words)模型被大量地用在了Image representation中,但是BOVW模型完全缺失了特徵點的位置信息。
主要參考:https://blog.csdn.net/jwh_bupt/article/details/9625469

SPP介紹

在這裏插入圖片描述

通過上圖中將經典的7層網絡結構(如AlexNet或VGGNet)中conv5層產生的特徵圖進行可視化可以發現,CNN中的濾波器會被一些特定的語義激活,而這些濾波器也會在圖像中採集相應的語義信息。這項特性說明CNN也和傳統方法一樣使用以下步驟:

  1. 將原始圖像進行編碼(即SIFT特徵或者HOG特徵表示)後形成特徵圖(可以看成是一個特徵空間)
  2. 將特徵圖根據不同尺度提取不同大小的圖像塊(bins),這一個個圖像塊便可以看成是特徵空間中的特徵向量
  3. 將2中的特徵向量集合利用詞袋模型或者空間金字塔進行池化

而CNN作爲一種有效的特徵提取器便可以替換1中的SIFT特徵或者HOG特徵來完成特徵提取的任務。通過以上的這種方式SPP-Net想要完成的目標是:

卷積層接受任意大小的輸入,而分類器固定輸出向量的尺寸

在這裏插入圖片描述

如圖所示,SPP結構即針對任意大小的特徵圖,首先將特徵圖分爲4x4個圖像塊,然後對每一個圖像塊取最大值,於是便可以得到一個4x4的特徵圖(即對每一個圖像塊做最大池化操作),即圖中spatial pyramid pooling layer最左邊的16x256-d特徵,然後將特徵圖分爲4x4個圖像塊,然後對每一個圖像塊取最大值,於是便可以得到一個2x2的特徵圖,即圖中spatial pyramid pooling layer中間的4x256-d特徵,最後將特徵圖整體最大值,於是便可以得到一個1x1的特徵圖,即圖中spatial pyramid pooling layer最右邊的256-d特徵,將以上的各個特徵進行拼接,作爲全連接層的輸入,通過這種方式,不論輸入的大小是多少,輸出向量的尺寸都是(16+4+1)x256-d,其中256-d對應着Conv 5輸出的特徵圖即輸入SPP結構的特徵圖的數量

這種處理方式具有以下的優點:

SPP is able to generate a fixed-length output regardless of the input size, while the sliding window pooling used in the previous deep networks cannot

這種方法由於不是像傳統的詞袋模型那樣,直接將圖像中所有的圖像塊作爲特徵向量放入詞袋模型中,所以不會破壞特徵圖的空間信息

SPP uses multi-level spatial bins, while the sliding window pooling uses only a single window size. Multi-level pooling has been shown to be robust to object deformations

SPP can pool features extracted at variable scales thanks to the flexibility of input scales.

SPP-net not only makes it possible to generate representations from arbitrarily sized images/windows for testing, but also allows us to feed images with varying sizes or scales during training. Training with variable-size images increases scale-invariance and reduces over-fitting.

在檢測中,SPP-Net不用像R-CNN那樣對每張圖片中的上千個變形後的區域的像素反覆調用CNN,只需要在整張圖片上運行一次卷積網絡層(不關心窗口的數量),然後再使用SPP-net在特徵圖上抽取特徵,這裏用一張圖可以形象的說明:

在這裏插入圖片描述

SPP-Net的訓練

由於GPU的實現(如cuda-convnet和Caffe)更適合運行在固定輸入圖像上,因此SPP-Net採用下面兩種訓練方式:

單一尺寸訓練

首先考慮接收裁剪成224×224圖像的網絡。裁剪的目的是數據增強。對於一個給定尺寸的圖像,我們先計算空間金字塔池化所需要的塊(bins)的大小。試想一個尺寸是axa(也就是13×13)的conv5之後特徵圖。對於nxn塊的金字塔級,我們實現一個滑窗池化過程,窗口大小爲win = 上取整[a/n],步幅str = 下取整[a/n]. 對於l層金字塔,我們實現l個這樣的層。然後將l個層的輸出進行連接輸出給全連接層。

多尺寸訓練

攜帶SPP的網絡可以應用於任意尺寸,爲了解決不同圖像尺寸的訓練問題,我們考慮一些預設好的尺寸。現在考慮這兩個尺寸:180×180,224×224。我們使用縮放而不是裁剪,將前述的224的區域圖像變成180大小。這樣,不同尺度的區域僅僅是分辨率上的不同,而不是內容和佈局上的不同。對於接受180輸入的網絡,我們實現另一個固定尺寸的網絡。本例中,conv5輸出的特徵圖尺寸是axa=10×10。我們仍然使用win = 上取整[a/n],str = 下取整[a/n],實現每個金字塔池化層。這個180網絡的空間金字塔層的輸出的大小就和224網絡的一樣了。
這樣,這個180網絡就和224網絡擁有一樣的參數了。換句話說,訓練過程中,我們通過使用共享參數的兩個固定尺寸的網絡實現了不同輸入尺寸的SPP-net。
爲了降低從一個網絡(比如224)向另一個網絡(比如180)切換的開銷,我們在每個網絡上訓練一個完整的epoch,然後在下一個完成的epoch再切換到另一個網絡(權重保留)。依此往復。實驗中我們發現多尺寸訓練的收斂速度和單尺寸差不多。

SPP-Net用於物體檢測

在這裏插入圖片描述

將SPP-Net應用於檢測的步驟如下:

  1. 使用主幹網絡提取特徵,取conv5產生的特徵圖
  2. 根據Selective Search方法在原始圖像中選取到的候選框的位置映射到conv5產生的特徵圖中,利用該區域的特徵圖使用SPP產生定長的特徵
  3. SVM分類器根據上面的特徵進行分類
  4. 利用Bounding Box迴歸收緊檢測框

SPP-Net的測試結果總結

  1. 多尺度訓練的效果比單尺度訓練的好
  2. 採用整幅圖進行訓練的效果比只採用圖像正中間裁切後的圖像塊的效果好
  3. 給定兩個模型,我們首先使用每個模型對測試圖像的候選框進行打分。然後對並聯的兩個候選框集合上應用最大化抑制。一個方法比較置信的窗口就會壓制另一個方法不太置信的窗口。通過這樣的結合,mAP得到有效的提升,這意味着雙模型是互補的。並且這種互補性主要是因爲卷積層,結合卷積模型完全相同的兩個模型,則沒有任何效果。

Fast R-CNN

《Fast R-CNN》

作爲改進之前方法的論文,第一步,當然是水一下之前的論文了:
這裏主要針對R-CNN及其改進版本SPP-Net:

R-CNN和SPP-Net的缺點以及Fast R-CNN的貢獻

  • R-CNN缺點
    1. 訓練過程是多級pipline:即先訓練CNN網絡,然後根據CNN生成的特徵訓練SVM分類器
    2. 訓練時空間和時間開銷大:R-CNN訓練時是將每一張圖片中的所有RoI區域作爲輸入網絡的圖片,而同一張圖片中的RoI區域之間存在着很大程度上的重疊,因此對每一個RoI區域進行網絡傳播會造成大量的冗餘計算,同時由於SVM分類器的訓練需要CNN提取的特徵,因此前面的冗餘計算同樣會導致存儲這些CNN產生的特徵會造成空間上的冗餘
    3. 測試速度慢:對於每一個候選框都進行一次CNN的正向傳播,因此目標檢測速度很慢
  • SPP-Net的缺點
    1. 訓練過程是多級pipline
    2. 提取特徵使用共享計算,但是仍需要將特徵文件寫入內存,供後面分類器的訓練
  • Fast R-CNN的貢獻
    1. 訓練是使用多任務損失的單階段訓練,可以更新所有網絡層參數
    2. 訓練時將一站個圖片及其對應的RoI區域送入網絡中,利用RoI pooling層實現特徵的共享,大大的減少了R-CNN中訓練時空間和時間上的冗餘
    3. 不需要磁盤空間緩存特徵,來提供給分類器的訓練
    4. 比R-CNN和SPPnet具有更高的目標檢測精度

Fast R-CNN的結構

在這裏插入圖片描述

網絡的整體處理步驟爲:
Fast R-CNN網絡將整個圖像和一組候選框作爲輸入。網絡首先使用幾個卷積層和最大池化層來處理整個圖像,以產生卷積特徵圖。然後,對於每個候選框,RoI池化層從特徵圖中提取固定長度的特徵向量。每個特徵向量被送入一系列全連接(fc)層中,其最終分支成兩個同級輸出層 :一個輸出K個類別加上1個背景類別的Softmax概率估計,另一個爲K個類別的每一個類別輸出四個實數值。每組4個值表示K個類別的一個類別的檢測框位置的修正。

其中RoI池化層使用最大池化將任何有效的RoI內的特徵轉換成具有H×W(例如,7×7)的固定空間範圍的小特徵圖,其中H和W是層的超參數,獨立於任何特定的RoI。在本文中,RoI是卷積特徵圖中的一個矩形窗口。 每個RoI由指定其左上角(r,c)及其高度和寬度(h,w)的四元組(r,c,h,w)定義。RoI最大池化通過將大小爲h×w的RoI窗口分割成H×W個網格,子窗口大小約爲h/H×w/W,然後對每個子窗口執行最大池化,並將輸出合併到相應的輸出網格單元中。同標準的最大池化一樣,池化操作獨立應用於每個特徵圖通道。RoI層只是SPPnets中使用的空間金字塔池層的特殊情況,其只有一個金字塔層。

這裏採用博客Fast RCNN算法詳解中的兩幅圖來說明Fast R-CNN在上面網絡結構下的訓練和測試過程:
在這裏插入圖片描述
下面就具體根據訓練和測試兩個過程來分別說明Fast R-CNN算法的詳細情況

Fast R-CNN的訓練

從預訓練網絡初始化

Fast R-CNN採用了三個ImageNet預訓練的網絡:AlexNet,VGG_CNN_M_1024以及VGG16,對這些網絡進行下面的結構替換:

  1. 將網絡的輸入改爲:圖像的列表和這些圖像中RoI的列表
  2. 將最後的池化層替換成Rol池化,假設預訓練網絡的輸入圖片大小爲h和w,池化層之後的全連接層輸出爲:batchsize×c×1×1batchsize\times c\times 1\times 1,那麼Rol池化層中H和W兩個超參數設置爲(這裏假設網絡中的特徵圖長和寬相等):
    H=h/c,W=w/cH=h/\sqrt{c}, W=w/\sqrt{c}
  3. 將網絡的最後一格全連接層和Softmax(其被訓練用於1000類ImageNet分類)被替換爲前面描述的兩個同級層(全連接層和K+1個類別的Softmax以及類別特定的檢測框迴歸)

訓練配置

訓練數據採樣方式

不同於R-CNN和SPPNet將圖像中每一個RoI區域作爲輸入來進行反向傳播訓練,Fast R-CNN採用一種更有效的訓練方式:
在Fast R-CNN網絡訓練中,隨機梯度下降的小批量是被分層採樣的,首先採樣N個圖像,然後從每個圖像採樣R/N個RoI。關鍵的是,來自同一圖像的RoI在向前和向後傳播中共享計算和內存。減小N,就減少了小批量的計算。例如,當N=2和R=128時,得到的訓練方案比從128幅不同的圖採樣一個RoI(即R-CNN和SPPnet的策略)快64倍。在微調期間,每個SGD的小批量由N=2個圖像構成,均勻地隨機選擇。我們使用大小爲R=128的小批量,從每個圖像採樣64個RoI。並且這N張圖片以0.5的概率水平翻轉,其中正例和負例如下表選擇方式:

類別 比例 方式
正例 25% 與GT bounding box的IoU在[0.5,1)
負例 75% 與GT bounding box的IoU在[0.1,0.5)

從訓練配置中訓練數據採樣方式的表中可以看出,Fast R-CNN中訓練CNN還是採用R-CNN中1:3的正例和負例比例以及訓練CNN中區分正例和負例的IoU閾值,因此這裏實際上還是引入了R-CNN中討論的一個問題,採用上面這種IoU值來區分正例和負例會引入“jittered example”,即大量的正例與GT的bounding box之間還是存在一些偏差,不是精確的定位位置,導致CNN學到的分類邊界不明顯,可是Fast R-CNN採用這種方式來進行訓練卻比R-CNN和SPPNet中的效果好很多,裏面可能存在的原因是什麼?論文中給出的答案是:

“one-shot” fine-tuning is sufficient compared to previous multi-stage training approaches. We note that softmax, unlike one-vs-rest SVMs, introduces competition between classes when scoring a RoI.

上面的解釋主要說明了直接端到端訓練的有效性,並且由於softmax分類器不同於SVM是直接對21個類別進行分類,引入了不同類別之間的競爭(爲什麼引入不同類別之間的競爭會對最後的分類結果有幫助?)。

多任務損失

Fast R-CNN中將分類和迴歸損失合併爲一個損失函數:
L(p,u,tu,v)=Lcls(p,u)+λ[u1]Lloc(tu,v)L(p,u,t^u,v)=L_{cls}(p,u)+\lambda[u\ge1]L_{loc}(t^u,v)
其中分類損失函數如下,即爲softmax預測到的第uu類物體的概率值,負號爲了使該概率值越大,LclsL_{cls}值越小
Lcls(p,u)=log(pu)L_{cls}(p,u)=-log(p_u)
迴歸損失函數如下,其中(tiuvi)(t_i^u-v_i)部分主要參考R-CNN中的檢測框迴歸,主要的不同在於Fast R-CNN中採用的是Smooth L1損失,而R-CNN中採用的是L2損失:
Lloc(tu,v)=i{x,y,w,h}smoothL1(tiuvi)L_{loc}(t^u,v)=\sum_{i\in\{x,y,w,h\}}smooth_{L_1}(t_i^u-v_i)

smoothL1(x)={0.5x2x1x0.5otherwisesmooth_{L_{1}}(x)= \begin{cases} 0.5x^{2} & |x|\leq 1 \cr |x|-0.5 & otherwise \end{cases}

Smooth L1損失相較於L1 loss和L2 loss而言具有以下優點:
在這裏插入圖片描述

個人覺得這裏採用Smooth L1損失主要是因爲:根據上面關於R-CNN中loss函數的分析博客https://blog.csdn.net/zijin0802034/article/details/77685438可知,由於R-CNN只挑選出IoU>0.6的檢測框來訓練迴歸模型,所以可以控制預測的檢測框與GT之間的差值較小,保證其爲線性迴歸問題,但是在Fast R-CNN中由於採用多任務損失進行聯合訓練,並且從損失函數可以看到,是分類的結果決定了檢測的結果(即只有當分類結果u1u\ge1時,檢測部分的損失纔會大於0),因此如果分類出現了錯誤導致預測的檢測框與實際的檢測框相距很遠時,使用L2損失很容易導致梯度爆炸,因此採用Smooth L1損失。同時由於採用Smooth L1損失可以避免預測的檢測框與實際的檢測框相距很遠造成的梯度爆炸,便可以省略R-CNN檢測框迴歸中的正則項

RoI池化層的反向傳播SVD分解見博客Fast RCNN算法詳解

實驗結果

  • 使用多尺度的圖像金字塔,性能幾乎沒有提高
  • 倍增訓練數據,能夠有2%-3%的準確度提升
  • 網絡直接輸出各類概率(softmax),比SVM分類器性能略好
  • 更多候選窗不能提升性能

Fast R-CNN測試

Fast RCNN測試中region proposal的提取仍然使用selective search,其他過程與訓練中前向傳播的過程一致,同時目標檢測時間大多消耗在這上面(提region proposal 2~3s,而提特徵分類只需0.32s)

Faster R-CNN

《Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks》

提出問題:

在之前的SPPNet和Fast-RNN的研究中,利用RoI池化層實現了直接在卷積網絡提取的特徵上選取候選框區域,並對於每一個不同大小的候選框區域生成相同大小的特徵向量,最後對每一個候選框進行分類。因此這類研究已經非常有效的減少了檢測網絡的運行時間,但是region proposal的提取仍然使用selective search算法,使得區域提出計算成爲一個瓶頸。

本文解決方案

提出RPN網絡,它是一個全卷積網絡,可以同時在每個位置預測目標邊界和目標分數。RPN經過端到端的訓練,可以生成高質量的區域提出,由Fast R-CNN用於檢測。

Faster R-CNN參考博文

通過下面這幾篇博文對於Faster R-CNN可以有一個非常全面的瞭解:

我主要針對上面博文會涉及到的我之前沒有弄明白的幾個問題做以下的補充。

卷積層感受野的計算

在論文的3.1節介紹RPN網絡的內容中,有下面這一段話:

To generate region proposals, we slide a small network over the convolutional feature map output by the last shared convolutional layer. This small network takes as input an n × n spatial window of the input convolutional feature map. Each sliding window is mapped to a lower-dimensional feature (256-d for ZF and 512-d for VGG, with ReLU [33] following). This feature is fed into two sibling fullyconnected layers—a box-regression layer (reg) and a box-classification layer (cls). We use n = 3 in this paper, noting that the effective receptive field on the input image is large (171 and 228 pixels for ZF and VGG, respectively). This mini-network is illustrated at a single position in Figure 3 (left). Note that because the mini-network operates in a sliding-window fashion, the fully-connected layers are shared across all spatial locations. This architecture is naturally implemented with an n×n convolutional layer followed by two sibling 1 × 1 convolutional layers (for reg and cls, respectively).

在這裏插入圖片描述

(下面主要以VGG爲例)結合論文中的示意圖片,是解釋RPN網絡中採用3x3的卷積核在VGG網絡的conv5_3產生的feature map上進行滑動,併產生不同大小的anchor box,這裏存在的一個問題就是上面加黑的那句話中,在VGG的網絡中3x3的卷積核在VGG網絡的conv5_3產生的feature map上的區域對應的感受野大小是228,所以這裏主要講解一下感受野的計算。

感受野的計算主要可以分爲兩種方法,一種是自頂向下的計算方法,一種是自底向上的計算方法,兩種方法分別適用於不同的情況:

  • 需要知道整個網絡從上到下每一層特徵圖對應於原始輸入圖片的感受野大小,採用自頂向下的方式
  • 只需要求解某一層特徵圖對應的感受野大小,並且不需要知道其上各個層的感受野,採用自底向上的方式
  • 只需要求解某一層特徵圖對應的感受野大小,並且需要知道其上各個層的感受野,採用自頂向下的方式

從上面的描述中可以發現,自頂向下的計算方法在求解的過程中可以知道每一層的感受野大小,而自底向上的方式不行,只能用於求解某一層特徵圖對應的感受野大小。可是自底向上的方式相較於自頂向下的方式計算的過程稍微簡單一點,不容易弄錯,所以當我們只需要求解某一層特徵圖對應的感受野大小,並且不需要知道其上各個層的感受野,更推薦自底向上的方式

1. 自頂向下的計算方法

這種計算方法是從輸入圖片開始,向下逐層計算每一層特徵圖中r0×r0r_0\times r_0的範圍內對應在原始輸入圖片中的感受野大小。主要過程爲:

首先假設我們需要求的感受野範圍是r0×r0r_0\times r_0,並且輸出特徵圖的jump爲jj,該值是卷積核的步長從上到下的累積量,那麼有:

{ri+1=ri+(ki+11)×ji ji+1=ji×si+1\left\{ \begin{array}{lr} r_{i+1} = r_i + (k_{i+1} -1)\times j_i & \\\ j_{i+1} = j_i\times s_{i+1} \end{array} \right.

其中kk爲卷積核的大小,ss爲卷積核的步長。初始情況下:

  • r0×r0r_0\times r_0爲我們需要求的感受野範圍
  • j0=1j_0 = 1
  • k1×k1k_1 \times k_1爲第一層卷積核的尺寸

後面層數的計算以此類推,主要需要注意的是在計算ri+1r_{i+1}的時候,使用的是jij_i而不是ji+1j_{i+1}。正是由於我們自頂向下的求解過程中需要求解卷積核步長的累加量,所以相較於自底向上的方法要稍微複雜一點

上面的內容主要參考:

卷積神經網絡中的感受野計算(譯)

特徵圖尺寸和感受野計算詳解

下面這個用於實現計算網絡感受野的網站也是使用這種方式來進行計算的:

Fomoro AI

2. 自底向上的計算方法

這種方法是從我們需要求解的層開始逐層向上進行計算,採用與上面相同的符號,可以有下面的地推公式:

rn1=sn1×(rn1)+kn1r_{n-1} = s_{n-1}\times (r_{n}-1)+k_{n-1}

由於我們是自底向上進行求解,所以這裏的初始值是第nn層的特徵圖需要求解的感受野範圍:

初始情況如下:

  • rn×rnr_n\times r_n爲第nn層的特徵圖需要求解的感受野範圍
  • sn1s_{n-1}爲產生第nn層的特徵圖的卷積覈對應的步長
  • kn1k_{n-1}爲產生第nn層的特徵圖的卷積覈對應的尺寸

這種方式不需要計算步長的累加量,所以更加簡潔一些,其計算的中間結果對應於第nn層的特徵圖對應於其上的各個層次的特徵圖的感受野範圍。

上面的內容主要參考:

CNN:接受視野(Receptive Field)

損失函數詳細解釋

Faster R-CNN中的損失函數分爲兩個部分:

  1. RPN網絡中判斷Anchor是否包含物體的分類損失以及收緊Anchor的迴歸損失組成的損失函數
  2. Fast R-CNN中判斷region proposal中目標類別的分類損失以及收緊檢測框的迴歸損失組成的損失函數

以上兩個多任務損失函數中的分類損失均採用交叉熵損失函數,迴歸損失均採用R-CNN中的Bounding Box Regression損失函數,所以下面主要分成這兩部分來進行分析。

1. 交叉熵損失函數

  • 信息熵

爲了說明交叉熵,我們從信息熵這個源頭來進行解釋。

在我們的生活中,信息的作用是爲了消除不確定性,不能消除不確定性的信息我們稱之爲噪聲。而信息量就可以被看做是衡量事件不確定性的量。事件的不確定性可以理解爲一個事件有多少種等可能的情況可能發生,這個可能性可以用概率來進行描述。那麼我們如何衡量這個不確定性的量呢?這裏可以由質量的定義來進行類推,我們爲了用單位千克來衡量一個物體的質量,會選擇一個參照物的質量作爲基準,假設這個基準物體的質量爲B,待測物體的質量爲m,那麼有:

m=n×Bm = n\times B

而爲了衡量待測物體的質量,就可以用乘法的反函數即除法來進行:

n=m/Bn = m / B

所以待測物體的重量爲nn千克。

同樣的,爲了衡量一個事件不確定的量,我們同樣可以找一個參照事件作爲基準來進行衡量,假設我們選取的事件是拋硬幣,對於一枚硬幣的拋硬幣事件,有正面和反面兩種可能性,即212^1種可能性,而對於兩枚硬幣則有222^2種可能性。假設待測事件可能發生的情況有m種,那麼就有:

m=2nm = 2^n

爲了衡量待測事件相當於多少個拋硬幣事件,即爲指數函數的反函數即對數函數來進行求解:

n=log2mn = log_2m

這裏我們用bit來作爲單位,所以待測事件的信息量爲nnbit。

上面在說明的時候,我們強調上面所有可能發生的情況都是等可能發生的,可是當各個情況不是等可能性的時候該怎樣進行衡量呢?

這裏假設我們的事件有四種可能發生的情況爲A,B,C,D,其中三種情況發生的概率爲1/6,第四種情況發生的概率爲1/2,按照上面的分析,此時我們計算這個事件的信息量即爲(假設四個事件可能發生的情況分別爲mAm_AmBm_BmCm_CmDm_D):

n=PA×log2mA+PB×log2mB+PC×log2mC+PD×log2mDn = P_A\times log_2m_A + P_B\times log_2m_B + P_C\times log_2m_C + P_D\times log_2m_D

那麼怎樣計算mAm_AmBm_BmCm_CmDm_D呢?這裏我們首先有PA=1/6P_A = 1/6PB=1/6P_B = 1/6PC=1/6P_C = 1/6PD=1/2P_D = 1/2,對於mAm_A,即A事件可能發生的情況,按照PA=1/6P_A = 1/6,說明A事件有6中可能發生的情況,所以mA=1/PAm_A = 1 / P_A,因此上式可以寫爲:

n=PA×log2(1/PA)+PB×log2(1/PB)+PC×log2(1/PC)+PD×log2(1/PD)n = P_A\times log_2(1/P_A) + P_B\times log_2(1/P_B) + P_C\times log_2(1/P_C) + P_D\times log_2(1/P_D)

而這裏的信息量我們用信息熵H來定義,假設事件有N種情況,情況ii發生的概率爲PiP_i,同時我們用於衡量的基準事件有m中可能發生的情況,那麼有:

H=i=0NPilogmPiH = - \sum_{i=0}^{N} P_ilog_mP_i

可以發現信息熵的形式與我們最終要討論的交叉熵形式上非常相似。

參考:學習觀10:信息與熵

學習觀11:量化信息

​ 《數學之美》第6章:信息的度量和作用

  • 交叉熵

參考【直觀詳解】信息熵、交叉熵和相對熵

  • 交叉熵損失函數

在Faster R-CNN中分類損失函數爲:

  1. RPN中分類前景和背景兩個類別的損失函數(NclsN_{cls}是mini-batch的數量):1/Ncls(pilogpi+pilogpi)-1/N_{cls}(p_ilogp_i+p_i^*logp_i^*)
  2. Fast R-CNN中分類多個類別uu的損失函數:logpu-logp_u

1中的損失函數是標準的信息熵的形式,即當分類器預測前景和背景兩者的概率分別爲1/2時,其信息熵值最大,也即是損失函數值最大,利用梯度下降法進行訓練後,讓分類器能夠改變兩種情況的預測概率,當其中一個的概率接近1,另一個接近0時,其信息熵值最小,也即是損失函數值最小。

2中的損失函數則是交叉熵的形式,其函數log前面沒有參數,也即是將各個類別的發生概率同等看待,因爲在真實的分佈下,各個類別是等可能發生的,而我們訓練分類器同樣是要改變各個類別的分佈概率,讓分類器儘量使其中一種類別的預測概率接近1,其他的類別預測概率接近0,這樣就可以減少損失函數的大小,也即是在給定的真實分佈情況下,使用非真實分佈指定的策略消除系統的不確定性所需要付出努力的大小。

2. 邊框迴歸損失函數

邊框損失函數主要參考:邊框迴歸(Bounding Box Regression)詳解

上面的邊框迴歸詳解中是解釋R-CNN中的邊框損失,而Faster R-CNN中的邊框迴歸損失分爲兩類:

  1. RPN中的邊框迴歸損失,與上面參考博客唯一的不同是這裏的Region Proposal採用的是預設的Anchor來生成
  2. Fast R-CNN中的邊框迴歸損失,與上面參考博客唯一的不同是這裏的Region Proposal採用的是RPN中生成的結果

而兩個邊框迴歸損失爲了避免Region Proposal和Ground Truth相差較大,導致損失函數的值過大,於是採用了Smooth L1損失函數,同時引入了λ\lambda參數來平衡多任務損失函數中分類損失函數和邊框迴歸損失函數兩者的權重平衡,保證損失函數對於兩類損失函數給予相同的關注程度

SoftMax函數實現細節

在上面一文讀懂Faster RCNN的博客2.3節softmax判定foreground與background中,RPN網絡在預測前景和背景類別的時候,採用下面的結構進行:

在這裏插入圖片描述

第一次reshape將原始的caffe blob中的存儲形式[1, 2x9, H, W]轉換爲[1, 2, 9xH, W],而softmax層進行多分類時,在caffe中的實現實際上是:

"Number of labels must match number of predictions; "
"e.g., if softmax axis == 1 and prediction shape is (N, C, H, W), "
"label count (number of labels) must be N*H*W, "
"with integer values in {0, 1, ..., C-1}.";

即是將channel的數量作爲類別的數量,而N*H*W均爲表示這個類別的特徵,這裏稍微補充一下。

自己還存在的問題

在Faster R-CNN的ROI Pooling步驟中,以VGG作爲主幹網絡爲例,用於ROI Pooling的特徵圖爲conv5_3生成的大小爲[1,512,14,14],可以發現特徵圖的大小爲14×1414\times 14,可是ROI Pooling中pooledw×poolh=7×7pooled_w\times pool_h = 7\times 7

用於ROI Pooling的特徵圖也即是用於生成Anchor的特徵圖,生成Anchor僅僅用3×33\times 3的劃窗進行生成,可是pooledw×poolhpooled_w\times pool_h參數卻爲7×77\times 7,很明顯對於aspect ratio爲0.5的Anchor,根本就沒有7×77\times 7個像素來做ROI Pooling,這個位置到底是怎樣設計的,難道此處的ROI Pooling操作是在輸入圖片上來採集特徵?感覺也不對啊。希望有知道的小夥伴能夠告知,感恩!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章