致初學者的深度學習入門系列(三)—— 深度學習目標檢測篇(上)

語言: CN / TW / HK

本文已參與「新人創作禮」活動,一起開啟掘金創作之路。

目標定位

​ 在softmax層中不僅僅只輸出分類資訊,還可以輸出目標的外接矩形框的角點和長寬,這樣就可以轉化為一個邏輯迴歸的問題。只要在訓練集上對相應資訊進行標註,以及定義合適的損失函式,就可以通過實現對目標的定位。

目標檢測

滑動視窗法

​ 首先設定固定大小的視窗,以固定步長遍歷影象,每次都將視窗內的影象傳入分類網路進行分類,以達到對目標的檢測效果。但是,步長的選擇無法適應不同情況。過大的步長計算成本低,但檢測的精確度下降,無法很好的框選目標;過小的步長又會導致傳入網路的視窗數量過多,計算成本巨大。

  • 滑動視窗在卷積上的實現

​ 對於滑動視窗傳入分類網路,並不需要單獨每一次都把視窗內的影象單獨傳入網路進行分類,這樣明顯效率低下。根據卷積的特性,不同視窗經過多層卷積,最終只對應feature maps上的一個畫素點,只要訪問其中一個畫素點就可以得到對應視窗經過分類網路得到的結果。

全卷積層(FCN)

​ 傳統的CNN其確定的網路輸入影象的大小也是固定的,因為全連線層的每個節點都與上一層的全部節點項鍊,當輸入影象大小不同時,全連線層前的feature map的大小也不相同。由於卷積只需要用卷積核在影象上遍歷即可得到結果,並不會限制輸入影象的尺寸。所以只要將全連線層也轉化為卷積層,就可以使得神經網路輸入影象的尺寸不受到限制。

​ 且實現全連線層需要進行Flatten操作,將二維的feature maps被壓縮成一維,丟失了空間資訊,這對語義分割造成了困難,所以我們需要丟棄全連線層。

​ FCN對影象進行畫素級的分類,從而解決了語義級別的影象分割問題。與經典的CNN在卷積層之後使用全連線層得到固定長度的特徵向量進行分類(全聯接層+softmax輸出)不同,FCN可以接受任意尺寸的輸入影象,採用反捲積層對最後一個卷積層的feature map進行上取樣, 使它恢復到輸入影象相同的尺寸,從而可以對每個畫素都產生了一個預測, 同時保留了原始輸入影象中的空間資訊, 最後在上取樣的特徵圖(heatmap)上進行逐畫素分類。最後逐個畫素計算softmax分類的損失, 相當於每一個畫素對應一個訓練樣本。

非極大值抑制(NMS)

​ 採用滑動視窗進行目標檢測時,對同一物件可能會生成多個檢測框。由於只要大於一定的閾值就會生成檢測框,所以程式並不知道這些檢測框對應的是同一個檢測物件,此時就要用到非極大值抑制。

IOU(Intersection Over Union)

$$

IOU=\dfrac{A\cap B}{A \cup B} \quad\text{(交併比)} $$

​ 對於Bounding Box列表B機器置信度S,選擇具有最大S的檢測框M,將其從B中移除並加入到最終檢測結果D中,將B中剩餘檢測框與M的IOU大於某閾值的從B中移除,重複直到B為空。

Top-1 正確率和Top-5正確率

Top-1正確率指正確標籤為最佳概率的樣本數除以總樣本數

Top-5正確率指正確標籤包含在前五個分類概率的樣本數除以總的樣本數

目標檢測網路的框架

  • Input:Image、Patches、Image Pyramid等。
  • BackBone:目標檢測網路的主幹,主要作用是對進行特徵提取,常需要對大型資料集進行與訓練。常見有VGG系列、ResNet系列、SpineNet、EfficientNet系列等。
  • Head:目標檢測網路的頭部,主要作用是預測物件所屬的類別和可邊界框的位置大小。分為one-stage和two-stage兩種。one-stage以YOLO、SSD、RetinaNet為代表,two-stage以R-CNN系列為代表。
  • two-stage方法:主要思路是先通過啟發式演算法(selective search)或者CNN網路(RPN)產生一系列稀疏的候選框,然後對這些候選框進行分類和迴歸。例如R-CNN、Fast R-CNN、Faster R-CNN等,其優勢是準確度較高。
  • one-stage方法:主要思路是均勻地在圖片的不同位置進行密集抽樣,抽樣時可以採用不同尺度和長寬比,然後利用CNN提取特徵後直接進行分類與迴歸,整個過程只需要一步。例如YOLO、SSD等,其優勢是速度快,但是均勻的密集取樣的一個重要缺點是訓練比較困難,這主要是因為正樣本與負樣本(背景)極其不均衡,導致模型準確度稍低。
  • Neck:隨著後來的發展,人們常在BackBone和Head之間新增一些網路層,稱為Neck。Neck常由幾個自下而上的path或自上而下的path組成。主要分為Additional Blocks和Path-aggregation blocks。
  • Additional Blocks:SPP、ASPP、RFB、SAM。
  • Path-aggregation blocks:FPN、PAN、BiFPN、NAS-FPN。

目標檢測網路的發展歷程

R-CNN

  • Selective Search

​ 首先通過影象分割演算法(Efficient Graph-Based Image Segmentation)得到影象初始區域,使用貪心演算法對區域進行迭代分組:

  1. 計算所有鄰近區域之間的相似性;
  2. 兩個最相似的區域被組合在一起;
  3. 計算合併區域和相鄰區域的相似度;
  4. 重複2、3過程,直到整個影象變為一個地區。

​ 度量相似性時採用一些多樣性策略,對顏色相似度、紋理相似度、尺度相似度、形狀重合度進行計算並進行加權求和得到最終的相似度,以此判斷合併。

  • BackBone:AlexNet

分類過程:

  1. 首先採用Selective Search演算法生成Region Proposal,並且使用非極大值抑制剔除重疊區域。
  2. 在ImageNet上進行預訓練,將成熟的權重引數作為網路的初始化引數進行fine-tune。
  3. 將區域內的影象輸入到AlexNet中進行預測,並得到一個固定長度的特徵向量。
  4. 用SVM對該特徵向量做類別預測。
  5. 採用邏輯迴歸函式,對Bounding Box進行迴歸計算,進行目標定位。

SPP-Net(空間金字塔池化網路)

  • 候選區域對映

​ 候選區域通過卷積層運算,雖然尺寸會發生變化,但同樣能夠達到框選目標物件的效果。所以沒有必要單獨將候選區域中的影象輸入到分類網路中,只需要一次性計算出feature maps,對應對映後的候選區域可以直接用在feature maps上。

  • 空間金字塔池化層

分類過程:

  1. 採用Selective Search演算法生成Region Proposal,並且使用非極大值抑制剔除重疊區域。
  2. 一次性輸入到CNN中得到feature maps。在其中找到各個候選框,對其採用金字塔空間池化提取出固定長度的特徵向量。
  3. SVM進行特徵向量分類識別。

Fast R-CNN

  • ROI Pooling

​ 將候選區域分成mxn個塊,每個塊執行Max Pooling。不同尺寸的候選區域都分成同樣多的塊做最大池化,提取成固定尺寸的特徵。

  • Muli-task Loss

  • SVD加速全連線層

SVD的定義:

$$ A=U\sum V^T $$

其中,A為mxn的矩陣,U為AA^T的m個特徵向量組成的mxm矩陣,V為A^TA的n個特徵向量組成的nxn矩陣。\sum是除了對角線上是奇異值其他位置都為0的矩陣。

奇異值

$$ \sigma_i=\sqrt{\lambda_i} \quad \lambda_i為A^TA的特徵值 $$

SVD常用於降維演算法中的矩陣分解。

計算過程:

計算全連線時的一次前向傳播

$$ y=wx\quad(w為權重) $$

計算複雜度為mxn。

將w進行SVD分解並用前t個特徵值近似。

$$ y=wx=U\sum V^Tx=Uz $$

計算複雜度為mxt+nxt<mxn。

  • 正負樣本的選取

​ 通常隨機選取256個樣本,其中128個正樣本,128個負樣本。IOU<0.7選取為正樣本,IOU為0.3選取為負樣本。

Faster R-CNN

  • 區域生長網路(RPN)

​ 感受野:feature map上的畫素對映在輸入影象上的區域。

​ 對於特徵圖上的每個3x3的滑動視窗,計算出滑動視窗中心點對應原始影象上的中心點,並計算出k(一般為9)個anchor boxes,生成一維向量,通過兩個全連線層得到2k個scores(背景和非背景的softmax)和4k個coordinates(x, y, w, h)。通過這些量來生成候選區域。

anchor boxes:

其餘均與fast R-CNN一致。

Mask R-CNN

  • ROI Align

ROI Pooling的量化誤差問題

​ 由於ROI Pooling操作會產生區域不匹配的問題,而畫素值只能為整數,此時就只能對畫素取整處理,引入了一次量化誤差

示例:輸入特徵圖尺寸為55,而網路輸入尺寸為22,那麼網格的劃分結果為

​ 而對於每個小網格進行Max Pooling又要進行一次量化操作,這兩次量化操作在feature maps上對映會原圖就會產生較大的誤差。

​ 為了解決ROI Pooling的上述缺點,作者提出了ROI Align這一改進的方法。ROI Align的思路很簡單:取消量化操作,使用雙線性內插的方法獲得座標為浮點數的畫素點上的影象數值,從而將整個特徵聚集過程轉化為一個連續的操作。(雙線性插值是一種比較好的影象縮放演算法,它充分的利用了原圖中虛擬點四周的四個真實存在的畫素值來共同決定目標圖中的一個畫素值,即可以將虛擬的位置點對應的畫素值估計出來。)

  • Instance segmentation

​ Mask-RCNN的BackBone為ResNet,當輸入的Bounding Box傳入網路到ResNet的倒數第四層時,得到7x7x1024的ROI Feature,然後分為兩個分支,其中一個與Faster R-CNN一樣負責分類和迴歸計算,另一分支採用FCN(全卷積網路)進行升維到與輸入影象尺寸一致的單通道map。每個畫素的值用0和1表示,1代表屬於該分類物體,0代表不屬於,生成的map稱為Mask(即做到畫素級的分類,以達到例項分割的效果)。

  • 損失函式

$$ L=L_{cls}+L_{box}+L_{mask} $$

​ Lmask定義為the average binary cross-entropy loss ,定義的Lmask允許網路為每一類生成一個mask,而不用和其它類進行競爭;我們依賴於分類分支所預測的類別標籤來選擇輸出的mask。這樣將分類和mask生成分解開來。

「其他文章」