目標檢測算法原理


1.概述

1.1 目標檢測的定義

識別圖片中有哪些物體以及物體的位置(坐標位置)。

其中,需要識別哪些物體是人為設定限制的,僅識別需要檢測的物體;物體的坐標位置由兩種表示方法:極坐標表示(xmin, ymin, xmax, ymax)和中心點坐標表示(x_center, y_center, w, h)。

1.2 目標檢測的發展

1.2.1 傳統的目標檢測算法(候選區域+手工特征提取+分類器)——two stage算法

     HOG+SVM、DPM

1.2.2 region proposal+CNN提取分類的目標檢測框架——one stage算法

    R-CNN、SPP-NET、Fast R-CNN、Faster R-CNN

1.2.3端到端(end-to-end)的目標檢測框架

    YOLO、SSD

 

1.2 目標檢測算法原理

目標:清晰記住算法的識別流程,解決某些問題用到的算法的關鍵技術點。

 

1.2.1 目標檢測算法的分類

1) two stage算法

先進行區域推薦,再進行目標分類,典型算法是R-CNN系列算法(R-CNN、SPP-Net、Fast R-CNN、Faster R-CNN);

2) one stage算法(end-to-end)

采用一個網絡一步到位,代表算法是:YOLO、SSD

 

通常在算法中需要對數值進行處理,一般為歸一化操作,即:

對於輸出的位置信息是4個比較大的像素的值,在回歸的時候不合適。目前統一的做法是,每個位置除以圖片本身的像素大小。假設以中心點坐標方式表示,則:

$x=x/x_{image},y=y/y_{image},w=w/x_{image},h=h/y_{image}$

 

1.2.2 目標檢測的任務

對於一張圖片中有一個物體時,可以通過如下框架進行物體檢測:將輸入的圖片經過一個CNN網絡得到feature map,然后將feature map分別連接兩個全連接層,一個是物體分類的全連接層(有多少個物體就多少個輸出),另一個是輸出位置信息,如圖1所示:

                                                                圖1 圖片分類框架

 

對於單個物體的檢測,還可以通過圖像金字塔和滑動窗口的方式進行物體檢測,可以參照《基於滑動窗口和全卷積網絡的人臉檢測》一節。 

 

2. R-CNN算法

 對於一張圖片中有多個目標,多個類別時,對於圖1所示的算法的無法實現,可能需要輸出N個類別(N不固定),因此網絡模型的輸出是不固定的。因此需要一個能夠輸出多個目標的算法。

2.1 寫在介紹R-CNN算法前面——overfeat模型

overfeat模型如圖2所示:

                                                               圖2 overfeat模型

 

該算法使用不同大小的候選框作為滑動窗口進行物體檢測。這種方式是一種暴力窮舉的方式,計算量巨大,而且不同大小的滑動窗口設置可能導致檢測結果不准確,但確實為物體檢測提供了一種思路。

 

2.2 R-CNN模型

        不使用暴力方法,而是用候選區域方法(region proposal method),創建目標檢測的區域改變了圖像領域實現物體檢測的模型思路,R-CNN是以深度神經網絡為基礎的物體檢測的模型 ,R-CNN在當時以優異的性能令世人矚目,以R-CNN為基點,后續的SPPNet、Fast R-CNN、Faster R-CNN模型都是照着這個物體檢測思路。R-CNN算法框架如圖3所示:

                                                      圖3 R-CNN算法模型框架

 

算法步驟如下(使用Alexnet網絡提取特征,輸入大小需要resize到227×227):

1)找到可能存在物體的候選區域region proposal;

2)圖片大小調整到227×227,為了使用Alexnet網絡的輸入,通過CNN對候選區域提取特征向量,2000個建議框的CNN特征組成2000×4096為矩陣;

3)將2000×4096的特征矩陣和20個SVM組成的權重矩陣4096×20相乘,獲得2000×20的矩陣;得到2000個類別得分矩陣,得分最高的即為候選框中物體的類別;

4)分別對2000×20的矩陣的每一列即每一類進行NMS來剔除重疊的建議框;

5)修正bbox,對bbox進行回歸微調。通過線性回歸實現:特征值是候選區域,目標是對應的GT,建立回歸方程學習參數。

 

       R-CNN中的候選區域的選取,使用的是選擇性搜索(SelectiveSearch, SS),如題4所示,首先將每個像素作為一組。然后,計算每一組的紋理,並將兩個最接近的組結合起來。但是為了避免單個區域吞噬其他區域,我們首先對較小的組進行分組。我們繼續合並區域,直到所有區域都結合在一起。下圖第一行展示了如何使區域增長,第二行中的藍色矩形代表合並過程中所有可能的 ROI。

                                                    圖4 選擇性搜索進行候選區域選取

 

