R-CNN算法於2014年提出,基本奠定了兩階段法在目標檢測領域的應用基礎。其算法結構如下。
算法步驟如下:
與傳統的目標檢測算法相比,R-CNN實現了50%的性能提升。在使用VGG-16模型作為物體識別模型的情況下,在voc2007數據集上可以達到66%的準確率,還算不錯。它最大的問題是速度非常慢,而且占用大量內存。主要有兩個原因。
針對R-CNN的壹些問題,2015年微軟提出了快速R-CNN算法,主要優化了兩個問題。
R-CNN和fast R-CNN都有壹個問題,就是候選框是選擇性搜索生成的,非常慢。而且R-CNN生成的2000個候選幀都需要經過壹次卷積神經網絡,也就是需要經過CNN網絡2000次左右,非常耗時(fast R-CNN已經改進,整個畫面只需要經過CNN網絡壹次)。這也是這兩種算法檢測速度慢的主要原因。
為了解決這個問題,fast R-CNN提出RPN網絡獲取候選幀,擺脫了選擇性搜索算法,只需要壹次卷積層運算,大大提高了識別速度。這個算法很復雜,我們會詳細分析。其基本結構如下。
主要分為四個步驟:
網絡結構采用VGG-16卷積模型;
卷積層采用VGG-16模型。首先將PxQ的原始圖片縮放裁剪成MxN的圖片,然後經過13個conv-雷魯層,其中穿插了四個max-pooling層。所有卷積核都是3×3,填充是1,步距是1。池層內核為2x2,填充為0,步幅為2。
MxN的圖片,經過卷積圖層後,變成了(M/16) x (N/16)的特征圖。
更快的R-CNN摒棄了R-CNN中的選擇性搜索方法,使用RPN層生成候選幀,可以大大提高候選幀的生成速度。RPN層首先進行3×3卷積,然後分成兩路。壹路用於判斷候選框是前景還是背景。它先將其重塑為壹維向量,然後softmax判斷是前景還是背景,再將其重塑為二維特征圖。另壹條路徑用於確定候選框的位置,通過包圍盒回歸實現,後面會詳細討論。經過雙向計算,選擇前景候選幀(因為物體在前景中),利用計算出的候選幀位置,得到我們感興趣的特征子圖提議。
卷積層提取原始圖像信息,得到256幅特征圖。RPN層3×3卷積後,還是256個特征圖。但是每個點融合了周圍3x3的空間信息。對於每個特征圖上壹個點,生成k個錨(k(k缺省為9)。主播分為前景和背景(我們不管是飛機還是汽車,只需要區分是前景還是背景)。Anchor有四個坐標偏移量[x,y,w,h],其中x和y表示中心點的坐標,w和h表示寬度和高度。這樣,對於特征圖上的每個點,獲得了具有不同大小和形狀的K個選擇區域。
對於生成的主播,首先要判斷是前景還是背景。由於感興趣的對象在前景中,在這壹步之後,我們可以放棄背景錨點。大部分錨點屬於後臺,所以這壹步可以過濾掉很多無用的錨點,從而減少全連接層的計算量。
3×3卷積後得到的256幅特征圖,經過1x1卷積後,變換成18幅特征圖。那麽reshape就是壹維向量,softmax判斷是前景還是背景。這裏整形的唯壹功能是使數據可用於softmax計算。然後輸出識別得到的前景錨點。
另壹條路徑用於確定候選框的位置,即錨點的[x,y,w,h]坐標值。如下圖,紅色代表我們當前的選區,綠色代表真正的選區。雖然我們現在的選擇可以大致選擇平面,但是距離綠色的真實位置和形狀還是有很大的差距,所以需要對生成的錨點進行調整。這個過程被稱為包圍盒回歸。
假設紅框的坐標是[x,y,w,h],綠框的坐標,也就是目標框的坐標是[Gx,Gy,Gw,Gh],我們需要建立壹個變換,使得[x,y,w,h]可以變成[Gx,Gy,Gw,Gh]。最簡單的思路就是先做平移讓中心點靠近,然後縮放讓W和H靠近。如下所示:
我們要學的是dx dy dw dh的四則變換。因為是線性變換,所以可以用線性回歸來建模。設置損失和優化方法後,就可以用深度學習來訓練,得到模型。對於空間位置損失,我們壹般使用均方誤差算法,而不是交叉熵(分類預測使用交叉熵)。優化方法可以采用自適應梯度下降算法Adam。
在得到前景錨點並確定它們的位置和形狀後,我們可以輸出前景的特征子圖建議。步驟如下:
1,獲得前景錨點及其[x y w h]坐標。
2.根據錨點為前景的概率不同,按降序選擇前pre_nms_topN個錨點,如前6000個。
3.排除非常小的錨。
4.通過NMS非最大抑制,找出可信度高的主播。這主要是為了解決選擇重疊的問題。首先計算每個選區的面積,然後在softmax中按照它們的得分(即是否是前景的概率)排序,得分最大的選區放入隊列。接下來,計算剩余選擇和當前最大得分選擇的IOU(IOU是兩個框的交集面積除以兩個框的並集面積,衡量兩個框的重疊程度)。移除IOU大於設定閾值的選擇。這樣就解決了選區重疊的問題。
5.選擇第壹個post_nms_topN結果作為輸出的最終選擇建議,例如300。
經過這壹步,物體定位應該就基本結束了,剩下的就是物體識別了。
類似於fast R-CNN,這壹層主要解決之前得到的提案大小形狀不壹,無法進行全連接的問題。全連接計算只能對某些形狀進行操作,因此需要使提案的大小和形狀相同。這個問題可以通過裁剪和縮放來解決,但是會帶來信息丟失和圖像變形。我們可以通過使用ROI pooling有效地解決這個問題。
在ROI pooling中,如果目標輸出為MxN,則將輸入建議在水平和垂直方向上分為MxN個部分,每個部分取最大值,從而得到MxN的輸出特性圖。
ROI Pooling圖層背後的特征圖可以通過將圖層與softmax充分連接來計算,比如人、狗、飛機,可以得到cls_prob概率向量。同時,再次利用包圍盒回歸對提議的位置進行微調,得到bbox_pred,用於返回更精確的目標檢測幀。
這就完成了更快的R-CNN的整個過程。算法相當復雜,每個細節都需要反復理解。更快的R-CNN使用resNet101模型作為卷積層,在voc2012數據集上準確率可以達到83.8%,超過yolo ssd和yoloV2。它最大的問題是速度慢,每秒只能處理5幀,達不到實時性的要求。
Yolo創造性地提出壹階段來克服兩階段目標檢測算法的共同缺點。即物體分類和物體定位壹步完成。Yolo在輸出層直接返回包圍盒的位置和類別,實現了壹步到位。這樣yolo可以達到每秒45幀的運算速度,完全可以滿足實時性要求(當達到每秒24幀時,人眼認為是連續的)。其網絡結構如下:
它主要分為三個部分:卷積層、目標檢測層和NMS屏蔽層。
采用Google inceptionV1網絡,對應上圖第壹階段,***20層。這壹層主要進行特征提取,從而提高模型的泛化能力。不過作者修改了inceptionV1。他沒有使用inception模塊結構,而是用1x1的卷積和3x3的卷積並行替換。(可以考慮只使用了inception模塊中的壹個分支,應該是為了簡化網絡結構。)
經過四個卷積層和兩個全連接層,最終生成7x7x30的輸出。先經歷四個卷積層的目的是為了提高模型的泛化能力。Yolo將壹張448x448的原始圖片劃分成7×7的網格,每個網格要預測兩個包圍盒的坐標(x,y,w,h),以及盒子中包含的物體的置信度,以及物體屬於20個類別中每壹個類別的概率(yolo的訓練數據是voc2012,這是壹個包含20個類別的數據集)。所以壹個網格對應的參數是(4x2+2+20) = 30。如下圖
其中,前壹項表示是否有人工標記的物體落入網格,如果有,則為1,否則為0。第二項表示包圍盒和真實標記盒之間的重合度。它等於兩個盒子面積的交集,除以面積和集合。值越大,盒子越接近真實位置。
分類信息:yolo的目標訓練集是voc2012,這是壹個20分類的目標檢測數據集。常用的目標檢測數據集如下:
| Name | # Images(trainval)| # Classes |上次更新時間|
| - | - | - | - |
| ImageNet | 450k | 200 | 2015 |
|可可| 120K | 90 | 2014 |
|帕斯卡VOC | 12k | 20 | 2012 |
牛津-IIIT寵物醫院| 7K | 37 | 2012 |
| KITTI Vision | 7K | 3 | |
每個網格還需要預測它屬於這20個類別的概率。分類信息針對每個網格,而不是邊界框。所以我們只需要20個,不是40個。而置信度針對的是包圍盒,只表示盒子裏是否有物體,不需要預測物體是20個類別中的哪壹個,所以只需要兩個參數。雖然分類信息和置信度都是概率,但意義完全不同。
篩選層的目的是從多個結果(多個包圍盒)中篩選出最合適的。這種方法和更快的R-CNN中的方法基本相同。首先過濾掉得分低於閾值的盒子,剩下的盒子進行NMS非極大值抑制,去掉重疊度高的盒子(具體的NMS算法可以在上面更快的R-CNN壹節回顧)。這樣,最終得到最合適的盒子及其類別。
Yolo的損失函數包括位置誤差、置信度誤差和分類誤差三部分。具體公式如下:
均方誤差算法用於所有誤差。其實我覺得位置誤差應該用均方差算法,分類誤差應該用交叉熵。因為物體位置只有4個參數,類別有20個參數,所以它們的累積和是不壹樣的。給予同樣的權重顯然是不合理的。所以yolo中的位置誤差權重是5,類別誤差權重是1。因為我們並不是特別在意不包含物體的包圍盒,所以給不包含物體的包圍盒的置信度誤差的權重是0.5,包含物體的包圍盒的權重是1。
較快的R-CNN有較高的mAP準確率和較低的召回率,但速度較慢。而Yolo雖然速度很快,但是準確率和漏檢率都不盡如人意。SSD結合了它們的優缺點。對於300x300的輸入圖像,在voc2007數據測試上可以達到每秒58幀(Titan X的GPU)和72.1% mAP。
固態硬盤的網絡結構如下:
和yolo壹樣,分為三個部分:卷積層、目標探測層和NMS屏蔽層。
SSD論文采用VGG16的基本網絡,這其實是幾乎所有目標檢測神經網絡的慣用方法。首先用CNN網絡提取特征,然後進行後續的目標定位和目標分類識別。
該層由五個卷積層和壹個平均池層組成。最後壹個完全連接的層被移除。SSD認為目標檢測中的物體只與周圍的信息有關,其感受野不是全局的,因此是不必要的,不應該完全連通。固態硬盤的特點如下。
每個卷積層將輸出不同感受野的特征圖。在這些不同尺度的特征圖上,對目標位置和類別進行訓練和預測,可以達到多尺度檢測的目的,可以克服yolo對長寬比異常的物體識別準確率低的問題。在yolo中,只使用最後壹個卷積層來訓練和預測目標位置和類別。這是SSD相比yolo能夠提高精度的壹個關鍵點。
如上圖所示,目標檢測和分類將在每個卷積層上進行,最後由NMS濾波並輸出最終結果。在多尺度特征圖上進行目標檢測,相當於增加了很多長寬比的包圍盒,可以大大提高泛化能力。
與更快的R-CNN類似,SSD也提出了anchor的概念。通過卷積輸出的特征圖,每個點對應於原始圖像的壹個區域的中心點。以此點為中心,構造六個不同寬高比、不同大小的錨點(SSD中稱為默認框)。每個主播對應四個位置參數(x,y,w,h)和21分類概率(voc訓練集是20分類問題,加上主播是否是後臺,***21分類)。如下圖所示:
另外,在訓練階段,SSD將正負樣本的比例定位在1: 3。給定訓練集輸入圖像和每個對象的真實區域(地面真實框),選擇默認框和真實框之間最近的作為正樣本。然後選擇IOU大於0.5的剩余默認框中的任意壹個,真實框IOU為正樣本。而另壹些則作為陰性樣本。因為大部分盒子都是負樣本,會導致正負不平衡,所以根據每個盒子類別的概率,正負比例會保持在1: 3。SSD認為這個策略提高了4%的準確率。
另外,SSD使用了數據增強。生成它們與目標物體真實盒子之間IOU為0.1.30.50.70.9的面片,隨機選擇這些面片參與訓練,隨機水平翻轉。SSD認為這個策略提高了8.8%的準確率。
和yolo的加網層基本壹樣。類似地,首先過濾類別概率低於閾值的默認框,然後使用NMS非最大值抑制過濾掉重疊度較高的框。只是SSD在不同的特征圖上合成了目標檢測輸出的默認框。
SSD基本可以滿足我們手機上實時物體檢測的需求。TensorFlow官方目標檢測模型SSD _ mobilenet _ v 1 _ Android _ export。Pb用SSD算法實現。它的基本卷積網絡是mobileNet,適合在終端上部署和運行。
針對yolo精度低、易漏檢、對長寬比異常的物體效果差的問題,結合SSD的特點,提出了yoloV2。它主要采用了yolo的網絡結構,並在此基礎上做了壹些優化和改進,具體如下。
網絡采用Darknet-19: 19層,包含大量的3×3卷積。同時增加了1x1卷積核的全局平均池層,供inceptionV1參考。其結構如下
Yolo和yoloV2只能識別20種物體。為了優化這個問題,yolo9000被提出,它可以識別9000種物體。在yoloV2的基礎上,進行了imageNet和coco的聯合訓練。該方法充分利用了imageNet可以識別1000個物體,coco可以檢測目標位置的優勢。使用imageNet訓練時,僅更新與對象分類相關的參數。使用coco時,所有參數都會更新。
YOLOv3可以說是直接掛了所有的圖像檢測算法。與同期的DSSD(反卷積SSD)和FPN(特征金字塔網絡)相比,精度更高或相近,速度為1/3。
YOLOv3的變化主要包括以下幾點:
但如果需要更準確的預測框架,以COCO AP作為評測標準,YOLO3在準確率上的表現就弱壹些。如下圖所示。
目前,目標檢測模型的算法也層出不窮。在兩階段領域,臉書在2017中提出了mask R-CNN。CMU還提出了A-Fast-RCNN算法,將對抗性學習引入目標檢測領域。Face++還提出了光頭強的R-CNN,主要討論R-CNN在物體檢測中如何平衡精度和速度。
壹級臺的領域也是百花齊放。2017年首爾大學提出了R-SSD算法,主要解決小尺寸物體檢測效果差的問題。清華大學提出的RON算法,結合了兩階段命名法和壹階段法的優點,更加註重多尺度物體定位和負空間樣本挖掘。
目標檢測領域的深度學習算法需要目標定位和物體識別,算法相對復雜。目前各種新算法層出不窮,但是模型之間有很強的連續性。大多數模型算法都是基於前人的思路,站在巨人的肩膀上。我們需要知道經典模型的特點,這些招數是為了解決什麽問題,為什麽要解決。這樣我們就可以舉壹反三,我們永遠不會改變我們的宗教。綜上所述,目標檢測領域的主要難點如下:
了解目標檢測的AI算法:R-CNN,更快的R-CNN,yolo,SSD,yoloV2。
從YOLOv1到v3的演進
SSD-Tensorflow超詳細分析壹:加載模型測試圖片?/darknet/yolo/?/pjreddie/darknet
C#項目引用:/alturosdestinations/alturos . yolo
貼壹張項目實踐的圖片。