天天看點

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

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

目錄

引言

深度目标檢測算法

深度目标檢測算法的分類

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 pooling 和 average 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吻合目标的程度。

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:
學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

          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

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

       用bbox_max代表分數最大的候選框,将其與其他候選框bbox_cur進行比較,如果IoU(bbox_max,bbox_cur)>0.5,将候選框bbox_cur的分數置為0。第一輪循環後,由于橙色框(bbox_max)和綠色框的重疊度大于0.5,是以将綠色候選框的分數置0。

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

         第二輪循環,将剩下的第二大分數的候選框設為bbox_max(圖中的藍色框)

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

       同樣的道理,由于藍色框(bbox_max)和粉色框的重疊度大于0.5,是以将粉色候選框的分數置0。

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

       使用非極大值抑制循環結束後,很多情況下,都隻有少數的幾個候選框大于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)再增加四個卷積層和兩個全連接配接層訓練物體檢測任務(凍住i中模型所的參數,對新增加的層随機初始化參數再進行訓練),為了避免過拟合,兩個全連接配接層均使用了dropout正則化,kee_pro = 0.5。最後一層輸出類别機率、bounding box(最後一層輸出物體的類别機率和物體框的中心坐标,高寬度和類别機率。物體的中心坐标是相對于每一個包含該物體中心格點的偏移量,物體框的高寬度通過圖檔的高寬度标準化為0,1之間。是以所有輸出值都在0,1之間)。

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

2、損失函數

         每個格子預測出多個bounding box。但是,在訓練時,隻希望一個bounding box predictor 來負責一個目标,是以,根據bounding box與ground truth的IOU來選取合适的bounding box predictor 。在訓練過程中,采用的損失函數如下:

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

損失函數是Yolo算法的精華所在。

1.隻對真實值中的确有物體的格點進行x, y, w, h的反向傳播訓練

2.雖然損失函數的各個部分均為均方誤差(包含w, h的部分除外),但坐标損失部分的權重和無物體格點的有無物體預測權重設的不同,分别為

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

        坐标損失權重之是以設的很大,是因為坐标值一般較小,不設定大的權重很難學習,而模型中大部分的格點都是沒有物體的,是以如果無物體的損失權重和有物體的損失權重一樣,為了最小化這樣的損失,神經網絡對于有物體和無物體的預測機率會大緻相同,但事實上大部分格點真實值為0,為了避免這種問題,就把無物體的格點有無物體預測給予更小的權重,使得模型更傾向與預測無物體格點(符合真實的資料分布)

3.為了避免對大網格和對小網格的偏差基于相同的懲罰(對于相同的偏差,對小網格的懲罰應該更大)

        例如網格寬度真實值分别為200和20的網格寬度預測值為190和10,那麼後一個預測顯然是差的多的。如果單純的使用內插補點的平方作為損失,那麼兩者的平方損失均為10² = 100, 這是不正确的,因為前者的預測顯然好很多過後者,為了解決這一問題, 對網格預測的高寬度和網格真實的高寬度均開根号再相減,使得損失函數對小值偏差更為敏感。例如

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:
學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

YOLO優點:

a、簡單,采取端到端的深度學習方式,不需要對圖檔進行傳統的流水線進行預處理;

b、快速,YOLO算法流程簡單,速度很快,可以實作實時監測。由于不需要對圖檔進行預處理,而且采取卷積的物體定位的實作方式,借鑒Google-net,構造了更加小的模型,使得YOLO可以用于實時物體檢測任務。而Faster YOLO更加快;

c、相比Fast R-CNN,YOLO不易于錯誤預測背景。YOLO采用全圖資訊進行預測。與滑動視窗、region proposals不同,YOLO在訓練、預測過程中利用全圖資訊。Fast R-CNN方法錯誤地将背景塊檢測為目标,原因在于Fast R-CNN方法在檢測時無法看到全局圖像。相比于Fast R-CNN,YOLO可以将背景預測錯誤率降低一半 ;

YOLO的泛化能力強,還可以檢測油畫中的object

YOLO 和其他網絡的對比如下圖

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:
學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

YOLO 各種資料集上表現和其他物體檢測神經網絡的對比如下圖

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

YOLO缺點:

a、每個格子隻能預測出兩個bounding box、一種類别,這導緻模型對相鄰目标的檢測準确率下降。是以,YOLO對成堆目标的檢測準确率較低。 

其實YOLO從某種程度上而言,就是用了proposal,隻是R-CNN系列的proposal是通過算法得出,而YOLO則是對整張圖劃分為7*7=49的網格,就是49個proposal,那麼自然它的速率就會提升,但是這也是已犧牲準确度為代價的~

YOLOV2

        YOLO與Fast R-CNN相比有較大的定位誤差,與基于region proposal的方法相比具有較低的召回率。是以,為了目标的提高召回率和定位能力,YOLO作者提出了《YOLO9000: Better, Faster, Stronger》YOLOV2是在YOLO的基礎上改進的(better、faster、stronger),下面先看看新增的改進,以及這些改進的作用

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

