1. 程式人生 > >學習筆記之——基於深度學習的目標檢測演算法

學習筆記之——基於深度學習的目標檢測演算法

        國慶假期閒來無事~又正好打算入門基於深度學習的視覺檢測領域,就利用這個時間來寫一份學習的博文~本博文主要是本人的學習筆記與調研報告(不涉及商業用途),博文的部分來自我團隊的幾位成員的調研報告(由於隱私關係,不公告他們的名字了哈~),同時結合本人的一些思考與理解。本博文僅從理論、介紹入手。暫時不涉及程式碼,後續會有博文補充各個演算法的程式碼~好下面進入正題


目錄

引言

深度目標檢測演算法

深度目標檢測演算法的分類

R-CNN(Regions with CNN features)

SPP-Net 

Fast R-CNN

Faster R-CNN

小結(R-CNN, Fast R-CNN, Faster R-CNN三種演算法)

YOLO(或稱為YOLOV1)

YOLOV2

YOLOV3

SSD

DSSD

小結(R-CNN系列、YOLO系列、SSD系列)

主要參考博文:


 

引言

計算機視覺是利用計算機及相關裝置對生物視覺的一種模擬。它的主要任務就是通過對採集的圖片或視訊進行處理以獲得相應場景的三維資訊,就像人類和許多其他類生物那樣。主要有以下幾個方向:

  • 語義分割(Semantic segmentation)
  • 分類與定位(Classification and localization)
  • 目標檢測(Object detection)
  • 例項分割(Instance segmentation)

        本博文關注目標檢測(object detection)這一方向。目標檢測是指在一個靜態影象(或動態視訊)中檢測出人們感興趣的目標物件。物體檢測的任務是找出影象或視訊中的感興趣物體,同時檢測出它們的位置和大小。也即在給定的圖片中精確找到物體所在位置,並標註出物體的類別。是計算機視覺領域的核心問題之一。目標檢測過程中有很多不確定因素,如影象中目標數量不確定,目標有不同的外觀、形狀、姿態,加之物體成像時會有光照、遮擋等因素的干擾,導致檢測演算法有一定的難度。

        傳統的目標檢測演算法主要是分為三步:1、先利用不同尺寸的滑動視窗框住圖中的某一部分作為候選區域;2、提取候選區域的特徵(如通過SIFT、HOG、SURF等檢測特徵點);3、分類決策(傳統的機器學習分類器,如SVM等)

        在傳統的目標檢測方法中,效能最佳的當屬可變形部件模型(Deformable Part based Model,DPM)。DPM是基於經典手工特徵的檢測演算法發展的頂峰,連續獲得VOC07、08、09三年的檢測冠軍。DPM的主要思想可簡單理解為將傳統目標檢測演算法中對目標整體的檢測問題拆分並轉化為對模型各個部件的檢測問題(如對於人臉而言,將人臉分為鼻子、嘴巴等等),然後將各個部件的檢測結果進行聚合得到最終的檢測結果,即“從整體到部分,再從部分到整體”的一個過程。DPM可以看作是HOG+SVM的擴充套件(關於HOG的介紹可見之前博文《學習筆記之——HOG、LBP與Haar特徵(未完待續)》)下圖為DPM的檢測流程

在當時,DPM的檢測效果雖然較好,但是由於相對比較複雜,運算較慢。為此引起了一股研究的熱潮去改進DPM。然而,卷積神經網路(CNN)在2012年ImageNet分類任務中取得了巨大成功(將檢測的準確率提升了一倍),在2013年R-CNN又在VOC 2007測試集檢測的mAP大幅提升至48%。

 

下面介紹常見的深度目標檢測演算法

深度目標檢測演算法

傳統的目標檢測演算法需要人工提取特徵,而深度學習就是又深度網路代替人工提取特徵。好,先給出一系列目標檢測的關鍵名詞

bounding box——也就是所框出來的,檢測的邊框

Precision 與 Recall(查準率(precision)和查全率(recall))

對於二分類而言,有如下表格

Precision其實就是在識別出來的圖片中,True positives所佔的比率。就是對於識別出來的是正例而言,真正是正例的準確率。

recall就是對於實際是正例而言,有多少被檢測出來了。

MAP(mean average precision)

      每一個類別都可以根據recall和precision繪製一條曲線,那麼AP就是該曲線下的面積,而mAP是多個類別AP的平均值,這個值介於0到1之間,且越大越好。這個指標是目標檢測演算法最為重要的一個指標引數。

IOU(交比並)

       如下圖所示。綠色框是人工標註的groundtruth,紅色框是目標檢測演算法最終給出的結果(紅色的框為Selective Search提取的Region Proposal),顯然綠色框對於飛機這個物體檢測的更加準確(機翼機尾都全部包含在綠色框中),IOU正是表達這種bounding box和groundtruth的差異的指標。演算法產生的bbox VS 人工標註的資料

        IOU定義了兩個bounding box的重疊度,可以說,當演算法給出的框和人工標註的框差異很小時,或者說重疊度很大時,可以說演算法產生的boundingbox就很準確。 矩形框A、B的一個重合度IOU計算公式為: IOU=(A∩B)/(A∪B)

