天天看點

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

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

    • 計算機視覺的三大任務
    • OverFeat
      • 引入問題
      • OverFeat改進方法
      • Offset Pooling
      • FCN
      • 分類任務
        • 模型訓練
        • 模型測試
      • 定位任務
        • 模型訓練
        • 模型定位步驟
      • 分類和定位任務
      • 參考資料:
    • R-CNN
      • 使用深度網絡來定位物體
        • 産生類别無關的候選框
        • 卷積神經網絡産生定長的特征向量
        • 指定類别的SVM線性分類器
      • 訓練網絡
        • CNN的訓練
        • SVM分類器的訓練
        • CNN和SVM訓練中的問題
        • Ablation studies
        • 檢測錯誤分析
        • Bounding-box回歸
      • 自己的一些問題
    • SPP-Net
      • 提出問題以及産生問題的原因
      • 解決問題的方案
        • SPP的由來
      • SPP介紹
      • SPP-Net的訓練
        • 單一尺寸訓練
        • 多尺寸訓練
      • SPP-Net用于物體檢測
      • SPP-Net的測試結果總結
    • Fast R-CNN
      • R-CNN和SPP-Net的缺點以及Fast R-CNN的貢獻
      • Fast R-CNN的結構
      • Fast R-CNN的訓練
        • 從預訓練網絡初始化
        • 訓練配置
        • 實驗結果
      • Fast R-CNN測試
    • Faster R-CNN
      • Faster R-CNN參考博文
      • 卷積層感受野的計算
      • 損失函數詳細解釋
      • SoftMax函數實作細節
      • 自己還存在的問題

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

計算機視覺的三大任務

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

OverFeat

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

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

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

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

  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整體流程圖如下所示:

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

Offset Pooling

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

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

具體操作步驟為:

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

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

FCN

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

分類任務

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

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

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

  • 快速模型架構
目标檢測two-stage經典方法總結
  • 高精度模型架構
    目标檢測two-stage經典方法總結

模型訓練

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

  • 對于訓練資料集中每一張256×256圖檔及其鏡像,随機crop成一張224×224的圖檔
  • 利用PCA來處理RGB三通道的值

AlexNet的詳細處理步驟為:

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

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

模型測試

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個尺寸的圖檔,并對所有尺寸的圖檔做翻轉作為輸入。
目标檢測two-stage經典方法總結
  • 将以上圖檔輸入模型直接進行測試,并在此處引入offset pooling來實作原始檢測架構中的密集滑窗政策,進而對于每一個尺寸的輸入圖檔産生如上表最後一列所示數量的特征向量
  • 對于網絡輸出的各個尺度對應的特征向量,例如第一個尺度産生的輸出3x3xC,則是對于每一個類别對應的3x3個特征向量取平均值,得到該尺度下每一個類别的機率值,以此類推到各個尺度,便可以求出各個尺度中各個類别的機率。最後将各個尺度中相同類别的機率值做平均,便可以得到最終的各個類别的機率,根據評價名額的需要取最大的一個機率對應的類别作為top-1,或者最大的5個機率對應的類别作為top-5.

定位任務

模型訓練

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

模型定位步驟

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

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

  • 利用不同的尺寸來進行預測,由于尺寸越大,對應的第五層産生的特征圖的大小也越大,而特征圖中每一個像素點都對應一個檢測框,是以原圖尺寸越大,越會産生更多的檢測框
    目标檢測two-stage經典方法總結
  • 在上面的基礎上,運用offset pooling 即滑窗的方法,是以在每一個scale又産生了不同的3x3個不同滑動視窗,是以進一步的增加了檢測視窗的數量
    目标檢測two-stage經典方法總結
  • 此處展示的是上面的每一個尺寸的每一滑窗的每一個像素點對應的位置回歸網絡産生的四個坐标點回歸值
    目标檢測two-stage經典方法總結
  • 結合上圖中各個尺度各個滑窗上産生的檢測框
    目标檢測two-stage經典方法總結
    目标檢測two-stage經典方法總結

