導航:首頁 > 源碼編譯 > cnn的坐標校正演算法

cnn的坐標校正演算法

發布時間:2022-10-02 20:19:36

1. 從R-CNN到Faster R-CNN

論文: 《Rich feature hierarchies for accurate object detection and semantic segmentation》

發表年份:2013

RCNN(Regions with CNN features)是將CNN用到目標檢測的一個里程碑,藉助CNN良好的特徵提取和分類性能,通過RegionProposal方法實現目標檢測問題的轉化。

Region proposal是一類傳統的候選區域生成方法,論文使用 selective search  生成大約2k個候選區域(先用分割手段將圖片完全分割成小圖,再通過一些合並規則,將小圖均勻的合並,經過若干次合並,直到合並成整張原圖),然後將proposal的圖片進行歸一化(大小為217*217)用於CNN的輸入。

對每個Region proposal使用CNN提取出一個4096維的特徵向量

3.1 CNN提取的特徵輸入到SVM分類器中,對region proposal進行分類,與 ground-truth box的IoU大於0.5的為正樣本,其餘為負樣本。論文中每個圖片正樣本個數為32負樣本個數為96。得到所有region proposals的對於每一類的分數,再使用貪心的非極大值抑制方法對每一個SVM分類器類去除相交的多餘的框。

3.2 使用一個線性回歸器對bounding box進行修正,proposal bounding box的大小位置與真實框的轉換關系如下:

綜上,整個網路結構如下:

R-CNN在當年無論是在學術界還是工業界都是具有創造性的,但是現在來看RCNN主要存在下面三個問題:

1)多個候選區域對應的圖像需要預先提取,佔用較大的磁碟空間;

2)針對傳統CNN需要固定尺寸(217*217)的輸入圖像,crop/warp(歸一化)產生物體截斷或拉伸,喪失或者改變了圖片本身的信息;

3)每一個ProposalRegion都需要進入CNN網路計算,上千個Region存在大量的范圍重疊,重復的CNN特徵提取導致巨大的計算浪費。

論文: 《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》

發表年份:2015

既然CNN特徵提取如此耗時,為什麼還要對每個Region proposal進行特徵提取,而不是整體進行特徵提取,然後在分類之前做一次Region的截取呢,於是就誕生了SPP-Net。

1.解決了CNN需要固定大小輸入的變換後導致圖片信息丟失或者變化的問題

2.對於一張圖,只需要進行一次的特徵提取運算,避免了R-CNN中特徵重復計算的問題

CNN為什麼需要固定大小的輸入?

R-CNN中會對圖片縮放成217*217的固定大小,從而導致物體發生形變(如下圖的上部分所示)。與前面不同,SPP-Net是加在最後一個卷積層的輸出的後面,使得不同輸入尺寸的圖像在經過前面的卷積池化過程後,再經過SPP-net,得到相同大小的feature map,最後再經過全連接層進行分類

以AlexNet為例,經CNN得到conv5輸出的任意尺寸的feature map,圖中256-d是conv5卷積核的數量。將最後一個池化層pool5替換成SPP layer,將feature map劃分成不同大小的網格,分別是`4x4`,`2x2`,`1x1`,每個網格中經過max pooling,從而得到4x4+2x2+1x1=21個特徵值,最後將這21個特徵值平鋪成一個特徵向量作為全連接層的輸入,這種方式就是 空間金字塔池化 。

與R-CNN不同,SPP-Net中是將整張圖片進行一次特徵提取,得到整張圖片的feature map,然後對feature map中的候選區域(RoIs)經過空間金字塔池化,提取出固定長度的特徵向量進入全連接層。

原圖候選區域與特徵圖上的RoIs的轉換流程:

綜上,整個網路結構如下圖。SPP-Net相比R-CNN做了很多優化,但現在來看依然存在一些問題,主要如下:

論文: 《Fast R-CNN》

發表年份:2015

Fast R-CNN是對R-CNN的一個提升版本,相比R-CNN,訓練速度提升9倍,測試速度提升213倍,mAP由66%提升到66.9%

主要改進點如下:

多任務損失函數(Multi-task Loss):

        Fast R-CNN將分類和邊框回歸合並,通過多任務Loss層進一步整合深度網路,統一了訓練過程。分為兩個損失函數:分類損失和回歸損失。分類採用softmax代替SVM進行分類,共輸出N(類別)+1(背景)類。softmax由於引入了類間競爭,所以分類效果優於SVM,SVM在R-CNN中用於二分類。回歸損失輸出的是4*N(類別),4表示的是(x,y,w,h分別表示候選框的中心坐標和寬、高)。

SVD對全連接層進行分解:

        由於一張圖像約產生2000個RoIs,將近一半多的時間用在全連接層計算,為了提高運算速度,使用 SVD(奇異值分解) 對全連接層進行變換來提高運算速度。一個大的矩陣可以近似分解為三個小矩陣的乘積,分解後的矩陣的元素數目遠小於原始矩陣的元素數目,從而達到減少計算量的目的。通過對全連接層的權值矩陣進行SVD分解,使得處理一張圖像的速度明顯提升。

論文: 《Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks》

發表年份:2016

        SPP-Net和Fast R-CNN都有一個非常耗時的候選框選取的過程,提取候選框最常用的SelectiveSearch方法,提取一副圖像大概需要2s的時間,改進的EdgeBoxes演算法將效率提高到了0.2s,但是還是比較耗時。

        Fast R-CNN中引入Region Proposal Network(RPN)替代Selective Search,同時引入anchor box應對目標形狀的變化問題(anchor就是位置和大小固定的box,可以理解成事先設置好的固定的proposal)

Region Proposal Network:

        RPN的核心思想是候選框的提取不在原圖上做,而是在feature map上做,這意味著相比原圖更少的計算量。在Faster R-CNN中,RPN是單獨的分支,通過RPN提取候選框並合並到深度網路中。

多尺度先驗框:

RPN網路的特點在於通過滑動窗口的方式實現候選框的提取,每個滑動窗口位置生成9個候選窗口(不同尺度、不同寬高),提取對應9個候選窗口(anchor)的特徵,用於目標分類和邊框回歸,與FastRCNN類似。

anchor的生成規則有兩個:調整寬高比和放大。如下圖所示,假設base_size為16,按照1:2,1:1,2:1三種比例進行變換生成下圖上部分三種anchor;第二種是將寬高進行三種倍數放大,2^3=8,2^4=16,2^5=32倍的放大,如16x16的區域變成(16*8)*(16*8)=128*128的區域,(16*16)*(16*16)=256*256的區域,(16*32)*(16*32)=512*512的區域。

訓練過程中,涉及到的候選框選取,選取依據如下:

從模型訓練的角度來看,通過使用共享特徵交替訓練的方式,達到接近實時的性能,交替訓練方式為:

Faster R-CNN實現了端到端的檢測,並且幾乎達到了效果上的最優,有些基於Faster R-CNN的變種准確度已經刷到了87%以上。速度方面還有優化的餘地,比如Yolo系列(Yolo v1/v2/v3/v4)。對於目標檢測,仍處於一個探索和高度發展的階段,還不斷有更優的模型產生。

2. SPP-net文章詳細解讀

文章 《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》 是在RCNN之後,是對RCNN的改進(關於RCNN可以查看 R-CNN文章詳細解讀 ),先給出SPP-net總的框架圖如下

該文章主要改進兩點:
1. CNN需要固定輸入圖像的尺寸,導致不必要的精度損失
2. R-CNN對候選區域進行重復卷積計算,造成計算冗餘

1.為什麼CNNs要固定輸入圖像的尺寸?

CNN主要有兩部分組成:卷積層和全連接層。卷積層以滑動窗口方式操作並輸出表示各個響應激活空間分布的特徵圖。實際上,卷積層不需要輸入的圖像尺寸固定,並且可以產生任意尺寸的特徵圖。但另一方面,完全連接層需要具有固定大小/長度的輸入。 因此,固定輸入大小的約束只是來自存在於網路更深層階段的全連接層。
解決辦法(對比R-CNN, SPP-net):

如下圖所示
第一行中的圖像即為要求固定尺寸輸入的CNN對圖像的處理方式

第二行為要求固定尺寸輸入的CNN (如R-CNN)的處理流程,先將圖片按照類似第一行中的方式進行處理,然後輸入卷積以及全連接層,最後輸出結果

第三行為SPP-net的處理方式,不固定圖像的大小,直接輸入給卷積層處理,卷積出來的特徵並不是直接輸入給全連接層,而是先給SPP層處理,然後得到一個固定長度的輸出傳給全連接層,最後輸出結果。

2.R-CNN為什麼會有計算冗餘?
如下圖所示
R-CNN對於一張圖片,先使用segment seletive方法提取出約2000個候選區域,然後將這兩千個候選區域分別送入網路中,即一張圖片要經歷2000次前向傳播,這樣會造成大量冗餘。
SPP-net則提出了一種從候選區域到全圖的特徵(feature map)之間的對應映射關系,通過此種映射關系可以直接獲取到候選區域的特徵向量,不需要重復使用CNN提取特徵,從而大幅度縮短訓練時間。每張圖片只需進行一次前向傳播即可。

下面來詳細講解一下改進的方法:
1.SPP層(spatial pyramid pooling)
首先要明確的是這一層的位置,這一層加在最後一個卷積層與全連接層之間,目的就是為了輸出固定長度的特徵傳給要求固定輸入的全連接層
SPP層的結構如下圖所示

SPP層的輸入:
如下圖灰色框所示
最後一層卷積輸出的特徵(我們稱為feature map),feature map為下圖的黑色部分表示,SPP層的輸入為與候選區域對應的在feature map上的一塊區域
上面這句話可能有點繞,我們可以理解為一張圖有約2000個候選區域,而對一張圖做完卷積後得到feature map,在這個feature map上也有約2000個與候選區域對應的區域(這里的對應關系下面會詳細講解)

SPP層的輸出:
SPP layer分成1x1,2x2,4x4三個pooling結構(這部分結構如下圖所示),對每個輸入(這里每個輸入大小是不一樣的)都作max pooling(論文使用的),出來的特徵再連接到一起,就是(16+4+1)x256的特徵向量。

無論輸入圖像大小如何,出來的特徵固定是(16+4+1)x256維度。這樣就實現了不管圖像中候選區域尺寸如何,SPP層的輸出永遠是(16+4+1)x256特徵向量。

2.候選區域在原圖與feature map之間的映射關系
這部分的計算其實就是感受野大小的計算。
在CNN中感受野(receptive fields)是指某一層輸出結果中一個元素所對應的上一層的區域大小,如下圖所示。

先定義幾個參數,參數的定義參考吳恩達在cousera講解中對符號的定義,然後再講解怎麼計算

輸入的尺寸大小與輸出的尺寸大小有如下關系:

上面是區域尺寸大小的對應關系,下面看一下坐標點之間的對應關系

SPP-net對上面的坐標對應關系作了一定的簡化,簡化過程如下:

而 是坐標值,不可能取小數 所以基本上可以認為 。公式得到了化簡:感受野中心點的坐標 只跟前一層 有關。

那麼對於下圖的做法,就是SPP-net的映射方法,SPP-net 是把原始ROI的左上角和右下角 映射到 feature map上的兩個對應點。 有了feature map上的兩隊角點就確定了 對應的 feature map 區域(下圖中橙色)。

從原圖坐標 到特徵圖中坐標 的映射關系為

到這里就把SPPNet的核心思想講完了,SPPNet網路後面和R-CNN類似,詳細參考 R-CNN文章詳細解讀 。該文章還用這些思想做了圖像分類的實驗,感興趣可以細讀原文的分類部分。

參考:

3. R-CNN和Mask R-CNN在圖像分割中的應用史

姓名:王咫毅

學號:19021211150

【嵌牛導讀】機器學習成為現在研究的一大熱門,而機器學習所應用到的領域圖像處理 目標檢測 圖像分割都已經日趨成熟,而cnn是如何應用到圖像分割里邊的呢?而其發展過程又有哪些呢?

【嵌牛鼻子】機器學習 cnn 

【嵌牛提問】r-cnn和mask r-cnn有什麼區別?兩者又是怎麼形成的?

【嵌牛正文】

在 Athelas (Athelas 通過深度學習進行血液診斷),我們使用卷積神經網路(CNN)不僅僅是分類!在這篇文章中,我們將看到如何在圖像實例分割中使用CNN,效果很好。

自從 Alex Krizhevsky,Geoff Hinton和Ilya Sutskever在2012年贏得ImageNet以來 ,卷積神經網路(CNNs)已經成為圖像分類的黃金標准。事實上,從那時起,CNN已經改進到現在他們在ImageNet挑戰中勝過人類的程度!

need-to-insert-img

CNN現在在ImageNet挑戰中勝過人類。上圖中的y軸是ImageNet上的錯誤率。

雖然這些結果令人印象深刻,但圖像分類遠比真人類視覺理解的復雜性和多樣性簡單得多。

need-to-insert-img

分類挑戰中使用的圖像示例。請注意圖像是如何構圖良好的,並且只有一個對象。

在分類中,通常有一個圖像,其中一個對象作為焦點,任務是說該圖像是什麼(見上文)。但是,當我們觀察周圍的世界時,我們會執行更復雜的任務。

need-to-insert-img

現實生活中的景點通常由許多不同的,重疊的物體,背景和動作組成。

我們看到復雜的景點有多個重疊的物體和不同的背景,我們不僅要對這些不同的物體進行分類,還要確定它們之間的界限,差異和關系!