Bounding-box regression(邊界框迴歸)

      由前面介紹的IOU指標可知,這裡所獲得的紅色框可以認為是檢測失敗的,因為它和綠色的groundtruth的 IOU值小於了0.5,也就是說重疊度不夠。那麼我們就需要對這個紅色框進行微調。使得經過微調後的視窗跟Ground Truth 更接近 。

如下圖所示。紅色的框 P 代表原始的Proposal **綠色的框 G **代表目標的 Ground Truth 目標是:尋找一種關係使得輸入原始的視窗 P 經過對映得到一個跟真實視窗 G 更接近的迴歸視窗 G~ G~≈G。(本博文沒有給出其數學過程,僅給出較為直觀的描述)

 

NMS(非極大值抑制)

     在檢測網路中,NMS至關重要。因為多個feature map 最後會產生大量的bounding boxes,即最終檢測結果。然而在這些bounding boxes中存在著大量的錯誤的、重疊的、不準確的樣本,這不僅造成了巨大的計算量,如果處理不好會影響演算法的效能。對於目標檢測演算法產生的大量的bounding box都進行調整肯定是不可行的。那麼我們就需要對這些粗略結果先進行一個大體的挑選。挑選出其中最具代表性的結果。再對這些挑選後的結果進行調整,這樣可以加快演算法效率。 消除多餘的框,找到最佳的bounding box。僅僅依賴於IOU是不現實的,IOU值設定的太大,可能就會丟失一部分檢測的目標,即會出現大量的漏檢情況;IOU值設定的太小,則會出現大量的重疊檢測,會大大影響檢測器的效能。即使在IOU處理掉大部分的bounding boxes之後,仍然會存在大量的錯誤的、重疊的、不準確的bounding boxes如下圖所示。

       這就需要NMS進行迭代優化——對於Bounding Box的列表B及其對應的置信度S,採用下面的計算方式.選擇具有最大score的檢測框M,將其從B集合中移除並加入到最終的檢測結果D中.通常將B中剩餘檢測框中與M的IoU大於閾值的框從B中移除.重複這個過程,直到B為空。對於每個預測框(default boxes),首先根據類別置信度確定其類別(置信度最大者)與置信度值,並過濾掉屬於背景的預測框。然後根據置信度閾值(如0.5)過濾掉閾值較低的預測框。對於留下的預測框進行解碼,根據先驗框得到其真實的位置引數,一般需要根據置信度進行降序排列,然後僅保留top-k(如400)個預測框。最後就是進行NMS演算法,過濾掉那些重疊度較大的預測框。最後剩餘的預測框就是檢測結果了。如下圖所示,右上圖黃色bounding boxes可以代表為正樣本。正樣本通過分類與迴歸得到右下圖中的各色bounding boxes,到這一步時使用了top-k讓選框數量減少。最後再使用NMS得到左下圖。(使用分類網路給出每個框的每類置信度,使用迴歸網路修正位置,最終應用NMS)。

NMS演算法流程:

根據這些框的分類器類別分類概率做排序: A<B<C<D<E<F

(1)從最大概率矩形框F開始,分別判斷A~E與F的重疊度IOU是否大於某個設定的閾值;

(2)假設B、D與F的重疊度超過閾值,那麼就扔掉B、D;並標記第一個矩形框F,是我們保留下來的。

(3)從剩下的矩形框A、C、E中,選擇概率最大的E,然後判斷E與A、C的重疊度,重疊度大於一定的閾值,那麼就扔掉;並標記E是我們保留下來的第二個矩形框。

從傳統目標檢測的角度來解釋:大部分人臉檢測的核心是分類器,即給定一個尺寸固定的圖片,分類器判斷是或者不是人臉。而將分類器進化為檢測器的關鍵是:在原始影象上從多個尺度產生視窗,並resize到固定尺寸,然後送給分類器做判斷。最常用的方法是滑動視窗。即同一個人臉,有好幾個框(每一個框都帶有一個分類器的得分)。而目標是對於一個人臉,只保密一個最優的框。於是我們就要用到非極大值抑制,來抑制那些冗餘的框: 抑制的過程是一個迭代-遍歷-消除的過程。

(1)將所有框的得分排序,選中最高分及其對應的框:

(2)遍歷其餘的框,如果和當前最高分框的重疊面積(IOU)大於一定閾值,我們就將框刪除;

(3)從未處理的框中繼續選一個得分最高的,重複上述過程;

 

CNN(卷積神經網路)

     在計算機視覺領域,深度網路採用卷積神經網路(CNN)。而再自然語言處理(NLP)領域採用RNN(涉及到時間序列的)。卷積就是兩個函式之間的相互關係,然後就得出一個新的值。他是在連續空間做積分運算,然後將在離散空間內求和的過程。在計算機視覺裡面,可以把卷積當做是一個抽象的過程,把影象上小區域的資訊統計抽象出來。

