你不得不瞭解的目標檢測發展史

計算機視覺

計算機視覺中的三大類任務:

  • 分類 Classification:解決“是什麼?”的問題,即給定一張圖片或一段視頻判斷裏面包含什麼類別的目標
  • 定位 Location:解決“在哪裏”的問題,即定位出這個目標的位置
  • 檢測 Detection:解決“是什麼?在哪裏”的問題,即定位出這個目標的位置並且知道目標物是什麼
  • 分割 Segmentation:分爲實例分割和場景分割,解決“每一個像素屬於哪個目標物或場景”的問題。

一、目標檢測

目標檢測可以理解爲是物體識別和物體定位的綜合,不僅僅要識別物體屬於哪個分類,更重要的是得到物體在圖片中的具體位置。

爲了完成這兩個任務,目標檢測模型分爲兩類。一類是two-stage算法;一類是one-stage算法。對於two-stage檢測方法來說,它先生成了可能包含物體的候選區域Region Proposal,然後對這個候選區域做進一步的分類和校準,得到最終的檢測結果,代表方法有R-CNN系列方法。而對於one-stage檢測算法直接給出最終的檢測結果,沒有經過生成候選區域的步驟,典型代表爲YOLO和SSD。

目標檢測算法的3個模塊:第一個是檢測窗口的選擇第二個是圖像特徵的提取第三個是分類器的設計

補充基礎知識之檢測窗口的選擇

1.滑動窗口法

首先對輸入圖像進行不同窗口大小的滑窗進行從左往右、從上到下的滑動。每次滑動時候對當前窗口執行分類器(分類器是事先訓練好的)。如果當前窗口得到較高的分類概率,則認爲檢測到了物體。對每個不同窗口大小的滑窗都進行檢測後,會得到不同窗口檢測到的物體標記,這些窗口大小會存在重複較高的部分,最後採用非極大值抑制(Non-Maximum Suppression, NMS)的方法進行篩選。最終,經過NMS篩選後獲得檢測到的物體。

2.選擇性搜索(Selective Search)

爲了在滑動窗口檢測器的基礎上提高搜索速度,可以採用候選區域方法(region proposal method)創建目標檢測的感興趣區域(ROI)。
圖像中物體可能存在的區域應該是有某些相似性或者連續性區域的。因此,選擇搜索基於上面這一想法採用子區域合併的方法進行提取bounding boxes候選邊界框。首先,對輸入圖像進行分割算法產生許多小的子區域。其次,根據這些子區域之間相似性(相似性標準主要有顏色、紋理、大小等等)進行區域合併,不斷的進行區域迭代合併。每次迭代過程中對這些合併的子區域做bounding boxes(外切矩形),這些子區域外切矩形就是通常所說的候選框。

3.區域候選網絡(Region Proposal Network RPN)

anchor是固定尺寸的bbox。具體作法是:把feature map每個點映射回原圖的感受野的中心點當成一個基準點,然後圍繞這個基準點選取k個不同的尺寸和比例的anchor。對於W×H大小的卷積feature map(通常爲2400),總共有W×H×k個錨點。默認使用3個尺度和3個縱橫比,在每個滑動位置上產生k=9個anchor。在feature map上的每個特徵點預測多個region proposals。例如對於像素點個數爲 51×39 的一幅feature map上就會產生 51×39×9 個候選框。雖然anchors是基於卷積特徵圖定義的,但最終的 anchors是相對於原始圖片的。

二、Two-Stage算法

1.R-CNN(Selective Search +CNN +SVM)

Region CNN由Ross Girshick提出,是利用深度學習進行目標檢測的里程碑之作,奠定了這個子領域的基礎。

步驟

  • 1.候選區域生成:一張圖像採用 Selective Search生成1k~2k個候選區域Region Proposal
  • 2.特徵提取:對每個候選區域,使用深度卷積網絡提取CNN特徵
  • 3.類別判斷:特徵送入每一類的SVM分類器,判別是否屬於該類
  • 4.位置精修:使用迴歸器細修候選框位置

缺點

  • 1.重複計算。R-CNN雖然不在是窮舉,但通過Proposal(Selective Search)的方案依然有兩千個左右的候選框,這些候選框都需要單獨經過backbone網絡提取特徵,計算量依然很大,候選框之間會有重疊,因此有不少重複計算。
  • 2.訓練測試不簡潔。候選區域提取、特徵提取、分類、迴歸都是分開操作,中間數據還需要單獨保存。

