天天看點

目标檢測算法總結

參考:目标檢測算法之SSD

概述

目前目标檢測算法的主流算法主要分為兩類:

  1. two-stage方法。比如R-CNN系算法。主要思路是先通過啟發式方法(selective search)或者CNN網絡(RPN)産生一系列稀疏的候選框,然後對這些候選框進行分類和回歸。two-stage方法的優點是準确度高。
  2. one-stage方法。比如yolo和SSD。主要思路是均勻的在圖檔的不同位置上密集抽樣,抽樣時可以采用不同的比例和長寬比,然後用CNN提取特征後直接分類與回歸,整個過程隻需要一步,是以優點是速度快。但是均勻的密集采樣的缺點是訓練困難,主要是因為正樣本與負樣本(背景)及其不均衡,導緻模型準确度較低。
下圖是不同算法的基本架構圖:
目标檢測算法總結

解釋

  1. Fast R-CNN首先通過CNN得到候選框,然後再分類與回歸。
  2. yolo和SSD可以一步到位完成檢測。
  3. SSD相比較yolo的三個不同點:

    (1)SSD采用CNN直接檢測,而不是像yolo一樣在全連接配接層後面做檢測。

    (2)SSD提取不同尺寸的特征圖做檢測。大尺度特征圖(較靠前的特征圖)可以用來檢測小物體,而小尺度特征圖(較靠後的特征圖)用來檢測大物體。

    (3)SSD采用不同尺度和長寬比的先驗框(prior box/default box,這個概念在Fast R-CNN中叫做錨,anchors)

  4. yolo算法的缺點是難以檢測小目标,且定位不準,上面提到的SSD相較于yolo改進的三點使得SSD克服了yolo的缺點。

SSD算法

Single shot MultiBox Detector即SSD。single shot說明SSD是one-stage方法。MultiBox說明SSD是多框預測。SSD算法普遍在準确度和速度上都優于yolo。

設計理念

SSD和yolo都是采用一個CNN來檢測,但是SSD采用多尺度的特征圖。設計理念總結為三點。

  1. 設計理念一——采用多尺度特征圖用于檢測。

    采用多尺度也就是采用大小不同的特征圖,CNN網絡一般前面的特征圖比較大,後面會逐漸采用strid=2的卷積或者是pool來降低特征圖大小。如下面的基本架構圖所示,前面是大的特征圖,後面是小的特征圖。這兩個不同尺度的特征圖都用來做檢測。目的是為了:大的特征圖用來檢測小目标,小特征圖用來檢測大目标。

    目标檢測算法總結
    下圖表示不同尺寸的特征圖。
    目标檢測算法總結
    8*8的特征圖是大的特征圖,可以劃分更多的單元,但是其每個單元的先驗框尺度都比較小。是以大尺度的特征圖用來檢測小目标。而4*4的特征圖是小的特征圖,但是其每個單元的先驗框尺度都比較大。是以小尺度的特征圖用來檢測大目标。
  2. 設計理念二——采用卷積檢測

    與yolo最後采用全連接配接層不同,SSD直接用卷積對不同的特征圖提取檢測結果。

  3. 設計理念三——設定先驗框

    yolo中,每個單元預測多個邊界框,其都是相對這個單元本身(正方塊)。但是真實目标的形狀是多變的,是以yolo在訓練過程中需要自适應目标的形狀。

SSD借鑒Fast R-CNN中anchor的理念,每個單元設定尺度或者長寬比不同的先驗框,預測的邊界框(bounding box)是以這些先驗框為基準,一定程度上減少訓練難度。每個單元會設定多個先驗框,其尺度和長寬比存在差異,如下圖所示,下圖中每個單元采用了四個先驗框,真實圖檔中的貓和狗都分别選擇最适合它們形狀的先驗框訓練。

SSD的檢測值也和yolo不太一樣,對于每個單元的每個先驗框,都輸出一套獨立的檢測值,對應一個邊界框,主要分為兩個部分:

(1)第一部分是各個類别的置信度或者評分,要注意的是SSD将背景也當成了一個特殊的類别。如果檢測目标共有C個類别,SSD需要預測C+1個置信度值,其中第一個置信度就是指的不含目标或者說是屬于背景的評分。是以要注意的是:當說C個類别置信度時,裡面包含了背景這個特殊類别,真實類别是C-1個。預測時,置信度最高的那個類别就是邊界框所屬的類别。當第一個置信度值最高時,表示邊界框中不含有目标即是屬于背景。

(2)第二部分就是邊界框的location。包含4個值(cx,cy,w,h),分别表示邊界框的中心坐标和寬高。