卷積層——卷積層是CNN的核心,層的引數由一組可學習的濾波器(filter)或核心(kernels)組成,它們具有小的感受野,延伸到輸入容積的整個深度。 在前饋期間,每個濾波器對輸入進行卷積,計算濾波器和輸入之間的點積,併產生該濾波器的二維啟用圖(輸入一般二維向量,但可能有高度(即RGB))。 簡單來說,卷積層是用來對輸入層進行卷積,提取更高層次的特徵。

池化層——池化層又稱下采樣,它的作用是減小資料處理量同時保留有用資訊。具有如下特性:1. 特徵不變性,也就是我們在影象處理中經常提到的特徵的尺度不變性,池化操作就是影象的resize,平時一張狗的影象被縮小了一倍我們還能認出這是一張狗的照片,這說明這張影象中仍保留著狗最重要的特徵,我們一看就能判斷影象中畫的是一隻狗,影象壓縮時去掉的資訊只是一些無關緊要的資訊,而留下的資訊則是具有尺度不變性的特徵,是最能表達影象的特徵。2. 特徵降維,我們知道一幅影象含有的資訊是很大的,特徵也很多,但是有些資訊對於我們做影象任務時沒有太多用途或者有重複,我們可以把這類冗餘資訊去除,把最重要的特徵抽取出來,這也是池化操作的一大作用。3. 在一定程度上防止過擬合,更方便優化。

池化層用的方法有Max poolingaverage pooling,而實際用的較多的是Max pooling。示例:如下圖所示,對於每個2*2的視窗選出最大的數作為輸出矩陣的相應元素的值,比如輸入矩陣第一個2*2視窗中最大的數是6,那麼輸出矩陣的第一個元素就是6,如此類推。

全連線層——兩層之間所有神經元都有權重連線,通常全連線層在卷積神經網路尾部。也就是跟傳統的神經網路神經元的連線方式是一樣的。

如上圖所示,對於一張圖片中的每個區域,通過CNN可以學習到n個不同的卷積和函式,然後對這個區域進行統計。可以用不同的方法統計,比如著重統計中央,也可以著重統計周圍,從而使得統計的和函式的種類多種多樣,同時也可以同時學習多個統計的累積和。

首先用學習好的卷積和對輸入影象進行掃描,然後每一個卷積和會生成一個掃描的響應圖,稱為response map,或feature map。如果有多個卷積和,就有多個feature map。也就說從一個最開始的輸入影象(RGB三個通道)可以得到256個通道的feature map,因為有256個卷積和,每個卷積和代表一種統計抽象的方式。

在卷積神經網路中,除了卷積層,還有一層池化層。池化操作就是對一個小區域內求平均值或者求最大值的統計操作。若輸入256通道的卷積的響應feature map,每一個feature map都經過一個求最大的池化層,就會得到一個比原來的feature map更小的256通道的feature map。如下圖所示,池化層對每一個2*2的區域求最大值,然後把最大值賦給生成的feature map對應的位置。如果輸入影象是100×100的話,那輸出影象就會變成50×50,feature map變成了一半。同時保留的資訊是原來2X2區域裡面最大的資訊。

 

VOC物體檢測任務

        這個就相當於一個競賽,裡面包含了20個物體類別:http://host.robots.ox.ac.uk/pascal/VOC/voc2012/examples/index.html  還有一個背景,總共就相當於21個類別。

 

深度目標檢測演算法的分類

基於深度學習的目標檢測演算法——深度目標檢測(不知這樣命名是否恰當,本文先以這樣命名)。目前深度目標檢測演算法主要分為兩類:

1、two stage的目標檢測演算法(如R-CNN系列)——先通過啟發式方法(selective search)或者CNN網路(RPN)產生一系列稀疏的候選框(proposal),再通過卷積神經網路對這些proposal進行樣本分類與迴歸。(檢測的準確率高和定位精度較好)

2、one stage的目標檢測演算法(如YOLO、SSD等)——不用產生proposal候選框,直接將目標邊框定位的問題轉化為迴歸問題處理。直接在網路中提取特徵來預測物體分類和位置。均勻地在圖片多個層數的特徵圖上進行密集抽樣,抽樣時可以採用不同尺度和長寬比,然後利用CNN提取特徵後直接進行分類與迴歸,整個過程只需要一步,所以其優勢是速度快。但是均勻的密集取樣的一個重要缺點是訓練比較困難,這主要是因為正樣本與負樣本(背景)極其不均衡,導致模型準確度稍低。 (速度較快)

兩類演算法的對比如下,可以清楚看出兩類方法在準確度和速度上的差異

 