YOLOV2的檢測速度和檢測品質相對于前一代都有進一步的提高,在67幀,YoloV2可以達到76.8的mAP,在40幀,可以達到78.6的mAP。而YOLO9000建立在YOLOV2之上,可以檢測超過9000類的物體(雖然準确率不怎麼樣,但是訓練這個模型的思路還是很好的),在Image Net的交叉驗證集的44個類别裡,達到19.7的mAP,在COCO的156類物體裡達到16.0的mAP。盡管可以預測很多類别,YOLO9000還是很有實時性的。

Better

1、使用Batch Normalization(可以提升模型的收斂速度,且可以起到一定正則化的效果,降低過拟合)。CNN在訓練過程中網絡每層輸入的分布一直在改變, 會使訓練過程難度加大,但可以通過normalize每層的輸入解決這個問題。YOLO中也大量用了Batch Normalization,同時在定位層後邊用了dropout,YOLOV2中取消了dropout,在每一個卷積層後全部添加Batch Normalization。 加快收斂,提高了2%的mAP。由于Batch Normalization有輕微正則化的作用,故此不再使用dropout正則化。

2、High Resolution Classifier——使用更高的分辨率圖檔作為分類模型訓練,YOLO先在ImageNet(224*224)分類資料集上預訓練模型的主體部分(大部分目标檢測算法),獲得較好的分類效果,然後再訓練網絡的時候将網絡的輸入從224*224增加為448*448。但是直接切換分辨率,檢測模型可能難以快速适應高分辨率。是以YOLOV2增加了在ImageNet資料集上使用448*448的輸入來finetune分類網絡這一中間過程(10 epochs),這可以使得模型在檢測資料集上finetune之前已經适用高分辨率輸入。使得模型對圖檔輸入有更大的像素适應範圍。使用高分辨率分類器後,YOLOV2的mAP提升了約4%。

3、Anchor Box & Dimension Clusters——YOLO中直接在卷積層之後使用全連接配接層預測bounding box的坐标,導緻丢失較多的空間資訊,定位不準。YOLOV2借鑒Faster R-CNN中的anchor思想,使用anchor boxes預測bounding box的偏移。移除了全連接配接層(網絡僅采用卷積層和池化層),保留了一定空間結構資訊。并且删掉了一個pooling層使特征的分辨率更大一些。Anchor box如下圖所示

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

在YOLO中,輸入圖檔最終被劃分為7*7的網格單元(cell),每個cell預測2個邊框。YOLO中最後采用的是全連接配接層直接對邊框進行預測,其中邊框的寬與高是相對整張圖檔的大小的,而由于資料集中各圖檔中存在不同尺度和高寬比的物體,YOLO在訓練過程中難以适應不同的物體的形狀。進而導緻YOLO在定位精準度上較差。而YOLOV2中通過引入anchor box,可以獲得更高的recall(YOLO中隻有98個邊框,而YOLO2中有1000多個)

然後,通過縮減網絡(下采樣32倍),讓圖檔輸入分辨率為由448*448變為416 * 416,這一步的目的是為了讓後面産生的卷積特征圖寬高都為奇數(輸出為13*13*5*25),産生奇數的目的是産生一個center cell。因為作者觀察到,大物體通常占據了圖像的中間位置, 就可以隻用中心的一個cell來預測這些物體的位置,否則就要用中間的4個cell來進行預測,這個技巧可稍稍提升效率。最後,YOLOv2使用了卷積層降采樣(factor為32),使得輸入卷積網絡的416 * 416圖檔最終得到13 * 13的卷積特征圖(416/32=13)。加入了anchor boxes後,可以預料到的結果是召回率上升,準确率下降。我們來計算一下,假設每個cell預測9個建議框,那麼總共會預測13 * 13 * 9 = 1521個boxes,而之前的網絡僅僅預測7 * 7 * 2 = 98個boxes。

anchor box的具體效果為:沒有anchor boxes,模型recall為81%,mAP為69.5%;加入anchor boxes,模型recall為88%,mAP為69.2%。準确率隻有小幅度的下降,而召回率則提升了7%。

Dimension Clusters則是用于決定anchor box的尺寸選擇問題。在Faster R-CNN中,是采用手動設定的。YOLOV2使用k-means clustering 算法來訓練,為圖檔自适應的選擇3個anchor box。為聚類算法定義的距離函數如下

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

在COCO 和VOC 2017訓練集上訓練得到的Anchor Boxes示意圖如下圖所示。

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

4、改進每一個box的預測值定義來改進模型(作者發現Yolov1模型訓練早期的不穩定性來自坐标和高寬度的預測),作者先是吐槽了一下RPN(region proposal network)坐标預測的缺點,t_x, t_y為預測值。最終坐标計算如下。x, y為最終預測點的坐标。如果t_x,t_y預測的很大或者很小,那麼中心點坐标會超出圖檔的範圍。

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

其實作者就是想說前面的縮放比例應該先定在0,1之間,是以作者使用了sigmoid函數作為激活函數。除此之外,作者将預測到的高寬度用了指數激活方式,認為增加非線性函數,給神經網絡一個誤差容限,而不是單純的數值誤差,新的五個預測值的表示如下:

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:
學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:
學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