分類和定位任務

整體上OverFeat利用OverFeat特征提取器來提取特征,将該特征運用于後面的分類和定位任務,即可以看作對于後面産生的特征圖中的每一個像素點映射到原始圖中的區域,在該區域預測出分類任務中各個類别的機率以及回歸任務中檢測框的坐标值,下面同樣以281x317的輸入尺寸為例,給出網絡同時進行兩項任務的示意圖:

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

參考資料:

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的具體構造:

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

如上圖所示,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大小的圖檔
目标檢測two-stage經典方法總結

上圖中展示了作者在附錄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名額如下:

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

檢測錯誤分析

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

(這裡沒有看的太明白)

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結構通常都需要輸入圖像的尺寸是固定的,這限制了輸入圖像的長寬比和縮放尺度。當遇到任意尺寸的圖像時,都是先将圖像利用裁剪和變形縮放的方式來适應成固定尺寸。但裁剪會導緻資訊的丢失,變形會導緻位置資訊的扭曲,就會影響識别的精度。另外,一個預先定義好的尺寸在物體是縮放可變的時候就不适用了。

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

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

解決問題的方案

解決上面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介紹

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

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

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

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

卷積層接受任意大小的輸入,而分類器固定輸出向量的尺寸
目标檢測two-stage經典方法總結

如圖所示,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在特征圖上抽取特征,這裡用一張圖可以形象的說明:
目标檢測two-stage經典方法總結

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用于物體檢測

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

将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的結構

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

網絡的整體處理步驟為:

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在上面網絡結構下的訓練和測試過程:

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

下面就具體根據訓練和測試兩個過程來分别說明Fast R-CNN算法的詳細情況

Fast R-CNN的訓練

從預訓練網絡初始化

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

  1. 将網絡的輸入改為:圖像的清單和這些圖像中RoI的清單
  2. 将最後的池化層替換成Rol池化,假設預訓練網絡的輸入圖檔大小為h和w,池化層之後的全連接配接層輸出為: b a t c h s i z e × c × 1 × 1 batchsize\times c\times 1\times 1 batchsize×c×1×1,那麼Rol池化層中H和W兩個超參數設定為(這裡假設網絡中的特征圖長和寬相等):

    H = h / c , W = w / c H=h/\sqrt{c}, W=w/\sqrt{c} H=h/c

    ​,W=w/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 , t u , v ) = L c l s ( p , u ) + λ [ u ≥ 1 ] L l o c ( t u , v ) L(p,u,t^u,v)=L_{cls}(p,u)+\lambda[u\ge1]L_{loc}(t^u,v) L(p,u,tu,v)=Lcls​(p,u)+λ[u≥1]Lloc​(tu,v)

其中分類損失函數如下,即為softmax預測到的第 u u u類物體的機率值,負号為了使該機率值越大, L c l s L_{cls} Lcls​值越小

L c l s ( p , u ) = − l o g ( p u ) L_{cls}(p,u)=-log(p_u) Lcls​(p,u)=−log(pu​)

回歸損失函數如下,其中 ( t i u − v i ) (t_i^u-v_i) (tiu​−vi​)部分主要參考R-CNN中的檢測框回歸,主要的不同在于Fast R-CNN中采用的是Smooth L1損失,而R-CNN中采用的是L2損失:

L l o c ( t u , v ) = ∑ i ∈ { x , y , w , h } s m o o t h L 1 ( t i u − v i ) L_{loc}(t^u,v)=\sum_{i\in\{x,y,w,h\}}smooth_{L_1}(t_i^u-v_i) Lloc​(tu,v)=i∈{x,y,w,h}∑​smoothL1​​(tiu​−vi​)