大小統一使用的方法是Crop+Wrap方法。

 

SVM分類介紹:

假設一張圖片的2000個侯選區域,那么提取出來的就是2000 x 4096這樣的特征向量(R-CNN當中默認CNN層輸出4096特征向量)。那么最后需要對這些特征進行分類,R-CNN選用SVM進行二分類。假設檢測N個類別,那么會提供20個不同類別的SVM分類器,每個分類器都會對2000個候選區域的特征向量分別判斷一次,這樣得出[2000, 20]的得分矩陣,如圖5所示:

 

                                                       圖5 SVM分類器

 

2.3 R-CNN網絡訓練

R-CNN網絡的訓練過程分為:正負樣本准備、預訓練+fine tuning、訓練SVM、訓練邊框回歸網絡。

1、  正負樣本准備

其中

正樣本:某個region proposal和當前圖像上所有的ground truth重疊面積最大的IOU大於等於0.5,則該region proposal作為這個ground truth類別的正樣本;

負樣本:某個region proposal和當前圖像上所有的ground truth重疊面積最大的IOU小於0.5,則該region proposal作為這個ground truth類別的負樣本。

這樣得到若干個候選區域以及對應的標記結果。

2、  預訓練

別人已經在大數據上訓練好的CNN網絡參數(比如:本方法使用的Alexnet)

3、  微調(fine-tuning)

利用標記好的樣本,輸入到model1中,繼續訓練,得出model2(CNN網絡)

4、  SVM訓練

針對每一個類別訓練一個SVM的二分類器。例如:貓的SVM分類器,輸入維度是2000*4096,目標還是之前第一步標記(正負樣本標記結果)的是否屬於該類別。例如:100個貓樣本,900個非貓樣本。

5、  訓練邊框回歸器

 

2.4 R-CNN測試過程

如圖6所示,為R-CNN實現的過程。

                                            圖6 R-CNN實現過程

 

3. SPP-NET

SPP(Spatial Pyramid Pooling,空間金字塔池化)

問題:如圖6所示,R-CNN速度慢在哪里?卷積網絡。每個選擇的候選區域都要進行卷積操作。因此,SPP-Net的出發點就是提升R-CNN的速度。

SPP-NET相比R-CNN,需要從下面的兩點進行改進,如圖7所示。

1、  減少卷積計算(直接將圖片輸入一個卷積網絡,不再是就將每個獲得的候選區域都進行輸入卷積網絡)

2、  防止圖片內容變形(不再使用Crop+Wrap方法)

                                                圖7 R-CNN與SPPNet對比

 

R-CNN模型 SPPNet模型
1、R-CNN是讓每個候選區域經過crop/wrap等操作變換成固定大小的圖像 2、固定大小的圖像塞給CNN 傳給后面的層做訓練回歸分類操作 1、SPPNet把全圖塞給CNN得到全圖的feature map 2、讓候選區域(通過SS在原圖篩選)與feature map直接映射,得到候選區域的映射特征向量 3、映射過來的特征向量大小不固定,這些特征向量塞給SPP層(空間金字塔變換層),SPP層接收任何大小的輸入,輸出固定大小的特征向量,再塞給FC層

 

3.1 映射

       原始圖片經過CNN變成了feature map,原始圖片通過選擇性搜索(SS)得到了候選區域,現在需要將基於原始圖片的候選區域映射到feature map中的特征向量。映射過程如圖8所示:

                                                                    圖8 映射過程

整個映射過程有具體的公式,如下

假設(x′,y′)(x′,y′)表示特征圖上的坐標點,坐標點(x,y)表示原輸入圖片上的點,那么它們之間有如下轉換關系,這種映射關心與網絡結構有關:(x,y)=(S∗x′,S∗y′),即:

  • 左上角的點:

    • x′=[x/S]+1
  • 右下角的點:

    • x′=[x/S]−1

其中S就是CNN中所有的strides的乘積,包含了池化、卷積的stride。論文中使用S的計算出來為=16。

 

3.2 SPP(spatial pyramid pooling)

通過spatial pyramid pooling 將任意大小的特征圖轉換成固定大小的特征向量。