R-CNN(Regions with CNN features)

      2014 年加州大學伯克利分校的 Ross B. Girshick 提出 R-CNN (Region CNN)演算法(《Rich feature hierarchies for accurate object detection and semantic segmentation》)。其基本思想是首先用一個非深度的方法,在影象中提取可能是物體的圖形塊,然後深度學習演算法根據這些影象塊,判斷屬性和一個具體物體的位置。通過利用選擇性搜尋(Selective Search)演算法評測相鄰影象子塊的特徵相似度,通過對合並後的相似影象區域打分,選擇出感興趣區域的候選框作為樣本輸入到卷積神經網路結構內部,由網路學習候選框和標定框組成的正負樣本特徵,形成對應的特徵向量,再由支援向量機設計分類器對特徵向量分類,最後對候選框以及標定框完成邊框迴歸操作達到目標檢測的定位目的(可以算是一個傳統機器學習演算法與深度學習演算法融合的例子)。

       R-CNN 利用候選區域方法建立了約 2000 個 ROI。這些區域被轉換為固定大小的影象,並分別饋送到卷積神經網路中。該網路架構後面會跟幾個全連線層,以實現目標分類並提煉邊界框bounding box。

演算法的步驟

(1)輸入圖片 ;

(2)提取大約2000個自下而上的region proposals ;Region Proposal是一類傳統的區域提取方法,可以看作不同寬高的滑動視窗,通過視窗滑動獲得潛在的目標影象,根據Proposal提取的目標影象進行歸一化,作為CNN的標準輸入。

        在做目標檢測時,如採用掃描窗的方法進行物體檢測,要考慮到掃描窗的長寬比和位置不一樣,若每一個影象塊都要過一遍深度網路的話,計算時間非常大。為此採用了折中的辦法——Selective Search。先把完全不可能是物體的影象塊去掉。採用seletive search 對讀入的圖片生成候選區域,再計算每個候選區域和ground truth的交併比(IOU).當IOU大於閾值時,則認為是當前的候選區域屬於正確類。並且將其標定為相應的類別(label)。這樣每一個候選區域就會產生相應的label即(image, label). (image, label)就是要訓練的訓練集。然後利用這些資料訓練CNN網路,

(3)利用CNN計算每個proposal的特徵 ;這屬於標準CNN過程,根據輸入進行卷積/池化等操作,得到固定維度的輸出;但對於每一個區域,需要修正區域大小,進行crop/warp(歸一化)操作,以適合CNN的輸入,做一次前向運算。

一般CNN後接full-connect layer或者classifiler,它們都需要固定的輸入尺寸。因此需要對輸入資料進行crop/warp操作,這些處理會造成資料的丟失或幾何學上的失真。

(4)對每個proposal使用線性svm進行分類;實際包含兩個子步驟:(i)對上一步的輸出向量進行分類(需要根據特徵訓練分類器);(ii)通過邊界迴歸(bounding-box regression) 得到精確的目標區域,由於實際目標會產生多個子區域,旨在對完成分類的前景目標進行精確的定位與合併,避免多個檢出。

 

基於候選區域的目標檢測器

1.滑動視窗檢測器

       自從 AlexNet 獲得 ILSVRC 2012 挑戰賽冠軍後,用 CNN 進行分類成為主流。一種用於目標檢測的暴力方法是從左到右、從上到下滑動視窗,利用分類識別目標。為了在不同觀察距離處檢測不同的目標型別,我們使用不同大小和寬高比的視窗。

      滑動視窗(從右到左,從上到下)。根據滑動視窗從影象中剪下影象塊。由於很多分類器只取固定大小的影象,因此這些影象塊是經過變形轉換的。但是,這不影響分類準確率,因為分類器可以處理變形後的影象。

       將影象變形轉換成固定大小的影象。然後再輸入 到CNN 分類器中,提取出 4096 個特徵。之後,再使用 SVM 分類器識別類別和該邊界框的另一個線性迴歸器。下圖為滑動視窗檢測器的系統工作流程圖。

 

2.選擇性搜尋(Selective Search)演算法

         不使用暴力的滑動視窗法,而是用候選區域方法(region proposal method)建立目標檢測的感興趣區域(ROI)。Region Proposal是一類傳統的區域提取方法,可以看作不同寬高的滑動視窗,通過視窗滑動獲得潛在的目標影象,根據Proposal提取的目標影象進行歸一化,作為CNN的標準輸入。而Region Proposal方法中常用的一種就是選擇性搜尋(Selective Search)方法。選擇性搜尋是用於物件檢測的區域提議演算法。 它被設計成具有非常高的召回速度。 它計算基於顏色,紋理,尺寸和形狀相容性的相似區域的分層分組。

       首先將每個畫素作為一組。然後,計算每一組的紋理,並將兩個最接近的組結合起來。但是為了避免單個區域吞噬其他區域,我們首先對較小的組進行分組。我們繼續合併區域,直到所有區域都結合在一起。下圖第一行展示瞭如何使區域增長,第二行中的藍色矩形代表合併過程中所有可能的 ROI。

selective search演算法流程:

step0:生成區域集R

step1:計算區域集R裡每個相鄰區域的相似度S={s1,s2,…}

step2:找出相似度最高的兩個區域,將其合併為新集,新增進R

step3:從S中移除所有與step2中有關的子集

step4:計算新集與所有子集的相似度

step5:跳至step2,直至S為空

 

雖然 R-CNN 演算法相較於傳統目標檢測演算法取得了 50%的效能提升,使用了selective search等預處理步驟來提取潛在的bounding box作為輸入,但存在以下缺陷:

(1)訓練網路的正負樣本候選區域由傳統演算法生成,使得演算法速度受到限制,且多個候選區域對應的影象需要預先提取,佔用較大的磁碟空間。

(2)卷積神經網路需要分別對每一個生成的候選區域進行一次特徵提取,實際存在大量的重複運算,制約了演算法效能。(特徵提取時會有重複計算)

(3)針對傳統CNN需要固定尺寸的輸入影象,crop/warp(歸一化)產生物體截斷或拉伸,會導致輸入CNN的資訊丟失

 

SPP-Net 

       針對卷積神經網路重複運算問題,2015 年微軟研究院的何愷明等提出一種 SPP-Net 演算法,通過在卷積層和全連線層之間加入空間金字塔池化結構(Spatial Pyramid Pooling)代替 R-CNN 演算法在輸入卷積神經網路前對各個候選區域進行剪裁、縮放操作使其影象子塊尺寸一致的做法。SPP-Net 演算法有兩個特點:

1、結合空間金字塔方法實現CNN的對尺度輸入。(將空間金字塔的思想加入到CNN中,實現了資料的多尺度輸入)
         一般CNN後接全連線層或者分類器,他們都需要固定的輸入尺寸,因此不得不對輸入資料進行crop或者warp,這些預處理會造成資料的丟失或幾何的失真。SPP Net的第一個貢獻就是將金字塔思想加入到CNN,實現了資料的多尺度輸入。如下圖所示。在卷積層和全連線層之間加入了SPP layer。此時網路的輸入可以是任意尺度的,在SPP layer中每一個pooling的filter會根據輸入調整大小,而SPP的輸出尺度始終是固定的。從而取消了crop/warp影象歸一化過程,解決影象變形導致的資訊丟失以及儲存問題;

2、只對原圖提取一次卷積特徵
       在R-CNN中,每個候選框(proposal region)先resize到統一大小,然後分別作為CNN的輸入,這樣是很低效的。所以SPP Net根據這個缺點做了優化:只對原圖進行一次卷積得到整張圖的feature map,然後找到每個候選框在feature map上的對映patch,將此patch作為每個候選框的卷積特徵輸入到SPP layer和之後的層。節省了大量的計算時間,比R-CNN有一百倍左右的提速。

       利用空間金字塔池化結構有效避免了 R-CNN 演算法對影象區域剪裁、縮放操作導致的影象物體剪裁不全以及形狀扭曲等問題,更重要的是解決了卷積神經網路對影象重複特徵提取的問題,大大提高了產生候選框的速度,且節省了計算成本。但是SPP-Net 也有明顯的缺點:

1、像R-CNN一樣,訓練分為多個階段: 提取候選框+計算CNN特徵+SVM分類+Bounding Box迴歸。大量的結果需要轉存,無法整體訓練引數;

2、SPP-NET在微調網路的時候固定了卷積層,只對全連線層進行微調,而對於一個新的任務,有必要對卷積層也進行微調。無法同時Tuning在SPP-Layer兩邊的卷積層和全連線層,很大程度上限制深度CNN的效果。(分類的模型提取的特徵更注重高層語義,而目標檢測任務除了語義資訊還需要目標的位置資訊)。

 

R-CNN 需要非常多的候選區域以提升準確度,但其實有很多區域是彼此重疊的,因此 R-CNN 的訓練和推斷速度非常慢。如果有 2000 個候選區域,且每一個都需要獨立地饋送到 CNN 中,那麼對於不同的 ROI,我們需要重複提取 2000 次特徵。針對以上問題,Ross B. Girshick提出了該Fast R-CNN,一個精簡快速的檢測框架。直接利用特徵圖來計算ROI

Fast R-CNN

如上圖所示,Fast R-CNN網路有兩個輸出層。一個softmax,一個bbox regressor(相對於R-CNN、SPP Net中分類和迴歸是兩個部分,這裡整合在同一個網路中)。而且加入了一個ROL pooling layer(沒有用金字塔、一個尺度的SPP layer)。在Fast R-CNN中,提取proposal的方法依然是Selective Search。

        R-CNN的進階版Fast R-CNN就是在RCNN的基礎上採納了SPP Net方法,對RCNN作了改進,使得效能進一步提高。2015 年微軟研究院的 Ross B. Girshick提出可以一個可以看作單層SPP Net的網路層,稱為ROI pooling(雖然借鑑了SPP Net的思路,但是沒有用金字塔)。這個網路層可以把不同大小的輸入對映到一個固定尺度的特徵向量,而我們知道,conv、pooling、relu等操作都不需要固定size的輸入,因此,在原始圖片上執行這些操作後,雖然輸入圖片size不同導致得到的feature map尺寸也不同,不能直接接到一個全連線層進行分類,但是可以加入這個神奇的ROI Pooling層,對每個region都提取一個固定維度的特徵表示,再通過正常的softmax進行型別識別。ROI pooling 池化層結構,可以有效解決 R-CNN 演算法必須將影象區域剪裁、縮放到相同尺寸大小的操作。提出多工損失函式思想,將分類損失和邊框迴歸損失結合統一訓練學習,並輸出對應分類和邊框座標,不再需要額外的硬碟空間來儲存中間層的特徵,梯度能夠通過 RoI Pooling 層直接傳播。

        ROI pooling layer——是SPP Net中pooling的一個簡化版本,可以看作是隻有一個尺度filter的“金字塔”。輸入是N個整幅影象的feature map和一組R個候選區域。每個特徵對映都是H*W*C,每個候選區域都是一個元祖(n,r,c,h,w),n是特徵對映的索引,r,c,h,w分別是候選區域的左上角座標和高與寬。輸出是max-pooling過得到的特徵對映

      除此之外,R-CNN的處理流程是先提取proposal,然後CNN提取特徵,之後用SVM分類器,最後再做bounding-box regression。而在Fast-RCNN中,作者巧妙的把bbox regression放進了神經網路內部,與region分類和併成為了一個multi-task模型

     在R-CNN中,最大的缺點就是每個proposal都要獨自經過CNN,這使得花費的時間非常多,且有很多重複的計算。而在Fast R-CNN中,共享卷積層,不再是是每一個候選框都當做輸入進入CNN了,而是輸入一張完整的圖片,在第五個卷積層再得到每個候選框的特徵。R-CNN的方法:許多候選框(比如兩千個)-->CNN-->得到每個候選框的特徵-->分類+迴歸。Fast R-CNN的方法:一張完整圖片-->CNN-->得到每張候選框的特徵-->分類+迴歸。故此很明顯可以看出。Fast R-CNN的提速的原因在於:不像R-CNN把每個候選區域給深度網路提特徵,而是整張圖提一次特徵,再把候選框對映到conv5上,而SPP只需要計算一次特徵,剩下的只需要在conv5層上操作就可以了。加速是Fast R-CNN的最主要貢獻

 

Faster R-CNN

2015年S Ren等人對R-CNN系列又提出了改進型Faster R-CNN。運用一種區域建議網路RPN(Region Proposal Network),它和檢測網路共享全圖的卷積特徵,使得區域建議幾乎不花時間。對於Fast R-CNN存在——選擇性搜尋,找出所有的候選框,這個過程非常耗時。為此,加入一個提取邊緣的神經網路,也就說找到候選框的工作也交給神經網路來做了。做這樣的任務的神經網路叫做Region Proposal Network(RPN)。Faster R-CNN的主要貢獻就是設計了提取候選區域的網路,使得檢測速度大為提高,上圖中黃色部分為RPN,除了RPN外,其他部分繼承了Fast R-CNN的結構。候選框的選取不一定要在原圖上做,在特徵圖上也可以,而低解析度的特徵圖意味著更少的計算量。Faster R-CNN是首個利用CNN來完成proposals的預測的

將RPN放在最後一個卷積層的後面,RPN直接訓練得到候選區域。

RPN候選區域網路的簡介

        RPN是一個全卷積網路, 在每個位置同時預測目標邊界和客體性得分。將RPN 生成的高質量區域建議框,用於Fast R-CNN來檢測,通過一種簡單的交替執行優化方法,RPN和Fast R-CNN 可以在訓練時共享卷積特徵,應用共享卷積,計算建議框的邊際成本是很小的(例如每個影象10ms)。這種將一直以來分離的候選區域提取階段和卷積神經網路分類過程融合到了一起,使用端到端的網路進行目標檢測,在速度以及精度上都得到了顯著的提高。

       RPN通過一個滑動視窗(下圖中紅色框)連線在最後一個卷積層輸出的feature map上,然後通過全連線層調整到256維的向量,作為輸出層的輸入,同時每個滑動視窗對應k個anchor boxes。在作者的原文中使用了3個尺寸和3個比例的anchor。每個anchor對應原圖上的一個感受區域,通過這種方法來提高scale-invariant。RPN網路的特點在於通過滑動視窗的方式實現候選框的提取,每個滑動視窗位置生成9個候選視窗(不同尺度、不同寬高),提取對應9個候選視窗(anchor)的特徵,用於目標分類和邊框迴歸。

  • 在feature map上滑動視窗
  • 建一個神經網路用於物體分類+框位置的迴歸
  • 滑動視窗的位置提供了物體的大體位置資訊
  • 框的迴歸提供了框更精確的位置

一種網路,四個損失函式;
  • RPN calssification(anchor good.bad)
  • RPN regression(anchor->propoasal)
  • Fast R-CNN classification(over classes)
  • Fast R-CNN regression(proposal ->box)

 

小結(R-CNN, Fast R-CNN, Faster R-CNN三種演算法)

R-CNN, Fast R-CNN, Faster R-CNN三種演算法的關係

R-CNN, Fast R-CNN, Faster R-CNN三種演算法的效能對比:

R-CNN, Fast R-CNN, Faster R-CNN三種演算法的步驟

RCNN
  1. 在影象中確定約1000-2000個候選框 (使用選擇性搜尋)
  2. 每個候選框內影象塊縮放至相同大小,並輸入到CNN內進行特徵提取 
  3. 對候選框中提取出的特徵,使用分類器判別是否屬於一個特定類 
  4. 對於屬於某一特徵的候選框,用迴歸器進一步調整其位置

 

Fast RCNN
  1. 在影象中確定約1000-2000個候選框 (使用選擇性搜尋)
  2. 對整張圖片輸進CNN,得到feature map
  3. 找到每個候選框在feature map上的對映patch,將此patch作為每個候選框的卷積特徵輸入到SPP layer和之後的層
  4. 對候選框中提取出的特徵,使用分類器判別是否屬於一個特定類 
  5. 對於屬於某一特徵的候選框,用迴歸器進一步調整其位置

 

Faster RCNN
  1. 對整張圖片輸進CNN,得到feature map
  2. 卷積特徵輸入到RPN,得到候選框的特徵資訊
  3. 對候選框中提取出的特徵,使用分類器判別是否屬於一個特定類 
  4. 對於屬於某一特徵的候選框,用迴歸器進一步調整其位置

 

YOLO(或稱為YOLOV1)

       Faster實現了端到端的檢測,並且幾乎達到了效果上的最優,速度方向的改進仍有餘地,於是YOLO(You Only Look Once)誕生了(2015 年華盛頓大學的 Joseph Redmon 等提出)。YOLO採用了一種非常激進的檢測方法,前面提到的目標檢測演算法都是基於proposal區域的檢測方法,而YOLO利用一個單一的CNN,完成了在整幅影象上bounding box和類別概率的預測。實現了end-to-end的優化,同時極大提高了演算法的速度。其增強版本在GPU上能實現45fps,簡化版本能達到155fps(Fast YOLO使用9個卷積層代替YOLO的24個,網路更輕快,但同時損失了檢測準確率。)。基本的原理如下圖所示,將原圖劃分為7*7的網格,如果某個object的中心落再一個網格中,這個網格就負責預測這個object,利用單一的CNN,每個grid cell同時完成多個bounding box的位置及其類別概率的預測。(YOLO的中文譯名:你只需要看一次,不需要類似RPN的候選框提取,直接進行整圖迴歸就可以了)

論文:You Only Look Once: Unified, Real-Time Object Detection(這篇 Paper 的主頁在這裡:http://pjreddie.com/darknet/yolo/

YOLO文章的翻譯https://www.cnblogs.com/zyly/p/9274472.html

       YOLO相比於傳統物體檢測分類模型的最大優點:使用端到端(所謂的端到端就是不需要使圖片通過傳統的流水線進行預處理,輸入影象到YOLO即可得到物體的位置資訊和類別,如下圖所示)的深度學習方式,不需要使圖片通過傳統的流水線進行預處理,輸入影象到YOLO即可得到物體的位置資訊和類別。YOLO演算法將檢測問題看做是迴歸問題( regression problem,迴歸的是bounding box),採用單個神經網路,利用整個影象的資訊來預測目標的邊框、識別目標的類別,實現端到端的目標檢測,YOLO 從輸入的影象,僅僅經過一個 neural network,直接得到 bounding boxes 以及每個 bounding box 所屬類別的概率。正因為整個的檢測過程僅僅有一個網路,所以它可以直接 end-to-end 的優化。

YOLO模型輸入:448x448的RGB圖片

YOLO模型輸出:S × S × (B ∗ 5 + C) 維度的張量

     符號說明:用S x S的格點分割原始圖片(如7*7), 有B個框選物體的Bounding boxes,每個框都會輸出5個資訊(p, x, y, w, h)

其中。p——該網格是否有物體, 即P(Object)。

        只有目標中心在的格點中,才有以下值,對於有目標的格點,選擇最適合其輪廓的一個Bounding Box包含以下值,其他的Bounding Box內的值均為don’t cares

x:——網格內目標的中心x座標(目標中心x座標與網格寬度的比值)

y——網格內目標的中心y座標(目標中心y座標與網格高度的比值)

w——正確預測框的寬度 (目標寬度相對於網格寬度的比值)

h—— 正確預測框的高度(目標高度相對於網格高度的比值)

C——每個格點都會有C個需要判斷的類別,即P(Class i)

 

YOLO模型結構

Use a linear activation function for the final layer and all other layers use the following leaky rectified linear activation (Leaky RELU):

YOLO演算法採用的網路結構,與GoogLeNet有點類似,有24個卷積層,2個全連線層,如下圖所示。

 

YOLO模型流程:

          step1:輸入一張448x448的圖片,並用7*7的網格進行劃分,劃分為49個網格(cell)。若一個目標的中心落入某個格子中,那麼該格子將負責檢測該目標。對於每個網格,都預測2個邊框,包括B個bounding boxes,以及這些bounding boxes 的置信值(confidence scores)。預測出7*7*2個目標視窗,然後根據閾值去除可能性比較低的目標視窗,最後NMS去除冗餘視窗即可(如上圖所示);

         step2:模型會為每一個網格都輸出一個(B ∗ 5 + C)長度的tensor。每個Bounding boxe有5個預測引數:是否有物體、x座標、y座標、寬、高。C為類別。而bounding box中的引數“是否有物體”用置信值confidence來衡量,confidence表示bounding box與ground truth的IOU。。而每個網格為第C類別的概率為

tensor結構——每個cell有兩個視窗,儲存結構為一個30維的向量,如下圖所示。可以看到每個cell向量的前5維分別代表了一個檢測框的x座標,y座標,寬度和高度,檢測框中有目標物體的置信度(P(Object) ∗ IOU)。6~10維表示第二個檢測框

 

        step3:對於所有網格計算出置信度。將bounding box的置信度與類別概率相乘,得到特定類的置信分數,這個分數代表了該類別出現在bounding box的概率,也代表了bounding box吻合目標的程度。

Pr(Class_{i} |Object)\ast Pr(Object)\ast IOU_{pred}^{truth} =Pr(Class_{i} )\ast IOU_{pred}^{truth}

          YOLO模型預測出每個bounding box時,也預測出了該bounding box的置信值。置信值表明了該bounding box包含目標的可信度,也即該bounding box的可信度。在訓練模型時,如果對應的格子中不包含目標時,我們希望該置信值等於0,否則,我們希望該置信值等於predicted box與ground truth的IOU。置信度大於某閾值的網格,則認為選出的網格是包含目標的,令這些候選出來的格點集合為S;

        step4:對於上述集合S中的每一元素s,利用公式

         選出最大的可能預測類(經過此步驟,則選出了所有存在檢測的目標的網格,而且這些存在目標的網格只預測了一類物體)。令這些後選出的集合為

對於上面提到的cell為30維向量,還剩下20維向量,代表這個cell中的物體屬於20個類別的概率值。將cell兩個檢測框的置信度分別乘以20類別的概率值。

step5:對於K集合中相同的每一類,要從候選的檢測框中找出最後的目標框。對每個類別,進行閾值比較、降序排列、對有重疊的候選框使用非極大值抑制(NMS)操作。

While there are any remaining boxes:

        Pick the box with largest C

        Discard any remaining box with IoU >= some threshold with the box output in the previous step

最後候選框的最終分數得到最終的類別和分數:

獲得最終結果:

關於NMS

https://images2017.cnblogs.com/blog/724315/201708/724315-20170819215636318-1865601062.png

       用bbox_max代表分數最大的候選框,將其與其他候選框bbox_cur進行比較,如果IoUbbox_maxbbox_cur>0.5,將候選框bbox_cur的分數置為0第一輪迴圈後,由於橙色框(bbox_max)和綠色框的重疊度大於0.5,所以將綠色候選框的分數置0

https://images2017.cnblogs.com/blog/724315/201708/724315-20170819220544834-302153105.png

         第二輪迴圈,將剩下的第二大分數的候選框設為bbox_max(圖中的藍色框)

https://images2017.cnblogs.com/blog/724315/201708/724315-20170819220952896-71277499.png

       同樣的道理,由於藍色框(bbox_max)和粉色框的重疊度大於0.5,所以將粉色候選框的分數置0

https://images2017.cnblogs.com/blog/724315/201708/724315-20170819221126053-1093006285.png

       使用非極大值抑制迴圈結束後,很多情況下,都只有少數的幾個候選框大於0。

 

YOLO模型訓練

1、訓練流程(YOLO網路骨架為24個卷積層+2個全連線層)

       YOLO模型前面20層使用了改進的GoogleNet,得到14×14×1024的tensor,接下來經過4個卷積層分別進行3×3的卷積操作和1×1的降維操作,最後經過兩個全連線層後輸出為7×7×30的tensor。檢測目標就能從7×7×30的tensor中得到。這裡的7×7並不是將輸入影象劃分為7×7的網格,實際上指經過多個卷積層處理過後的特徵map是7×7大小的,而且其中的每個cell是互相有重疊的,但是為了便於直觀理解,直接將原始影象用7×7的網格進行劃分。

      i)先在以下模型上訓練分類任務。在預訓練階段,採用圖中的前20卷積層,外加a average-pooling layer and a fully connected layer

        ii