1. 程式人生 > >收藏 | 目標檢測網路學習總結(RCNN --> YOLO V3),

收藏 | 目標檢測網路學習總結(RCNN --> YOLO V3),

來源:知乎 -方宇   編輯 :專知

之前總結了一下卷積網路在分類方面的一些網路演變,但是自己做的是語義SLAM,所以對於目標檢測和語義分割甚至例項分割演算法都要有所瞭解,畢竟以後要拿來用,不瞭解那根本沒法用。這個也是結合深度學習大講壇的課程和我自己的總結,個人覺得這個課程還是比較不錯的,把整個演算法脈絡給我們講清楚了,只要自己去梳理,也就能夠比較快速的瞭解。自從2012年深度學習在ImageNet上面大放異彩之後,大家關注到了深度學習在計算機視覺領域的巨大潛力。首先來對比一下傳統的目標檢測演算法和基於深度學習的目標檢測演算法之間的不同點:

640?wx_fmt=jpeg

深度學習用於目標檢測的演算法從思路上來看,可以分為兩大類,一類是two stage的方法,也就是把整個分為兩部分,生成候選框和識別框內物體;另一類是one stage的方法,把整個流程統一在一起,直接給出檢測結果,主要包含SSD,YOLO系列。首先介紹兩階段的檢測演算法,其實這條路線基本就是R-CNN SPP Net Fast R-CNN faster RCNN R-FCN FPN,然後集大成者Mask RCNN。

預備知識

先講一下目標檢測裡面都會用到的一些基本知識IOU,非極大值抑制。

IOU其實就是交併比,具體定義如下:

640?wx_fmt=jpeg

計算框A和框B的重合率:

640?wx_fmt=jpeg

這個是用來判斷定位的準確度的。

非極大值抑制

所謂非極大值抑制,說白了就是取最大值,這個過程是一個迭代-遍歷-消除的過程。第一步,對所有的框根據置信度進行排序,從低到高放到一個列表裡面,從列表中取出當前置信度最高的,作為目標,把還在列表內的框與目標框進行比較,如果重合度大於閾值,就將該框從列表內刪去,遍歷整個列表。然後再取出當前置信度最高的,重複上述操作,知道這個列表最終變空。

Two stage

1.RCNN

RCNN是把深度學習用到目標檢測領域的先驅,開創了一個時代!先了解一下這個方法的整體思路:

640?wx_fmt=jpeg

首先用Selective Search的方法,獲得一些可能的候選框(這些框可能包含有需要檢測的物體),隨後將這些產生的框送到CNN裡面進行特徵的提取,最後利用支援向量機進行分類。

候選框生成(Selective Search演算法)

下面來了解一下候選框的搜尋過程,這個演算法借鑑了層次聚類的思想,把這種思想用到了可能區域的合併中來。這個演算法是基於2004年Felzenszwalb在論文《Efficient Graph-Based Image Segmentation 》上的一個改進,那麼先來介紹一下這一篇論文。

這篇論文提出的是一種基於貪心選擇的影象分割演算法,論文中把影象中的每個畫素表示圖上的一個節點,每一條連線節點的無向邊都具有一個權重(weights),以衡量其連線的兩個節點之間的不相似度,這篇論文的創新點在於該演算法能夠根據相鄰區域在特徵值上變化速度的大小動態調整分割閾值。這個特徵值就是類間距離和類內距離,如果類間距離大於類內距離就認為是兩個區域。

定義類間距離為對應區域的最小生成樹(因為把影象看做一個連線圖,所以每個區域可以用最小生成樹來表示)中權重最大的邊的權重值,類間距離定義為兩個區域內相鄰點的最小權重邊,如果兩個區域沒有相鄰邊則取無窮大。但是這樣其實還是有問題,比如一個類中只有一個點的時候,它的類內距離為0,這樣就沒法搞了(每個點都變成了一類),所以作者又引入了一個閾值函式,用來表示兩個區域的區域的類間距離至少要比類內距離大多少才能認為是兩個區域。用公式可以表達如下:

640?wx_fmt=jpeg

其中Dif表示類間距離,Mint的表示式如下:

640?wx_fmt=jpeg

這裡的τ就是用來控制最短距離的,一般取為C的負相關函式,k為一個常數。

640?wx_fmt=jpeg

演算法實現分為以下步驟:

1.首先對所有的邊640?wx_fmt=png進行非遞減排序。

2.把每個節點都作為一個區域,記為S(0)。

3. 按照以下規則有S(q-1)生成640?wx_fmt=png,也就是第q條邊連線640?wx_fmt=png640?wx_fmt=png兩個節點,如果在S(q-1)中640?wx_fmt=png640?wx_fmt=png是分別屬於兩個區域並且第q條邊的權重小於兩個區域的類內距離,則合併兩個區域。否則令S(q) = S(q-1)。

4.對q=1…m重複步驟3,最終獲得需要的區域分割。論文在後面基於這個思想實現了兩個具體的演算法,一個是直接基於畫素的,另一個是把每個畫素對映到特徵空間,再使用該演算法,後者效果會好一些。

接下來介紹Selective Search演算法,該演算法利用上面的圖分割演算法獲得的分割區域結果,再一次根據一些搜尋策略(相似度)做了一個聚類。也是和上面的思路一致,首先根據獲得的區域,算出每個區域和其他區域的相似度,不相鄰的和自身與自身的相似度都設定為0,得到一個N*N的矩陣,然後將相似度最大的合併,再次計算相似度矩陣(這裡是增量更新,只需要計算新生成的區域和其他區域的相似度就可以了),這樣合併一次較少一個區域,對於N個區域需要執行N-1次合併,最終得到一個區域。

對於相似度的度量,作者主要選取了顏色和區域兩大塊,顏色作者比較了8中模型,最終選擇了HSV,區域主要考量大小、紋理和吻合度(相交包含關係)這三個因素。簡單介紹一下這四個是怎麼計算的:

顏色相似度計算

顏色相似度計算以影象直方圖的形式來進行的,每個通道分成25個bin(這是他們做了是呀發現效果不錯),這樣3個通道一共75個bin,這裡需要注意的是,要對每個直方圖進行歸一化處理,以便於我們後面計算分數,分數計算如下:

640?wx_fmt=jpeg

對更新之後的區域,它的計算顏色分佈直方圖可以根據下式進行計算:

640?wx_fmt=jpeg

紋理相似度計算:

這裡使用的是一種類似於SIFT的演算法來描述空間的紋理特性,這裡使用的是描述子,利用SIFT識別材料特性參考這篇論文《Exploring features in a bayesian framework for material recognition》。這裡取了8個方向,方差為1的高斯濾波器(也就是計算加權)對每個通道進行了濾波,然後將得到的結果分到10個bin當中,如果是個3通道的影象,那麼就一共有3*8*10=240個bin,然後對這些bin做歸一化處理,計算方法如下:

640?wx_fmt=jpeg

合併後的更新方式也和顏色的更新方式一樣。

大小相似度的計算:

這個其實就是鼓勵小的區域進行合併,也就是把周邊的小區域都合併了:

640?wx_fmt=jpeg

這裡的size(im)表示整張圖的畫素總數。

吻合相似度計算:

這個就是用來填空白的,也就是說如果兩個區域的面積之和與包含他們最小面積相差越小,分數也就越高。

640?wx_fmt=jpeg

這裡的640?wx_fmt=png用來表示包含兩個區域的最小區域。

最後考慮以上這些因素,得到一個相似度的分數計算:

640?wx_fmt=jpeg

中這裡的640?wx_fmt=png取值只要在[0,1]就可以,這裡作者強調的是多元化的策略,而不是一個優化,所以這裡作者並沒有進一步的討論。

