1. 程式人生 > >目標檢測演算法彙集介紹

目標檢測演算法彙集介紹

目標檢測演算法

目標檢測概念

目標檢測這裡闡述兩個應用場景,1 為物體位置檢測,2 為物體關鍵點檢測。

1 物體位置檢測

相比與圖片分類,目標檢測演算法結果要求不僅識別出圖片中的物理類別並且輸出物體的位置引數。
物體的位置通過bounding box表示。bounding box指的是能夠框出物體的矩形框在圖片中的對應引數,如下圖所示。
圖中紅色框,就稱為一個bounding box,bounding box由個引數來描述[bx,by,bh,bw][b_x, b_y, b_h, b_w], 其中(bx,byb_x, b_y)對應矩形框的中心點座標,b

hb_h則對應矩形框的高度,bwb_w則對一個矩形框的寬度。如下圖所示。

從而 bx=0.5,by=0.7,bh=0.3,bw=0.4b_x=0.5, b_y=0.7, b_h=0.3, b_w=0.4
將圖片作為模型的輸入, 輸出為物體的類別和bounding box引數。如下圖所示。
這裡寫圖片描述
這裡我們假設的是一個圖片中指定為一個物體的類別及位置。
吳恩達老師的課程中這樣定義模型輸出y^=[pc,bx,by,bh,bw,c1,c2,c3]T\hat{y}=[p_c, b_x, b_y, b_h, b_w, c_1, c_2, c_3]^T,(不知道如何把T改為正體,歡迎留言說明。)

y^=[pc,bx,by,bh,bw,c1,c2,c3]T\hat{y}=[p_c, b_x, b_y, b_h, b_w, c_1, c_2, c_3]^T
其中,
pcp_c為圖中有物體的概率;
[bx,by,bh,bw][b_x, b_y, b_h, b_w]則是對應物體的位置(bounding box)引數;
c1,c2,c3c_1, c_2, c_3

,c2,c3則是對應哪個物體的class。少一個c4c_4是因為c1,c2,c3c_1, c_2, c_3均為0時,則c4=1c_4=1

2 物體關鍵點檢測(landmark detection)

物體關鍵點檢測的應用場景有,人臉關鍵點(眼睛、鼻子、嘴及臉的邊緣點)的檢測,人體姿態檢測(頭, 胳膊及腿的各個關鍵點的檢測),還有比如天池的衣服關鍵點檢測等都是屬於這個範疇的應用場景。
輸入為圖片,輸出則是這一系列關鍵點的座標位置[[l1x,l1y],[l2x,l2y],...,[lnx,lny]][[l_{1x},l_{1y}], [l_{2x},l_{2y}], ... , [l_{nx},l_{ny}]],即landmark。
人體關鍵點檢測
人臉關鍵點檢測

物體位置檢測演算法

本文只是大致介紹位置檢測的演算法特點。
其實RCNN, Fast-rcnn, SPP-net, Faster-rcnn都可以分為兩個主要部分:1. region proposal 提取regions;而YOLO及SSD則通過分格及anchor的方法來代替大批量的regions,相比YOLO及SSD計算量小,從而快一些。
接下來列出每個網路的主要特點。

RCNN介紹

相關概念介紹:
regions就是從原影象上擷取的有可能包含物體的影象區域集合。
bounding box是指包含物體的矩形框。文中前面有介紹。
IOU(Intersection over Union)用來衡量兩個regions之間的重疊度。上圖。

矩形框A、B的一個重合度IOU計算公式為:
IOU=(A∩B)/(A∪B)
就是矩形框A、B的重疊面積佔A、B並集的面積比例:
IOU=SI/(SA+SB-SI)

NMS(極大值抑制)是挑出不同類中的最大值,捨棄相近的但是不是極大的值。
在目標識別中,用於最後的bounding box篩選。經過SVM判別的bounding boxes,包含了所有類別的bounding boxes,通過NMS實現,最後留下不同類的最優的bounding box。詳細的實現原理參考部落格