假設原圖輸入是224x224,對於conv出來后的輸出是13x13x256的,可以理解成有256個這樣的Filter,每個Filter對應一張13x13的feature map。接着在這個特征圖中找到每一個候選區域映射的區域,spp layer會將每一個候選區域分成1x1,2x2,4x4三張子圖,對每個子圖的每個區域作max pooling,得出的特征再連接到一起,就是(16+4+1)x256的特征向量,接着給全連接層做進一步處理,如圖9所示。

                                                         圖9 SPP層

 

3.3 SPP-NET總結

                                                         圖10 SPP-NET總結

 

  • 優點
    • SPPNet在R-CNN的基礎上提出了改進,通過候選區域和feature map的映射,配合SPP層的使用,從而達到了CNN層的共享計算,減少了運算時間, 后面的Fast R-CNN等也是受SPPNet的啟發。
  • 缺點
    • 訓練依然過慢、效率低,特征需要寫入磁盤(因為SVM的存在)。
    • 分階段訓練網絡:選取候選區域、訓練CNN、訓練SVM、訓練bbox回歸器, SPP-Net在fine-tuning階段無法使用反向傳播微調SPP-Net前面的Conv層。

 

4. Fast R-CNN

出發點:解決SPP-NET的網絡之間不統一訓練的問題。

4.1 Fast R-CNN改進

1)提出了ROI Pooling層(類似於SPP層),然后整合模型,將CNN、SPP變換層、分類器、bbox回歸幾個模塊放在一起訓練。是一個end-to-end模型,即輸入端到輸出端直接使用一個網絡相連,整體優化目標函數;

2)SVM替換成了softmax分類;

 

                                                                             圖11 Fast R-CNN

 

步驟

  • 首先將整個圖片輸入到一個基礎卷積網絡,得到整張圖的feature map;
  • 將region proposal(RoI)映射到feature map中;
  • RoI pooling layer提取一個固定長度的特征向量,每個特征會輸入到一系列全連接層,得到一個RoI特征向量(此步驟是對每一個候選區域都會進行同樣的操作);
    • 其中一個是傳統softmax層進行分類(不再使用SVM進行分類),輸出類別有K個類別加上”背景”類;
    • 另一個是bounding box regressor;

 

4.2 RoI層和SPP層對比

RoI Pooling相當於簡易版的SPP層,目的是為了減少計算時間並且得出固定長度的向量。和SPP層的對比如圖12所示。

                                                                               圖12 RoI層和SPP層對比

 

原來SPP是金字塔型:4×4、2×2、1×1;而RoI Pooling改成了單個塊:K×M(論文中是4×4)

 

為什么要設計單個尺度呢?這要涉及到single scale與multi scale兩者的優缺點

  • single scale(RoI Pooling),直接將image定為某種scale,直接輸入網絡來訓練即可。(Fast R-CNN);
  • multi scale(SPP層),也就是要生成一個金字塔,然后對於object,在金字塔上找到一個大小比較接近227x227的投影版本。

后者比前者更加准確些,沒有突更多,但是第一種時間要省很多,所以實際采用的是第一個策略,因此Fast R-CNN要比SPPNet快很多也是因為這里的原因。

 

接着我們來看為什么后面的整個網絡能進行統一訓練?

特征提取CNN的訓練和SVM分類器的訓練在時間上是先后順序,兩者的訓練方式獨立,因此SVMs的訓練Loss無法更新SPP-Layer之前的卷積層參數,去掉了SVM分類這一過程,所有特征都存儲在內存中,不占用硬盤空間,形成了End-to-End模型(proposal除外,end-to-end在Faster-RCNN中得以完善)

  • 使用了softmax分類;
  • RoI pooling能進行反向傳播,SPP層不適合;

 

4.3 總結

Fast R-CNN結構如圖13所示:

                                                          如圖13 Fast R-CNN結構

 

缺點:使用Selective Search提取Region Proposals,沒有實現真正意義上的端對端,操作也十分耗時。

 

5. Faster R-CNN

R-CNN、Fast R-CNN以及Faster R-CNN的對比如圖14所示:

       

                                                                                                         圖14 R-CNN、Fast R-CNN以及Faster R-CNN的對比

 

        在Fast R-CNN因為還使用Selective Search(選擇性搜索),因此不是一個嚴格意義上的end-to-end模型。同時,要找出所有的候選框,這個也非常耗時。Faster R-CNN提出了一種更加高效的方法來求出這些候選框。Faster R-CNN可以簡單地看成是區域生成網絡+Fast R-CNN的模型,用區域生成網絡(Region Proposal Network,簡稱RPN)來代替Fast R-CNN中的選擇性搜索方法,結構如圖15所示。

 

                          圖15 RPN網絡結構

 