這樣根據這種相似度的策略,我們就可以獲得一系列的候選框了。(之前也看RCNN,基本就沒去管這個候選框的產生,原來這裡面還這麼複雜!!!!)

這裡雖然產生了候選框,但是候選框的大小不一致,對於卷積網路來說,必須輸入尺寸一致,所以這裡需要對生成的候選框做預處理。

作者在這裡提到了兩大類三種處理辦法,第一類是各向異性縮放,其實也就是直接resize到目標尺寸。第二類是各項同性縮放,這裡有兩種辦法,先擴充然後再裁剪或者是先裁剪再擴充,經過試驗發現第一類直接縮放到目標尺寸效果最好。然後作者還發現如何對獲得的框進行選取也有一些講究,直接取出來的效果不是padding一下效果好,經過試驗發現了padding=16 的效果最好。

CNN提取特徵

提取特徵的架構選擇的是AlexNet,AlexNet的具體介紹可以參考我之前的一篇文章,裡面有介紹。通過五個卷積層和兩個全連線層來對每張圖片提取4096維的特徵,作者這裡使用了在ILSVRC2012資料集上訓練好的分類器模型引數來初始化作者的CNN模型引數,然後在PASCAL VOC訓練集上進行微調。 作者最後根據每張圖片獲得的4096維向量,用支援向量機對影象進行了分類,這樣出來的可能會出現框重疊的情況,通過非極大值抑制就可以解決這個問題了。

SVM分類

在微調之後,再送到SVM裡面進行分類,在SVM分類裡面,我們需要注意一個問題,SVM是適合於小樣本訓練資料的,所以作者在這裡根據實驗發現把IOU值低於0.7的都當做負樣本來處理,這樣效果會比直接用softmax的效果更好(這裡是經過實驗測出來的,作者也只是給了一些推測,所以神經網路這東西,有時候真的是玄學)。

SVM是一個二分類的問題,如何把它做成多分類問題呢?這裡作者是通過給,21類物體,每一類物體都訓練一個分類器,然後把這些分類器構成一個矩陣的4096*21的矩陣,然後與CNN提取的特徵相乘即可(比如每張圖片提取2000個可能的框,那麼一張圖片訓練下來,到最後一層就是2000*4096),這樣就能獲得分類結果。

預測框迴歸

獲得了分類結果之後,我們還需要對預測框進行迴歸。這裡需要去學習一個迴歸對映,對於所有兩個框之間的不一致,其實我們都可以通過平移和尺度縮放去變換到一起,於是作者就定義了四個函式,分別表示兩個方向的平移和兩個方向的縮放。

640?wx_fmt=jpeg

現在我們就是要去學這個變換引數,這裡需要注意的是:只有預測框和真實框兩者重疊程度較大的時候(IOU>0.6)才能認為這個是成立的,因為這其實是一種線性變換,要是距離太遠,肯定就不能當做一個線性問題來處理。

這個學習的輸入是P,輸出的是平移變換和尺度縮放的四個值,而不是真實的預測邊框。這四個值時通過pool5層的特徵給學出來的,這個學習可以表示為:

640?wx_fmt=jpeg

對於訓練樣本,它給出的值可以通過下式求出來:

640?wx_fmt=jpeg

這樣根據樣本給的尺度變換和預測的尺度變換,損失函式設定如下:

640?wx_fmt=jpeg
640?wx_fmt=jpeg

這裡肯定有很多小夥伴會有疑問,為什麼這裡要寫成指數的形式,x,y座標為什麼要除以寬和高?這裡我的理解這裡使用的是相對尺度,因為遠近觀測不同,那麼他們的中心距離邊界的偏移肯定是不同的,那直接做一個除法,其實就能夠把這種絕對尺度變成了相對尺度。寫成指數形式是因為限制必須要大於0,所以就用了指數。最後這個正則化引數經過試驗,選擇了1000.至此,整個RCNN的東西基本就講完了。

