目標檢測背景學習

OBJECT DETECTION目標檢測

主流算法

目標檢測模型分為兩類。一類是two-stage,將物體識別和物體定位分為兩個步驟,分別完成,這一類的典型代表是R-CNN, fast R-CNN, faster-RCNN家族。他們識別錯誤率低,漏識別率也較低,但速度較慢,不能滿足實時檢測場景。為了解決這一問題,另一類方式出現(xiàn)了,稱為one-stage, 典型代表是Yolo, SSD, YoloV2等。他們識別速度很快,可以達到實時性要求,而且準確率也基本能達到faster R-CNN的水平。(物體識別與分類主流算法:Lenet5?AlexNet VGG Inception ResNet)

目標檢測(Object detection)發(fā)展

早期的目標檢測方法通常是通過提取圖像的一些 robust 的特征(如 Haar、SIFT、HOG 等),使用 DPM (Deformable Parts Model)模型,用滑動窗口(silding window)的方式來預測具有較高 score 的 bounding box。這種方式非常耗時,而且精度又不怎么高。

后來出現(xiàn)了object proposal方法(其中selective search為這類方法的典型代表),相比于sliding window這中窮舉的方式,減少了大量的計算,同時在性能上也有很大的提高。利用 selective search的結(jié)果,結(jié)合卷積神經(jīng)網(wǎng)絡的R-CNN出現(xiàn)后,Object detection 的性能有了一個質(zhì)的飛越?;?R-CNN 發(fā)展出來的 SPPnet、Fast R-CNN、Faster R-CNN 等方法,證明了 “Proposal + Classification” 的方法在 Objection Detection 上的有效性。

相比于 R-CNN 系列的方法,本論文提供了另外一種思路,將 Object Detection 的問題轉(zhuǎn)化成一個 Regression 問題。給定輸入圖像,直接在圖像的多個位置上回歸出目標的bounding box以及其分類類別。

YOLO是一個可以一次性預測多個Box位置和類別的卷積神經(jīng)網(wǎng)絡,能夠?qū)崿F(xiàn)端到端的目標檢測和識別,其最大的優(yōu)勢就是速度快。事實上,目標檢測的本質(zhì)就是回歸,因此一個實現(xiàn)回歸功能的CNN并不需要復雜的設計過程。YOLO沒有選擇滑動窗口(silding window)或提取proposal的方式訓練網(wǎng)絡,而是直接選用整圖訓練模型。這樣做的好處在于可以更好的區(qū)分目標和背景區(qū)域,相比之下,采用proposal訓練方式的Fast-R-CNN常常把背景區(qū)域誤檢為特定目標。

Faster R-CNN、R-FCN和SSD?原理介紹

Faster R-CNN

主要分為四個步驟

1. 卷積層。原始圖片先經(jīng)過conv-relu-pooling的多層卷積神經(jīng)網(wǎng)絡,提取出特征圖。供后續(xù)的RPN網(wǎng)絡和全連接層使用。faster R-CNN不像R-CNN需要對每個子圖進行卷積層特征提取,它只需要對全圖進行一次提取就可以了,從而大大減小了計算時間。

2. RPN層,region proposal networks。RPN層用于生成候選框,并利用softmax判斷候選框是前景還是背景,從中選取前景候選框(因為物體一般在前景中),并利用bounding box regression調(diào)整候選框的位置,從而得到特征子圖,稱為proposals。

3. ROI層,fast R-CNN中已經(jīng)講過了ROI層了,它將大小尺寸不同的proposal池化成相同的大小,然后送入后續(xù)的全連接層進行物體分類和位置調(diào)整回歸

4. 分類層。利用ROI層輸出的特征圖proposal,判斷proposal的類別,同時再次對bounding box進行regression從而得到精確的形狀和位置。

使用VGG-16卷積模型的網(wǎng)絡結(jié)構(gòu)如下圖


卷積層

卷積層采用的VGG-16模型,先將PxQ的原始圖片,縮放裁剪為MxN的圖片,然后經(jīng)過13個conv-relu層,其中會穿插4個max-pooling層。所有的卷積的kernel都是3x3的,padding為1,stride為1。pooling層kernel為2x2, padding為0,stride為2。

MxN的圖片,經(jīng)過卷積層后,變?yōu)榱?M/16) x (N/16)的feature map了。

RPN層

faster R-CNN拋棄了R-CNN中的選擇性搜索(selective search)方法,使用RPN層來生成候選框,能極大的提升候選框的生成速度。RPN層先經(jīng)過3x3的卷積運算,然后分為兩路。一路用來判斷候選框是前景還是背景,它先reshape成一維向量,然后softmax來判斷是前景還是背景,然后reshape恢復為二維feature map。另一路用來確定候選框的位置,通過bounding box regression實現(xiàn),后面再詳細講。兩路計算結(jié)束后,挑選出前景候選框(因為物體在前景中),并利用計算得到的候選框位置,得到我們感興趣的特征子圖proposal。

> 候選框的生成 anchors

卷積層提取原始圖像信息,得到了256個feature map,經(jīng)過RPN層的3x3卷積后,仍然為256個feature map。但是每個點融合了周圍3x3的空間信息。對每個feature map上的一個點,生成k個anchor(k默認為9)。anchor分為前景和背景兩類(我們先不去管它具體是飛機還是汽車,只用區(qū)分它是前景還是背景即可)。anchor有[x,y,w,h]四個坐標偏移量,x,y表示中心點坐標,w和h表示寬度和高度。這樣,對于feature map上的每個點,就得到了k個大小形狀各不相同的選區(qū)region。

> softmax判斷選區(qū)是前景還是背景

對于生成的anchors,我們首先要判斷它是前景還是背景。由于感興趣的物體位于前景中,故經(jīng)過這一步之后,我們就可以舍棄背景anchors了。大部分的anchors都是屬于背景,故這一步可以篩選掉很多無用的anchor,從而減少全連接層的計算量。

對于經(jīng)過了3x3的卷積后得到的256個feature map,先經(jīng)過1x1的卷積,變換為18個feature map。然后reshape為一維向量,經(jīng)過softmax判斷是前景還是背景。此處reshape的唯一作用就是讓數(shù)據(jù)可以進行softmax計算。然后輸出識別得到的前景anchors。

> 確定候選框位置

另一路用來確定候選框的位置,也就是anchors的[x,y,w,h]坐標值。如下圖所示,紅色代表我們當前的選區(qū),綠色代表真實的選區(qū)。雖然我們當前的選取能夠大概框選出飛機,但離綠色的真實位置和形狀還是有很大差別,故需要對生成的anchors進行調(diào)整。這個過程我們稱為bounding box regression。

假設紅色框的坐標為[x,y,w,h], 綠色框,也就是目標框的坐標為[Gx, Gy,Gw,Gh], 我們要建立一個變換,使得[x,y,w,h]能夠變?yōu)閇Gx, Gy,Gw,Gh]。最簡單的思路是,先做平移,使得中心點接近,然后進行縮放,使得w和h接近.

> 輸出特征子圖proposal

得到了前景anchors,并確定了他們的位置和形狀后,我們就可以輸出前景的特征子圖proposal了。步驟如下

1. 得到前景anchors和他們的[x y w h]坐標

2. 按照anchors為前景的不同概率,從大到小排序,選取前pre_nms_topN個anchors,比如前6000個

3. 剔除非常小的anchors

4. 通過NMS非極大值抑制,從anchors中找出置信度較高的。這個主要是為了解決選取交疊問題。首先計算每一個選區(qū)面積,然后根據(jù)他們在softmax中的score(也就是是否為前景的概率)進行排序,將score最大的選區(qū)放入隊列中。接下來,計算其余選區(qū)與當前最大score選區(qū)的IOU(IOU為兩box交集面積除以兩box并集面積,它衡量了兩個box之間重疊程度)。去除IOU大于設定閾值的選區(qū)。這樣就解決了選區(qū)重疊問題

5. 選取前post_nms_topN個結(jié)果作為最終選區(qū)proposal進行輸出,比如300個。

經(jīng)過這一步之后,物體定位應該就基本結(jié)束了,剩下的就是物體識別了

ROI Pooling層

和fast R-CNN中類似,這一層主要解決之前得到的proposal大小形狀各不相同,導致沒法做全連接。全連接計算只能對確定的shape進行運算,故必須使proposal大小形狀變?yōu)橄嗤Mㄟ^裁剪和縮放的手段,可以解決這個問題,但會帶來信息丟失和圖片形變問題。我們使用ROI pooling可以有效的解決這個問題。

ROI pooling中,如果目標輸出為MxN,則在水平和豎直方向上,將輸入proposal劃分為MxN份,每一份取最大值,從而得到MxN的輸出特征圖。

分類層

ROI Pooling層后的特征圖,通過全連接層與softmax,就可以計算屬于哪個具體類別,比如人,狗,飛機,并可以得到cls_prob概率向量。同時再次利用bounding box regression精細調(diào)整proposal位置,得到bbox_pred,用于回歸更加精確的目標檢測框。

這樣就完成了faster R-CNN的整個過程了。算法還是相當復雜的,對于每個細節(jié)需要反復理解。faster R-CNN使用resNet101模型作為卷積層,在voc2012數(shù)據(jù)集上可以達到83.8%的準確率,超過yolo ssd和yoloV2。其最大的問題是速度偏慢,每秒只能處理5幀,達不到實時性要求。

Ref:?一文讀懂目標檢測AI算法:R-CNN,faster R-CNN,yolo,SSD,yoloV2

Faster R-CNN準確率mAP較高,漏檢率recall較低,但速度較慢。

yolo則相反,速度快,但準確率和漏檢率不盡人意。

SSD綜合了他們的優(yōu)缺點,對輸入300x300的圖像,在voc2007數(shù)據(jù)集上test,能夠達到58 幀每秒( Titan X 的 GPU ),72.1%的mAP。

當前目標檢測模型算法也是層出不窮。在two-stage領域,2017年Facebook提出了mask R-CNN。CMU也提出了A-Fast-RCNN 算法,將對抗學習引入到目標檢測領域。Face++也提出了Light-Head R-CNN,主要探討了 R-CNN 如何在物體檢測中平衡精確度和速度。

one-stage領域也是百花齊放,2017年首爾大學提出 R-SSD 算法,主要解決小尺寸物體檢測效果差的問題。清華大學提出了 RON 算法,結(jié)合 two stage 名的方法和 one stage 方法的優(yōu)勢,更加關注多尺度對象定位和負空間樣本挖掘問題。

Object Segmentation:?Mask R-CNN

FasterRCNN 提升分類精度


目標識別&分類

一文讀懂物體分類AI算法:LeNet-5 AlexNet VGG Inception ResNet MobileNet

AlexNet的結(jié)構(gòu)特點為

1. 采用relu替代了tanh和sigmoid激活函數(shù)。relu具有計算簡單,不產(chǎn)生梯度彌散等優(yōu)點,現(xiàn)在已經(jīng)基本替代了tanh和sigmoid

2. 全連接層使用了dropout來防止過擬合。dropout可以理解為是一種下采樣方式,可以有效降低過擬合問題。

3. 卷積-激活-池化后,采用了一層LRN,也就是局部響應歸一化。將一個卷積核在(x,y)空間像素點的輸出,和它前后的幾個卷積核上的輸出做權(quán)重歸一化。(LRN層,對局部神經(jīng)元的活動創(chuàng)建競爭機制,使得其中響應比較大的值變得相對更大,并抑制其他反饋較小的神經(jīng)元,增強了模型的泛化能力. 歸一化后有什么好處呢?原因在于神經(jīng)網(wǎng)絡學習過程本質(zhì)就是為了學習數(shù)據(jù)分布,一旦訓練數(shù)據(jù)與測試數(shù)據(jù)的分布不同,那么網(wǎng)絡的泛化能力也大大降低;另外一方面,一旦每批訓練數(shù)據(jù)的分布各不相同(batch 梯度下降),那么網(wǎng)絡就要在每次迭代都去學習適應不同的分布,這樣將會大大降低網(wǎng)絡的訓練速度,這也正是為什么我們需要對數(shù)據(jù)都要做一個歸一化預處理的原因。)

4. 使用了重疊的最大值池化層。3x3的池化核,步長為2,因此產(chǎn)生了重疊池化效應,使得一個像素點在多個池化結(jié)果中均有輸出,提高了特征提取的豐富性

5. 使用CUDA GPU硬件加速。訓練中使用了兩塊GPU進行并行加速,使得模型訓練速度大大提高。

6. 數(shù)據(jù)增強。隨機的從256x256的原始圖片中,裁剪得到224x224的圖片,從而使一張圖片變?yōu)榱?256-224)^2張圖片。并對圖片進行鏡像,旋轉(zhuǎn),隨機噪聲等數(shù)據(jù)增強操作,大大降低了過擬合現(xiàn)象。

ResNet

ResNet由微軟提出,并奪得了2015年ILSVRC大賽的冠軍。它以152層的網(wǎng)絡深度,將錯誤率降低到只有3.57%,遠遠低于5.1%的人眼識別錯誤率。它同樣利用全局平均池化來代替全連接層,使得152層網(wǎng)絡的模型不至于太大。網(wǎng)絡中使用了1x1 3x3 5x5 7x7等不同尺寸的卷積核,從而提高卷積的多樣性。resNetV1_152模型大小為214M,不算太大。

隨著網(wǎng)絡的加深,會出現(xiàn)了訓練集上準確率下降的現(xiàn)象,我們可以確定這不是由于Overfit過擬合造成的(過擬合的情況,訓練集上應該準確率很高);所以作者針對這個問題提出了一種全新的網(wǎng)絡,叫深度殘差網(wǎng)絡,它允許網(wǎng)絡更深,其中引入了全新的結(jié)構(gòu)

殘差指的是什么?

其中ResNet提出了兩種mapping:一種是identity mapping,x,指的就是圖1中”彎彎的曲線”,另一種residual mapping,F(x),指的就是除了”彎彎的曲線“之外的那部分,兩部分相加組成了最后的輸出:y=F(x)+x

identity mapping:顧名思義,就是指本身,也就是公式中的x

residual mapping:指的是“”,也就是y?x,所以殘差指的就是F(x)部分。

理論上,對于“隨著網(wǎng)絡加深,準確率下降”的問題,Resnet提供了兩種選擇方式,也就是identity mapping和residual mapping,如果網(wǎng)絡已經(jīng)到達最優(yōu),繼續(xù)加深網(wǎng)絡,residual mapping將被push為0,只剩下identity mapping,這樣理論上網(wǎng)絡一直處于最優(yōu)狀態(tài)了,網(wǎng)絡的性能也就不會隨著深度增加而降低了。

Google Inception

Google Inception是一個大家族,包括inceptionV1 inceptionV2 inceptionV3 inceptionV4等結(jié)構(gòu)。它主要不是對網(wǎng)絡深度的探索,而是進行了網(wǎng)絡結(jié)構(gòu)的改進。

> InceptionV1

inceptionV1是一個設計十分精巧的網(wǎng)絡,它有22層深,只有500萬左右的參數(shù)量,模型大小僅為20M左右,但錯誤率卻只有6.7%。它的網(wǎng)絡結(jié)構(gòu)特點如下

1. 去除了最后的全連接層,而使用全局平均池化來代替。這是模型之所以小的原因。AlexNet和VGG中全連接幾乎占據(jù)了90%的參數(shù)量。而inceptionV1僅僅需要1000個參數(shù),大大降低了參數(shù)量

2. inception module的使用。借鑒與Network in Network的思想,提出了inception module的概念,允許通道并聯(lián)來組合特征。其結(jié)構(gòu)如下

inception module分為并聯(lián)的四路,分別為單獨的1x1卷積,1x1并聯(lián)3x3, 1x1并聯(lián)5x5, 池化后1x1卷積。使用不同的卷積結(jié)構(gòu)來提取不同特征,然后將他們組合在一起來輸出。

使用了1x1,3x3,5x5等不同尺寸的卷積,增加了提取特征面積的多樣性,從而減小過擬合

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容