步驟:

1)輸入任意大小的圖片,經過CNN網絡輸出特征圖,特征圖共享於后面兩步;

2)特征圖經過RPN層生成候選區域;

3)候選區域和特征圖共同輸入到RoI Pooling層,經過每個候選區域的特征圖,然后進行softmax分類,bbox預測。 

 

 

5.1 RPN網絡

RPN網絡的主要作用是得出比較准確的候選區域。整個過程分為如下兩步:

  • 用n×n(默認3×3=9)的大小窗口去掃描特征圖,每個滑窗位置映射到一個低維的向量(默認256維),並為每個滑窗位置考慮k種(在論文設計中k=9)可能的參考窗口(論文中稱為anchors)
  • 低維特征向量輸入兩個並行連接的1 x 1卷積層然后得出兩個部分:reg窗口回歸層(用於修正位置)和cls窗口分類層(是否為前景或背景概率)

5.1.1 anchors

 

3*3卷積核的中心點對應原圖上的位置,將該點作為anchor的中心點,原圖中框出多尺度、多種長寬比的anchors,三種尺度{ 128,256,512 }, 三種長寬比{1:1,1:2,2:1}

 

例如:

 

候選區域訓練

  • 訓練樣本anchor標記
    • 1.每個ground-truth box有着最高的IoU的anchor標記為正樣本
    • 2.剩下的anchor/anchors與任何ground-truth box的IoU大於0.7記為正樣本,IoU小於0.3,記為負樣本
    • 3.剩下的樣本全部忽略
    • 正負樣本比例為1:3
  • 訓練損失
    • RPN classification (anchor good / bad) ,二分類,是否有物體,是、否
    • RPN regression (anchor -> proposal) ,回歸
    • 注:這里使用的損失函數和Fast R-CNN內的損失函數原理類似,同時最小化兩種代價

候選區域的訓練是為了讓得出來的正確的候選區域, 並且候選區域經過了回歸微調。

在這基礎之上做Fast RCNN訓練是得到特征向量做分類預測和回歸預測。

 

5.2 總結

  • 優點
    • 提出RPN網絡
    • 端到端網絡模型
  • 缺點
    • 訓練參數過大
    • 對於真實訓練使用來說還是依然過於耗時(RPN層,候選區域過多)

可以改進的需求:

  • RPN(Region Proposal Networks)改進對於小目標選擇利用多尺度特征信息進行RPN;
  • 速度提升 如YOLO系列算法,刪去了RPN,直接對proposal進行分類回歸,極大的提升了網絡的速度。

 

6. YOLO(You only look once)算法

6.1 流程理解

原始圖片resize到448x448,經過前面卷積網絡之后,將圖片輸出成了一個7×7×30的結構。

對於7×7的單元格,每個單元格預測兩個bbox框,然后進行NMS篩選,篩選概率以及IoU。

6.2 單元格(grid)

最后輸出網絡的7×7×30的特征圖怎么理解?

7×7=49個像素值,理解成49個單元格,每個單元格可以代表原圖中的一個方塊。單元格需要做兩件事情:

1)每個單元格負責預測一個物體類別,並且直接預測物體的概率值。

2)每個單元格預測兩個bbox位置,兩個bbox的置信度(confidence):7×7×2=98個bbox。

一個物體類別+兩個bbox位置+兩個confidence:(4+1+4+1+20)=30

其中,4代表位置信息,1為置信度代表一個bbox的結果,20代表20類的預測結果。

 

6.3 訓練過程

  • 預測框對應的目標值標記
    • confidence:格子內是否有目標
    • 20類概率:標記每個單元格的目標類別

怎么理解這個過程?同樣以分類那種形式來對應,假設以一個單元格的預測值為結果,如下圖

 

6.4 YOLO總結

優點:速度快

缺點:准確率較低,對於相互靠近的物體(挨在一起且中點落在同一個grid cell時),還有小物體的檢測效果不好,主要是因為一個網格只預測了兩個框。

 

7. SSD(Single Shot MultiBox Detector)算法

7.1簡介

特點:SSD結合了YOLO的回歸思想以及Faster R-CNN的Anchor機制,使用全圖各個位置的多尺度區域進行 回歸,既保持了YOLO速度快的特征,也保證了窗口預測的跟Faster R-CNN一樣比較准確。

SSD的核心是在不同尺度的特征圖上采用卷積核來預測一系列Detector Bounding Boxes的類別、坐標偏移。

 

7.2 SSD的結構

7.3 SSD流程

 