2.SPP Net

這篇論文打開了一個新的思路,我個人認為RCNN其實就是一個組裝,把各種方法組裝到了一起。SPPNet提出了共用特徵卷積圖,這樣一張圖片只用卷一次,速度肯定比你卷2000次要快得多。其次SPPnet引入空間金字塔池化,有效的解決了不同尺度的圖片在全連線層輸出不一致的問題。SPPnet其實就是解決了這兩個問題,步驟還是和RCNN一樣的,先採取一些演算法生成候選框,這裡只對一張圖片卷積一次獲得特徵圖,然後把這些候選框的座標對映到特徵圖上面,最後分類和迴歸。下面仔細介紹一下這個過程:

候選框生成

候選框生成演算法作者既用了Selective Search演算法去與RCNN做對比,發現速度會比RCNN快,精度高。同時作者這裡也使用了一個微軟在2014年ECCV提出的EdgeBoxes演算法,速度會更快。這個方法的主要思路在於利用邊緣資訊確定框內的輪廓數和與邊緣重疊的輪廓數。這個演算法的思路步驟可以有下圖給出

640?wx_fmt=jpeg

第一行是原圖,第二行是經過結構化邊緣提取演算法處理之後得到的邊緣,第三行是經過Edge group處理之後的邊緣,第四行是獲得的正確框,第五行是一些錯誤的框。接下來就j講一下獲得第三行以及第四行的操作。

Edge group顧名思義就是一個邊緣組,作者在每個點上通過不斷尋找8連通點直到邊緣與邊緣之間的角度差值大於90度,以這種方式對邊緣處理之後便獲得了n個Edge group。作者獲得了不同的Edge group之後,會對所有的組與組之間進行相似度評價,它以每個組的平均位置(中心點)作為評價依據,評價函式如下:

640?wx_fmt=jpeg

在這其中640?wx_fmt=png是兩組的平均方向,θ_ij是平均位置x_i,x_j上的夾角,γ是一個超引數,作者在文中選擇的是2。如果兩個組之間的距離超過了兩個畫素,直接將相似度設定為0,同時為了提高計算效率,相似度小於0.05的也直接設定為0.

現在給定了每一個邊緣組以及各個邊緣組之間的相似度,我們先假定已知邊框,就可以計算邊對框的貢獻,也就是權值,把權值為1的組算作該框內部,權值為0的就作為外部處理。對於所有的組計算權值公式如下

640?wx_fmt=jpeg

這裡T是一個序列,它表示從邊框重疊區域的一個邊緣組到邊框內的一個邊緣組的序列(這裡面每個序列之間的相似度都要大於0),如果一個邊緣組不存在於重疊區域連通的路徑,則權值為1,因為其實這裡會有很多0,所以計算效率是比較快的。獲得了每個組的權值,我們就可以計算一個邊框的得分,計算公式如下:

640?wx_fmt=jpeg

這裡的640?wx_fmt=png表示一個組內的所有點的數目,640?wx_fmt=png分別表示框的寬和高,k是一個超引數,這裡取的是1.5,用來抵消一些偏差較大的邊框具有更多邊緣的情況。在實際計算中可以通過對影象積分來加速計算,具體的可以看論文以及程式碼。

最後,我們都知道對於一個邊框而言,邊框內部的組應該不如邊框邊緣的組重要,所以對於邊框內部的組,其實就是把這邊框內部的給減去,具體計算如下:

640?wx_fmt=jpeg

這裡減掉的是以框為中心點,長寬各為整體的1/2的小框。在後面發現以這個作為分數,效果會更好一點。

那麼如何獲得這個重疊區域呢?首先分別對水平邊界和垂直邊界建立兩個矩陣,每個矩陣當中只有邊緣組才儲存索引值,比如沿著每一行先建立一個列表,這裡面儲存的是兩個邊緣組之間的轉變,如果存在連線,就儲存下值,否則記為0,這樣這個矩陣裡面只有有邊緣的地方才會有值。由於絕大部分位置都不屬於邊緣,所以這個資料結構會很方便查詢,所以很快就能夠得到一些重疊的區域(具體的建議看看程式碼)。建立好了這種儲存結構之後,作者就根據上述的得分情況用貪心演算法搜尋得到一些可能存在的框。這就是edge boxes演算法的大體思路。

卷積層提取特徵

這是SPPnet的改進之處了,原來RCNN是對每一個候選框都進行卷積,提特徵,SPPnet通過一次卷積的方式避免了重複計算問題。要一次卷積的話,就需要解決點與點之間的匹配,也就是說原影象的座標經過對映之後到特徵圖上的座標。這個其實是很容易想到的,對於卷積網路而言,只有stride才會改變網路的尺寸,所以對於左上角和右下角的座標計算的方法如下:

640?wx_fmt=jpeg

這裡的s是所有stride的乘積。

這樣一幅圖片經過卷積之後,對應的特徵位置就能夠找到,但是由於各個框的大小不一致,而神經網路則是要求輸入的大小要相同,為了解決這個問題RCNN通過裁剪縮放的辦法來解決這個問題,但是這樣會帶來精度的損失,你看,好好一幅圖,左右兩邊明顯看著就不一樣。於是作者就提出了空間池化層來改善這個問題。

640?wx_fmt=jpeg

作者通過分析,之前通過卷積好之後,把每個區域取出來再送到全連線層裡面去訓練,只要保證輸入到全連線層的數目保證相同,那麼久沒什麼問題了,於是作者對RCNN進行了改進,流程如下:

640?wx_fmt=jpeg

上面的步驟是RCNN的,下面是作者提出來的空間池化層。這個空間池化層其實思想也分簡單,把每一個邊框,分成3個層次去池化,也就是說將圖片劃分為4*4的小格,每個小格取一個數,2*2的小格每個小格進行池化和對整張影象進行全域性池化,然後在合併起來,這樣得到的輸出就是固定的,具體見下圖

640?wx_fmt=jpeg

空間池化層實際就是一種自適應的層,這樣無論你的輸入是什麼尺寸,輸出都是固定的。SPPNet改變了卷積的順序,提出了自適應的池化層,避免了預測框大小不一致所帶來的問題。從這個結構設計上來看,整體也非常巧妙,不像RCNN那樣蠻力求解。

SVM分類+邊框迴歸

這裡也是延續了RCNN的思路,沒有什麼特別的改進,所以也就不再介紹了。

3.Fast RCNN

這篇論文是Rbg大神的作品,也就是RCNN的作者,這篇論文是他在去了微軟之後做出來,當時何凱明也在微軟,所以這篇論文是借鑑了何凱明的SPP Net的思想的,這篇論文做了一個多工學習,就是網路同時學了邊框預測和分類兩件事,而不是像以前一樣物體分類歸分類,邊框預測歸邊框預測,因為分別學兩件事其實由於樣本的不同,會變得比較麻煩,佔用儲存空間比較大;同時引入了一個ROI pooling的操作來解決不同邊框大小不一的問題,這個ROI pooling其實就是單層的SPP layer,這就是本文的兩個創新點。

640?wx_fmt=jpeg