2.SPP-NET(ROI Pooing)

SPP:Spatial Pyrmid Pooling(空間金字塔池化)。

CNN一般都含有卷積部分和全連接部分。其中,卷積層不需要固定尺寸的圖像,而全連接層是需要固定大小的輸入。
所以當全連接層面對各種尺寸的輸入數據時,就需要對輸入數據進行crop(crop就是從一個大圖中扣出網絡輸入大小的patch,比如227×227),或warp(把一個邊界框bounding box的內容resize成227×227)等一系列操作以統一圖片的尺寸大小。

SPP Net的作者何凱明考慮到,既然由於全連接FC層的存在,普通的CNN需要通過固定輸入圖片的大小來使得全連接層的輸入固定。那借鑑卷積層可以適應任何尺寸,爲何不能在卷積層的最後加入某種結構,使得後面全連接層得到的輸入變成固定的呢?

這個“化腐朽爲神奇”的結構就是spatial pyramid pooling layer。下圖便是R-CNN和SPP Net檢測流程的比較:

Spatial Pyramid Pooling層,對卷積特徵圖像進行空間金字塔採樣獲得固定長度的輸出,可對特徵層任意長寬比和尺度區域進行特徵提取。具體做法是對特徵圖像區域進行固定數量的網格劃分,對不同寬高的圖像,每個網格的高度和寬度是不規定的,但對劃分的每個網格進行池化,這樣就可以得到固定長度的輸出。SPP操作示意圖:

步驟

  • 1.首先通過選擇性搜索,對待檢測的圖片進行搜索出2000個候選窗口。這一步和R-CNN一樣。
  • 2.特徵提取階段。這一步就是和R-CNN最大的區別了,同樣是用卷積神經網絡進行特徵提取,但是SPP-Net用的是金字塔池化。這一步驟的具體操作如下:把整張待檢測的圖片,輸入CNN中,進行一次性特徵提取,得到feature maps,然後在feature maps中找到各個候選框的區域,再對各個候選框採用金字塔空間池化,提取出固定長度的特徵向量。而R-CNN輸入的是每個候選框,然後在進入CNN,因爲SPP-Net只需要一次對整張圖片進行特徵提取,速度是大大地快啊。江湖傳說可一個提高100倍的速度,因爲R-CNN就相當於遍歷一個CNN兩千次,而SPP-Net只需要遍歷1次。
  • 3.最後一步也是和R-CNN一樣,採用SVM算法進行特徵向量分類識別。

3.Fast R-CNN(Selective Search +CNN + ROI)

Fast R-CNN主要優化了兩個問題:

  • 1.提出ROI Pooling池化層結果,解決了候選框子圖必須將圖像裁剪縮放到相同尺寸大小的問題。由於CNN網絡的輸入圖像尺寸必須是固定的某一個固定大小(否則全連接沒法計算),故R-CNN中對大小形狀不同的候選框,進行了裁剪和縮放,使得他們達到相同的尺寸。這個操作既浪費時間,又容易導致圖像信息丟失和形變。fast R-CNN在全連接層之前插入了ROI pooling層,從而不需要對圖像進行裁剪,很好的解決了這個問題。

    • ROI Pooling的具體操作如下:

      • a.將region proposal劃分成h * w大小的網格;
      • b.對每一個網格做MaxPooling(即每一個網格對應一個輸出值);
      • c.將所有輸出值組合起來便形成固定大小爲h * w的feature map。

      這樣我們就可以從不同大小的方框得到固定大小的相應 的feature maps。值得一提的是,輸出的feature maps的大小不取決於ROI和卷積feature maps大小。ROI pooling 最大的好處就在於極大地提高了處理速度。

  • 2.提出多任務損失函數思想,將分類損失和邊框定位迴歸損失結合在一起統一訓練,最終輸出對應分類和邊框座標。

步驟

  • 1.首先以整張圖片爲輸入,利用CNN得到圖片的特徵層。
  • 2.然後,利用selective search算法得到原始圖像空間中的候選框,並將這些候選框投影到特徵層。
  • 3.針對特徵層上的每個不同大小的候選框,使用RoI池化操作,得到固定維度的特徵表示。
  • 4.最後通過兩個全連接層,分別用softmax分類以及迴歸模型進行檢測。

4.Faster R-CNN(RPN +CNN + ROI)


R-CNN和fast R-CNN均存在一個問題,那就是由選擇性搜索來生成候選框,這個算法很慢。Faster R-CNN針對這個問題,提出了RPN網絡來進行候選框的獲取,從而擺脫了選擇性搜索算法,也只需要一次卷積層操作,從而大大提高了識別速度。
主要步驟:

  • 1.卷積層。原始圖片先經過conv-relu-pooling的多層卷積神經網絡,提取出特徵圖。供後續的RPN網絡和全連接層使用。Faster R-CNN不像R-CNN需要對每個子圖進行卷積層特徵提取,它只需要對全圖進行一次提取就可以了,從而大大減少了計算時間。
  • 2.RPN層,Region Proposal Networks。RPN層用於生成候選框,並利用softmax判斷候選框是前景還是背景,從中提取前景候選框,並利用bounding box regression調整候選框的位置,從而得到特徵子圖,稱爲proposals。
  • 3.ROI層。它將大小尺寸不同的proposal池化成相同的大小,然後送入後續的全連接層進行後續的全連接層進行物體分類和位置調整迴歸。
  • 4.分類層。利用ROI層輸出的特徵圖proposal的類別,同時再次對bounding box進行regression從而得到精準的形狀和位置。

5.R-FCN

R-FCN是Faster-RCNN的改進型,其速度提升了2.5倍以上,並略微提高了準確度。其主要貢獻是提出Position-sentive score maps來解決目標檢測的位置敏感性問題。

位置敏感性

分類網絡的位置不敏感性

對於分類任務而言,我希望我的網絡有一個很好的分類性能,隨着目標在圖片中不斷的移動,但我的忘了仍然可以準確的將你區分爲對應的類別。如上圖左邊所示,不管你這個鳥在圖片中如何移動,我的分類網絡都能準確的將你分類爲鳥。即我的網絡有很好的區分能力。

檢測網絡的位置敏感性

對於檢測任務而言,我希望我的網絡有一個很好的檢測性能,可以準確的輸出目標所在的位置值。隨着某個目標的移動,我的網絡希望能夠和它一起移動,仍然能夠準確的檢測到它,即我對目標位置的移動很敏感。我需要計算對應的偏差值,我需要計算我的預測和GT的重合率等。但是,深的全卷積網絡不具備這樣的一個特徵。

總之分類網絡的位置不敏感性和檢測網絡的位置敏感性的一個矛盾問題,而我們的目標檢測中不僅要分類也要定位,那麼如何解決這個問題呢,R-FCN提出了Position-sensitive score maps來解決這個問題。

步驟:

  • 1.圖片首先進圖特徵提取網絡主幹網絡;
  • 2.然後進行分支操作;
    • a.RPN網絡沒什麼改變,輸出兩個損失函數判斷anchor是否是前景,然後篩選出特定個數的候選框;
    • b.下面支路進行卷積輸出即爲position-sensitive score map,本層不改變大小,輸出維度是重點:K * K * (C+1)
    • c.還需一個卷積支路輸出 K * K * 4通道的特徵。稱作位置敏感得分映射,用於迴歸位置修正。

骨幹架構(backbone architecture)

R-FCN使用的是殘差網絡的ResNet-101結構,ResNet-101採用的是100層卷積+Global Averaging Pooling(GAP)+ FC分類器的結構,ResNet101卷積的最後一層的Feature Map的個數是2048。在R-FCN中,去掉了ResNet的GAP層和fc層,並在最後一個卷積層之後使用1024個1×1×2048卷積降維到1024-d,然後再使用k2*(C+1)個1×1×1024-d的卷積生成k2*(C+1)-d的位置敏感卷積層。其中ResNet部分使用在ImageNet上訓練好的模型作爲初始化參數。

位置敏感網絡

該層的大小和ResNet-101最後一層的大小相同,維度是k^2×(C+1)。C+1C+1爲類別數,表示CC類物體加上1類背景。k是一個超參數,表示把ROI劃分grid的單位,一般情況下,k=3。在R-FCN中,一個ROI區域會被等比例劃分成一個k×k的grid,每個位置爲一個bin,分別表示該grid對應的物體的敏感位置(左上,正上,右上,正左,正中,正右,左下,正下,右下)編碼。

三、One-Stage算法

1.YoLoV1