最終通過使用自動選擇的Anchor boxes和新定義的預測值,Yolov2的性能提升了5%,而且模型更加的穩定。

5、細粒度特征(fine grain features)——在Faster R-CNN 和 SSD 均使用了不同的feature map以适應不同尺度大小的目标。YOLOv2使用了一種不同的方法,簡單添加一個 pass through layer(轉移層)捕捉更細粒度的特征,這個轉移層也就是把高低兩種分辨率的特征圖做了一次連結,把淺層特征圖連接配接到深層特征圖。 通過疊加淺層特征圖相鄰特征到不同通道(而非空間位置),類似于Resnet中的identity mapping。将淺層特征圖與原生的深層特征圖相連接配接,使模型有了細粒度特征。使得淺層模型特征對最終預測結果有更大的影響。

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

6、Multi-Scale Training(采用不同尺寸的圖檔訓練)——YOLO訓練時,輸入網絡的圖像的尺寸固定不變。而YOLOV2中,由于沒有了全連接配接層,是以其輸入不限于416*416大小的圖檔。YOLOV2每隔幾次疊代後就會微調網絡的輸入尺寸。訓練時每疊代10次,就會随機選擇新的輸入圖像尺寸。因為YOLOv2的網絡使用的downsamples倍率為32,是以使用32的倍數調整輸入圖像尺寸{320,352,…,608}。訓練使用的最小的圖像尺寸為320 x 320,最大的圖像尺寸為608 x 608,對應特征圖的大小為19*19。 這使得網絡可以适應多種不同尺度的輸入,提高魯棒性.

Faster

1、大多數檢測架構依賴于VGG-16作為的基本特征提取器。VGG-16是一個強大的,準确的分類網絡,但它比較複雜。YOLO借鑒Google-net 的模型架構,自定義了一種網絡,這個網絡比VGG-16快,然而準确性比VGG-16差。YOLOV2提出了一種新的分類模型Darknet-19,更簡便的模型,更少的運算,但也有很不錯的準确率和mAP。Darknet網絡結構如下圖。包含了19個conv和5maxpooling,相比YOLOv1的24個卷積層和2個全連接配接層精簡了網絡。

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

先對模型訓練1000類的分類任務: 先在standard ImageNet 1000 class classification dataset訓練160epochs。

再對模型進行檢測訓練:在分類網絡Darknet-19的基礎上去掉最後一個1*1的卷積層,加上一個3*3*1024的卷積層,然後再加上一個1x1卷積層輸出類别,

除此之外,添加跨層跳躍連接配接,融合粗細粒度的特征。将前面最後一個3*3*512卷積的特征圖跨層連接配接到最後一個卷積層。

Stronger

1、由于現實生活中的物體分類資料集遠大于物體檢測資料集,是以單純的使用一小部分的物體檢測資料集進行YOLOV2的訓練會使得該模型無法檢測更多類别的物體。為了解決這一問題, 并且盡可能地利用分類資料集來提升Yolo能夠檢測的物體的類别數量,作者提出了聯合訓練算法,并使模型可以進行盡可能多的分類資料進行訓練,采用樹狀圖建構現實世界的物體分類資料集來融合多個平台的圖檔資料集來訓練物體分類模型,再使用一小部分物體檢測的資料進行訓練定位模型,使得YOLOV2可以對9000種物體進行檢測。

在訓練的時候,物體檢測資料集和物體分類資料集是混合在一起的。如果某個資料來自分類資料集,則不對定位量b_x, b_y, b_w, b_h進行反向傳播訓練,隻降低分類損失,如果是物體檢測資料集,則降低全部損失。

但是這種融合資料集的方法會有幾個問題:

  • 分類資料集的物體類别多,分類更加詳細。
  • 檢測資料集的物體類别少,分類粗糙。

是以需要采取結構化的方式,結構化融合的資料集。

2、采用樹狀圖建構現實世界的物體分類資料,若一個物體有多條路徑到達根節點(Physical Object),則選取最短路路徑進行模型标記。先将Image Net中隻有一條路徑通往根結點的物體路徑添加到樹有向圖中,再将剩餘的有多條路徑通往有向圖根結點的物體以添加最少分支的原則添加到有向圖中。構造了WordTree樹狀圖如下,解決了不同資料集互相排斥的問題(具體沒了解)。

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

           assume: 

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

if we wan to compute absolute probability of Norfolk terrier 

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

在訓練的時候,舉一個例子,如果某一個樣本他的真是标簽是Norfolk terrier(一種狗名),那麼輸出中,對狗和哺乳動物的分類也是1。

2、采用多sotfmax來預測類别,而不是使用單softmax

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

Yolov2優點:

檢測類别更多,應該是最多類别的物體檢測模型,準确率更高, mAP更高,準确率提升的同時,速度依然很快。

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

Yolov2缺點:

對于分類資料集中出現的,但定位模型中沒有出現的小物體定位精度很低