真實預測值是邊界框相對于先驗框的轉換值。

先驗框位置如下:

目标檢測算法總結

對應的邊界框位置如下:

目标檢測算法總結

邊界框的預測值l就是b相對于d的轉換值,即邊界框位置相對于先驗框位置的轉換值。計算式子如下:

目标檢測算法總結

在預測時,需要反向上面的這個過程,從預測值l中得到邊界框的真實位置b。計算式子如下:

目标檢測算法總結

綜上,對于一個大小為mn的特征圖,共有mn個單元,每個單元設定的先驗框數目記為k,那麼每個單元需要(c+4)k個預測值。(解釋:c是表示c個類别,包括了特殊的背景類别。4表示的是4個位置參數即中心坐标和寬和高,共4個值。)故特征圖所有單元共需要mn*(c+4)*k個預測值。

SSD采用卷積做檢測,需要(c+4)*k個卷積核完成這個特征圖的檢測。

SSD的基本架構圖

目标檢測算法總結

SSD的網絡結構

SSD采用VGG16作為基礎模型,在VGG16的基礎上新增卷積層以獲得更多的特征圖以用于檢測。

SSD和yolo的網絡結構圖如下

目标檢測算法總結

SSD網絡結構采用一種Atrous Algorithm,就是conv6采用擴充卷積或者是帶孔卷積,其在不增加參數和模型複雜度的條件下指數級擴大卷積的視野。如下圖所示:第一張圖是普通的33卷積,視野就是33。第二張圖擴張率為2,視野變為77。第三張圖擴張率為4時,視野擴大為1515,但是視野的特征更稀疏了。

VGG16的conv4_3層作為檢測的第一個特征圖,conv4_3層特征圖大小是38*38。但是該層較靠前,norm較大,是以在其後增加了一個L2 normalization層,以保證和後面的檢測層差異不是很大。這個和batch normalization層不太一樣,其僅僅是對每個像素點在channle次元做歸一化。而bacth normalization層是在[batch_size width height]三個次元上做歸一化。

下圖表示基于卷積得到檢測結果:

目标檢測算法總結

訓練過程

第一步 先驗框比對

訓練過程中首先要确定訓練圖檔中的ground truth(真實目标)與哪個先驗框來進行比對,與之比對的先驗框所對應的邊界框将負責預測它。yolo中ground truth的中心落在哪個單元格,該單元格與其IOU最大的邊界框負責預測它。

SSD不一樣,SSD先驗框與ground truth的比對原則有兩點:

  1. 對于圖檔中的每個ground truth,找到與其IOU最大的先驗框,該先驗框與其比對,這樣可保證每個ground truth一定與某個先驗框比對,與ground truth相比對的先驗框為正樣本。若一個先驗框沒有與任何一個ground truth相比對則說明該先驗框隻能與背景相比對,就是負樣本。

    一個圖檔中ground truth是很少的,而先驗框卻很多,如果僅僅按照上面第一個原則進行比對,那麼很多先驗框會是負樣本,正負樣本是及其不平衡的。是以需要第二個原則。

  2. 對于剩下的未比對先驗框,若某個ground truth的IOU大于某個門檻值(一般是0.5),那麼該先驗框也與這個ground truth比對。
SSD比對示意圖如下
目标檢測算法總結

上圖中綠色的GT是ground truth。紅色為先驗框,FP表示負樣本,TP表示正樣本。

資料擴增

data augmentation資料擴增可以提升SSD性能。采用的技術有:水準翻轉horizontal flip、随機裁剪加顔色扭曲random crop / color distortion、随機采集塊域randomly sample a patch(擷取小目标訓練樣本)。如下圖所示:

目标檢測算法總結

SSD預測過程

  1. 對于每個預測框,首先根據類别置信度确定其類别(置信度最大者)及其置信度值,并過濾掉屬于背景的預測框.
  2. 根據置信度門檻值(如0.5)過濾掉門檻值較低的預測框。
  3. 對于留下的預測框進行解碼,根據先驗框得到真實的位置參數(解碼後一般要做clip,防止預測框位置超出圖檔)
  4. 解碼之後,根據置信度降序排列,然後僅僅保留top-k個預測框。
  5. 最後進行NMS算法,過濾掉那些重合度較大的預測框。
  6. 最後剩餘的預測框是檢測結果。

小結論

  1. 資料擴增對于mAP的提升很大。
  2. 使用不同長寬比的先驗框可以得到更好的結果。
  3. 采用多尺度的特征圖用于檢測很重要。

繼續閱讀