天天看點

目标檢測學習筆記(三):Fast R-CNNFast R-CNN 結構及訓練

原文參考:Fast R-CNN

Fast R-CNN 是2015年 Ross Girshick 提出的目标檢測優化模型,這個模型是建立在 R-CNN 和 SPPnet 模型的基礎上進行改進的,實作了在訓練及測試速率上都達到了很大程度上的優化。

首先,R-CNN 本身具有一些問題:

  • R-CNN 是一種多步驟訓練的模型(Multi-stage pipeline),先通過卷積網絡對每一個輸入的 object proposal 進行計算提取特征,然後再使用支援向量機(SVM)來對每個物體進行識别分類,最後在對 bounding-box(bbox)進行拟合訓練;
  • 因為比較複雜的網絡結構,R-CNN 無論是在訓練還是測試過程中都需要耗費很長的時間,并且在訓練過程中由于需要将卷積網絡從每個 proposal 中提取的特征寫入記憶體,是以還需要占用很大的存儲空間。

R-CNN 之是以耗費時間,是因為在運作過程中,卷積網絡需要依次對每個 proposal 進行卷積計算提取特征,是以在計算過程中不存在任何的資料共享。而 SPPnet 則采用了空間金字塔池化層實作了運算資料共享,詳細原理在目标檢測學習筆記(二):RoI 池化層中有相應的介紹。

但是 SPPnet 也存在一些問題,比如同 R-CNN 一樣是一種 Multi-stage pipeline,而且提取的特征值也需要寫入記憶體,并且在訓練過程中,空間池化層之前的卷積層權值不能夠得到更新,是以限制了卷積網絡的精度。

Fast R-CNN 結構及訓練

Fast R-CNN 通過對前述模型進行優化,獲得了更高的檢測品質(mAP),并且由于采用單步模型(single-stage)和多任務損失(multi-task loss),以及無需寫入記憶體,實作在訓練及測試速率上大大提高。

目标檢測學習筆記(三):Fast R-CNNFast R-CNN 結構及訓練

與 R-CNN 将所有 proposal 作為卷積網絡輸入不同,Fast R-CNN 一次将整個圖像作為輸入,通過卷積層及池化層獲得一個卷積特征圖,同時,通過 RoI projection 将原輸入圖像上的每個 proposal 映射在卷積特征圖上的相應區域,獲得相應的映射 proposal 後,采用一個 RoI 池化層來提取一個固定尺寸的特征向量。

固定參數的全連接配接層如何适應于不同尺寸的 Proposal?

我們知道,在一個神經網絡的訓練過程中,卷積層和池化層無論針對何種尺寸的輸入圖像資訊都能夠獲得相應的輸出,并且能夠達到相應的目的。因為卷積層的任務是提取輸入資訊中的特征,而池化層則主要是為了消除由于區域資訊對特征識别造成的影響。

全連接配接層的存在主要是為了實作分類,也就是針對輸入特征資訊來完成相應的分類任務,而全連接配接層的維數也就代表着特征資訊的類别數目。在訓練過程中,全連接配接層的參數是固定始終不變的,這也就要求其輸入資訊的次元也不能夠改變。

而在目标檢測的過程中,無論采用何種方式來完成 proposal 的提取,最終 proposal 的尺寸往往不可能相同,這也使得各種模型需要采用相應的方法來歸一化 proposal 的尺寸大小。

在 R-CNN 中針對此問題采用的方法是,在提取相應的 proposal 後,将其内部的像素進行壓縮或者膨脹,使所有的 proposal 最後都能夠變換成相同的尺寸,用這種方式得到的圖像往往都有不同程度的變形,參考 R-CNN。

而 SPPnet 則提出了空間金字塔池化層改進了這一方法,且 Fast R-CNN 中的 RoI 池化操作其實也是 SPP 的一種特殊形式,詳細參考目标檢測學習筆記(二):RoI 池化層。

為啥 Fast R-CNN 訓練過程中能更新整個網絡的參數而 SPPnet 不闊以?

首先,R-CNN 和 SPPnet 的訓練方式是:每個訓練樣本 proposal 都來自于不同的圖像,而由于 proposal 的感受視野可能會非常大,訓練時的輸入也就相應比較大,導緻反向傳播更新參數會非常低效。

Fast R-CNN 則提出了一種能夠實作特征共享的訓練方式,在訓練過程中,采用梯度下降法的 mini-batch 先采取 N 個輸入圖像,再從每個圖像中提取 R/N 的 RoI(R 即 mini-batch 中的樣本總數),當采樣圖像數目 N 較小時,能夠有效減少運算量,因為同一圖像中的特征資訊能夠共享,在論文中,采用 N=2,R/N = 64,能夠實作 64 倍速率于 N=128,R/N=1 的訓練方式,即 R-CNN 和 SPPnet 的訓練方式。

但是由于樣本大多來自于同一圖像,也就使得樣本之間具有一定的相關性,這就隐藏問題可能會減緩訓練的收斂速度。而作者在論文指出,雖然有這種潛在問題,但實驗證明收斂速率依然快于 R-CNN。(然而并妹說原因?喵喵喵?)

Multi-task 損失函數計算

由于将模型簡化為 single-stage 的模型,也就使得各個損失成分需要進行并行輸出,通過權重求和的方式來完成整體損失值的輸出。

Fast R-CNN 有兩個并行的輸出層:第一個輸出層輸出每個 RoI 在 K+1 個類别上的評價分數(Confidence),其中 K 表示預期識别的 K 個物體種類,而 1 則代表着輸出為背景,不屬于 K 個類别中的任何一個;第二個輸出層則輸出 bbox 的四維參數。

在訓練過程中,每一個輸入的 RoI 都标記一個實際的目标類别 u 以及實際的目标框 bbox v,然後通過 multi-task loss 來同時對分類精度以及 bbox 拟合進行訓練優化:

目标檢測學習筆記(三):Fast R-CNNFast R-CNN 結構及訓練

式中,Lcls 表示類别損失,後一項則用于計算 bbox 的拟合損失。第二項的系數 λ 在 u≥1(屬于待分類類别中的一個類别) 時有效,取值為1,而當 u=0(背景)的時候,取值為0,即 bbox 的拟合損失不計入總體的損失函數值。

Bbox 的損失計算采用 L1 損失函數,具體可參考目标檢測學習筆記(一):InteractNet。第二項系數 λ 控制着兩項損失貢獻的平衡,在實驗中,将所有的目标框參數進行标準化,使所有 v 參數的均值為0,是以将 λ 取值為1。

Mini-batch 采樣

在訓練的采樣過程中,每次選取 2 個輸入圖像,并從每個圖像中選取 64 個 RoI。

在這 64 個 RoI 中,25% 的樣本從與真實 bbox 的 IoU 大于 0.5 的 RoI 中選取,這些樣本根據真實 bbox 中的物體類别進行類别标記(u=x, N≥x≥1, N為待分類類别總數);

其餘的 RoI 從 IoU 值為 [0.1, 0.5) 的樣本中選取,并标記為背景(u=0)。

參考資料:

[1] Fast R-CNN

繼續閱讀