SSD中引入了Defalut Box,實際上與Faster R-CNN的anchor box機制類似,就是預設一些目標預選框,不同的是在不同尺度feature map所有特征點上是使用不同的prior boxes。

 

7.4 Detector&Classifier

 

Detector & classifier的三個部分:

  • 1.default boxes: 默認候選框

  • 2.localization:4個位置偏移

  • 3.confidence:21個類別置信度(要區分出背景)

 

上圖中每個像素生成3個候選框,每個候選框都生成一個localization和confidence。

 

參考如下代碼理解:

def ssd_multibox_layer(inputs,
                       num_classes,
                       sizes,
                       ratios=[1],
                       normalization=-1,
                       bn_normalization=False):
    """Construct a multibox layer, return a class and localization predictions.
    """
    net = inputs
    if normalization > 0:
        net = layers_utils.l2_normalization(net, scaling=True)
    # Number of anchors.
    num_anchors = len(sizes) + len(ratios)

    # Location.
    num_loc_pred = num_anchors * 4
    loc_pred = slim.conv2d(net, num_loc_pred, [3, 3], activation_fn=None,
                           scope='conv_loc')
    loc_pred = layers_utils.channel_to_last(loc_pred)
    loc_pred = tf.reshape(loc_pred,
                          tensor_shape(loc_pred, 4)[:-1]+[num_anchors, 4])
    # Class prediction.
    num_cls_pred = num_anchors * num_classes
    cls_pred = slim.conv2d(net, num_cls_pred, [3, 3], activation_fn=None,
                           scope='conv_cls')
    cls_pred = layers_utils.channel_to_last(cls_pred)
    cls_pred = tf.reshape(cls_pred,
                          tensor_shape(cls_pred, 4)[:-1]+[num_anchors, num_classes])
    return cls_pred, loc_pred

假設如上圖的5×5×256的feature map。每個像素點對應3個default box。因此通過兩個3×3的卷積,分別輸出位置(3×4=12)和置信度(3×21(類別+背景)=63)。

 

        如上圖所示,feature map上的每個像素生成3個bbox,一共有5*5*3=75個Default Box,類似Faster R-CNN的Anchor;其次,通過卷積得到5*5*12的feature map(12代表3*4,即3個Default Box的位置偏差);最后是通過卷積得到5*5*63的feature map(63=3*21,即3個Default Box的類別概率,一個21個類別,包括20個類別+1個背景)

總的輸出是5*5*(3+12+63)=5*5*78的feature map。

 

7.5 Default Box

    default boxex類似於RPN當中的滑動窗口生成的候選框,SSD中也是對特征圖中的每一個像素生成若干個框。

 

7.6 localization與confidence

這兩者的意義如下,主要作用用來過濾,訓練

經過這一次過濾操作,會將候選框篩選出數量較少的prior boxes。

 

關於三種boxes的解釋區別:

  • gournd truth boxes:訓練集中,標注好的待檢測類別的的位置,即真實的位置,目標的左下角和右上角坐標;
  • default boxes:在feature map上每一個點上生成的某一類別圖片的位置。feature map每個點生成4或6個box(數量是事先指定的),格式為轉換過后的(x, y, w, h);
  • prior boxes:經過置信度閾值篩選后,剩下的可能性高的boxes。這個box才是會被真正去做回歸;

 

SSD中的多個Detector & classifier有什么作用

SSD的核心是在不同尺度的特征圖上來進行Detector & classifier 容易使得SSD觀察到更小的物體

 

7.7 訓練

7.7.1 訓練流程

如下圖所示:

輸入->輸出->結果與ground truth標記樣本回歸損失計算->反向傳播, 更新權值

1)樣本標記

利用anchor與對應的ground truth進行標記正負樣本,每次並不訓練8732張計算好的default boxes, 先進行置信度篩選,並且訓練指定的正樣本和負樣本, 如下規則:

  • 正樣本

    • 1.與GT重合最高的boxes, 其輸出對應label設為對應物體;
    • 2.物體GT與anchor iou滿足大於0.5;
  • 負樣本:其它的樣本標記為負樣本

在訓練時, default boxes按照正負樣本控制positive:negative=1:3

 

2)損失

網絡輸出預測的predict box與ground truth回歸變換之間的損失計算, 置信度是采用 Softmax Loss(Faster R-CNN是log loss),位置回歸則是采用 Smooth L1 loss (與Faster R-CNN一樣)

 

7.7.1 測試流程

輸入->輸出->nms->輸出

 

8. 總結

 

物體檢測項目在另一篇文章中介紹。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM