雷鋒網(wǎng)按:本文為雷鋒字幕組編譯的技術(shù)博客,原標(biāo)題 What do we learn from region based object detectors (Faster R-CNN,R-FCN, FPN)?,作者為 Jonathan Hui 。 翻譯 | 唐青 李振 整理 | 凡江 在這個(gè)系列中,我們將對(duì)目標(biāo)檢測(cè)算法進(jìn)行全面探討。 第 1 部分,我們介紹常見(jiàn)的基于區(qū)域的目標(biāo)檢測(cè)器,包括 Fast R-CNN , Faster R-CNN , R-FCN 和 FPN 。 第 2 部分,我們介紹單步檢測(cè)器(single shoot dectors, SSD )。第 3 部分,我們探討算法性能和一些具體的例子。通過(guò)在相同的環(huán)境研究這些算法,我們研究哪些部分在其作用,哪些部分是重要的,可以在哪些部分進(jìn)一步改進(jìn)。希望通過(guò)對(duì)算法如何發(fā)展到今天的研究,會(huì)給我們未來(lái)的研究提供方向。 第1部分:我們從基于區(qū)域的目標(biāo)檢測(cè)器中學(xué)到了什么(Faster R-CNN,R-FCN,F(xiàn)PN)? 第2部分:我們從單步檢測(cè)器中學(xué)到了什么(SSD,YOLO),F(xiàn)PN 和 Focal loss? 第3部分:目標(biāo)檢測(cè)的設(shè)計(jì)選型,經(jīng)驗(yàn)教訓(xùn)和發(fā)展趨勢(shì)? 滑動(dòng)窗口檢測(cè)器(Sliding-window detectors) 自從 AlexNet 贏得了 2012 年 ILSVRC 挑戰(zhàn)的冠軍,使用 CNN 進(jìn)行分類成為領(lǐng)域的主導(dǎo)。一種用于目標(biāo)檢測(cè)的簡(jiǎn)單粗暴的方法是將滑動(dòng)窗口從左到右,從上到下滑動(dòng)使用分類來(lái)識(shí)別目標(biāo)。為了區(qū)分在不同視覺(jué)距離下的目標(biāo)類型,我們使用了不同尺寸和高寬比的窗口。 我們按照滑動(dòng)窗口從圖片中剪切出部分圖像塊。由于通常分類器都采用固定的圖像大小,所以圖像塊需要進(jìn)行形變。然而,這對(duì)分類精度并沒(méi)有什么影響,應(yīng)為分類器訓(xùn)練時(shí)也使用了形變的圖像。 形變的圖像塊被送進(jìn) CNN 分類器中提取 4096 個(gè)特征。然后,我們用一個(gè) SVM 分類器進(jìn)行分類,用一個(gè)線性回歸器得到邊界框。 以下是偽代碼。 我們生成了很多窗口來(lái)檢測(cè)不同位置、不同形狀的目標(biāo)。 為了提高性能,減少窗口數(shù)量是一個(gè)顯而易見(jiàn)的解決方案。 選擇性搜索(Selective Search) 不再用簡(jiǎn)單粗暴的方法,我們用區(qū)域提議方法(region proposal method)生成感興趣區(qū)域 ( regins of interest, ROIs ) 來(lái)進(jìn)行目標(biāo)檢測(cè)。在選擇性搜索算法(Selective Search, SS)中,我們讓每個(gè)獨(dú)立像素作為一個(gè)起始的組。然后,計(jì)算每個(gè)組的紋理,合并最接近的兩個(gè)組。為了避免一個(gè)區(qū)域吞所有,我們優(yōu)先合并較小的組。持續(xù)進(jìn)行合并,直到所有可能合并的區(qū)域均完成合并。下圖中,第一行展示了如何進(jìn)行區(qū)域生長(zhǎng)。第二行展示了在合并過(guò)程中所有可能的 ROIs 。 R-CNN R-CNN 利用區(qū)域提議方法(region proposal method)生成了約 2000 個(gè)感興趣區(qū)域(regins of interest, ROIs)。這些圖像塊進(jìn)行形變到固定的大小,分別送入到一個(gè) CNN 網(wǎng)絡(luò)中。然后,經(jīng)過(guò)全連接層,進(jìn)行目標(biāo)分類和邊界框提取。 以下是系統(tǒng)的工作流。 利用數(shù)量更少,但質(zhì)量更高的 ROIs ,R-CNN 比滑動(dòng)窗口的方法運(yùn)行的更快、更準(zhǔn)確。 邊界框回歸器(Boundary box regressor) 區(qū)域提議方法的計(jì)算量很大。為了加速這個(gè)過(guò)程,我們常采用一個(gè)簡(jiǎn)易版的區(qū)域提議網(wǎng)絡(luò)來(lái)生成 ROIs ,然后,接線性回歸器(使用全連接層)來(lái)提取邊界框。 Fast R-CNN R-CNN 需要足夠多的提議區(qū)域才能保證準(zhǔn)確度, 而很多區(qū)域是相互重疊的。R-CNN 的訓(xùn)練和推理過(guò)程都很緩慢。例如,我們生成了 2000 個(gè)的區(qū)域提議,每個(gè)區(qū)域提議分別進(jìn)入 CNN。換句話說(shuō),我們對(duì)不同的 ROIs 重復(fù)了進(jìn)行了 2000 次的提取特征。 CNN 中的特征映射表達(dá)了一個(gè)更緊密的空間中的空間特征。我們能否利用這些特征映射來(lái)進(jìn)行目標(biāo)檢測(cè),而不是原始圖像? 我們不再為每個(gè)圖像塊重新提取特征,而是在開(kāi)始時(shí)采用一個(gè)特征提取器(一個(gè) CNN 網(wǎng)絡(luò))為整個(gè)圖像提取特征。然后,直接在特征映射上應(yīng)用區(qū)域提議方法。例如,F(xiàn)ast R-CNN 選擇 VGG16 的卷積層 conv5 來(lái)生成待合并 ROIs 來(lái)進(jìn)行目標(biāo)檢測(cè),其中,包括了與相應(yīng)特征的映射。我們利用 ROI Pooling 對(duì)圖像塊進(jìn)行形變轉(zhuǎn)換成固定大小,然后將其輸入到全連接層進(jìn)行分類和定位(檢測(cè)出目標(biāo)的位置)。由于不重復(fù)特征提取,F(xiàn)ast R-CNN 顯著的縮短了處理時(shí)間。 以下是網(wǎng)絡(luò)工作流: 在下面的偽代碼中,計(jì)算量很大的特征提取操作被移出了 for 循環(huán)。由于同時(shí)為 2000 個(gè) ROIs 提取特征,速度有顯著的提升。Fast R-CNN 比 R-CNN 的訓(xùn)練速度快 10 倍,推理速度快 150 倍。 Fast R-CNN 的一個(gè)主要特點(diǎn)是整個(gè)網(wǎng)絡(luò)(特征提取器,分類器和邊界框回歸器)可以通過(guò)多任務(wù)損失 multi-task losses(分類損失和定位損失)進(jìn)行端到端的訓(xùn)練。這樣的設(shè)計(jì)提高了準(zhǔn)確性。 ROI Pooling 由于 Fast R-CNN 使用了全連接層,因此我們應(yīng)用 ROI Pooling 將不同大小的 ROIs 轉(zhuǎn)換為預(yù)定義大小形狀。 舉個(gè)例子,我們將 8×8 特征映射轉(zhuǎn)換為預(yù)定義的 2×2 大小。
結(jié)果,得到了一個(gè) 2×2 的特征塊,我們可以將它輸入到分類器和邊界框回歸器中。 Faster R-CNN Fast R-CNN 采用類似選擇性搜索(Selective Search)這樣額外的區(qū)域提議方法。 但是,這些算法在 CPU 上運(yùn)行,且速度很慢。測(cè)試時(shí), Fast R-CNN 需要 2.3 秒進(jìn)行預(yù)測(cè),而其中 2 秒花費(fèi)在生成 2000 個(gè)ROIs 上。 Faster R-CNN 采用與 Fast R-CNN 相似的設(shè)計(jì),不同之處在于它通過(guò)內(nèi)部深度網(wǎng)絡(luò)取代區(qū)域提議方法。 新的區(qū)域提議網(wǎng)絡(luò)(Region Proposal Network, RPN)效率更高。單副圖像生成 ROIs 只需要 10ms 。 網(wǎng)絡(luò)工作流。區(qū)域提議方法被新的卷積網(wǎng)絡(luò)(RPN)取代。 區(qū)域提議網(wǎng)絡(luò)(Region proposal network) 區(qū)域提議網(wǎng)絡(luò)( RPN )用第一個(gè)卷積網(wǎng)絡(luò)輸出的特征圖作為輸入。在特征圖上用 3×3 的濾波器進(jìn)行滑動(dòng)(濾波),采用諸如 ZF 網(wǎng)絡(luò)(如下圖)的卷積網(wǎng)絡(luò)來(lái)得到未知類的建議區(qū)域。其他如 VGG 或者 ResNet 可以被用來(lái)提取更全面的特征,但需以速度為代價(jià)。 ZF 網(wǎng)絡(luò)輸出的 256 個(gè)值分別被送入兩個(gè)不一樣的全連接層來(lái)預(yù)測(cè)邊界框和對(duì)象性分?jǐn)?shù)(2 objectness score)。對(duì)象性描述了框內(nèi)是否包含有一個(gè)物體。我們可以用回歸器來(lái)計(jì)算單個(gè)物體的分?jǐn)?shù),但是為了簡(jiǎn)單起見(jiàn),F(xiàn)aster R-CNN使用了一個(gè)分類器分類出兩種可能的類別:「 存在物體 」類和「 不存在物體/背景 」類。 RPN 對(duì)特征圖里的每個(gè)位置(像素點(diǎn))做了 K 次猜測(cè)。因此 RPN 在每個(gè)位置都輸出 4×k 個(gè)坐標(biāo)和 2×k 個(gè)分?jǐn)?shù)。以下圖例演示了一個(gè)使用 3×3 過(guò)濾器的 8×8 特征圖,它一共輸出 8×8×3 個(gè)興趣區(qū)( ROI )( 當(dāng)k=3時(shí))。右側(cè)圖例展示了在單個(gè)位置得到的 3 個(gè)提議區(qū)域。 我們現(xiàn)在有 3 個(gè)猜測(cè),隨后我們也會(huì)逐漸改善我們的猜想。因?yàn)槲覀冏罱K只需要一個(gè)正確的猜測(cè),所以我們使用不同形狀和大小的的初始猜測(cè)會(huì)更好。因此, Faster R-CNN 不是隨機(jī)的選擇提議邊界框。而是預(yù)測(cè)了相對(duì)于一些被稱為錨的參考框的左上角的偏移量,比如 x, y 。因?yàn)槲覀兗s束了偏移量,所以我們的猜測(cè)仍然類似與錨。 為了對(duì)每個(gè)位置都進(jìn)行 k 次預(yù)測(cè),我們需要在每個(gè)位置中心放置 k 個(gè)錨。每次預(yù)測(cè)都和不同位置但是相同形狀的特定錨相關(guān)。 這些錨都是精心預(yù)選好的,所以它們多種多樣,同時(shí)非常合理的覆蓋了不同尺度和不同長(zhǎng)寬比的現(xiàn)實(shí)生活中的物體。這使了初始訓(xùn)練將具有更好的猜測(cè),同時(shí)允許每次預(yù)測(cè)都有特定、不同的形狀。這種方式使早期的訓(xùn)練更加穩(wěn)定和容易。 Faster R-CNN 使用了更多的錨。Faster R-CNN 在一個(gè)位置上使用了 9 個(gè)錨:3 種不同尺度并使用三種長(zhǎng)寬比。在每個(gè)位置使用 9 種錨,所以對(duì)于每個(gè)位置,它一共產(chǎn)生了 2×9 個(gè)對(duì)象性分?jǐn)?shù)和 4×9 個(gè)坐標(biāo)。 錨在不同的論文中也被稱為先驗(yàn)或者默認(rèn)邊界框。 R-CNN的性能 如下圖,F(xiàn)aster R-CNN 要快得多。 基于區(qū)域的全卷積網(wǎng)絡(luò) 假設(shè)我們只有一張?zhí)卣鲌D用來(lái)檢測(cè)臉上的右眼。我們是否可以用此來(lái)決定臉的位置呢?是可以的。因?yàn)橛已蹜?yīng)該位于一張面部圖像的左上角,我們也可以用此信息來(lái)確定臉的位置。 如果我們有另外的特征圖專門用來(lái)分別檢測(cè)左眼、鼻子、嘴,我們可以將這些結(jié)果結(jié)合在一起使對(duì)臉部的定位更準(zhǔn)確。 那為什么我們要如此麻煩呢?在 Faster R-CNN 里,檢測(cè)器使用多個(gè)全連接層來(lái)做預(yù)測(cè),有 2000 多個(gè) ROI ,這消耗很高。 R-FCN 通過(guò)減少每個(gè) ROI 需要的工作總量來(lái)提高速度,以上基于區(qū)域的特征圖獨(dú)立于 ROIs ,同時(shí)可以在每一個(gè)ROI的外部進(jìn)行計(jì)算。接下來(lái)的工作就更簡(jiǎn)單了,因此 R-FCN 比 Faster R-CNN 要快。 我們可以想想一下這種情況,M 是一個(gè) 5*5 大小,有一個(gè)藍(lán)色的正方形物體在其中的特征圖,我們將方形物體平均分割成 3*3 的區(qū)域?,F(xiàn)在我們從 M 中創(chuàng)建一個(gè)新的特征圖并只用其來(lái)檢測(cè)方形區(qū)域的左上角。這個(gè)新的特征圖如下右圖,只有黃色網(wǎng)格單元被激活。 因?yàn)槲覀儗⒎叫畏譃榱?9 個(gè)部分,我們可以創(chuàng)建 9 張?zhí)卣鲌D分別來(lái)檢測(cè)對(duì)應(yīng)的物體區(qū)域。因?yàn)槊繌垐D檢測(cè)的是目標(biāo)物體的子區(qū)域,所以這些特征圖被稱為位置敏感分?jǐn)?shù)圖(position-sensitive score maps)。 比如,我們可以說(shuō),下圖由虛線所畫的紅色矩形是被提議的 ROIs 。我們將其分為 3*3 區(qū)域并得出每個(gè)區(qū)域可能包含其對(duì)應(yīng)的物體部分的可能性。例如, ROIs 的左上區(qū)域中存在左眼的可能性。我們將此結(jié)果儲(chǔ)存在 3*3 的投票陣列(如下右圖)中。比如,投票陣列 [0][0] 中數(shù)值的意義是在此找到方形目標(biāo)左上區(qū)域的可能性。 將分?jǐn)?shù)圖和 ROIs 映射到投票陣列的過(guò)程叫做位置敏感 ROI 池化(position-sensitive ROI-pool)。這個(gè)過(guò)程和我們之前提到的 ROI pool 非常相似。這里不會(huì)更深入的去講解它,但是你可以參考以后的章節(jié)來(lái)獲取更多信息。 在計(jì)算完位置敏感 ROI 池化所有的值之后,分類的得分就是所有它元素的平均值。 如果說(shuō)我們有 C 類物體需要檢測(cè)。我們將使用 C+1個(gè)類,因?yàn)槠渲卸喟艘粋€(gè)背景(無(wú)目標(biāo)物體)類。每類都分別有一個(gè) 3×3 分?jǐn)?shù)圖,因此一共有 (C+1)×3×3 張分?jǐn)?shù)圖。通過(guò)使用自己類別的那組分?jǐn)?shù)圖,我們可以預(yù)測(cè)出每一類的分?jǐn)?shù)。然后我們使用 softmax 來(lái)操作這些分?jǐn)?shù)從而計(jì)算出每一類的概率。 接下來(lái)是數(shù)據(jù)流(圖),比如我們的例子中,k=3。 至今為止我們的歷程 我們從最基礎(chǔ)的滑動(dòng)窗口算法開(kāi)始。 然后我們嘗試減少窗口數(shù),并盡可能的將可以移出 for-loop 的操作移出。 在第 2 部分里,我們更加完全的移除了 for-loop 。單次檢測(cè)器(single shot detectors)使物體檢測(cè)能一次性完成,而不需要額外的區(qū)域提議步驟。 |
|
來(lái)自: 牛k8nb72h1x6w1 > 《實(shí)戰(zhàn)》