RCNN結構主要步驟:

  • 影象對應的候選區域(1K~2K個)生成;
  • 候選區域的特徵提取;
  • 特徵分類(SVM);留下包含物體的regions,從而作為bounding boxes。
  • bounding box篩選,並修正。

各環節使用技術:

  • 候選區域生成
    使用Selective Search生成影象的候選區域。
    大體原理:
    是一種影象分格的手段,通過合併相似顏色或文理且相鄰的區域,實現影象分割,將最後的區域去重輸出。Selective Search原始碼地址
  • 特徵提取
    使用訓練好的神經網路提取regions特徵。
    RCNN訓練特徵主要經過2個階段:
  1. Pre-train:
    使用ILVCR 2012資料集及簡化版的Hinton 2012年在Image Net上的分類網路來進行預訓練。(全連線層提取特徵4096維,再使用全連線(4096->1000)實現1000類分類)。
  2. Fine-tune:
    替換Pre-train的最後輸出層,換為(4096->21)21分類的輸出層,使用資料集PASCAL VOC 2007來訓練網路。此處訓練的正負樣本的標定:IOU>0.5則為正樣本。
  • 特徵分類
    使用一系列SVM來分類經過網路提取到的特徵,SVM個數等於要標出的物種數。並且使用了hard negative mining。
    SVM訓練時,正負樣本標定:IOU>0.3則為正樣本。
    在測試時,SVM輸出為正的regions作為待篩選的bounding boxes。
  • bounding box篩選
    使用極大值抑制(NMS)。篩選得到每一類對應的最優的bounding box。
    最後通過bounding box迴歸精細優化bounding box。
    bounding box迴歸就是通過神經網路擬合平移和放縮兩個函式,使用這兩個函式使更加擬合真實的位置區域。loss就是原始box與目標box之間的距離。

RCNN網路的缺點

  1. 訓練需要幾個階段;
  2. SS得到的regions是不同尺寸的。不同尺寸的regions需要經過,裁剪及放縮到相同的尺寸,這樣會使一些內容丟失。
  3. 每個region的都需要經過模型去提取,並存放至磁碟;

SPP-net介紹

SPP-net(Spatial Pyramid Pooling) 提出主要結構:

  1. 提出金字塔結構,使模型可以處理不同尺寸的輸入。
  2. 使用regions到特徵層之間的對映,從而實現只提取一次完成的影象,regions特徵通過對映關係來獲取。
    SPP-net的缺點:
  3. 金字塔結構雖然使得模型處理不同尺寸輸入的問題,但同時使模型不同同時訓練金字塔左側的卷積層。至於原因,作者給出的原因是金字塔的pooling層對應的感受野太大。本人覺得感受野太大,會使梯度傳遞不穩定。
    詳細結構不作介紹。
  4. 訓練依舊需要幾個階段。依舊採用SVM實現分類。
    SPP-net中技術點講解

1. 金字塔講解

實際原理就是,對每通道的特徵進行分塊,分成16*16, 4*4, 1*1塊,挑出每塊的最大值,得到16*16, 4*4, 1*1特徵,展開成16*16 + 4*4 + 1*1為向量,輸給全連線層。
2. regions到特徵層之間是如何對映

圖中輸入層藍色加深部分對應每一層的區域,一個區域對應經過卷積/pooling後的對應區域尺寸計算方法,與原圖特徵經過卷積/pooling後的對應尺寸相同。注:僅僅是借用這個圖表示一下regions輸入與其他層之間的對應關係。該圖是原意旨在說利用1x1卷積核實現全卷積。

Fast-RCNN介紹:

Fast-RCNN優化技術點

  1. 提出ROI pooling layer,採用單層金字塔結構,其實就是在特徵層只使用一個金字塔max-pooling,進一步簡化了regions對應特徵層的對映關係。
  2. 提出梯度傳遞方法,實現整個網路網路結構的全部訓練。
  3. 在兩層全連線中加入SVD降維,加快訓練速度。
  4. 輸出使用兩個softmax,一個用於class分類,一個用於bounding box迴歸。