YOLO的更新版本有兩種:YOLOV2和YOLO9000。作者采用一系列的方法優化了YOLO的模型結構,産生了YOLOV2,在快速的同時準确率也達到很高。然後作者再采用wordtree的方法,總會ImageNet的資料集和COCO資料集訓練YOLO9000,使其識别率可以達9000種。

YOLOV3

YOLOV3與之前模型的對比

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

模型的改進:

1、采用更深的模型Darknet-53。使用殘差模型和采用FPN架構。YOLOV3的特征提取器是一個殘差模型,因為包含53個卷積層,是以稱為Darknet-53,從網絡結構上看,相比Darknet-19網絡使用了殘差單元,是以可以建構得更深。

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:
學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

2、采用FPN架構(Feature Pyramid Networks for Object Detection)來實作多尺度檢測。每種尺度預測3個bounding box。anchor的設計方式仍然采用Dimension Clusters,得到9個聚類中心,将其按照大小均勻分給3個尺度。

  • 尺度1: 在基礎網絡之後添加一些卷積層再輸出box資訊.
  • 尺度2: 從尺度1中的倒數第二層的卷積層上采樣(x2)再與最後一個16x16大小的特征圖相加,再次通過多個卷積後輸出box資訊.相比尺度1變大兩倍.
  • 尺度3: 與尺度2類似,使用了32x32大小的特征圖.

3、采用logistic(邏輯回歸)替換原來模型的單個節點softmax。這樣更易于預測。softmax使每個框配置設定一個類别(選擇score最大的一個,但實際上可能存在重疊的類别标簽),是以不适用于多标簽分類。

(本人對YOLOV2的了解不是特别的深入,為此YOLOV3也沒有多大的體會,後續會對本部分進行修補)

SSD

       基于“Proposal + Classification”的目标檢測方法中,R-CNN 系列(R-CNN、 SPPnet、Fast R-CNN以及 Faster R-CNN等)取得了非常好的結果,但是在速度方面離實時效果還比較遠。在提高 mAP (Mean Average Precision) 的同時兼顧速度,逐漸成為神經網絡目标檢測領域未來的趨勢。YOLO檢測算法不僅能夠達到實時的效果,而且mAP與前面面提到的 R-CNN系列相比有很大的提升。 但是YOLO 有一些缺陷:每個網格隻能預測一個物體,容易造成漏檢;且對于物體的尺度相對比較敏感,面對尺度變化較大的物體時泛化能力較差。針對 YOLO 中的這些不足,SSD(Single Shot MultiBox Detector)網絡在這兩方面都有所改進,同時兼顧了 mAP 和實時性的要求。