need-to-insert-img

CNN可以幫助我們完成這些復雜的任務嗎?也就是說,給定一個更復雜的圖像,我們可以使用CNN來識別圖像中的不同對象及其邊界嗎?正如Ross Girshick和他的同齡人在過去幾年所表明的那樣,答案是肯定的。

這篇文章的目標

通過這篇文章,我們將介紹在對象檢測和分割中使用的一些主要技術背後的直覺,並了解它們是如何從一個實現發展到下一個實現的。特別是,我們將介紹R-CNN(地區CNN),這是CNN對此問題的原始應用,以及其後代Fast R-CNN和Faster R-CNN。最後,我們將介紹最近由Facebook Research發布的一篇文章Mask R-CNN,它擴展了這種對象檢測技術以提供像素級分割。以下是本文中引用的論文:

R-CNN: https : //arxiv.org/abs/1311.2524

Fast R-CNN: https : //arxiv.org/abs/1504.08083

Faster R-CNN: https : //arxiv.org/abs/1506.01497

Mask R-CNN: https : //arxiv.org/abs/1703.06870

2014年:R-CNN - CNN在物體檢測中的早期應用

need-to-insert-img

諸如R-CNN的對象檢測演算法接收圖像並識別圖像中主要對象的位置和分類。

受多倫多大學Hinton實驗室研究的啟發,由Jitendra Malik教授領導的加州大學伯克利分校的一個小團隊問自己,今天看來是一個不可避免的問題:

在多大程度上[Krizhevsky等。al的結果]推廣到物體檢測?

對象檢測的任務是在圖像中查找不同的對象並對其進行分類(如上圖所示)。由Ross Girshick(我們將再次看到的名字),Jeff Donahue和Trevor Darrel組成的團隊發現,通過測試PASCAL VOC Challenge,這是一種類似於ImageNet的流行物體檢測挑戰,Krizhevsky的結果可以解決這個問題。他們寫,

本文首次表明,與基於簡單HOG類功能的系統相比,CNN可以在PASCAL VOC上實現更高的物體檢測性能。

現在讓我們花一點時間來了解他們的架構,CNNs區域(R-CNN)是如何工作的。

了解R-CNN

R-CNN的目標是接收圖像,並正確識別圖像中主要對象(通過邊界框)的位置。

輸入 :圖像

輸出 :圖像中每個對象的邊界框+標簽。

但是我們如何找出這些邊界框的位置?R-CNN做了我們可能直觀地做的事情 - 在圖像中 提出 一堆框,看看它們中的任何一個是否實際上對應於一個對象 。

need-to-insert-img

選擇性搜索查看多個比例的窗口,並查找共享紋理,顏色或強度的相鄰像素

R-CNN使用稱為選擇性搜索的過程創建這些邊界框或區域提議,您可以在 此處 閱讀。在較高的層次上,選擇性搜索(如上圖所示)通過不同大小的窗口查看圖像,並且對於每個尺寸,嘗試通過紋理,顏色或強度將相鄰像素組合在一起以識別對象。

need-to-insert-img

在創建一組區域提議後,R-CNN通過AlexNet的修改版本傳遞圖像,以確定它是否是有效區域。

一旦提出建議,R-CNN將該區域變為標準的方形大小,並將其傳遞給AlexNet的修改版本(ImageNet 2012的獲獎提交,啟發了R-CNN),如上所示。

在CNN的最後一層,R-CNN增加了一個支持向量機(SVM),它簡單地分類這是否是一個對象,如果是的話,是什麼對象。這是上圖中的第4步。

改進邊界框

現在,在盒子里找到了這個物體,我們可以收緊盒子以適應物體的真實尺寸嗎?我們可以,這是R-CNN的最後一步。R-CNN對區域提議運行簡單的線性回歸,以生成更緊密的邊界框坐標以獲得最終結果。以下是此回歸模型的輸入和輸出:

輸入 :與對象對應的圖像的子區域。

輸出 :子區域中對象的新邊界框坐標。

總而言之,R-CNN只是以下步驟:

1.為邊界框生成一組提議。

2.通過預先訓練的AlexNet運行邊界框中的圖像,最後運行SVM,以查看框中圖像的對象。

3.通過線性回歸模型運行該框,一旦對象被分類,就為框輸出更緊密的坐標。

2015年:快速R-CNN - 加速並簡化R-CNN

need-to-insert-img

Ross Girshick寫了R-CNN和Fast R-CNN。他繼續在Facebook Research推動計算機視覺的界限。

R-CNN效果很好,但由於一些簡單的原因,它確實很慢:

它需要CNN(AlexNet)的正向傳遞,用於每個單個圖像的每個區域建議(每個圖像大約2000個前向傳遞!)。

它必須分別訓練三個不同的模型 - 用於生成圖像特徵的CNN,用於預測類的分類器,以及用於收緊邊界框的回歸模型。這使得管道極難訓練。

2015年,R-CNN的第一作者Ross Girshick解決了這兩個問題,導致了我們短暫歷史中的第二個演算法 - 快速R-CNN。現在讓我們回顧一下它的主要見解。

Fast R-CNN洞察力1:RoI(感興趣區域)池

對於CNN的前向傳遞,Girshick意識到對於每個圖像,圖像的許多建議區域總是重疊,導致我們一次又一次地運行相同的CNN計算(~2000次!)。他的洞察力很簡單 - 為什麼不在每張圖像上運行CNN一次,然後找到一種方法來分享〜2000個提案中的計算?

need-to-insert-img

在RoIPool中,創建圖像的完整前向傳遞,並從所得到的前向傳遞中提取每個感興趣區域的conv特徵。

這正是Fast R-CNN使用稱為RoIPool(感興趣區域池)的技術所做的事情。在其核心,RoIPool分享CNN的前向傳遞,以在其子區域中形成圖像。在上圖中,請注意如何通過從CNN的要素圖中選擇相應的區域來獲取每個區域的CNN要素。然後,匯集每個區域中的要素(通常使用最大池)。所以我們所需要的只是原始圖像的一次傳遞而不是~2000!

快速R-CNN洞察力2:將所有模型組合到一個網路中

need-to-insert-img

快速R-CNN將CNN,分類器和邊界框回歸器組合成一個單一網路

Fast R-CNN的第二個見解是在單個模型中聯合訓練CNN,分類器和邊界框回歸器。之前我們有不同的模型來提取圖像特徵(CNN),分類(SVM)和收緊邊界框(回歸量),而 快速R-CNN則使用單個網路來計算所有三個。

您可以在上圖中看到這是如何完成的。快速R-CNN用在CNN頂部的softmax層替換SVM分類器以輸出分類。它還添加了一個與softmax圖層平行的線性回歸圖層,以輸出邊界框坐標。這樣,所需的所有輸出都來自一個網路!以下是此整體模型的輸入和輸出:

輸入 :帶有區域提案的圖像。

輸出 :每個區域的對象分類以及更嚴格的邊界框。

2016年:更快的R-CNN - 加速地區提案

即使有了所有這些進步,快速R-CNN過程仍然存在一個瓶頸 - 區域提議者。正如我們所看到的,檢測對象位置的第一步是生成一堆潛在的邊界框或感興趣的區域進行測試。在Fast R-CNN中,這些提議是使用 選擇性搜索 創建的,這是一個相當緩慢的過程,被發現是整個過程的瓶頸。

need-to-insert-img

微軟研究院的首席研究員孫健帶領團隊領導更快的R-CNN。

在2015年中期,由Shaoqing Ren,Kaiming He,Ross Girshick和Jian Sun組成的微軟研究團隊找到了一種方法,通過他們(創造性地)命名為快速R-CNN的架構,使該區域提案步驟幾乎免費。

更快的R-CNN的見解是區域建議取決於已經通過CNN的前向傳遞(分類的第一步)計算的圖像的特徵。 那麼為什麼不為區域提案重用那些相同的CNN結果而不是運行單獨的選擇性搜索演算法呢?

need-to-insert-img

在Faster R-CNN中,單個CNN用於區域提議和分類。

實際上,這正是R-CNN團隊更快取得的成就。在上圖中,您可以看到單個CNN如何用於執行區域提議和分類。這樣, 只有一個CNN需要接受培訓 ,我們幾乎可以免費獲得地區建議!作者寫道:

我們的觀察結果是,基於區域的探測器(如Fast R-CNN)使用的卷積特徵圖也可用於生成區域提議[從而實現幾乎無成本的區域提議]。

以下是其模型的輸入和輸出:

輸入 :圖像(注意不需要區域提議)。

輸出 :圖像中對象的分類和邊界框坐標。

如何生成區域

讓我們花點時間看看R-CNN如何通過CNN功能更快地生成這些區域提案。Faster R-CNN在CNN的功能之上增加了一個完全卷積網路,創建了所謂的 區域提案網路 。

need-to-insert-img

區域提案網路在CNN的功能上滑動窗口。在每個窗口位置,網路輸出每個錨點的分數和邊界框(因此4k框坐標,其中k是錨的數量)。

區域提議網路通過在CNN特徵映射和每個窗口上傳遞滑動窗口來工作,輸出 k個 潛在的邊界框以及每個框預期有多好的分數。這些 k 盒代表什麼?

need-to-insert-img

我們知道人們的邊界框往往是矩形和垂直的。我們可以通過創建這樣的維度錨來利用這種直覺來指導我們的區域提案網路。

直覺上,我們知道圖像中的對象應該適合某些常見的寬高比和大小。例如,我們知道我們想要一些類似於人類形狀的矩形盒子。同樣,我們知道我們不會看到很多非常薄的盒子。以這種方式,我們創建 k 這樣的常見寬高比,我們稱之為 錨盒 。對於每個這樣的錨箱,我們輸出一個邊界框並在圖像中的每個位置得分。

考慮到這些錨框,我們來看看這個區域提案網路的輸入和輸出:

輸入 :CNN功能圖。

輸出 :每個錨點的邊界框。表示該邊界框中圖像成為對象的可能性的分數。

然後,我們將可能是對象的每個這樣的邊界框傳遞到Fast R-CNN,以生成分類和收緊的邊界框。

2017:Mask R-CNN - 擴展更快的R-CNN以實現像素級分割

need-to-insert-img

圖像實例分割的目標是在像素級別識別場景中不同的對象是什麼。

到目前為止,我們已經看到我們如何能夠以許多有趣的方式使用CNN功能來有效地定位帶有邊界框的圖像中的不同對象。

我們是否可以擴展這些技術以進一步找到每個對象的精確像素而不僅僅是邊界框?這個問題被稱為圖像分割,是Kaiming He和包括Girshick在內的一組研究人員在Facebook AI上使用一種名為 Mask R-CNN 的架構進行探索的。

need-to-insert-img

Facebook AI的研究員Kaiming He是Mask R-CNN的主要作者,也是Faster R-CNN的合著者。

就像Fast R-CNN和Faster R-CNN一樣,Mask R-CNN的潛在直覺也是直截了當的。鑒於Faster R-CNN在物體檢測方面的效果非常好,我們是否可以擴展它以進行像素級分割?

need-to-insert-img

在掩碼R-CNN中,在快速R-CNN的CNN特徵之上添加完全卷積網路(FCN)以生成掩碼(分段輸出)。注意這與Faster R-CNN的分類和邊界框回歸網路並行。

Mask R-CNN通過向更快的R-CNN添加分支來完成此操作,該分支輸出二進制掩碼,該Mask 表示給定像素是否是對象的一部分。與以前一樣,分支(上圖中的白色)只是基於CNN的特徵映射之上的完全卷積網路。以下是其輸入和輸出:

輸入 :CNN功能圖。

輸出 :矩陣在像素屬於對象的所有位置上為1,在其他位置為0(這稱為 二進制掩碼 )。

但Mask R-CNN的作者不得不進行一次小調整,以使這條管道按預期工作。

RoiAlign - 重新調整RoIPool更准確

need-to-insert-img

而不是RoIPool,圖像通過RoIAlign傳遞,以便RoIPool選擇的特徵圖的區域更精確地對應於原始圖像的區域。這是必需的,因為像素級分割需要比邊界框更細粒度的對齊。

當在原始的快速R-CNN架構上運行而沒有修改時,Mask R-CNN作者意識到由RoIPool選擇的特徵圖的區域與原始圖像的區域略微不對准。由於圖像分割需要像素級特異性,與邊界框不同,這自然會導致不準確。

作者能夠通過巧妙地調整RoIPool來解決這個問題,使用一種稱為RoIAlign的方法進行更精確的對齊。

need-to-insert-img

我們如何准確地將感興趣的區域從原始圖像映射到特徵圖?

想像一下,我們有一個大小為 128x128 的圖像和一個大小為 25x25 的特徵圖。讓我們想像一下,我們想要的特徵區域對應於原始圖像中左上角的 15x15 像素(見上文)。我們如何從要素圖中選擇這些像素?

我們知道原始圖像中的每個像素對應於特徵圖中的~25 / 128像素。要從原始圖像中選擇15個像素,我們只選擇15 * 25 / 128~ = 2.93 像素。

在RoIPool中,我們將它向下舍入並選擇2個像素,導致輕微的錯位。但是,在RoIAlign中, 我們避免了這種舍入。 相反,我們使用 雙線性插值 來准確了解像素2.93處的內容。這在很大程度上是允許我們避免RoIPool引起的錯位的原因。

生成這些掩模後,Mask R-CNN將它們與Faster R-CNN中的分類和邊界框組合在一起,生成如此精確的分割:

need-to-insert-img

Mask R-CNN能夠對圖像中的對象進行分段和分類。

期待

在短短3年時間里,我們已經看到研究界如何從Krizhevsky等進步。al的原始結果是R-CNN,最後一直到Mask R-CNN這樣強大的結果。孤立地看,像面具R-CNN這樣的結果看起來像天才的難以置信的飛躍,是無法接近的。然而,通過這篇文章,我希望你已經看到這些進步如何通過多年的努力和合作實現直觀,漸進的改進。R-CNN,Fast R-CNN,Faster R-CNN以及最後的Mask R-CNN提出的每個想法都不一定是量子跳躍,但它們的總和產品已經產生了非常顯著的結果,使我們更接近人類水平了解視力。

讓我特別興奮的是,R-CNN和Mask R-CNN之間的時間只有三年!通過持續的資金,關注和支持,未來計算機視覺能夠進一步提升?

4. 超詳細解讀Faster R-CNN-FPN

2021年了,竟然還有人寫關於Faster R-CNN的文章?我的原因主要有兩點:

我們先從全局上了解Faster R-CNN-FPN,然後再關注其中涉及的細節。下面是Faster R-CNN-FPN的網路框架圖(或稱為tensor流動圖)。

眾所周知,Faster R-CNN-FPN(主要是Faster R-CNN)是個兩階段的對象檢測方法,主要由兩部分網路組成,RPN和Fast R-CNN。

RPN的作用是以bouding box(後簡稱為box)的方式預測出圖片中對象可能的位置,並過濾掉圖片中絕大部分的背景區域,目標是達到盡量召回圖像中感興趣的對象,預測box盡量能夠與實際對象的box貼合,並且保證一定的預測精度(Precision)。另外,RPN並不需要指出預測的box中對象具體的類別,RPN預測的box稱為RoI(Region of Interest),由於是以box的方式輸出,所以後面我們統一將其稱為proposal box。

Fast R-CNN則是在FPN預測的proposal box基礎上進一步預測box中對象具體的類別,並對proposal box進行微調,使得最終預測的box盡量貼合目標對象。大致的做法是根據RPN預測的proposal box,從原圖backbone的feature map上通過RoIPooling或RoIAlign(Faster R-CNN-FPN使用RoIAlign)提取每個proposal box對應區域的feature map,在這些區域feature map上進一步預測box的類別和相對proposal box的偏移量(微調)。另外,RPN和Fast R-CNN共用同一個backbone網路提取圖像的feature map,大大減少了推理耗時。

從上面的介紹可以看出,RPN和Fast R-CNN的配合作用其實可以理解為一種注意力機制,先大致確定目標在視野中的位置,然後再鎖定目標仔細觀察,確定目標的類別和更加精確的位置,簡單來說就是look twice,相比單階段的look once,當然是比較耗時的,但也換來了更好的效果(雖然很多單階段方法號稱已經獲得相當或好於兩階段的效果)。

下面以Faster R-CNN-FPN發展順序的匯總介紹每個改進的核心思想。

在R-CNN中,CNN只被用來作為特徵抽取,後接SVM和線性回歸模型分別用於分類和box修正回歸。在此基礎上,Fast R-CNN直接對原輸入圖進行特徵抽取,然後在整張圖片的特徵圖上分別對每個RoI使用RoIPooling提取(後面會介紹RoIPooling的原理)特定長度的特徵向量(論文中空降尺寸為7*7),去掉SVM和線性回歸模型,在特徵向量上直接使用若干FC層進行回歸,然後分別使用兩個FC分支預測RoI相關的類別和box,從而顯著提升速度和預測效果。 整體框架圖如下:

在Fast RCNN的基礎上進一步優化,用CNN網路代替Fast R-CNN中的region proposal模塊(使用傳統Selective Search方法),從而實現了全神經網路的檢測方法,在召回和速度上都超過了傳統的Selective Search。作者將提供proposal region的網路稱為RPN(Region Proposal Network),與檢測網路Fast RCNN共享同一backbone,大大縮減了推理速度。

RPN在backbone產生的feature map(圖中的conv feature map)之上執行 的滑窗操作,每個滑窗范圍內的feature map會被映射為多個proposal box(圖中的reg layer分支)以及每個box對應是否存在對象的類別信息(圖中的cls layer分支)。由於CNN天然就是滑窗操作,所以RPN使用CNN作為窗口內特徵的提取器(對應圖中的intermediate layer,後面簡稱為「新增CNN層」),窗口大小 ,將feature map映射為較低維的feature map以節省計算量(論文中為256)。雖然只使用了 的卷積,但是在原圖上的有效的感受野還是很大的,感受野大小不等於網路的降采樣率,對於VGG網路,降采樣率為16,但是感受野為228像素。類似於Fast-RCNN,為了分別得到box和box對應的類別(此處類別只是表示有沒有目標,不識別具體類別),CNN操作之後會分為兩個子網路,它們的輸入都是新增CNN層輸出的feature map,一個子網路負責box回歸,一個負責類別回歸。由於新增CNN層產生的feature map的每個空間位置的特徵(包括通道方向,shape為 )都被用來預測映射前窗口對應位置是否存在對象(類別)和對象的box,那麼使用 的CNN進行計算正合適(等效於FC層),這便是RPN的做法。綜上所述,所有滑窗位置共享一個新增CNN層和後續的分類和box回歸分支網路。下圖是RPN在一個窗口位置上執行計算的原理示意。

由於滑窗操作是通過正方形的CNN卷積實現的,為了訓練網路適應不同長寬比和尺寸的對象,RPN引入了anchor box的概念。每個滑窗位置會預置k個anchor box,每個anchor box的位置便是滑窗的中心點,k個anchor box的長寬比和尺寸不同,作者使用了9種,分別是長寬比為 、 和 ,尺寸為 , 和 的9種不同組合。分類分支和box回歸分支會將新增CNN層輸出的feature map的每個空間位置的tensor(shape為 )映射為k個box和與之對應的類別,假設每個位置的anchor box數量為k(如前所述, ),則分類分支輸出的特徵向量為2k(兩個類別),box回歸分支輸出為4k(4為box信息,box中心點x坐標、box中心點y坐標、box寬w和box高h)。box分支預測的位置(x,y,w,h)都是相對anchor box的偏移量。從功能上來看,anchor box的作用有點類似於提供給Fast RCNN的propsal box的作用,也表示目標可能出現的位置box,但是anchor box是均勻采樣的,而proposal box是通過特徵抽取(或包含訓練)回歸得到的。由此可以看出,anchor box與預測的box是一一對應的。從後文將會了解到,通過anchor box與gt box的IoU的關系,可以確定每個預測box的正負樣本類別。通過監督的方式讓特定的box負責特定位置、特定尺寸和特定長寬比的對象,模型就學會了擬合不同尺寸和大小的對象。另外,由於預測的box是相對anchor box的偏移量,而anchor box是均勻分布在feature map上的,只有距離和尺寸與gt box接近(IoU較大)的anchor box對應的預測box才會與gt box計算損失,這大大簡化了訓練,不然會有大量的預測box與gt box計算損失,尤其是在訓練初始階段,當一切都是瞎猜的時候。

在Faster RCNN基礎上,將backbone替換為ResNet50或ResNet101,涉及部分細節的改動,我們放在本文的細節部分進行描述。

在Faster RCNN-ResNet基礎上,引入FPN(特徵金字塔網路)模塊,利用CNN網路天然的特徵金字塔特點,模擬圖像金字塔功能,使得RPN和Fast RCNN可以在多個尺度級別(scale level)的feature map上分別預測不同尺寸的對象,大大提高了Faster RCNN的檢測能力。相比圖像金字塔大大節省了推理時間。原理如下圖所示:

從上圖中可以看出,FPN並不是簡單地使用backbone的多個CNN層輸出的feature map進行box回歸和分類,而是將不同層的feature map進行了top-down和lateral connection形式的融合後使用。這樣便將CNN網路前向傳播(bottom-up)產生的深層語義低解析度特徵與淺層的淺語義高解析度的特徵進行融合,從而彌補低層特徵語義抽象不足的問題,類似增加上下文信息。其中,top-down過程只是簡單地使用最近鄰插值將低解析度的feature map上采樣到即將與之融合的下層feature map相同的尺寸(尺寸上采樣到2倍),lateral connection則是先將低層的feature map使用 的卷積縮放為即將與之融合的上層feature map相同的通道數(減少計算量),然後執行像素級相加。融合後的feature map不僅會用於預測,還會繼續沿著top-down方向向下傳播用於下層的特徵融合,直到最後一層。

mask R-CNN提出的RoI Align緩解了RoIPooling的缺陷,能夠顯著提升小目標物體的檢測能力。網上介紹RoIPooling和RoIAlign的文章很多,此處不再贅述,推薦閱讀個人覺得比較好的兩篇博客: RoIPooling 和 RoIAlign 。

此處稍微啰嗦下個人對RoIPooling的思考: 為什麼RoIPooling不使用自適應的池化操作,即根據輸入的feature map的尺寸和希望輸出的feature map尺寸,自動調整池化窗口的大小和步長以計算想要尺寸的feature map,類似於自適應池化操作,而不是將輸入的feature map劃分成均勻的小區域(bins,論文中劃分為 個bins),然後每個小區域中分別計算MaxPooling。不管計算上是否高效,至少這種做法在輸入的feature map尺寸(比如 )小於期望的輸出feature map尺寸(比如 )時會失效,因為在3*3的feature map上如果不使用padding的話是無法得到 的特徵的,而使用padding又是很低效的操作,因為要擴展局部feature map的尺寸,而使用劃分bins的方法,即使輸出的feature map尺寸遠小於要輸出的feature map尺寸,也僅僅是在同一位置采樣多次而已。

本人之前介紹YOLOv3的 文章 也介紹過anchor box的作用,再加上本文1.1.2節中的介紹應該比較全面了,不再贅述。

此處的絕大部分細節來自論文,論文中未提及的部分,主要參考了mmdetection中的 實現 。

整個模型的網路結構可以劃分為四個部分,分別為backbone、FPN、RPN head和Fast RCNN head。

1.backbone: 原圖短邊被resize到800像素,這里值得注意的是,如此resize後一個batch內的每張圖片的大小很有可能並不一致,所以還無法合並為一個輸入矩陣,普遍的做法是將batch內的每張圖片的左上角對齊,然後計算resize後batch內所有圖片的最大寬和高,最後按照最大寬或高分別對每張圖片的寬或高進行0值padding;輸出為4個不同尺寸的feature map(C2、C3、C4、C5)。

2.FPN: ResNet backbone產生的4個不同尺寸的feature map(C2、C3、C4、C5)作為輸入,輸出5個不同尺寸的feature map(P2、P3、P4、P5、P6),P6是對P5進行2倍降采樣得到,每個feature map的通道數為固定的256;使用P6的原因是為了預測更大尺寸的對象。

3.RPN:輸入為FPN產生的feature map(P2、P3、P4、P5、P6);由於RPN是在5個輸入feature map上進行獨立的預測,則每個feature map都會輸出 proposal box,因此不可能將所有的proposal box都提供給Fast R-CNN,這里的做法是對每個feature map上產生的proposal box按類別概率進行排序(每個feature map上的proposal box獨立進行),然後選擇前k個proposal box, 5個feature map一共會 產生 個proposal box,訓練時 ,推理時 。最後,將所有的 個proposal box合並後統一進行NMS(IoU threshold=0.7)去掉冗餘的box,最後選擇前m個輸出給Fast R-CNN,訓練和測試時m都取1000。

訓練時將gt box通過下面的公式轉換為相對anchor box的偏移值,與網路的預測計算loss,至於將每個gt與具體的哪個anchor box計算偏移,則需要根據2.3.1節中的正負樣本方法來確定。測試時將預測的box通過該公式中的逆運算計算出當前box相對原圖的位置和大小, , , , 指相對全圖的box中心點坐標以及寬和高, , , , 指每個anchor相對全圖的box中心點坐標以及寬和高。由此可以看出,box回歸分支直接預測的便是相對anchor的偏移值,即公式中的 、 、 和 。

以上提到的2000和1000是作為Fast R-CNN的輸入proposal box,在訓練時參與RPN loss計算的anchor boxs數量為256個,正負樣本數量為 ,正樣本不足128的用負樣本補足。這里的256是從所有feature map中的anchor box中選擇的,並非每個feature map都獨立取得256個正負樣本。這也是合理的,因為每個gt box由於尺寸的原因,幾乎不可能與所有feature map上的anchor box的IoU都大於一定的閾值(原因參考2.3.1節)。注意選擇前並未進行NMS處理,而是直接根據2.3.1節中確定正負樣本的方式確定每個預測box正負類別,然後分別在正樣本中隨機選擇128個正樣本,在負樣本中隨機選擇128個負樣本。

4.Fast R-CNN:輸入為FPN產生的前4個feature map和RPN輸出的proposal box,4個feature map為P2、P3、P4、P5,與backbone對應,不使用P6。那麼,如何確定在哪個feature map上執行每個proposal box對應的RoIAlign操作並得到 大大小的feature map呢?論文中的做法是通過下面的公式將特定尺寸的proposal box與FPN產生的4個feature map中尺寸最適合的對應起來,即讓感受野更接近對象尺寸的feature map預測該對象 ,其中224為backbone在ImageNet上預訓練的尺寸,w和h為proposal box的長和寬,k表示適合尺寸為w和h的propsal box的feature map的位置,即4個feature map為P2、P3、P4、P5的下標,k_0為proposal box大致為224*224時對應feature map位置值( ),表示proposal box大致為 時在P4上執行RoIAlign,小於 時,在P2或P3上執行,大於則在P5上。

網路都會針對每個RoI會輸出一個類別概率分布(包括背景類別)和一個相對RoI box的長度為4的box偏移向量。概率分支由softmax激活函數得到。與RPN的類似,訓練時,如2.4.2節loss計算中所述,會將gt box通過下面的公式轉換為相對proposal box(前提是該RoI是正樣本)的偏移量,然後使用loss計算公式直接與預測的相對偏移量進行loss計算;測試時,會通過下列公式的逆運算將偏移值換算回相對原圖的位置box,然後使用NMS去掉冗餘的box,最終輸出。

訓練時,通過2.3.2中的方式確定每個proposal box屬於正樣本或負樣本後,隨機選擇512個樣本,其中正負比例為1:3進行loss計算,正樣本不足的由負樣本補足。

在RPN中,由於每個feature map的每個滑窗位置上的張量( 維張量,C為feature map的通道數)會被用來預測k個box和每個box對應的類別概率,那麼具體哪個box才能參與gt box的損失計算(包括類別和box回歸損失)?這便需要在所有預測的box中確定正負樣本,因為一個anchor對應一個預測的box和類別,那麼確定預測的box是正例還是負例等價於確定anchor box的是正例還是反例。為了便於訓練,RPN中使用雙IoU閾值的方式確定正負樣本,與gt box的IoU為最大或者大於0.7的anchor box被設置為正樣本,這會導致一個gt box與多個預測box計算損失,即允許多個box預測同一對象,與gt box的IoU小於0.3的anchor box被設置為負樣本,其餘的忽略掉,即不參與loss計算。在此基礎上,如2.2節中所述,會對正負樣本進行隨機采樣,總數為256,其他不參與損失函數計算。

與gt box的IoU大於0.5的proposal box作為正樣本,注意,是將proposal box與gt box計算IoU,Fast-RCNN中的proposal box的作用與anchor box有些類似,即確定正負樣本和預測的box 都是針對它們的偏移值 ,其餘IoU在 之間的作為負樣本,低於0.1的作為難例挖掘時的啟發式樣本(mmdetection中的做法是單閾值方式,與gt box的IoU大於0.5的proposal box作為正樣本,小於的都是負樣本)。

Faster R-CNN中是以分步的方式聯合訓練RPN和Fast R-CNN,大致的過程為:

但在mmdetection中,已經將RPN和Fast R-CNN的loss進行權重加和,從而進行聯合訓練,訓練流程簡化很多,且能夠達到相同的效果。

確定了每個預測box或anchor box的正負類別後,便可以計算損失函數了,類似於Fast RCNN的做法,只有正樣本的box才會參與box損失計算,損失函數如下:

為類別損失為類別損失函數,使用交叉熵損失, 為box回歸損失,使用smooth L1損失,論文中平衡因子lambda為10。 表示第i個anchor box對應的gt 類別(背景為0,對象為1), 為gt box相對anchor box的偏移量(如果該anchor box被確定為正樣本),通過下面的公式計算得到, 即表示只有 ,即為正樣本時才會計算box的損失。

Fast R-CNN的loss類似於RPN,只有proposal box為非背景類別(正樣本)時才計算box損失, 為類別損失, 為box損失, 表示proposal box的 , 時表示背景(通過2.3.2的方式確定proposal box的類別)。 為平衡因子,作者所有實驗中 。為了防止box回歸的L2 loss放大雜訊(異常loss)從而影響訓練,作者將L2 loss修改為 loss,當box尺寸的差異較大時使用L1 loss,抑制異常值對梯度的貢獻。

其中v是通過下面的公式將gt box( , , , )轉換得到,其中,( , , , )為proposal box的在原圖中的中心點坐標和寬與高。

在Faster R-CNN和Faster R-CNN-ResNet中,由於RPN只是在單尺寸的feature map上進行滑窗,為了緩解多尺寸的問題,每個滑窗位置會設計多個尺寸的anchor,但是在Faster R-CNN-FPN中使用了FPN,則天然就具有了適應對象多尺寸的問題,因此不用再為每個滑窗設計多個尺寸的anchor。即在Faster RCNN-FPN中,為每種尺寸feature map上的滑窗只設計了單一尺寸多種長寬比的anchor,長寬比有 、 和 ,不同feature map上anchor的尺寸為: , , , 和 ,依次對應P2、P3、P4、P5和P6。

COCO上的訓練細節:RPN的weight decay為0.0001,SGD的 ,初始學習率為0.002,學習率調整使用step decay方式。

5. 經典目標檢測演算法介紹

姓名:牛曉銀;學號:20181213993;學院:計算機科學與技術

轉自:https://zhuanlan.hu.com/p/34142321

【嵌牛導讀】:目標檢測,也叫目標提取,是一種基於目標幾何和統計特徵的圖像分割。隨著計算機技術的發展和計算機視覺原理的廣泛應用,利用計算機圖像處理技術對目標進行實時跟蹤研究越來越熱門,對目標進行動態實時跟蹤定位在智能化交通系統、軍事目標檢測及醫學導航手術中手術器械定位等方面具有廣泛的應用價值。

【嵌牛鼻子】:目標檢測、檢測模型、計算機視覺

【嵌牛提問】:你知道或者用過哪些目標檢測演算法?

【嵌牛正文】:

(一)目標檢測經典工作回顧

本文結構

兩階段模型因其對圖片的兩階段處理得名,也稱為基於區域(Region-based)的方法,我們選取R-CNN系列工作作為這一類型的代表。

R-CNN: R-CNN系列的開山之作

論文鏈接:  Rich feature hierarchies for accurate object detection and semantic segmentation

本文的兩大貢獻:1)CNN可用於基於區域的定位和分割物體;2)監督訓練樣本數緊缺時,在額外的數據上預訓練的模型經過fine-tuning可以取得很好的效果。第一個貢獻影響了之後幾乎所有2-stage方法,而第二個貢獻中用分類任務(Imagenet)中訓練好的模型作為基網路,在檢測問題上fine-tuning的做法也在之後的工作中一直沿用。

傳統的計算機視覺方法常用精心設計的手工特徵(如SIFT, HOG)描述圖像,而深度學習的方法則倡導習得特徵,從圖像分類任務的經驗來看,CNN網路自動習得的特徵取得的效果已經超出了手工設計的特徵。本篇在局部區域應用卷積網路,以發揮卷積網路學習高質量特徵的能力。

R-CNN將檢測抽象為兩個過程,一是基於圖片提出若干可能包含物體的區域(即圖片的局部裁剪,被稱為Region Proposal),文中使用的是Selective Search演算法;二是在提出的這些區域上運行當時表現最好的分類網路(AlexNet),得到每個區域內物體的類別。

另外,文章中的兩個做法值得注意。

一是數據的准備。輸入CNN前,我們需要根據Ground Truth對提出的Region Proposal進行標記,這里使用的指標是IoU(Intersection over Union,交並比)。IoU計算了兩個區域之交的面積跟它們之並的比,描述了兩個區域的重合程度。

文章中特別提到,IoU閾值的選擇對結果影響顯著,這里要談兩個threshold,一個用來識別正樣本(如跟ground truth的IoU大於0.5),另一個用來標記負樣本(即背景類,如IoU小於0.1),而介於兩者之間的則為難例(Hard Negatives),若標為正類,則包含了過多的背景信息,反之又包含了要檢測物體的特徵,因而這些Proposal便被忽略掉。

另一點是位置坐標的回歸(Bounding-Box Regression),這一過程是Region Proposal向Ground Truth調整,實現時加入了log/exp變換來使損失保持在合理的量級上,可以看做一種標准化(Normalization)操作。

小結

R-CNN的想法直接明了,即將檢測任務轉化為區域上的分類任務,是深度學習方法在檢測任務上的試水。模型本身存在的問題也很多,如需要訓練三個不同的模型(proposal, classification, regression)、重復計算過多導致的性能問題等。盡管如此,這篇論文的很多做法仍然廣泛地影響著檢測任務上的深度模型革命,後續的很多工作也都是針對改進這一工作而展開,此篇可以稱得上"The First Paper"。

Fast R-CNN: 共享卷積運算

論文鏈接: Fast R-CNN

文章指出R-CNN耗時的原因是CNN是在每一個Proposal上單獨進行的,沒有共享計算,便提出將基礎網路在圖片整體上運行完畢後,再傳入R-CNN子網路,共享了大部分計算,故有Fast之名。

上圖是Fast R-CNN的架構。圖片經過feature extractor得到feature map, 同時在原圖上運行Selective Search演算法並將RoI(Region of Interset,實為坐標組,可與Region Proposal混用)映射到到feature map上,再對每個RoI進行RoI Pooling操作便得到等長的feature vector,將這些得到的feature vector進行正負樣本的整理(保持一定的正負樣本比例),分batch傳入並行的R-CNN子網路,同時進行分類和回歸,並將兩者的損失統一起來。

RoI Pooling 是對輸入R-CNN子網路的數據進行准備的關鍵操作。我們得到的區域常常有不同的大小,在映射到feature map上之後,會得到不同大小的特徵張量。RoI Pooling先將RoI等分成目標個數的網格,再在每個網格上進行max pooling,就得到等長的RoI feature vector。

文章最後的討論也有一定的借鑒意義:

multi-loss traing相比單獨訓練classification確有提升

multi-scale相比single-scale精度略有提升,但帶來的時間開銷更大。一定程度上說明CNN結構可以內在地學習尺度不變性

在更多的數據(VOC)上訓練後,精度是有進一步提升的

Softmax分類器比"one vs rest"型的SVM表現略好,引入了類間的競爭

更多的Proposal並不一定帶來精度的提升

小結

Fast R-CNN的這一結構正是檢測任務主流2-stage方法所採用的元結構的雛形。文章將Proposal, Feature Extractor, Object Classification&Localization統一在一個整體的結構中,並通過共享卷積計算提高特徵利用效率,是最有貢獻的地方。

Faster R-CNN: 兩階段模型的深度化

論文鏈接: Faster R-CNN: Towards Real Time Object Detection with Region Proposal Networks

Faster R-CNN是2-stage方法的奠基性工作,提出的RPN網路取代Selective Search演算法使得檢測任務可以由神經網路端到端地完成。粗略的講,Faster R-CNN = RPN + Fast R-CNN,跟RCNN共享卷積計算的特性使得RPN引入的計算量很小,使得Faster R-CNN可以在單個GPU上以5fps的速度運行,而在精度方面達到SOTA(State of the Art,當前最佳)。

本文的主要貢獻是提出Regional Proposal Networks,替代之前的SS演算法。RPN網路將Proposal這一任務建模為二分類(是否為物體)的問題。

第一步是在一個滑動窗口上生成不同大小和長寬比例的anchor box(如上圖右邊部分),取定IoU的閾值,按Ground Truth標定這些anchor box的正負。於是,傳入RPN網路的樣本數據被整理為anchor box(坐標)和每個anchor box是否有物體(二分類標簽)。RPN網路將每個樣本映射為一個概率值和四個坐標值,概率值反應這個anchor box有物體的概率,四個坐標值用於回歸定義物體的位置。最後將二分類和坐標回歸的損失統一起來,作為RPN網路的目標訓練。

由RPN得到Region Proposal在根據概率值篩選後經過類似的標記過程,被傳入R-CNN子網路,進行多分類和坐標回歸,同樣用多任務損失將二者的損失聯合。

小結

Faster R-CNN的成功之處在於用RPN網路完成了檢測任務的"深度化"。使用滑動窗口生成anchor box的思想也在後來的工作中越來越多地被採用(YOLO v2等)。這項工作奠定了"RPN+RCNN"的兩階段方法元結構,影響了大部分後續工作。

單階段(1-stage)檢測模型

單階段模型沒有中間的區域檢出過程,直接從圖片獲得預測結果,也被成為Region-free方法。

YOLO

論文鏈接: You Only Look Once: Unified, Real-Time Object Detection

YOLO是單階段方法的開山之作。它將檢測任務表述成一個統一的、端到端的回歸問題,並且以只處理一次圖片同時得到位置和分類而得名。

YOLO的主要優點:

快。

全局處理使得背景錯誤相對少,相比基於局部(區域)的方法, 如Fast RCNN。

泛化性能好,在藝術作品上做檢測時,YOLO表現比Fast R-CNN好。

YOLO的工作流程如下:

1.准備數據:將圖片縮放,劃分為等分的網格,每個網格按跟Ground Truth的IoU分配到所要預測的樣本。

2.卷積網路:由GoogLeNet更改而來,每個網格對每個類別預測一個條件概率值,並在網格基礎上生成B個box,每個box預測五個回歸值,四個表徵位置,第五個表徵這個box含有物體(注意不是某一類物體)的概率和位置的准確程度(由IoU表示)。測試時,分數如下計算:

等式左邊第一項由網格預測,後兩項由每個box預測,以條件概率的方式得到每個box含有不同類別物體的分數。 因而,卷積網路共輸出的預測值個數為S×S×(B×5+C),其中S為網格數,B為每個網格生成box個數,C為類別數。

3.後處理:使用NMS(Non-Maximum Suppression,非極大抑制)過濾得到最後的預測框

損失函數的設計

損失函數被分為三部分:坐標誤差、物體誤差、類別誤差。為了平衡類別不均衡和大小物體等帶來的影響,損失函數中添加了權重並將長寬取根號。

小結

YOLO提出了單階段的新思路,相比兩階段方法,其速度優勢明顯,實時的特性令人印象深刻。但YOLO本身也存在一些問題,如劃分網格較為粗糙,每個網格生成的box個數等限制了對小尺度物體和相近物體的檢測。

SSD: Single Shot Multibox Detector

論文鏈接: SSD: Single Shot Multibox Detector

SSD相比YOLO有以下突出的特點:

多尺度的feature map:基於VGG的不同卷積段,輸出feature map到回歸器中。這一點試圖提升小物體的檢測精度。

更多的anchor box,每個網格點生成不同大小和長寬比例的box,並將類別預測概率基於box預測(YOLO是在網格上),得到的輸出值個數為(C+4)×k×m×n,其中C為類別數,k為box個數,m×n為feature map的大小。

小結

SSD是單階段模型早期的集大成者,達到跟接近兩階段模型精度的同時,擁有比兩階段模型快一個數量級的速度。後續的單階段模型工作大多基於SSD改進展開。

檢測模型基本特點

最後,我們對檢測模型的基本特徵做一個簡單的歸納。

檢測模型整體上由基礎網路(Backbone Network)和檢測頭部(Detection Head)構成。前者作為特徵提取器,給出圖像不同大小、不同抽象層次的表示;後者則依據這些表示和監督信息學習類別和位置關聯。檢測頭部負責的類別預測和位置回歸兩個任務常常是並行進行的,構成多任務的損失進行聯合訓練。

相比單階段,兩階段檢測模型通常含有一個串列的頭部結構,即完成前背景分類和回歸後,把中間結果作為RCNN頭部的輸入再進行一次多分類和位置回歸。這種設計帶來了一些優點:

對檢測任務的解構,先進行前背景的分類,再進行物體的分類,這種解構使得監督信息在不同階段對網路參數的學習進行指導

RPN網路為RCNN網路提供良好的先驗,並有機會整理樣本的比例,減輕RCNN網路的學習負擔

這種設計的缺點也很明顯:中間結果常常帶來空間開銷,而串列的方式也使得推斷速度無法跟單階段相比;級聯的位置回歸則會導致RCNN部分的重復計算(如兩個RoI有重疊)。

另一方面,單階段模型只有一次類別預測和位置回歸,卷積運算的共享程度更高,擁有更快的速度和更小的內存佔用。讀者將會在接下來的文章中看到,兩種類型的模型也在互相吸收彼此的優點,這也使得兩者的界限更為模糊。

6. Sparse R-CNN: 稀疏的目標檢測,武裝Fast RCNN | 新文分析

論文: Sparse R-CNN: End-to-End Object Detection with Learnable Proposals

  論文認為,目前的目標檢測演算法可以按預設框的多少分為兩種:

  上述兩種方法都會預測大量的結果,需要進行NMS後處理,而在訓練的時候會存在many-to-one的問題,並且anchor的設置對性能的影響很大。
  於是,很多研究開始探討稀疏(sparse)檢測,比如近期的DETR演算法。該演算法不需要預設anchor,並且預測的結果可直接輸出,不需要後處理。但論文認為DETR並不是真正的稀疏檢測,因為DETR在各位置提取特徵時,需要與全圖的上下文進行交互,而真正的稀疏檢測應該滿足sparse boxes和sparse features,即較少的初始框設定以及框之間不需要過多的特徵互動。
  為此,論文提出了Sparse R-CNN,如圖1c所示,僅需設定少量anchor即可進行檢測,而且能夠進行set prediction,免去NMS等後處理,其核心主要包含以下幾點:

  Sparse R-CNN的推理流程如圖3所示,輸入圖片、可學習的proposal boxes以及可學習的proposal features,根據proposal boxes提取對應的RoIAlign特徵,dynamic head將proposal features轉換為卷積核參數,對RoIAlign特徵進一步提取特徵,再進行後續的分類和回歸。整體的思想和Fast RCNN很像,將selective search替換為proposal boxes,再增加其它更強的模塊。

  論文採用FPN-ResNet作為主幹網路,輸出多層特徵,每層特徵的維度都是256。採用更復雜的主幹網路可以獲得更好的性能,但論文與Faster R-CNN對齊,採用標準的實現。

  Sparse R-CNN的核心是採用數目固定的小批量可學習proposal boxes( )作為region proposal,而非RPN。每個box為4-d參數,在0~1范圍內,值為歸一化的中心點坐標、寬度和高度。這些參數在訓練過程中通過反向傳播進行更新,包含了訓練集目標位置的統計信息,可用於推理時的初步目標位置猜測。

  盡管4維的proposal box能夠直觀地表示目標的定位,但缺少了目標的信息,比如目標的姿態和形狀,所以論文引入proposal feature( )進行補充。proposal features是高維的可學習向量,與proposal boxes一一對應,用於豐富目標的RoIAlign特徵。

  Dynamic instance interactive head的結構如圖4所示,每個proposal box都有一個專屬的預測head。給定 個proposal boxes和 個proposal features,先通過RoIAlign提取每個box的 維特徵,Dynamic instance interactive head將其對應的 維proposal feature轉換為卷積參數,使用這個卷積參數對RoIAlign特徵進行提取,得到目標的 維特徵,最後經過簡單的3層感知機進行分類與回歸。
  Dynamic instance interactive head也可以使用類似Cascade R-CNN那樣的級聯模式進一步的提升性能,將輸出的新回歸框和 維特徵作為下一次迭代的proposal box和proposal feature即可。

  Sparse R-CNN的訓練採用set prediction的形式,將固定數量的預測結果與GT之間進行二分圖最優的匹配,然後計算損失值,完整的損失函數為:

  各模塊對比實驗。

  性能與收斂性。

  在COCO上進行對比。

  Sparse R-CNN貫徹了稀疏的思想,只提供少量初始框,可進行Set prediction,顛覆了當前密集預測的檢測思路,整體框架十分簡潔,跟Fast RCNN有點像,十分值得大家閱讀。



7. [圖像演算法]-Faster RCNN詳解

paper: Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
Tensorflow-faster r-cnn github: Tensorflow Faster RCNN for Object Detection

faster rcnn是何凱明等大神在2015年提出目標檢測演算法,該演算法在2015年的ILSVRV和COCO競賽中獲得多項第一。該演算法在fast rcnn基礎上提出了RPN候選框生成演算法,使得目標檢測速度大大提高。

(1)image input;
(2)利用selective search 演算法在圖像中從上到下提取2000個左右的Region Proposal;
(3)將每個Region Proposal縮放(warp)成227*227的大小並輸入到CNN,將CNN的fc7層的輸出作為特徵;
(4)將每個Region Proposal提取的CNN特徵輸入到SVM進行分類;
(5)對於SVM分好類的Region Proposal做邊框回歸,用Bounding box回歸值校正原來的建議窗口,生成預測窗口坐標.
缺陷:
(1) 訓練分為多個階段,步驟繁瑣:微調網路+訓練SVM+訓練邊框回歸器;
(2) 訓練耗時,佔用磁碟空間大;5000張圖像產生幾百G的特徵文件;
(3) 速度慢:使用GPU,VGG16模型處理一張圖像需要47s;
(4) 測試速度慢:每個候選區域需要運行整個前向CNN計算;
(5) SVM和回歸是事後操作,在SVM和回歸過程中CNN特徵沒有被學習更新.

(1)image input;
(2)利用selective search 演算法在圖像中從上到下提取2000個左右的建議窗口(Region Proposal);
(3)將整張圖片輸入CNN,進行特徵提取;
(4)把建議窗口映射到CNN的最後一層卷積feature map上;
(5)通過RoI pooling層使每個建議窗口生成固定尺寸的feature map;
(6)利用Softmax Loss(探測分類概率) 和Smooth L1 Loss(探測邊框回歸)對分類概率和邊框回歸(Bounding box regression)聯合訓練.

相比R-CNN,主要兩處不同:
(1)最後一層卷積層後加了一個ROI pooling layer;
(2)損失函數使用了多任務損失函數(multi-task loss),將邊框回歸直接加入到CNN網路中訓練
改進:
(1) 測試時速度慢:R-CNN把一張圖像分解成大量的建議框,每個建議框拉伸形成的圖像都會單獨通過CNN提取特徵.實際上這些建議框之間大量重疊,特徵值之間完全可以共享,造成了運算能力的浪費.
FAST-RCNN將整張圖像歸一化後直接送入CNN,在最後的卷積層輸出的feature map上,加入建議框信息,使得在此之前的CNN運算得以共享.
(2) 訓練時速度慢:R-CNN在訓練時,是在採用SVM分類之前,把通過CNN提取的特徵存儲在硬碟上.這種方法造成了訓練性能低下,因為在硬碟上大量的讀寫數據會造成訓練速度緩慢.
FAST-RCNN在訓練時,只需要將一張圖像送入網路,每張圖像一次性地提取CNN特徵和建議區域,訓練數據在GPU內存里直接進Loss層,這樣候選區域的前幾層特徵不需要再重復計算且不再需要把大量數據存儲在硬碟上.
(3) 訓練所需空間大:R-CNN中獨立的SVM分類器和回歸器需要大量特徵作為訓練樣本,需要大量的硬碟空間.FAST-RCNN把類別判斷和位置回歸統一用深度網路實現,不再需要額外存儲.
(4) 由於ROI pooling的提出,不需要再input進行Corp和wrap操作,避免像素的損失,巧妙解決了尺度縮放的問題.

(1)輸入測試圖像;
(2)將整張圖片輸入CNN,進行特徵提取;
(3)用RPN先生成一堆Anchor box,對其進行裁剪過濾後通過softmax判斷anchors屬於前景(foreground)或者後景(background),即是物體or不是物體,所以這是一個二分類;同時,另一分支bounding box regression修正anchor box,形成較精確的proposal(註:這里的較精確是相對於後面全連接層的再一次box regression而言)
(4)把建議窗口映射到CNN的最後一層卷積feature map上;
(5)通過RoI pooling層使每個RoI生成固定尺寸的feature map;
(6)利用Softmax Loss(探測分類概率) 和Smooth L1 Loss(探測邊框回歸)對分類概率和邊框回歸(Bounding box regression)聯合訓練.

相比FASTER-RCNN,主要兩處不同:
(1)使用RPN(Region Proposal Network)代替原來的Selective Search方法產生建議窗口;
(2)產生建議窗口的CNN和目標檢測的CNN共享

改進:
(1) 如何高效快速產生建議框?
FASTER-RCNN創造性地採用卷積網路自行產生建議框,並且和目標檢測網路共享卷積網路,使得建議框數目從原有的約2000個減少為300個,且建議框的質量也有本質的提高.

從上面的三張圖可以看出,Faster R CNN由下面幾部分組成:
1.數據集,image input
2.卷積層CNN等基礎網路,提取特徵得到feature map
3-1.RPN層,再在經過卷積層提取到的feature map上用一個3x3的slide window,去遍歷整個feature map,在遍歷過程中每個window中心按rate,scale(1:2,1:1,2:1)生成9個anchors,然後再利用全連接對每個anchors做二分類(是前景還是背景)和初步bbox regression,最後輸出比較精確的300個ROIs。
3-2.把經過卷積層feature map用ROI pooling固定全連接層的輸入維度。
4.然後把經過RPN輸出的rois映射到ROIpooling的feature map上進行bbox回歸和分類。

SPP-Net是出自論文《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》
由於一般的網路結構中都伴隨全連接層,全連接層的參數就和輸入圖像大小有關,因為它要把輸入的所有像素點連接起來,需要指定輸入層神經元個數和輸出層神經元個數,所以需要規定輸入的feature的大小。而SPP-NET正好解決了這個問題。

如果原圖輸入是224x224,對於conv5出來後的輸出,是13x13x256的,可以理解成有256個這樣的filter,每個filter對應一張13x13的activation map.如果像上圖那樣將activation map pooling成4x4 2x2 1x1三張子圖,做max pooling後,出來的特徵就是固定長度的(16+4+1)x256那麼多的維度了.如果原圖的輸入不是224x224,出來的特徵依然是(16+4+1)x256;直覺地說,可以理解成將原來固定大小為(3x3)窗口的pool5改成了自適應窗口大小,窗口的大小和activation map成比例,保證了經過pooling後出來的feature的長度是一致的.

總結而言,當網路輸入的是一張任意大小的圖片,這個時候我們可以一直進行卷積、池化,直到網路的倒數幾層的時候,也就是我們即將與全連接層連接的時候,就要使用金字塔池化,使得任意大小的特徵圖都能夠轉換成固定大小的特徵向量,這就是空間金字塔池化的意義(多尺度特徵提取出固定大小的特徵向量)。

ROI pooling layer實際上是SPP-NET的一個精簡版,SPP-NET對每個proposal使用了不同大小的金字塔映射,而ROI pooling layer只需要下采樣到一個7x7的特徵圖.對於VGG16網路conv5_3有512個特徵圖,這樣所有region proposal對應了一個7*7*512維度的特徵向量作為全連接層的輸入.

為什麼要pooling成7×7的尺度?是為了能夠共享權重。Faster RCNN除了用到VGG前幾層的卷積之外,最後的全連接層也可以繼續利用。當所有的RoIs都被pooling成(512\×7\×7)的feature map後,將它reshape 成一個一維的向量,就可以利用VGG16預訓練的權重,初始化前兩層全連接.

那麼經過何種變換才能從圖11中的窗口P變為窗口呢?比較簡單的思路就是:

注意:只有當Proposal和Ground Truth比較接近時(線性問題),我們才能將其作為訓練樣本訓練我們的線性回歸模型,否則會導致訓練的回歸模型不work(當Proposal跟GT離得較遠,就是復雜的非線性問題了,此時用線性回歸建模顯然不合理).這個也是G-CNN: an Iterative Grid Based Object Detector多次迭代實現目標准確定位的關鍵. 線性回歸就是給定輸入的特徵向量X,學習一組參數W,使得經過線性回歸後的值跟真實值Y(Ground Truth)非常接近.即.那麼Bounding-box中我們的輸入以及輸出分別是什麼呢?

如上圖中標識:
① rpn_cls:60*40*512-d ⊕ 1*1*512*18 > 60*40*92 逐像素對其9個Anchor box進行二分類
② rpn_bbox:60*40*512-d ⊕ 1*1*512*36>60*40*9*4 逐像素得到其9個Anchor box四個坐標信息

逐像素對Anchors分類標記
① 去除掉超過1000*600這原圖的邊界的anchor box
② 如果anchor box與ground truth的IoU值最大,標記為正樣本,label=1
③ 如果anchor box與ground truth的IoU>0.7,標記為正樣本,label=1
④ 如果anchor box與ground truth的IoU<0.3,標記為負樣本,label=0
剩下的既不是正樣本也不是負樣本,不用於最終訓練,label=-1

逐像素Bbox回歸糾正
除了對anchor box進行標記外,另一件事情就是計算anchor box與ground truth之間的偏移量
令:ground truth:標定的框也對應一個中心點位置坐標x ,y 和寬高w ,h
anchor box: 中心點位置坐標x_a,y_a和寬高w_a,h_a
所以,偏移量:
△x=(x -x_a)/w_a △y=(y -y_a)/h_a
△w=log(w /w_a) △h=log(h /h_a)
通過ground truth box與預測的anchor box之間的差異來進行學習,從而是RPN網路中的權重能夠學習到預測box的能力

接著進一步對Anchors進行越界剔除和使用nms非最大值抑制,剔除掉重疊的框;比如,設定IoU為0.7的閾值,即僅保留覆蓋率不超過0.7的局部最大分數的box(粗篩)。最後留下大約2000個anchor,然後再取前N個box(比如300個);這樣,進入到下一層ROI Pooling時region proposal大約只有300個。

參考文獻:

8. 目標檢測演算法(R-CNN,fast R-CNN,faster R-CNN,yolo,SSD,yoloV2,yoloV3)

深度學習目前已經應用到了各個領域,應用場景大體分為三類:物體識別,目標檢測,自然語言處理。  目標檢測可以理解為是物體識別和物體定位的綜合 ,不僅僅要識別出物體屬於哪個分類,更重要的是得到物體在圖片中的具體位置。

2014年R-CNN演算法被提出,基本奠定了two-stage方式在目標檢測領域的應用。它的演算法結構如下圖

演算法步驟如下:

R-CNN較傳統的目標檢測演算法獲得了50%的性能提升,在使用VGG-16模型作為物體識別模型情況下,在voc2007數據集上可以取得66%的准確率,已經算還不錯的一個成績了。其最大的問題是速度很慢,內存佔用量很大,主要原因有兩個

針對R-CNN的部分問題,2015年微軟提出了Fast R-CNN演算法,它主要優化了兩個問題。

R-CNN和fast R-CNN均存在一個問題,那就是 由選擇性搜索來生成候選框,這個演算法很慢 。而且R-CNN中生成的2000個左右的候選框全部需要經過一次卷積神經網路,也就是需要經過2000次左右的CNN網路,這個是十分耗時的(fast R-CNN已經做了改進,只需要對整圖經過一次CNN網路)。這也是導致這兩個演算法檢測速度較慢的最主要原因。

faster R-CNN 針對這個問題, 提出了RPN網路來進行候選框的獲取,從而擺脫了選擇性搜索演算法,也只需要一次卷積層操作,從而大大提高了識別速度 。這個演算法十分復雜,我們會詳細分析。它的基本結構如下圖

主要分為四個步驟:

使用VGG-16卷積模型的網路結構:

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

MxN的圖片,經過卷積層後,變為了(M/16) x (N/16)的feature map了。

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

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

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

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

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

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

我們要學習的就是dx dy dw dh這四個變換。由於是線性變換,我們可以用線性回歸來建模。設定loss和優化方法後,就可以利用深度學習進行訓練,並得到模型了。對於空間位置loss,我們一般採用均方差演算法,而不是交叉熵(交叉熵使用在分類預測中)。優化方法可以採用自適應梯度下降演算法Adam。

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

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

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

3,剔除非常小的anchors。

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

5,選取前post_nms_topN個結果作為最終選區proposal進行輸出,比如300個。

經過這一步之後,物體定位應該就基本結束了,剩下的就是物體識別了。

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

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

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

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

針對於two-stage目標檢測演算法普遍存在的運算速度慢的缺點, yolo創造性的提出了one-stage。也就是將物體分類和物體定位在一個步驟中完成。 yolo直接在輸出層回歸bounding box的位置和bounding box所屬類別,從而實現one-stage。通過這種方式, yolo可實現45幀每秒的運算速度,完全能滿足實時性要求 (達到24幀每秒,人眼就認為是連續的)。它的網路結構如下圖:

主要分為三個部分:卷積層,目標檢測層,NMS篩選層。

採用Google inceptionV1網路,對應到上圖中的第一個階段,共20層。這一層主要是進行特徵提取,從而提高模型泛化能力。但作者對inceptionV1進行了改造,他沒有使用inception mole結構,而是用一個1x1的卷積,並聯一個3x3的卷積來替代。(可以認為只使用了inception mole中的一個分支,應該是為了簡化網路結構)

先經過4個卷積層和2個全連接層,最後生成7x7x30的輸出。先經過4個卷積層的目的是為了提高模型泛化能力。yolo將一副448x448的原圖分割成了7x7個網格,每個網格要預測兩個bounding box的坐標(x,y,w,h)和box內包含物體的置信度confidence,以及物體屬於20類別中每一類的概率(yolo的訓練數據為voc2012,它是一個20分類的數據集)。所以一個網格對應的參數為(4x2+2+20) = 30。如下圖

其中前一項表示有無人工標記的物體落入了網格內,如果有則為1,否則為0。第二項代表bounding box和真實標記的box之間的重合度。它等於兩個box面積交集,除以面積並集。值越大則box越接近真實位置。

分類信息: yolo的目標訓練集為voc2012,它是一個20分類的目標檢測數據集 。常用目標檢測數據集如下表:

| Name | # Images (trainval) | # Classes | Last updated |

| --------------- | ------------------- | --------- | ------------ |

| ImageNet | 450k | 200 | 2015 |

| COCO | 120K | 90 | 2014 |

| Pascal VOC | 12k | 20 | 2012 |

| Oxford-IIIT Pet | 7K | 37 | 2012 |

| KITTI Vision | 7K | 3 | |

每個網格還需要預測它屬於20分類中每一個類別的概率。分類信息是針對每個網格的,而不是bounding box。故只需要20個,而不是40個。而confidence則是針對bounding box的,它只表示box內是否有物體,而不需要預測物體是20分類中的哪一個,故只需要2個參數。雖然分類信息和confidence都是概率,但表達含義完全不同。

篩選層是為了在多個結果中(多個bounding box)篩選出最合適的幾個,這個方法和faster R-CNN 中基本相同。都是先過濾掉score低於閾值的box,對剩下的box進行NMS非極大值抑制,去除掉重疊度比較高的box(NMS具體演算法可以回顧上面faster R-CNN小節)。這樣就得到了最終的最合適的幾個box和他們的類別。

yolo的損失函數包含三部分,位置誤差,confidence誤差,分類誤差。具體公式如下:

誤差均採用了均方差演算法,其實我認為,位置誤差應該採用均方差演算法,而分類誤差應該採用交叉熵。由於物體位置只有4個參數,而類別有20個參數,他們的累加和不同。如果賦予相同的權重,顯然不合理。故yolo中位置誤差權重為5,類別誤差權重為1。由於我們不是特別關心不包含物體的bounding box,故賦予不包含物體的box的置信度confidence誤差的權重為0.5,包含物體的權重則為1。

Faster R-CNN准確率mAP較高,漏檢率recall較低,但速度較慢。而yolo則相反,速度快,但准確率和漏檢率不盡人意。SSD綜合了他們的優缺點,對輸入300x300的圖像,在voc2007數據集上test,能夠達到58 幀每秒( Titan X 的 GPU ),72.1%的mAP。

SSD網路結構如下圖:

和yolo一樣,也分為三部分:卷積層,目標檢測層和NMS篩選層

SSD論文採用了VGG16的基礎網路,其實這也是幾乎所有目標檢測神經網路的慣用方法。先用一個CNN網路來提取特徵,然後再進行後續的目標定位和目標分類識別。

這一層由5個卷積層和一個平均池化層組成。去掉了最後的全連接層。SSD認為目標檢測中的物體,只與周圍信息相關,它的感受野不是全局的,故沒必要也不應該做全連接。SSD的特點如下。

每一個卷積層,都會輸出不同大小感受野的feature map。在這些不同尺度的feature map上,進行目標位置和類別的訓練和預測,從而達到 多尺度檢測 的目的,可以克服yolo對於寬高比不常見的物體,識別准確率較低的問題。而yolo中,只在最後一個卷積層上做目標位置和類別的訓練和預測。這是SSD相對於yolo能提高准確率的一個關鍵所在。

如上所示,在每個卷積層上都會進行目標檢測和分類,最後由NMS進行篩選,輸出最終的結果。多尺度feature map上做目標檢測,就相當於多了很多寬高比例的bounding box,可以大大提高泛化能力。

和faster R-CNN相似,SSD也提出了anchor的概念。卷積輸出的feature map,每個點對應為原圖的一個區域的中心點。以這個點為中心,構造出6個寬高比例不同,大小不同的anchor(SSD中稱為default box)。每個anchor對應4個位置參數(x,y,w,h)和21個類別概率(voc訓練集為20分類問題,在加上anchor是否為背景,共21分類)。如下圖所示:

另外,在訓練階段,SSD將正負樣本比例定位1:3。訓練集給定了輸入圖像以及每個物體的真實區域(ground true box),將default box和真實box最接近的選為正樣本。然後在剩下的default box中選擇任意一個與真實box IOU大於0.5的,作為正樣本。而其他的則作為負樣本。由於絕大部分的box為負樣本,會導致正負失衡,故根據每個box類別概率排序,使正負比例保持在1:3。SSD認為這個策略提高了4%的准確率

另外,SSD採用了數據增強。生成與目標物體真實box間IOU為0.1 0.3 0.5 0.7 0.9的patch,隨機選取這些patch參與訓練,並對他們進行隨機水平翻轉等操作。SSD認為這個策略提高了8.8%的准確率。

和yolo的篩選層基本一致,同樣先過濾掉類別概率低於閾值的default box,再採用NMS非極大值抑制,篩掉重疊度較高的。只不過SSD綜合了各個不同feature map上的目標檢測輸出的default box。

SSD基本已經可以滿足我們手機端上實時物體檢測需求了,TensorFlow在android上的目標檢測官方模型ssd_mobilenet_v1_android_export.pb,就是通過SSD演算法實現的。它的基礎卷積網路採用的是mobileNet,適合在終端上部署和運行。

針對yolo准確率不高,容易漏檢,對長寬比不常見物體效果差等問題,結合SSD的特點,提出了yoloV2。它主要還是採用了yolo的網路結構,在其基礎上做了一些優化和改進,如下

網路採用DarkNet-19:19層,裡麵包含了大量3x3卷積,同時借鑒inceptionV1,加入1x1卷積核全局平均池化層。結構如下

yolo和yoloV2隻能識別20類物體,為了優化這個問題,提出了yolo9000,可以識別9000類物體。它在yoloV2基礎上,進行了imageNet和coco的聯合訓練。這種方式充分利用imageNet可以識別1000類物體和coco可以進行目標位置檢測的優點。當使用imageNet訓練時,只更新物體分類相關的參數。而使用coco時,則更新全部所有參數。

YOLOv3可以說出來直接吊打一切圖像檢測演算法。比同期的DSSD(反卷積SSD), FPN(feature pyramid networks)准確率更高或相仿,速度是其1/3.。

YOLOv3的改動主要有如下幾點:

不過如果要求更精準的預測邊框,採用COCO AP做評估標準的話,YOLO3在精確率上的表現就弱了一些。如下圖所示。

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

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

目標檢測領域的深度學習演算法,需要進行目標定位和物體識別,演算法相對來說還是很復雜的。當前各種新演算法也是層不出窮,但模型之間有很強的延續性,大部分模型演算法都是借鑒了前人的思想,站在巨人的肩膀上。我們需要知道經典模型的特點,這些tricks是為了解決什麼問題,以及為什麼解決了這些問題。這樣才能舉一反三,萬變不離其宗。綜合下來,目標檢測領域主要的難點如下:

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

從YOLOv1到v3的進化之路

SSD-Tensorflow超詳細解析【一】:載入模型對圖片進行測試  https://blog.csdn.net/k87974/article/details/80606407

YOLO    https://pjreddie.com/darknet/yolo/      https://github.com/pjreddie/darknet   

C#項目參考:https://github.com/AlturosDestinations/Alturos.Yolo

項目實踐貼個圖。

9. Faster R-CNN:使用RPN實時目標檢測

論文: Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

目標檢測網路大多依靠 區域生成 (region proposal)演算法來假設目標的位置。 R-CNN 是採用 Selective Search 演算法來提取(propose)可能的 RoIs(regions of interest) 區域,然後對每個提取區域採用標准 CNN 進行分類。選擇性搜索(Selective Search )方法就是在目標對象周圍設定2000個形狀大小位置不一的候選區域,目標物體在候選區域的可能性還是比較大的。然後對這些區域卷積,找到目標物體,雖然大多數區域都是無用的。與尋找幾乎個區域比起來,這種方法要高效的多。

Fast R-CNN ,不在原始圖像生成備選區域,而是先整張圖片通過卷積網路得到特徵圖,然後在特徵圖上使用備選區域演算法得到感興趣的區域在特徵圖的映射,之後使用 Rol Pool將所有區域變成同樣尺寸,大大減少了這些目標檢測網路的運行時間,但是區域生成的計算成為整個檢測網路的瓶頸。

Faster R-CNN 引入了一個 區域生成網路(Region Proposal Network,RPN) ,該網路與檢測網路共享輸入圖像的卷積特徵,從而使接近零時間成本的區域生成成為可能。 RPN是一個全卷積網路,可以同時在每個位置預測目標邊界和目標分數。RPN經過端到端的訓練,可以生成高質量的區域候選框,然後提供給Fast R-CNN用於檢測。

Faster R-CNN 由兩個模塊組成:第一個模塊是區域生成的深度全卷積網路,第二個模塊是使用備選區域的Fast R-CNN檢測器。整個系統是一個單個的,統一的目標檢測網路。使用最近流行的「注意力」機制的神經網路術語,RPN模塊告訴Fast R-CNN模塊在哪裡尋找目標。

針對一張圖片,需要獲得的輸出有:

Faster R-CNN 第一步是採用基於分類任務(如ImageNet)的 CNN 模型作為特徵提取器。輸入圖片表示為 H × W × D 的形式,經過預訓練 CNN 模型的處理,得到卷積特徵圖(conv feature map)。

Faster R-CNN 最早是採用在 ImageNet 訓練的 ZF 和 VGG ,其後出現了很多其它權重不同的網路.。如 MobileNet 是一種小型效率高的網路結構,僅有 3.3M 參數;而ResNet-152 的參數量達到了 60M;新網路結構,如 DenseNet 在提高了結果的同時,降低了參數數量。

以 VGG16 為例:

VGG16 圖片分類時,輸入為 224×224×3 的張量(即,一張 224×224 像素的 RGB 圖片)。網路結構最後採用 FC 層(而不是 Conv 層)得到固定長度的向量,以進行圖片分類.。對最後一個卷積層的輸出拉伸為1維的向量,然後送入 FC 層。官方實現中是採用的卷積層 conv5/conv5_1 的輸出。

在深度上,卷積特徵圖對圖片的所有信息進行了編碼,同時保持相對於原始圖片所編碼 「things」 的位置。例如,如果在圖片的左上角存在一個紅色正方形,而且卷積層有激活響應,那麼該紅色正方形的信息被卷積層編碼後,仍在卷積特徵圖的左上角。因此利用特徵圖檢測目標所在的位置是可行的。

ResNet 結構逐漸取代 VGG 作為基礎網路,用於提取特徵。ResNet 相對於 VGG 的明顯優勢是,網路更大,因此具有更強的學習能力.。這對於分類任務是重要的,在目標檢測中也應該如此。另外,ResNet 採用殘差連接(resial connection) 和 BN (batch normalization) 使得深度模型的訓練比較容易。

然後,RPN(Region Propose Network) 對提取的卷積特徵圖進行處理,尋找可能包含 目標的 預定義數量的區域(regions,邊界框) 。為了生成候選區域,在最後的共享卷積層輸出的卷積特徵圖上做 3x3 卷積,卷積核共有512個(VGG),後面是ReLU,這樣每個 3x3 區域會得到一個512維的特徵向量。然後這個特徵向量被輸入到兩個全連接層——一個邊界框回歸層(reg)和一個邊界框分類層(cls)。

下面解釋 k, 2k, 4k 的含義。

基於深度學習的目標檢測中,可能最難的問題就是生成長度不定(variable-length)的邊界框列表(bounding-boxes),邊界框是具有不同尺寸(sizes)和長寬比(aspect ratios )的矩形。在構建深度神經網路時,最後的網路輸出一般是固定尺寸的張量輸出(採用RNN的除外)。例如,在圖片分類中,網路輸出是 (C, ) 的張量,C是類別標簽數,張量的每個位置的標量值表示圖片是類別的概率值。

在 RPN 中,通過採用 anchors(錨) 來解決邊界框列表長度不定的問題,即在原始圖像中統一放置固定大小的參考邊界框。上面說到RPN對特徵圖做3x3的卷積,假設每一次卷積需要預測 k 個候選區域,因此,reg層具有 4k 個輸出,編碼 k 個邊界框的坐標,cls層輸出 2k 個分數,估計每個區域是目標或是背景的概率。這 k 個區域就是 被 k 個參考邊界框初始化, k 個參考框就是 k 個錨點,作為第一次預測目標位置的參考 boxes。錨點的中心位於卷積核滑動窗口的中心。默認情況下每個滑動位置使用3個不同尺度(128 2 , 256 2 , 512 2 )3個不同長寬比(1:2, 1:1, 2:1)的錨點,k=9。對於大小為W×H(通常約為2400)的卷積特徵圖,總共有 W×H×k 個錨點。對於RPN的最後兩個全連接層,參數的個數為 512×(4+2)×k.

不同於直接檢測目標的位置,這里將問題轉化為兩部分。對每一個 anchor 而言:

有一種簡單的方法來預測目標的邊界框,即學習相對於參考邊界框的偏移量。假設參考 box:( ),待預測量:( ),一般都是很小的值,以調整參考 box 更好的擬合所需要的。

雖然 anchors 是基於卷積特徵圖定義的,但最終的 anchos 是相對於原始圖片的.

由於只有卷積層和 pooling 層,特徵圖的維度是與原始圖片的尺寸成比例關系的. 即,數學地表述,如果圖片尺寸 w×h,特徵圖的尺寸則是w/r×h/r. 其中,r 是下采樣率(subsampling ratio). 如果在卷積特徵圖空間位置定義 anchor,則最終的圖片會是由 r 像素劃分的 anchors 集。在 VGG 中, r=16。

RPN 利用所有的參考邊界框(anchors),輸出一系列目標的良好的 proposals。針對每個 anchor,都有兩個不同的輸出:

RPN是全卷積網路。

對於分類層,每個 anchor 輸出兩個預測值:anchor 是背景(background,非object)的 score 和 anchor 是前景(foreground,object) 的 score.

對於回歸層,也可以叫邊界框調整層,每個 anchor 輸出 4 個預測值:
(Δxcenter,Δycenter,Δwidth,Δheight),用於 anchors 來得到最終的 proposals。根據最終的 proposal 坐標和其對應的 objectness score,即可得到良好的 objects proposals.

RPN 有兩種類型的預測值輸出:二值分類和邊界框回歸調整。

為了訓練RPN,我們為每個錨點分配一個二值類別標簽(是目標或不是目標)。我們給兩種錨點分配一個正標簽:(i)具有與實際邊界框的重疊最高交並比(IoU)的錨點,或者(ii)具有與實際邊界框的重疊超過0.7 IoU的錨點。注意,單個真實邊界框可以為多個錨點分配正標簽。通常第二個條件足以確定正樣本;但我們仍然採用第一個條件,因為在一些極少數情況下,第二個條件可能找不到正樣本。對於所有的真實邊界框,如果一個錨點的IoU比率低於0.3,我們給非正面的錨點分配一個負標簽。既不正面也不負面的錨點不會有助於訓練目標函數。

然後,隨機采樣 anchors 來生成batchsize=256 的 mini-batch,盡可能的保持 foreground 和 background anchors 的比例平衡。

RPN 對 mini-batch 內的所有 anchors 採用二分類交叉熵來計算分類 loss。然後,只對 mini-batch 內標記為 foreground 的 anchros 計算回歸 loss。為了計算回歸的目標targets,根據 foreground anchor 和其最接近的 groundtruth object,計算將 anchor 變換到 object groundtruth 的偏移值 Δ。

Faster R-CNN沒有採用簡單的 L1 或 L2 loss 用於回歸誤差,而是採用 Smooth L1 loss. Smooth L1 和 L1 基本相同,但是,當 L1 誤差值非常小時,表示為一個確定值即認為是接近正確的,loss 就會以更快的速度消失.

由於 Anchors 一般是有重疊,因此,相同目標的候選區域也存在重疊。

為了解決重疊 proposals 問題,採用 NMS 演算法處理,丟棄與一個 score 更高的 proposal 間 IoU 大於預設閾值的 proposals.

雖然 NMS 看起來比較簡單,但 IoU 閾值的預設需要謹慎處理. 如果 IoU 值太小,可能丟失 objetcs 的一些 proposals;如果 IoU 值過大,可能會導致 objects 出現很多 proposals。IoU 典型值為 0.7。

NMS 處理後,根據 sore 對topN 個 proposals 排序. 在 Faster R-CNN 論文中 N=2000,其值也可以小一點,如 50,仍然能的高好的結果.

當獲得了可能的相關目標和其在原始圖像中的對應位置之後,問題就更加直接了,採用 CNN 提取的特徵和包含相關目標的邊界框,採用 RoI Pooling 處理,並提取相關目標的特徵,得到一個新的向量。

RPN 處理後,可以得到一堆沒有分類得分的目標 proposals。待處理問題為,如何利用這些邊界框並分類。

一種最簡單的方法是,對每個 porposal,裁剪,並送入pre-trained base 網路,提取特徵;然後,將提取特徵來訓練分類器. 但這就需要對所有的 2000 個 proposals 進行計算,效率低,速度慢。Faster R-CNN通過重用卷積特徵圖來加快計算效率,即採用 RoI(region of interest) Pooling 對每個 proposal 提取固定尺寸的特徵圖。然後 R-CNN 對固定尺寸的特徵圖分類。

目標檢測中,包括 Faster R-CNN,常用一種更簡單的方法,即:採用每個 proposal 來對卷積特徵圖裁剪crop,然後利用插值演算法(一般為雙線性插值 bilinear)將每個 crop resize 到固定尺寸14×14×ConvDepth. 裁剪後,利用 2×2 kernel 的 Max Pooling 得到每個 proposal 的最終7×7×ConvDepth 特徵圖.

之所以選擇該精確形狀,與其在下面的模塊(R-CNN)中的應用有關。

R-CNN利用RoI Pooling提取的特徵進行分類,採用全連接層來輸出每個可能的 目標類別的分類得分,是Faster R-CNN框架中的最後一個步驟。

R-CNN 有兩個不同的輸出:

R-CNN 對每個 proposal 的特徵圖,拉平後採用 ReLU 和兩個大小為 4096 維的全連接層進行處理。然後,對每個不同目標採用兩個不同的全連接層處理:一個全連接層有 N+1 個神經單元,其中 N 是類別 class 的總數,包括 background class;一個全連接層有 4N 個神經單元,是回歸預測輸出,得到 N 個可能的類別分別預測 Δcenterx,Δcentery,Δwidth,Δheight。

R-CNN 的目標基本上是與 RPN 目標的計算是一致的,但需要考慮不同的可能的 object 類別 classes.

根據 proposals 和 ground-truth boxes,計算其 IoU。與任何一個 ground-truth box 的 IoU 大於 0.5 的 proposals 被設為正確的 boxes。IoU 在 0.1 到 0.5 之間時設為 background。這里忽略沒有任何交叉的 proposals。這是因為,在此階段,假設已經獲得良好的 proposals。當然,所有的這些超參數都是可以用於調整以更好的擬合 objects。

邊界框回歸的目標計算的是 proposal 與其對應的 ground-truth間的偏移量,只對基於 IoU 閾值設定類別後的 proposals 進行計算。隨機採用一個平衡化的 mini-batch=64,其中,25% 的 foreground proposals(具有類別class) 和 75% 的background proposals.

類似於 RPNs 的 losses,對於選定的 proposals,分類 loss 採用 multiclass entropy loss;對於 25% 的 foreground proposals 採用 SmoothL1 loss 計算其與 groundtruth box 的匹配。

由於 R-CNN全連接網路對每個類別僅輸出一個預測值,當計算邊框回歸loss 時需謹慎,只需考慮正確的類別。

類似於 RPN,R-CNN 最終輸出一堆帶有類別分類的objects,在返回結果前,再進一步進行處理。

為了調整邊界框,需要考慮概率最大的類別的 proposals. 忽略概率最大值為 background class 的proposals.

當得到最終的 objects 時,並忽略被預測為 background 的結果,採用 class-based NMS. 主要是通過對 objects 根據類別class 分組,然後根據概率排序,並對每個獨立的分組採用 NMS 處理,最後再放在一起.

最終得到的 objects 列表,仍可繼續通過設定概率閾值的方式,來限制每個類的 objects 數量.

Faster R-CNN在論文中是採用分步方法,對每個模塊分別訓練再合並訓練的權重. 自此,End-to-end 的聯合訓練被發現能夠得到更好的結果.

當將完整的模型合並後,得到 4 個不同的 losses,2 個用於 RPN,2 個用於 R-CNN。4 種不同的 losses 以加權和的形式組織. 可以根據需要對分類 loss 和回歸 loss 設置權重,或者對 R-CNN 和 RPNs 設置不同權重.

採用 SGD 訓練,momentum=0.9. 學習率初始值為 0.001,50K 次迭代後衰減為 0.0001. 這是一組常用參數設置。

10. 目標檢測 YOLO系列——YOLO v1

YOLO v1:You Only Look Once: Unified, Real-Time Object Detection
YOLO v2:YOLO9000:Better,Faster,Stronger
YOLO v3:YOLOv3: An Incremental Improvement

近幾年來,目標檢測演算法取得了很大的突破。比較流行的演算法可以分為兩類,一類是基於Region Proposal的R-CNN系演算法(R-CNN,Fast R-CNN, Faster R-CNN),它們是two-stage的,需要先使用啟發式方法(selective search)或者CNN網路(RPN)產生Region Proposal,然後再在Region Proposal上做分類與回歸。而另一類是Yolo,SSD這類one-stage演算法,其僅僅使用一個CNN網路直接預測不同目標的類別與位置。第一類方法是准確度高一些,但是速度慢,但是第二類演算法是速度快,但是准確性要低一些。這里我們談的是Yolo-v1版本演算法,其性能是差於後來的SSD演算法的,但是Yolo後來也繼續進行改進,產生了Yolo9000、YOLO v3演算法。

傳統方法常採用滑動窗口法,滑動窗口的目標檢測演算法思路非常簡單,它將檢測問題轉化為了圖像分類問題。其基本原理就是採用不同大小和比例(寬高比)的窗口在整張圖片上以一定的步長進行滑動,然後對這些窗口對應的區域做圖像分類,這樣就可以實現對整張圖片的檢測了,如 DPM 就是採用這種思路。但是這個方法有致命的缺點,就是你並不知道要檢測的目標大小是什麼規模,所以你要設置不同大小和比例的窗口去滑動,而且還要選取合適的步長。但是這樣會產生很多的子區域,並且都要經過分類器去做預測,這需要很大的計算量,所以你的分類器不能太復雜,因為要保證速度。解決思路之一就是減少要分類的子區域,這就是R-CNN的一個改進策略,其採用了 selective search 方法來找到最有可能包含目標的子區域(Region Proposal),其實可以看成採用啟發式方法過濾掉很多子區域,這會提升效率。

如果你使用的是CNN分類器,那麼滑動窗口是非常耗時的。但是結合卷積運算的特點,我們可以使用CNN實現更高效的滑動窗口方法。這里要介紹的是一種全卷積的方法,簡單來說就是網路中用卷積層代替了全連接層,如圖所示。輸入圖片大小是16x16,經過一系列卷積操作,提取了2x2的特徵圖,但是這個2x2的圖上每個元素都是和原圖是一一對應的,如圖上藍色的格子對應藍色的區域,這不就是相當於在原圖上做大小為14x14的窗口滑動,且步長為2,共產生4個字區域。最終輸出的通道數為4,可以看成4個類別的預測概率值,這樣一次CNN計算就可以實現窗口滑動的所有子區域的分類預測。這其實是overfeat演算法的思路。之所可以CNN可以實現這樣的效果是因為卷積操作的特性,就是圖片的空間位置信息的不變性,盡管卷積過程中圖片大小減少,但是位置對應關系還是保存的。這個思路也被R-CNN借鑒,從而誕生了Fast R-cNN演算法。

上面盡管可以減少滑動窗口的計算量,但是只是針對一個固定大小與步長的窗口,這是遠遠不夠的。Yolo演算法很好的解決了這個問題,它不再是窗口滑動了,而是直接將原始圖片分割成互不重合的小方塊,然後通過卷積最後生產這樣大小的特徵圖,基於上面的分析,可以認為特徵圖的每個元素也是對應原始圖片的一個小方塊,然後用每個元素來可以預測那些中心點在該小方格內的目標,這就是Yolo演算法的樸素思想。

整體來看,Yolo演算法採用一個單獨的CNN模型實現end-to-end的目標檢測,整個系統如圖所示:首先將輸入圖片resize到448x448,然後送入CNN網路,最後處理網路預測結果得到檢測的目標。相比R-CNN演算法,其是一個統一的框架,其速度更快,而且Yolo的訓練過程也是end-to-end的。

具體來說,Yolo的CNN網路將輸入的圖片分割成 網格,然後每個單元格負責去檢測那些中心點落在該格子內的目標,如圖所示,可以看到狗這個目標的中心落在左下角一個單元格內,那麼該單元格負責預測這個狗。每個單元格會預測B個邊界框(bounding box)以及邊界框的 置信度 (confidence score)。所謂置信度其實包含兩個方面,一是這個邊界框含有目標的可能性大小,二是這個邊界框的准確度。前者記為 ,當該邊界框是背景時(即不包含目標),此時 。而當該邊界框包含目標時, 。邊界框的准確度可以用預測框與實際框(ground truth)的 IOU (intersection over union,交並比)來表徵,記為 IOU 。因此置信度可以定義為 。

很多人可能將Yolo的置信度看成邊界框是否含有目標的概率,但是其實它是兩個因子的乘積,預測框的准確度也反映在裡面。邊界框的大小與位置可以用4個值來表徵:(x,y,h,w),其中(x,y)是邊界框的中心坐標,而w和h是邊界框的寬與高。還有一點要注意,中心坐標的預測值(x,y)是相對於每個單元格左上角坐標點的偏移值,並且單位是相對於單元格大小的,單元格的坐標定義如圖所示。而邊界框的w和h預測值是相對於整個圖片的寬與高的比例,這樣理論上4個元素的大小應該在[0,1]范圍。這樣,每個邊界框的預測值實際上包含5個元素:(x,y,w,h,c),其中前4個表徵邊界框的大小與位置,而最後一個值是置信度。

值得注意的是,不管一個單元格預測多少個邊界框,其只預測一組類別概率值,這是Yolo演算法的一個缺點,在後來的改進版本中,Yolo9000是把類別概率預測值與邊界框是綁定在一起的。同時,我們可以計算出各個邊界框類別置信度(class-specificconfidence scores):

邊界框類別置信度表徵的是該邊界框中目標屬於各個類別的可能性大小以及邊界框匹配目標的好壞。後面會說,一般會根據類別置信度來過濾網路的預測框。

總結一下,每個單元格需要預測 個值。如果將輸入圖片劃分為 網格,那麼最終預測值為 大小的張量。整個模型的預測值結構如下圖所示。對於PASCALVOC數據,其共有20個類別,如果使用S=7,B=2,那麼最終的預測結果就是 大小的張量。在下面的網路結構中我們會詳細講述每個單元格的預測值的分布位置。

Yolo採用卷積網路來提取特徵,然後使用全連接層來得到預測值。網路結構參考GooLeNet模型,包含24個卷積層和2個全連接層,如圖所示。對於卷積層,主要使用1x1卷積來做channle rection,然後緊跟3x3卷積。對於卷積層和全連接層,採用Leaky ReLU激活函數:max(x,0)。但是最後一層卻採用線性激活函數。除了上面這個結構,文章還提出了一個輕量級版本Fast Yolo,其僅使用9個卷積層,並且卷積層中使用更少的卷積核。

可以看到網路的最後輸出為 大小的張量。這和前面的討論是一致的。這個張量所代表的具體含義如圖所示。對於每一個單元格,前20個元素是類別概率值,然後2個元素是邊界框置信度,兩者相乘可以得到類別置信度,最後8個元素是邊界框的(x,y,w,h)。大家可能會感到奇怪,對於邊界框為什麼把置信度c和(x,y,w,h)都分開排列,而不是按照(x,y,w,h,c)這樣排列,其實純粹是為了計算方便,因為實際上這30個元素都是對應一個單元格,其排列是可以任意的。但是分離排布,可以方便地提取每一個部分。這里來解釋一下,首先網路的預測值是一個二維張量P,其shape為 。

採用切片,那麼 就是類別概率部分; 是置信度部分; 是邊界框的預測結果。這樣,提取每個部分是非常方便的,這會方面後面的訓練及預測時的計算。

在訓練之前,先在ImageNet上進行了預訓練,其預訓練的分類模型採用圖中前20個卷積層,然後添加一個average-pool層和全連接層。預訓練之後,在預訓練得到的20層卷積層之上加上隨機初始化的4個卷積層和2個全連接層。由於檢測任務一般需要更高清的圖片,所以將網路的輸入從224x224增加到了448x448。整個網路的流程如下圖所示:

損失函數計算如下:

其中第一項是邊界框中心坐標的誤差項, 指的是第i個單元格存在目標,且該單元格中的第j個邊界框負責預測該目標。第二項是邊界框的高與寬的誤差項。第三項是包含目標的邊界框的置信度誤差項。第四項是不包含目標的邊界框的置信度誤差項。而最後一項是包含目標的單元格的分類誤差項, 指的是第i個單元格存在目標。

在說明Yolo演算法的預測過程之前,這里先介紹一下非極大值抑制演算法(non maximum suppression, NMS),這個演算法不單單是針對Yolo演算法的,而是所有的檢測演算法中都會用到。NMS演算法主要解決的是一個目標被多次檢測的問題,如圖中人臉檢測,可以看到人臉被多次檢測,但是其實我們希望最後僅僅輸出其中一個最好的預測框,比如對於美女,只想要紅色那個檢測結果。那麼可以採用NMS演算法來實現這樣的效果:首先從所有的檢測框中找到置信度最大的那個框,然後挨個計算其與剩餘框的IOU,如果其值大於一定閾值(重合度過高),那麼就將該框剔除;然後對剩餘的檢測框重復上述過程,直到處理完所有的檢測框。

下面就來分析Yolo的預測過程,這里我們不考慮batch,認為只是預測一張輸入圖片。根據前面的分析,最終的網路輸出是 ,但是我們可以將其分割成三個部分:類別概率部分為 ,置信度部分為 ,而邊界框部分為 (對於這部分不要忘記根據原始圖片計算出其真實值)。然後將前兩項相乘可以得到 類別置信度值為 ,這里總共預測了 邊界框。

所有的准備數據已經得到了,那麼先說第一種策略來得到檢測框的結果。首先,對於每個預測框根據類別置信度選取置信度最大的那個類別作為其預測標簽,經過這層處理我們得到各個預測框的預測類別及對應的置信度值,其大小都是[7,7,2]。一般情況下,會設置置信度閾值,就是將置信度小於該閾值的box過濾掉,所以經過這層處理,剩餘的是置信度比較高的預測框。最後再對這些預測框使用NMS演算法,最後留下來的就是檢測結果。一個值得注意的點是NMS是對所有預測框一視同仁,還是區分每個類別,分別使用NMS。Ng在deeplearning.ai中講應該區分每個類別分別使用NMS,但是看了很多實現,其實還是同等對待所有的框,可能是不同類別的目標出現在相同位置這種概率很低吧。

上面的預測方法應該非常簡單明了,但是對於Yolo演算法,其卻採用了另外一個不同的處理思路(至少從C源碼看是這樣的),其區別就是先使用NMS,然後再確定各個box的類別。其基本過程如圖所示。對於98個boxes,首先將小於置信度閾值的值歸0,然後分類別地對置信度值採用NMS,這里NMS處理結果不是剔除,而是將其置信度值歸為0。最後才是確定各個box的類別,當其置信度值不為0時才做出檢測結果輸出。這個策略不是很直接,但是貌似Yolo源碼就是這樣做的。Yolo論文裡面說NMS演算法對Yolo的性能是影響很大的,所以可能這種策略對Yolo更好。

總結一下Yolo的優缺點。首先是優點,Yolo採用一個CNN網路來實現檢測,是單管道策略,其訓練與預測都是end-to-end,所以Yolo演算法比較簡潔且速度快。第二點由於Yolo是對整張圖片做卷積,所以其在檢測目標有更大的視野,它不容易對背景誤判。另外,Yolo的泛化能力強,在做遷移時,模型魯棒性高。

Yolo的缺點,首先Yolo各個單元格僅僅預測兩個邊界框,而且屬於一個類別。對於小物體,Yolo的表現會不如人意。這方面的改進可以看SSD,其採用多尺度單元格。也可以看Faster R-CNN,其採用了anchor boxes。Yolo對於在物體的寬高比方面泛化率低,就是無法定位不尋常比例的物體。當然Yolo的定位不準確也是很大的問題。

參考鏈接
YOLO演算法的原理與實現
https://cloud.tencent.com/developer/article/1058057

閱讀全文

與cnn的坐標校正演算法相關的資料

熱點內容
雞雞加長叫什麼電影 瀏覽:387
愛情電影網址 瀏覽:726
激情戲愛情電影 瀏覽:51
哪裡可以免費在線看輕小說 瀏覽:61
李采譚演的韓國論理 瀏覽:962
男男攻是軍人 瀏覽:617
今天實時票房 瀏覽:634
葉倩桐天地之間有聲mp3 瀏覽:143
風月片成人 瀏覽:523
女孩學樂高編程機器人 瀏覽:236
求網站 瀏覽:159
穿越平行世界多妻制 瀏覽:109
鐵雨3免費完整版視頻 瀏覽:499
墜入》中,主角小女孩為什麼摔傷了頭 瀏覽:207
交換的一天女模特 瀏覽:336
牛客網編程題答案 瀏覽:60
童玲主演的古裝電影 瀏覽:303
法國電影小男孩和白狗 瀏覽:771
大尺度吻戲推薦電影 瀏覽:97
最新巨獸電影推薦 瀏覽:925