Fast-RCNN優化技術點講解
ROI pooling layer講解:
POI pooling layer 層是位於卷積後,全連線之前的layer。
輸入為卷積層輸出(H*W*N)及R個ROI元組,R表示regions的個數。每個ROI是一個元組(n, r, c, h, w),n是特徵對映的索引,n∈{0, … ,N-1},(r, c)是RoI左上角的座標,(h, w)是高與寬。
輸出是max-pool過的特徵對映,H’ x W’ x C的大小,H’≤H,W’≤W。金字塔的的切割引數:bin-size ~ h/H’ x w/W’,這樣就有H’ x W’個,bin的大小是自適應的,取決於RoI的大小。

Faster-RCNN介紹:

Faster-RCNN優化技術點
提出RPN(Region Proposal Networks)區域生成網路,使用神經網路生成regions,代替RCNN中的Selective Search方法。節省regions proposal的時間。基本實現end to end訓練。

RPN大致原理介紹:
在最後的卷積層(即特徵提取層)上使用滑動視窗來預測。使用3x3的卷積核對得到的256維的特徵圖進行滑動卷積,分兩路分別使用利用1*1/卷積,最後一路輸出所有anchors的目標和非目標(背景)的概率,另一路輸出anchors box相關的四個引數,包括box的中心座標x和y,box寬w和長h。每次滑動卷積,輸出k個anchors的是否包含物體以及位置資訊。因此最後的RPN的輸出是一路為2k對應分類(是否包含物體),另一路為4k對應anchors的位置資訊。

作者採用四步訓練法:
1) 單獨訓練RPN網路,網路引數由預訓練模型載入;
2) 單獨訓練Fast-RCNN網路,將第一步RPN的輸出候選區域作為檢測網路的輸入。具體而言,RPN輸出一個候選框,通過候選框擷取原影象,並將擷取後的影象通過幾次conv-pool,然後再通過roi-pooling和fc再輸出兩條支路,一條是目標分類softmax,另一條是bbox迴歸。截止到現在,兩個網路並沒有共享引數,只是分開訓練了;
3) 再次訓練RPN,此時固定網路公共部分的引數,只更新RPN獨有部分的引數;
4) 那RPN的結果再次微調Fast-RCNN網路,固定網路公共部分的引數,只更新Fast-RCNN獨有部分的引數。

YOLO演算法介紹

YOLO技術大致原理
將一幅影象分成SxS個網格(grid cell),如果某個object的中心 落在這個網格中,則這個網格就負責預測這個object。

每個網格要預測落在該網格的物體類別及B個bounding box資訊,每個bounding box預測資訊包含自身位置資訊(四個變數)和confidence值。
confidence代表了所預測的box中含有object的置信度和這個box預測的有多準(與標註的ground region的IOU)兩重資訊。
confidence=Pr(object)IOUpredtruthconfidence = P_r(object) * IOU_{pred}^{truth}
其中如果有object落在一個grid cell裡,第一項取1,否則取0。 第二項是預測的bounding box和實際的groundtruth之間的IOU值。

每個bounding box要預測(x, y, w, h)和confidence共5個值,每個網格還要預測一個類別資訊,記為C類。則SxS個網格,每個網格要預測B個bounding box還要預測C個categories。輸出就是S x S x (5*B+C)的一個tensor。
注意:class資訊是針對每個網格的,confidence資訊是針對每個bounding box的。

舉例說明: 在PASCAL VOC中,影象輸入為448x448,取S=7,B=2,一共有20個類別(C=20)。則輸出就是7x7x30的一個tensor。
在test的時候,每個網格預測的class資訊和bounding box預測的confidence資訊相乘,就得到每個bounding box的class-specific confidence score:
classspecificconfidencescore=Pr(classi)confidenceclass-specific confidence score = P_r(class_i) * confidence
以上YOLO部分參考