(論文位址:https://arxiv.org/abs/1512.02325)

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

SSD與YOLO網絡對比

       SSD相比Faster R-CNN有明顯的速度優勢,相比YOLO又有明顯的mAP優勢。從上圖對比可以看出YOLO在卷積層後接全連接配接層,即堅持時隻利用了最高層的feature map(Faster R-CNN也是如此)。而SSD則将好幾層的,所獲得的大小不同的feature map用于檢測。在多個feature map上同時進行softmax分類和位置回歸。如下圖所示。

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

網絡結構

      SSD網絡分為兩種結構:SSD 300和SSD 512,用于不同輸入尺寸的圖像識别。本博文主要以SSD 300為例進行分析。

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

      SSD 300中輸入圖像的大小是300x300,特征提取部分使用了VGG16的卷積層,并将VGG16的兩個全連接配接層轉換成了普通的卷積層(圖中conv6和conv7),之後又接了多個卷積(conv8_1,conv8_2,conv9_1,conv9_2,conv10_1,conv10_2),最後用一個Global Average Pool來變成1x1的輸出(conv11_2)。從圖中我們可以看出,SSD将conv4_3、conv7、conv8_2、conv9_2、conv10_2、conv11_2都連接配接到了最後的檢測分類層做回歸。具體細節如下圖

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

觀察上述兩幅圖,我們可以初步得到SSD網絡預測過程的基本步驟:

  1. 輸入一幅圖檔(300x300),将其輸入到預訓練好的分類網絡(改進的傳統的VGG16網絡)中來獲得不同大小的特征映射;
  2. 抽取Conv4_3、Conv7、Conv8_2、Conv9_2、Conv10_2、Conv11_2層的feature map,然後分别在這些feature map層上面的每一個點構造6個不同尺度大小的Default boxes。然後分别進行檢測和分類,生成多個初步符合條件的Default boxes;
  3. 将不同feature map獲得的Default boxes結合起來,經過NMS(非極大值抑制)方法來抑制掉一部分重疊或者不正确的Default boxes,生成最終的Default boxes集合(即檢測結果);

具體訓練過程

首先列出SSD的三條核心設計理念:

1、采用多尺度特征圖用于檢測(Mult-scale feature map for detection)

        剛開始的層使用分類模型中的層,成為base network。在base network後添加一些卷積層,這些卷積層的大小逐漸減少,進而可以獲得多尺度的特征圖。

       所謂多尺度采用大小不同的特征圖,CNN網絡一般前面的特征圖比較大,後面會逐漸采用stride=2的卷積或者pool來降低特征圖大小,這正上如圖所示,比較大的特征圖和比較小的特征圖,它們都用來做檢測。這樣做的好處是比較大的特征圖來用來檢測相對較小的目标,而小的特征圖負責檢測大目标,如下圖所示,8x8的特征圖可以劃分更多的單元,但是其每個單元的先驗框尺度比較小。

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

      多尺度特征圖檢測的作用可以從下圖的例子中得到很好的展現。圖中,淺層網絡特征圖很适合用來識别貓這一目标(藍色方框,淺層的時候,感受野小),但面對狗這一目标,選框尺寸顯得太小無法很好地将目标檢測到。而到了深層網絡,由于特征圖經過池化層後尺寸減小,感受野變大。是以,紅色選框可以較準确地識别到狗。究其原因,正是因為每一個特征圖中都隻能用尺度相同的選框(應稱為Default boxes,後文會介紹),導緻目标尺寸與選框尺寸差距過大時,無法完成理想檢測。

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

從下圖中更是可以直接感受到,采用多尺度特征用于檢測可以提高識别的準确度。

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

2、設定Default boxes

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

      SSD借鑒了Faster R-CNN中anchor(如上圖)的理念,每個單元設定尺度或者長寬比不同的Default boxes(就是一些目标的預選框,後續通過softmax分類+bounding box regression獲得真實目标的位置),預測的邊界框(bounding boxes)是以這些Default boxes為基準的,在一定程度上減少訓練難度。一般情況下,每個單元會設定多個先驗框,其尺度和長寬比存在差異。對應上一條核心思想我們知道,Default boxes其實就是在某一feature map上每一點處選取的不同長寬比的選框。以feature map上每個點的中心點為中心,生成一系列通同心的Default boxes。與YOLO不同的是,YOLO在每個位置隻選取正方形選框,但是真實目标的形狀是多變的,YOLO需要在訓練過程中自适應目标的形狀。

Default boxes尺寸的确定(Choosing scales and aspect ratios for default boxes )

          Conv7,Conv8_2,Conv9_2,Conv10_2,Conv11_2作為檢測所用的特征圖,加上Conv4_3層,共提取了6個特征圖,其大小分别是(38,38)(19,19)(10,10)(5,5)(3,3)(1,1)。但是不同特征圖設定的先驗框數目不同。先驗框的設定,包括尺度(scale)和長寬比(aspect ratio)兩個方面。對于對于每個feature map對應的先驗框的尺度,其遵守一個線性遞增規則:随着特征圖大小降低,先驗框尺度線性增加:

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

          這裡smin是0.2,表示最底層的尺度是0.2,;smax是0.9,表示最高層的尺度是0.9。通過這種計算方法,可以得出6個特征圖的default box尺度分别為:[30,60,111,162,213,264]。長寬比用ar

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

表示為下式(注意這裡一共有5種長寬比): 

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

          通過下面的公式計算 default box 的寬度w和高度h:

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

          預設情況下,每個特征圖會有一個

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

且尺度為

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

的先驗框,除此之外,還會設定一個尺度為

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

的先驗框,這樣每個特征圖都設定了兩個長寬比為1但大小不同的正方形先驗框。是以,每個特征圖一共有6個先驗框,但是在實作時,Conv4_3,Conv10_2和Conv11_2層僅使用4個先驗框,它們不使用長寬比為3,1/3的先驗框。SSD 300一共可以預測的default box個數為:

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

是以說SSD本質上是密集采樣。

3、采用卷積進行檢測(Convolutional predictors for detection)

        與Yolo最後采用全連接配接層不同,SSD直接采用卷積對不同的特征圖來進行提取檢測結果。對網絡中6個特定的卷積層的輸出分别用兩個3*3的卷積核進行卷積,一個輸出分類用的confidence,每個default box生成21個confidence(這是針對VOC資料集包含20個object類别而言的,另外一個是背景的分類);一個輸出回歸用的localization,每個default box生成4個坐标值(x,y,w,h)。下圖給出了一個5*5大小的卷積核對feature map檢測的過程。其中Priorbox是代表default box(隻是不同叫法,實際上是一樣的),前面已經介紹了生成規則。檢測值包含兩個部分:類别置信度和邊界框位置,各采用一次3*3卷積來進行完成。令

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

為該特征圖所采用的先驗框數目,那麼類别置信度需要的卷積核數量為

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

,而邊界框位置需要的卷積核數量為

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

訓練與預試

1、default box比對

      在訓練過程中,首先要确定訓練圖檔中的ground truth(真實目标)與哪個先驗框來進行比對,與之比對的先驗框所對應的邊界框将負責預測它。在YOLO中,ground truth的中心落在哪個單元格,該單元格中與其IOU最大的邊界框負責預測它。但是在SSD中卻完全不一樣,在訓練時,ground truth與 default boxes按照如下方式進行配對:

i)、首先,尋找與每一個ground truth box有最大IOU的default box,這樣就能保證每一個ground truth能與至少一個default box對應起來。

ii)、SSD之後又将剩餘還沒有配對的default box與任意一個ground truth嘗試配對,隻要兩者之間的IoU大于門檻值,就進行比對(SSD 300 門檻值為0.5)。

       通常稱與ground truth比對的default box為正樣本,反之,若一個default box沒有與任何ground truth進行比對,那麼該default box隻能與背景比對,就是負樣本。下圖為一個比對示意圖,其中綠色的GT是ground truth,紅色為先驗框,FP表示負樣本,TP表示正樣本。

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

      盡管一個ground truth可以與多個先驗框比對,但是ground truth相對先驗框還是太少了,是以負樣本相對正樣本會很多。為了保證正負樣本盡量平衡,SSD采用了hard negative mining,就是對負樣本進行抽樣,抽樣時按照置信度誤差(預測背景的置信度越小,誤差越大)進行降序排列,選取誤差的較大的top-k作為訓練的負樣本,以保證正負樣本比例接近1:3。

2、損失函數

        在訓練樣本确定了之後,就是選擇損失函數了。損失函數定義為位置誤差(locatization loss,loc)與置信度誤差(confidence loss, conf)的權重和:

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

      其中N是先驗框的正樣本數量。c為類别置信度預測值。l為先驗框的所對應邊界框的位置預測值,而g是ground truth的位置參數。權重系數

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

通過交叉驗證設定為1。

對于位置誤差,其采用Smooth L1 loss,定義如下:

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

      這裡

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

為一個訓示參數,當

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

時表示第i個default boxes與第j個ground truth比對,并且ground truth的類别為g。由于

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

的存在,是以位置誤差僅針對正樣本進行計算。

對于置信度誤差,其采用softmax loss,定義如下:

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

從公式中可以看出,置信度的誤差包含兩個部分:正樣本的誤差和負樣本的誤差。通過下圖我們可以更好地觀察到具體過程。

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

3、資料增廣

       不同于Faster R-CNN,SSD算法使用了多種資料增強的方法,包括水準翻轉、裁剪、放大和縮小等。論文明确指出,資料增強可以明顯的提高算法的性能。主要的目的是為了使得該算法對輸入的不同大小和不同形狀的目标具有更好的魯棒性。直覺的了解是通過這個資料增強操作可以增加訓練樣本的個數,同時構造出更多的不同形狀和大小的目标,将其輸入到網絡中,可以使得網絡學習到更加魯棒的特征。

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

4、Atrous Algothrim

采用Hole算法可以利用已經訓練好的模型進行微調,又可以改變網絡結構得到更加稠密的得分圖。其原理如下圖。

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

Hole算法擴大感受野

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

Hole算法在增加特征圖尺寸的同時擴充感受野

5、NMS(非極大值抑制)

       在SSD算法中,NMS至關重要。因為多個feature map 最後會産生大量的bounding boxes,即最終檢測結果。然而在這些bounding boxes中存在着大量的錯誤的、重疊的、不準确的樣本,這不僅造成了巨大的計算量,如果處理不好會影響算法的性能。(在上文已經對NMS作了較為詳細的介紹)

性能評估

1、子產品性能

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

觀察上圖可以得到如下的結論:

1)資料增強方法在SSD算法中起到了關鍵性的作用,使得mAP從65.5變化到71.6,主要的原因可能是資料增強增加了樣本的個數,使得模型可以獲得更重更樣的樣本,即提高了樣本的多樣性,使得其具有更好的魯棒性,進而找到更接近GT的bounding boxes。

2)[1/2,2]和[1/3, 3]box可以在一定程度上提升算法的性能,主要的原因可能是這兩種box可以在一定程度上增加較大和較小的bounding boxes,可以更更加準确的檢測到較大和較小的目标,而且VOC資料集上面的目标一般都比較大。當然,更多的比例可以進一步提升算法的性能。

3)Atrous算法可以輕微提升算法性能,但是其主要的作用是用來提速,論文中表明它可以提速20%。主要的原因可能是雖然該算法可以獲得更大的feature map和感受野,但是由于SSD本身利用了多個feature map來擷取bounding boxes,bounding boxes的多樣性已經足夠,由于feature map擴大而多得到的bounding boxes可能是一些重複的,并沒有起到提升檢測性能的作用。

2、SSD加速的原因

  • 原因1:首先SSD是一個one-stage網絡,隻需要一個階段就可以輸出結果;而Faster R-CNN是一個two-stage網絡。盡管Faster R-CNN的bounding boxes少很多,但是其需要大量的前向和反向推理(訓練階段),而且需要交替的訓練兩個網絡;
  • 原因2:Faster R-CNN中不僅需要訓練RPN,而且需要訓練Fast R-CNN,而SSD其實相當于一個優化了的RPN網絡,不需要進行後面的檢測,僅僅前向推理就會花費很多時間;
  • 原因3:YOLO網絡雖然比SSD網絡看起來簡單,但是YOLO網絡中含有大量的全連接配接層。和FC層相比,CONV層具有更少的參數;同時YOLO獲得候選bounding boxes的操作比較費時;SSD算法中,調整了VGG網絡的架構,将其中的FC層替換為CONV層,這一點會大大的提升速度。
  • 原因4:使用了Atrous算法,該算法能夠提速20%。
  • 原因5:SSD設定了輸入圖檔的大小,它會将不同大小的圖檔裁剪為300x300,或者512x512,和Faster-rcnn相比,在輸入上就會少很多的計算。