步驟:

  • 1.給定一個輸入圖像,YoLoV1會把圖像看成一個s * s 的柵格,這的的s等於7。即首先將圖像劃分成7 * 7 的網格;
  • 2.對於上述每個柵格,每個柵格預測兩個bounding boxe以及柵格含有對象的置信度,同時每個柵格還會預測柵格所屬對象類別。
  • 3.根據上一步可以預測出的目標窗口,然後根據閾值去除可能性比較低的目標窗口,然後根據NMS去除冗餘窗口。

架構:

YOLOv1由24層卷積層,4個最大池化層和2個全連接層組成。我們關注最後的輸出是7x7x30,這裏是7x7代表輸入圖像的7x7柵格,一一對應,30的前十個代表2個bounding boxes的座標以及對象的置信度,後20個代表VOC數據集的20個類別。

標籤定義:

YOLOv1是一個監督式的網絡,有監督那就有標籤,來看看標籤是怎樣定義,首先看狗,它被一個框框起來了,這個框就是真實的標籤,框對應的中心在哪個柵格,就代表當前柵格是狗所在的柵格,這個柵格里就會記錄狗的標籤信息,自行車和小車和狗類似。

2.SSD(Single Shot MultiBox Detector)

SSD的全稱是Single Shot MultiBox Detector,Single Shot表示SSD是像YOLO一樣的單次檢測算法,MultiBox指SSD每次可以檢測多個物體,Detector表示SSD是用來進行物體檢測的。
SSD做出的改進如下:

  • 使用了類似Faster R-CNN中RPN網絡提出的錨點(Anchor)機制,增加了bounding box的多樣性;
  • 使用全卷積的網絡結構,提升了SSD的速度;
  • 使用網絡中多個階段的Feature Map,提升了特徵多樣性。

SSD的網絡結構

  • 1.卷積層

SSD論文采用了VGG16的基礎網絡,其實這也是幾乎所有目標檢測神經網絡的慣用方法。先用一個CNN網絡來提取特徵,然後再進行後續的目標定位和目標分類識別。

  • 2.目標檢測層

這一層由5個卷積層和一個平均池化層組成。去掉了最後的全連接層。SSD認爲目標檢測中的物體,只與周圍信息相關,它的感受野不是全局的,故沒必要也不應該做全連接。SSD的特點如下

  • a.多尺寸feature map上進行目標檢測
    每一個卷積層,都會輸出不同大小感受野的feature map。在這些不同尺度的feature map上,進行目標位置和類別的訓練和預測,從而達到多尺度檢測的目的,可以克服yolo對於寬高比不常見的物體,識別準確率較低的問題。而yolo中,只在最後一個卷積層上做目標位置和類別的訓練和預測。這是SSD相對於yolo能提高準確率的一個關鍵所在。
    在每個卷積層上都會進行目標檢測和分類,最後由NMS進行篩選,輸出最終的結果。多尺度feature map上做目標檢測,就相當於多了很多寬高比例的bounding box,可以大大提高泛化能力。
  • b.多個anchors,每個anchor對應4個位置參數和21個類別參數

和faster R-CNN相似,SSD也提出了anchor的概念。卷積輸出的feature map,每個點對應爲原圖的一個區域的中心點。以這個點爲中心,構造出6個寬高比例不同,大小不同的anchor(SSD中稱爲default box)。每個anchor對應4個位置參數(x,y,w,h)和21個類別概率(voc訓練集爲20分類問題,在加上anchor是否爲背景,共21分類)。如下圖所示

  • 3.篩選層

和yolo的篩選層基本一致,同樣先過濾掉類別概率低於閾值的default box,再採用NMS非極大值抑制,篩掉重疊度較高的。只不過SSD綜合了各個不同feature map上的目標檢測輸出的default box。

SSD基本已經可以滿足我們手機端上實時物體檢測需求了,TensorFlow在Android上的目標檢測官方模型ssd_mobilenet_v1_android_export.pb,就是通過SSD算法實現的。它的基礎卷積網絡採用的是mobileNet,適合在終端上部署和運行。

3.YoLov2

  • 1.Better:批歸一化,高分辨分類器,錨盒,維度聚類,細粒度特徵以及多尺度訓練。
    • a.批歸一化的效果則是將數據分佈映射到相對緊湊的分佈,讓網絡可以更快以及更好地學習,避免過擬合,使用批歸一化這一操作提升了2%mAP。
    • b.高分辨率的分類器,在YOLOv1中,將在imagenet預訓練好的網絡遷移到目標檢測網絡中,而訓練imagenet數據集的輸入的大小和目標檢測網絡的輸入尺寸是不一致的,這意味目標檢測網絡需要同時取學習目標檢測而且還要去適應新的分辨率輸入,所以YOLOv2使用目標檢測輸入的分辨率微調了分類網絡,然後遷移到目標檢測網絡中去,這樣,目標檢測網絡就可以專攻學習目標檢測了,通過這一技巧,使mAP上升了4%。
    • c.錨盒:在YOLOv1中,最後是使用全連接層來生成bounding box的座標,然而使用全連接的缺點在於丟失了特徵圖的空間信息,造成定位不準,作者借鑑了Faster Rcnn中錨框的思想,利用錨框直接在卷積特徵圖滑窗採樣,因爲卷積不需要Reshape,所以很好的保留的空間信息,最終使特徵圖的每個特徵點和原圖的每個柵格一一對應。另外,與YOLOv1不同的是,YOLOv2是預測的是座標相對於柵格左頂點的偏移量,通過變換公式得到最後的預測座標。既然錨框是手動精選的先驗框,設想能否一開始就選擇了更好的、更有代表性的先驗Boxes維度,那麼網絡就應該更容易學到準確的預測位置。所以作者通過K-means聚類算法將數據集中的ground truth進行了聚類。最後對模型複雜度和召回率的平衡,選擇5個聚類中心,挑選了5個最具代表性的bounding box。一起提升了5%mAP。
    • d.細粒度特徵對於檢測小物體是有很大的影響,隨着圖像尺寸的一步步縮小,圖片中的某些小物體的特徵是會由於特徵圖的不斷縮小而發生信息丟失,作者通過引入了一個Passthrough Layer,把淺層特徵圖連接到深層特徵圖,也就是圖中這個26x26x512的特徵圖通過隔行隔列採樣,變換成13x13x2048的特徵圖,然後和13x13x1024的特徵圖進行按通道concat,通過這一操作,可以使mAP提升一個百分點。
    • e.讓YOLOv2對不同尺寸圖片的具有魯棒性,引入了多尺寸的訓練,每10batch,選擇新的圖像尺寸對網絡進行訓練,最後使精度提升了2個百分點。
  • 2.Faster:YOLOv2簡化了網絡,只使用了19卷積層和5個池化層(Darknet-19),不僅通過一系列的改進使精度高了,速度方面依然比YOLOv1還要快。
  • 3.Stronger:強大之處體現在YOLO9000,YOLO9000是在YOLOv2的基礎上提出的一種可以檢測超過9000個類別的模型,其主要貢獻點在於提出了一種分類和檢測的聯合訓練策略。對於檢測數據集,可以用來學習預測物體的邊界框、置信度以及爲物體分類,而對於分類數據集可以僅用來學習分類,但是其可以大大擴充模型所能檢測的物體種類。但是遇到的一個問題是兩個數據集的類別不是完全互斥的,比如ImageNet光狗的品種就有100多種,它們與COCO數據集中狗的類別產生衝突,兩者是包含關係,針對這一問題,作者提出了一種層級分類方法,主要思路是根據各個類別之間的從屬關係建立一種樹結構,也就是WordTree。

4.YoLov3

在保持實時性的基礎上,對YOLOv2進行了幾點改進,主要有三點:採用邏輯迴歸預測置信度和進行分類,從三個尺度上預測b-box的座標以及特徵提取器發生變化。

  • 1.邏輯迴歸的使用:在YOLOv2中,每個cell是直接通過網絡迴歸預測b-box座標和置信度的,YOLOv3則將置信度和座標分開預測,座標預測還是通過網絡進行預測,而置信度則是單獨通過邏輯迴歸進行預測。在分類上,沒有使用softmax多分類,作者也指出softmax最終對性能也沒有提升,而且softmax假設是每個box只有一個類,這對遷移到更大有多種類別標籤的數據集是沒有好處的,所以作者使用多個邏輯迴歸來預測分類,使用二元交叉熵計算分類損失。
  • 2.特徵提取器:YOLOv3重新訓練了一個新的特徵提取器——DarkNet-53,使用了殘差網絡,相比最先進的特徵提取器,性能相當,但浮點數運算更少,速度更快,下采樣沒有使用池化操作,而是通過卷積步長來實現。圖18是DarkNet-53的結構圖。
  • 3.多尺度預測座標:作者藉由FPN的思想,引用中間層的輸出與後層輸出進行融合,進行三個尺度預測,每個尺度的每個cell預測3個座標.
發佈了489 篇原創文章 · 獲贊 515 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章