s m o o t h L 1 ( x ) = { 0.5 x 2 ∣ x ∣ ≤ 1 ∣ x ∣ − 0.5 o t h e r w i s e smooth_{L_{1}}(x)= \begin{cases} 0.5x^{2} & |x|\leq 1 \cr |x|-0.5 & otherwise \end{cases} smoothL1​​(x)={0.5x2∣x∣−0.5​∣x∣≤1otherwise​

Smooth L1損失相較于L1 loss和L2 loss而言具有以下優點:

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

個人覺得這裡采用Smooth L1損失主要是因為:根據上面關于R-CNN中loss函數的分析部落格https://blog.csdn.net/zijin0802034/article/details/77685438可知,由于R-CNN隻挑選出IoU>0.6的檢測框來訓練回歸模型,是以可以控制預測的檢測框與GT之間的內插補點較小,保證其為線性回歸問題,但是在Fast R-CNN中由于采用多任務損失進行聯合訓練,并且從損失函數可以看到,是分類的結果決定了檢測的結果(即隻有當分類結果 u ≥ 1 u\ge1 u≥1時,檢測部分的損失才會大于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可以有一個非常全面的了解:

  • 一文讀懂Faster RCNN
  • Faster R-CNN 論文閱讀記錄(一):概覽
  • Faster R-CNN 論文閱讀記錄(二):細節
  • Faster R-CNN的詳細訓練步驟參考:Object Detection and Classification using R-CNNs

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

卷積層感受野的計算

在論文的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).
目标檢測two-stage經典方法總結

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

感受野的計算主要可以分為兩種方法,一種是自頂向下的計算方法,一種是自底向上的計算方法,兩種方法分别适用于不同的情況:

  • 需要知道整個網絡從上到下每一層特征圖對應于原始輸入圖檔的感受野大小,采用自頂向下的方式
  • 隻需要求解某一層特征圖對應的感受野大小,并且不需要知道其上各個層的感受野,采用自底向上的方式
  • 隻需要求解某一層特征圖對應的感受野大小,并且需要知道其上各個層的感受野,采用自頂向下的方式

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

1. 自頂向下的計算方法

這種計算方法是從輸入圖檔開始,向下逐層計算每一層特征圖中 r 0 × r 0 r_0\times r_0 r0​×r0​的範圍内對應在原始輸入圖檔中的感受野大小。主要過程為:

首先假設我們需要求的感受野範圍是 r 0 × r 0 r_0\times r_0 r0​×r0​,并且輸出特征圖的jump為 j j j,該值是卷積核的步長從上到下的累積量,那麼有:

{ r i + 1 = r i + ( k i + 1 − 1 ) × j i   j i + 1 = j i × s i + 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. {ri+1​=ri​+(ki+1​−1)×ji​ ji+1​=ji​×si+1​​

其中 k k k為卷積核的大小, s s s為卷積核的步長。初始情況下:

  • r 0 × r 0 r_0\times r_0 r0​×r0​為我們需要求的感受野範圍
  • j 0 = 1 j_0 = 1 j0​=1
  • k 1 × k 1 k_1 \times k_1 k1​×k1​為第一層卷積核的尺寸

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

上面的内容主要參考:

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

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

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

Fomoro AI

2. 自底向上的計算方法

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

r n − 1 = s n − 1 × ( r n − 1 ) + k n − 1 r_{n-1} = s_{n-1}\times (r_{n}-1)+k_{n-1} rn−1​=sn−1​×(rn​−1)+kn−1​

由于我們是自底向上進行求解,是以這裡的初始值是第 n n n層的特征圖需要求解的感受野範圍:

初始情況如下:

  • r n × r n r_n\times r_n rn​×rn​為第 n n n層的特征圖需要求解的感受野範圍
  • s n − 1 s_{n-1} sn−1​為産生第 n n n層的特征圖的卷積核對應的步長
  • k n − 1 k_{n-1} kn−1​為産生第 n n n層的特征圖的卷積核對應的尺寸

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

上面的内容主要參考:

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 × B m = n\times B m=n×B

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

n = m / B n = m / B n=m/B

是以待測物體的重量為 n n n千克。

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

m = 2 n m = 2^n m=2n

為了衡量待測事件相當于多少個抛硬币事件,即為指數函數的反函數即對數函數來進行求解:

n = l o g 2 m n = log_2m n=log2​m

這裡我們用bit來作為機關,是以待測事件的資訊量為 n n nbit。

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

這裡假設我們的事件有四種可能發生的情況為A,B,C,D,其中三種情況發生的機率為1/6,第四種情況發生的機率為1/2,按照上面的分析,此時我們計算這個事件的資訊量即為(假設四個事件可能發生的情況分别為 m A m_A mA​, m B m_B mB​, m C m_C mC​, m D m_D mD​):

n = P A × l o g 2 m A + P B × l o g 2 m B + P C × l o g 2 m C + P D × l o g 2 m D n = P_A\times log_2m_A + P_B\times log_2m_B + P_C\times log_2m_C + P_D\times log_2m_D n=PA​×log2​mA​+PB​×log2​mB​+PC​×log2​mC​+PD​×log2​mD​

那麼怎樣計算 m A m_A mA​, m B m_B mB​, m C m_C mC​, m D m_D mD​呢?這裡我們首先有 P A = 1 / 6 P_A = 1/6 PA​=1/6, P B = 1 / 6 P_B = 1/6 PB​=1/6, P C = 1 / 6 P_C = 1/6 PC​=1/6, P D = 1 / 2 P_D = 1/2 PD​=1/2,對于 m A m_A mA​,即A事件可能發生的情況,按照 P A = 1 / 6 P_A = 1/6 PA​=1/6,說明A事件有6中可能發生的情況,是以 m A = 1 / P A m_A = 1 / P_A mA​=1/PA​,是以上式可以寫為:

n = P A × l o g 2 ( 1 / P A ) + P B × l o g 2 ( 1 / P B ) + P C × l o g 2 ( 1 / P C ) + P D × l o g 2 ( 1 / P D ) 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) n=PA​×log2​(1/PA​)+PB​×log2​(1/PB​)+PC​×log2​(1/PC​)+PD​×log2​(1/PD​)

而這裡的資訊量我們用資訊熵H來定義,假設事件有N種情況,情況 i i i發生的機率為 P i P_i Pi​,同時我們用于衡量的基準事件有m中可能發生的情況,那麼有:

H = − ∑ i = 0 N P i l o g m P i H = - \sum_{i=0}^{N} P_ilog_mP_i H=−i=0∑N​Pi​logm​Pi​

可以發現資訊熵的形式與我們最終要讨論的交叉熵形式上非常相似。

參考:學習觀10:資訊與熵

​ 學習觀11:量化資訊

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

  • 交叉熵

參考【直覺詳解】資訊熵、交叉熵和相對熵

  • 交叉熵損失函數

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

  1. RPN中分類前景和背景兩個類别的損失函數( N c l s N_{cls} Ncls​是mini-batch的數量): − 1 / N c l s ( p i l o g p i + p i ∗ l o g p i ∗ ) -1/N_{cls}(p_ilogp_i+p_i^*logp_i^*) −1/Ncls​(pi​logpi​+pi∗​logpi∗​)
  2. Fast R-CNN中分類多個類别 u u u的損失函數: − l o g p u -logp_u −logpu​

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網絡在預測前景和背景類别的時候,采用下面的結構進行:

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

第一次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 × 14 14\times 14 14×14,可是ROI Pooling中 p o o l e d w × p o o l h = 7 × 7 pooled_w\times pool_h = 7\times 7 pooledw​×poolh​=7×7。

用于ROI Pooling的特征圖也即是用于生成Anchor的特征圖,生成Anchor僅僅用 3 × 3 3\times 3 3×3的劃窗進行生成,可是 p o o l e d w × p o o l h pooled_w\times pool_h pooledw​×poolh​參數卻為 7 × 7 7\times 7 7×7,很明顯對于aspect ratio為0.5的Anchor,根本就沒有 7 × 7 7\times 7 7×7個像素來做ROI Pooling,這個位置到底是怎樣設計的,難道此處的ROI Pooling操作是在輸入圖檔上來采集特征?感覺也不對啊。希望有知道的小夥伴能夠告知,感恩!

繼續閱讀