SSD優點:

運作速度超過YOLO,精度超過Faster R-CNN(一定條件下,對于稀疏場景的大目标而言)。

SSD缺點:

需要人工設定default boxes的初始尺度和長寬比的值。網絡中default boxes的基礎大小和形狀不能直接通過學習獲得,而是需要手工設定。而網絡中每一層feature使用的default box大小和形狀恰好都不一樣,導緻調試過程非常依賴經驗。

對小尺寸的目辨別别仍比較差,還達不到Faster R-CNN的水準。因為SSD使用conv4_3低級feature去檢測小目标,而低級特征卷積層數少,存在特征提取不充分的問題。

DSSD

SSD算法的局限:

  • 卷積神經網絡在結構上存在固有的問題:高層網絡感受野比較大,語義資訊表征能力強,但是分辨率低,幾何細節資訊表征能力弱。低層網絡感受野比較小,幾何細節資訊表征能力強,雖然分辨率高,但語義資訊表征能力弱。
  • SSD采用多尺度的特征圖來預測物體,使用具有較大感受野的高層特征資訊預測大物體,具有較小感受野的低層特征資訊預測小物體。
  • 這樣就帶來一個問題:使用的低層網絡的特征資訊預測小物體時,由于缺乏高層語義特征,導緻SSD對于小物體的檢測效果較差。而解決這個問題的思路就是對高層語意資訊和低層細節資訊進行融合。DSSD采用Top Down的網絡結構進行高低層特征的融合并且改進了傳統上采樣的結構。

DSSD(Deconvolutional Single Shot Detector)算法思想:

  • DSSD使用一種通用的Top Down的融合方法,使用VGG和Resnet網絡,以及不同大小的訓練圖檔尺寸來驗證算法的通用性。
  • 将高層的語義資訊融入到低層網絡的特征資訊中,豐富預測回歸位置框和分類任務輸入的多尺度特征圖,以此來提高檢測精度。
  • 在提取出多尺度特征圖之後,DSSD提出由殘差單元組成的預測子產品,進一步提取深度的特征最後輸入給框回歸任務和分類任務。

(論文位址:https://arxiv.org/abs/1701.06659)

1、DSSD網絡

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

       DSSD的基礎是SSD檢測網絡。經過以上的分析我們知道,SSD算法對小目标不夠魯棒的最主要的原因是淺層feature map的表征能力不夠強。DSSD就使用了更好的基礎網絡(ResNet)和Deconvolution層,skip連接配接來給淺層feature map更好的表征能力。(上圖的上半部分)。DSSD算法将上圖中的特定的七層特征圖拿出六層(去掉尺寸最小的一層的特征圖)輸入到反卷積模型裡,輸出修正的特征圖金字塔,形成一個由特征圖組成的沙漏結構。最後經預測子產品輸入給框回歸任務和分類任務做預測。

          DSSD的核心思想,也就是如何利用中間層的上下文資訊。方法就是把紅色層做反卷積操作,使其和上一級藍色層尺度相同,再把二者融合在一起,得到的新的紅色層用來做預測。如此反複,仍然形成多尺度檢測架構。在圖中越往後的紅色層分辨率越高,而且包含的上下文資訊越豐富,綜合在一起,使得檢測精度得以提升。

2、實作細節

2.1、預測子產品

        SSD的直接從數個卷積層中分别引出預測函數,預測量多達7000多,梯度計算量也很大。MS-CNN方法指出,改進每個任務的子網可以提高準确性。根據這一思想,作者在每一個預測層後增加殘差子產品,并且對于多種方案進行了對比,如下圖所示。

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

圖中:

(a)為SSD使用的方法,直接提取出網絡中的多尺度特征圖做分類和回歸的預測;

(b)為Resnet殘差單元的網絡結構;

(c)為改進的隻含一個殘差單元的預測模型,在殘差旁路将原來的特征圖用的卷積核做處理後與網絡主幹道的特征圖做通道間加法;

(d)為隻含兩個殘差單元的預測模型。

圖中四種預測方式的實驗結果如下圖:

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

結果表明,增加殘差預測子產品後,高分辨率圖檔的檢測精度比原始SSD提升明顯。

2.2、反卷積子產品

        為了引入更多的進階上下文資訊,DSSD在SSD+Resnet-101之上,采用反卷積層來進行預測(Deconvolution Module)。和原始SSD是不同的,最終形成沙漏形的網絡。添加額外的反卷積層以連續增加後面特征圖的分辨率,為了加強特征,作者在沙漏形網絡中采用了跳步連接配接(skip connection)方法。反卷積模型指的是DSSD中高層特征和低層特征的融合子產品,其基本結構如下圖 所示。該子產品可以适合整個DSSD架構。

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

DSSD的提出者認為用于精細網絡的反卷積子產品的分解結構達到的精度可以和複雜網絡一樣,并且更有效率。是以進行了一定的改進:

  1. 在每個卷積層後添加批歸一化層;
  2. 使用基于學習的反卷積層而不是簡單地雙線性上采樣;
  3. 測試了不同的結合方式,元素求和(element-wise sum)與元素點積(element-wise product)方式,實驗證明點積計算能得到更好的精度(見下圖)。
學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

2.3、訓練與預測

2.3.1、訓練過程

訓練的大部分過程和原始SSD類似。

  • 首先,依然采用了SSD的default boxes,把重疊率高于0.5的視為正樣本。
  • 設定一些負樣本,使得正負樣本的比例為3:1。
  • 訓練中使Smooth L1+Softmax聯合損失函數最小。訓練前依然需要資料擴充(包含了hard example mining技巧)。

       另外原始SSD的default boxes次元是人工指定的,可能不夠高效,為此,DSSD算法在這裡采用K-means聚類方法重新得到了7種default boxes次元,得到的這些boxes次元更具代表性。這一點是對上文提到的SSD算法需要人工确定default boxes,很依賴經驗這一局限的改進。而訓練階段DSSD算法獨有的過程分為兩個階段:

  • 第一個階段,加載SSD模型初始化DSSD網絡,并當機SSD網絡的參數,然後隻增加反卷積模型(不添加預測模型),在這樣的條件下隻訓練反卷積模型;
  • 第二個階段,微調第一階段的模型,解凍第一階段訓練時候當機的所有參數,并添加預測模型。

2.3.2、預測過程

       預測過程較SSD算法并無太大差别。同樣是選取特定層的feature map選取default boxes。但需要注意的是,由于經過了反卷積層的作用,這些feature map包涵更多的特征資訊和更精細的感受野。

           對標明的feature map使用新增加的殘差子產品進行運算後,再做分類與回歸(SSD中沒有殘差子產品)。接着就是SSD算法的流程了,根據置信度進行降序排列保留top-k個預測框。然後進行NMS算法,過濾掉那些重疊度較大的預測框。最後剩餘的預測框就是檢測結果了。

DSSD針對小目标魯棒性太差,提出了以下兩個貢獻:

  • 把SSD的基準網絡從VGG換成了Resnet-101,并添加了殘差子產品,增強了特征提取能力; 
  • 使用反卷積層(deconvolution layer)增加了大量上下文資訊。

是以, DSSD算法達到了更好的檢測準确率,特别是對小目标也有較好的檢測效果。

不足之處是時效性不高,原因:

  • Resnet-101相比VGG有更多的卷積層;
  • 增加的反卷積層帶來的額外的運算;
  • DSSD中增加了比例為1.6的default boxes,這也增加了預測時間。

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

學習筆記之——基于深度學習的目标檢測算法引言深度目标檢測算法深度目标檢測算法的分類主要參考博文:

         好~終于把幾種常見的檢測網絡寫完了~~~不過可能由于用的時間較短,對于部分細節了解不夠透徹(比如YOLOV2采用了很多改進的算法,但是細節部分,本人感覺還沒了解透徹,接下來會對YOLOV2進行實作,做深入的剖析),接下來有新的體會會及時更新本博文,也歡迎大家賜教~

       本博文主要是對常用的深度學習的檢測網絡進行了介紹,後面還會有博文介紹分類網絡。這裡補充說明一下檢測網絡和分類網絡的差別。檢測網絡就是用于目标檢測的(object detection)。包含兩個問題:一是判斷屬于某個特定類的物體是否出現在圖中;二是對該目标定位,定位常用表征表征就是物體的邊界框(bounding box)。可以實作——輸入測試圖檔,輸出檢測到的目标類别和位置。

而分類網絡則是實作物體的分類任務。該任務需要我們對出現在某幅圖像中的物體做标注,比如一共有1000個物體類,對一幅圖檔中所有物體來說,某個物體要麼有,要麼沒有。可實作:輸入一幅測試圖檔,輸出該圖檔中物體類别的候選集。

主要參考博文:

https://blog.csdn.net/Julialove102123/article/details/79520473

https://blog.csdn.net/qq_38906523/article/details/79971817(目标檢測的發展史,推薦看看)

https://www.cnblogs.com/Libo-Master/p/9717626.html

https://www.jianshu.com/p/e6496a764b51

https://blog.csdn.net/liangjiubujiu/article/details/80879771(R-CNN)

https://www.cnblogs.com/skyfsm/p/6806246.html(R-CNN)

https://blog.csdn.net/u013989576/article/details/72781018(YOLO)

http://www.cnblogs.com/sandy-t/p/7397713.html(YOLO,寫得非常好)

https://www.cnblogs.com/makefile/p/YOLOv3.html(YOLOV2)

https://blog.csdn.net/wfei101/article/details/79398563(YOLOV2)

https://www.jianshu.com/p/032b1eecb335(YOLOV2)

https://blog.csdn.net/qq1483661204/article/details/79776065(SSD代碼分析)

https://baijiahao.baidu.com/s?id=1598999301741831102&wfr=spider&for=pc(基于候選區域的目标檢測器)

繼續閱讀