這篇論文還是需要進行預先的產生一些候選框位置,這裡用的是Selective Search演算法產生一些候選框,也就是ROI區域。然後還是對圖片只做一次卷積,獲得特徵圖,然後通過ROI pooling對每個區域獲得一個固定的輸入,經過全連線層之後,分別送到分類的子任務和迴歸的子任務當中,然後再通過損失函式對網路引數進行調整。(注意SPP和RCNN之前都是沒有辦法做到一體化調整引數的,他們的都是單任務調整)作者這裡也分析了為什麼SPPnet沒有辦法進行整改網路引數調整,主要是因為是SPPNet在訓練的時候樣本批次都不是來自同一副影象,這樣反向傳播的時候需要的跨度就會非常的大,這樣就會導致異常低效。作者這裡使用SGD優化的時候,用的是一種分層次小批量取樣的辦法,每一次用N幅圖來更新引數,但是每張圖就取R/N個感興趣區域(這裡的R是指批量的大小),這樣只要N取的小一點,那麼更新引數也是可以實現的(因為這樣你更新引數所需要的其實也就是幾張圖片,而不是像SPP Net那樣需要去更新很多張圖片,其實就是把原來的隨機給固定了一下,固定了只能來自N張圖片,然後在ROI區域上面去隨機取樣),這裡訓練資料保證保證25%的正樣本,75%的負樣本。

ROI區域取樣,其實就是單層的SPP Layer,SPP Layer把每個框劃分為了不同的層級,4*4,2*2,1*1,這裡只保留了一層,也就是每個框經過ROI pooling之後固定輸出H*W,就是將一個款平均劃分成H*W個小格,每個小格內採用最大池化。

網路結構,可以利用經典的網路如VGG等,VGG的介紹可以看我之前的一篇介紹,然後對VGG進行一下小改造,把最後的一層池化換成ROI pooling(這個ROI的位置是根據SPP Net當中的計算圖片到特徵圖對映獲得的,具體公式可以看SPP Net),然後再接全連線層,然後在跟兩個子任務,迴歸和分類。

多工網路,對於一個多工網路而言,最重要的就是損失函式的設定,這裡的分類採用的是softmax損失函式,定位採用的是平滑L1損失函式,不過訓練的時候需要注意,背景區域不計入定位損失函式。具體表達式如下:

640?wx_fmt=jpeg

這裡的u>1表示背景的定位損失函式不計入。

640?wx_fmt=jpeg

同時作者用了兩種方法對網路進行了測試,一種就是單一的圖片,另一種就是對每張圖片進行尺度變換,經過測試雖然多尺度精度高1個百分點左右,但是速度卻更低,這也間接證明了神經網路可以自己學到尺度不變性。

最後作者利用SVD分解來加速全連線層的計算,因為我們通過共享了卷積特徵之後,整個計算量主要就集中在了全連線層的計算上面。(這裡是在測試的時候,訓練的時候不能分解,不然這個矩陣都還沒有得到,我們就沒法做這個分解啊!)簡單介紹一下SVD分解,對於任意一個實數矩陣640?wx_fmt=png,SVD分解就是要找到它的左奇異向量

640?wx_fmt=png,右奇異向量640?wx_fmt=png和奇異值矩陣640?wx_fmt=png(特徵值):

640?wx_fmt=jpeg

這裡的U,V都是正交矩陣,也就是640?wx_fmt=png。如何構成的呢?這其中U的列是由640?wx_fmt=png的歸一化特徵向量按特徵值降序排列組成的,V的列是由

640?wx_fmt=png的歸一化特徵向量按特徵值降序排列組成的,Σ對角上的值由640?wx_fmt=png或在640?wx_fmt=png的特徵值降序組成,其餘為0。

作者在這裡對權值矩陣進行了SVD分解,用前t個最大特徵值來近似矩陣,相當於用兩個小的全連線層去替代了大的全連線層,這樣可以有效的降低計算時間(時間複雜度從O(uv)降到了O(t(u+v)),而不會損失太多的精度。

4.Faster RCNN

Fast RCNN雖然採用了多工學習把迴歸和分類和卷積特徵提取統一了,但是對於產生候選框還是單獨的,於是任少卿在微軟的時候受到何凱明、孫劍的指導,終於把候選框的提取也換成了一個網路,這樣整個四步全部統一到了網路架構,大一統,所以效果也好!簡單來說,可以把Faster RCNN=Fast RCNN+RPN,先看一下整個網路的構成

640?wx_fmt=jpeg

因為Faster RCNN是一個統一的網路,所以這個區域生成網路也能夠共享前面的卷積特徵,需要注意的是這裡的區域生成網路其實包括兩個任務,第一個是獲得邊框的座標(迴歸4個值),另外一個是這個框內是背景還是前景(二分類)。

640?wx_fmt=jpeg

這裡作者通過在特徵圖上面滑動生成一些框,注意:這裡每個點都會生成9個框(3種長寬比例和3中尺寸的自由組合,3*3=9,這裡的尺寸是基於原圖而不是特徵圖),然後這些初步的框會去進一步學習一個線性變換,這個與RCNN裡面的框迴歸是一樣的,都是去學習尺度的變換和平移變換4個引數。注意:上圖只是針對每一個3*3的滑窗,而不是整個特徵圖都只變為了一個256維的陣列。接下來我們都只針對一個滑窗進行討論,每個3*3的滑窗變為了1*1*256維(實際上從這個層來看是W*H*256)的陣列,對於判斷前景和背景,我們需要做一個二分類判斷,同時因為有9個尺度大小不同的框,所以我們輸出應該是18維的結果(2*9,用一個1*1*256*18的卷積核即可),同理針對每一個迴歸邊框也是輸出36個結果(4*9,用一個1*1*256*36的卷積核)。如果去看caffe的原始碼會發現在softmax分類之前和之後都有一個reshape層,這個是與caffe的程式碼實現本身有關係,具體可以參考softmax_loss_layer.cpp。

損失函式,這裡RPN網路是有兩個任務,所以這裡的損失函式也是有兩部分組成,一部分是分類,一部分是迴歸。在定義損失函式之前,需要先定義什麼是正例,什麼是負例。作者在這裡定義了兩種情況的正例:第一種,與每個真實的框重疊比例最大的是正例,第二,與真實框的IOU值大於0.7的是正例;負例:與任意一個真實框的IOU值都小於0.3的。其餘的框都不計入損失。損失函式的具體表達形式如下:

640?wx_fmt=jpeg

這裡的迴歸框損失函式使用的是L1平滑損失函式。在給出了損失函式和網路結構之後,開始訓練網路,作者在論文中提到了三種訓練方式:交替訓練、近似聯合訓練、非近似聯合訓練。這裡作者用的是交替訓練方式,具體而言分為4步:1.先基於ImageNet訓練好的模型去訓練RPN,2.基於訓練好的RPN和預訓練模型去訓練Fast RCNN,3.把共享的卷積層固定,微調RPN,4.固定共享的卷積層,微調Fast RCNN.這4步交替進行訓練整個網路。

640?wx_fmt=jpeg

來自於知乎專欄(曉雷機器學習筆記https://zhuanlan.zhihu.com/p/24916624)

最後,為了消除一些冗餘,在生成ROI區域的時候,針對重疊框採用了非極大值抑制(根據二分類輸出的概率)的辦法,減少了一些候選區域,最後得到了候選的區域。

這樣獲得了候選區域,就再把這個送到Fast RCNN網路當中去檢測就可以了。這是一個影響非常深遠的工作,因為第一次把整個目標檢測全部納入到一個網路當中了,而且檢測速度和準確率明顯上升,其實我們這裡可以看到多工帶來了一系列的好處。

5.R-FCN

這篇論文也是微軟亞洲研究院何凱明孫劍團隊所做的工作,作者通過分析目標分類任務和檢測任務之間的異同,發現對於分類網路而言,要求對位置不敏感,而對於檢測網路而言,對物體的位置是有要求的(因為要把物體定位出來),而當前工作基本都是基於CNN來做抽取特徵,池化會損失位置精度,所以作者提出來了一個位置敏感層,就是說要把這個位置的資訊加進去。這是這篇論文的主要思想,就是為當前的檢測網路加入一個位置敏感層。

這個位置敏感層的設計非常的巧妙,先來看看整體的結構框架(我覺得深度學習網路架構非常棒的就是很多東西只要給出了網路的架構,就很容易理解,看論文形象生動)

640?wx_fmt=jpeg

首先整體架構還是與Faster RCNN差不多還是由一個卷積網路提取特徵,然後用一個RPN來生成一些候選框,最後進行分類和修整候選框的位置。但是這裡需要注意到作者在feature map之後引入了一個卷積操作,得到了一個k*k*(c+1)通道的特徵圖,看下圖更清楚一點。

640?wx_fmt=jpeg

這個K*K*(C+1)通道的特徵圖是用來幹啥的呢?這個就是作者思路的關鍵點了,作者將ROI區域劃分成k*k的格子(用來池化),每個格子的池化資料都來自於固定的單個通道所對應的區域,這樣其實就能強迫某一個通道只去學習對應格子的特徵。這裡使用了一個平均池化,經過這樣的一個操作之後,獲得的其實就是c+1個通道,每個通道k*k。(這裡其實就是對通道下的功夫)最後把這個k*k個值相加,就能夠獲得c+1個分數,然後用softmax函式就能夠輸出當前區域的預測類別。

在迴歸框的設計上也是類似於分類的思路,對每個小框進行估計偏移量和縮放量,這樣就能夠獲得4*k*k個值,然後對著k*k個值進行求和,最終得到迴歸框的4個值。

損失函式這裡也是由交叉熵損失函式和平滑L1損失函式構成,對於負例不計算邊框損失函式。訓練的時候還是需要預先訓練邊框生成網路,隨後再進行端到端的訓練。

6.FPN

特徵金字塔網路,這個方法對不同的語義層級都進行了預測,因為對於底層的資訊來說,位置精度相對更高,高層語義資訊的語義特徵更為抽象,所以本文就將兩者進行了結合。(這篇論文是何凱明去Facebook之後的工作)

640?wx_fmt=jpeg

這是四種常見的多尺度融合的操作,第一種就是把一副圖片縮放成不同尺寸,然後去對每張圖進行預測,第二種則經神經網路處理後直接對最後的一層做預測,這是SPP Net ,Fast RCNN, Faster RCNN的操作,第三種則是直接從神經網路當中拿出不同尺度拿出來做預測,這是SSS所採用的多層次資訊融合,第四種就是本文所使用的多尺度融合,把神經網路中的層拿出來,然後特徵圖進行上取樣,得到與上一個尺度相同的影象,兩者相加,然後通過一個3*3的卷積核來融合一下,最後再進行預測。(這裡1*1的conv是為了消除通道不一致)

640?wx_fmt=jpeg

這就是本文的核心思路,非常的簡單,現在作者就用這個網路去替換Faster RCNN當中的RPN網路。原來的RPN網路在一個尺度上面生成不同大小不同長寬比的邊框,這樣並不能利用到多個尺度的資訊。作者把從神經網路拿出來的特徵圖稱為C,通過上取樣加融合的特徵圖稱為P,現在把原先的RPN網路在單尺度上生成多尺度的邊框替換為了在不同的P層生成邊框,因為每個P的尺度是不一樣的,所以在每個P層只需要生成一種尺度的邊框(當然長寬比還是要保持不同)。

640?wx_fmt=jpeg

這樣產生了一些邊框之後,就要進行ROI pooling,因為你這個區域是多個尺度產生的,那麼很自然的就想到在pooling的時候應該要在不同的尺度上pooling,由於你大尺度的邊框是在靠後的層產生的,於是作者給出了一個取特徵層的公式:

640?wx_fmt=jpeg

這裡作者借鑑了ResNet做目標檢測任務時的取的第4層作為特徵層,所以這裡k_0取的是4。這裡的224是ImageNet中影象的標準長寬。

接下來的其餘部分和Faster RCNN一致,共享網路,後面接分類和迴歸。

7.Mask RCNN

這是一篇引入了分割的目標檢測,其實就是例項分割,這樣就完成了計算