編者按:tryo.labs是一家專注于機器學習和自然語言處理的技術支持公司,在本篇文章中,公司的研究人員介紹了他們在研究過程中所使用的先進目標檢測工具Faster R-CNN,包括它的構造及實現原理。
之前,我們介紹了目標物體檢測(object detection)是什么以及它是如何用于深度學習的。去年,我們決定研究Faster R-CNN。通過閱讀原論文以及相關的參考文獻,我們對其工作原理及如何部署已經有了清晰的了解。
最終,我們將Faster R-CNN安裝到Luminoth上,Luminoth是基于TensorFlow的計算機視覺工具包,我們在公開數據科學大會(ODSC)的歐洲和西部會場上分享了這一成果,并收到了很多關注。
基于我們研發Luminoth中的收獲以及分享成果,我們認為應當把研究所得記錄到博客中,以饗讀者。
背景
Faster R-CNN最初是在NIPS 2015上發表的,后來又經過多次修改。Faster R-CNN是Ross Girshick團隊推出的R-CNN的第三次迭代版本。
2014年,在第一篇R-CNN的論文Rich feature hierarchies for accurate object detection and semantic segmentation中,研究人員利用一種名為選擇性搜索(selective search)的算法提出一種可能的感興趣區域(RoI)和一個標準的卷積神經網絡來區分和調整它們。2015年初,R-CNN進化成為Fast R-CNN,其中一種名為興趣區域池化(RoI Pooling)的技術能夠共享耗能巨大的計算力,并且讓模型變得更快。最后他們提出了Faster R-CNN,是第一個完全可微分的模型。
結構
Faster R-CNN的結構十分復雜,因為它有好幾個移動部分。我們首先對Faster R-CNN做大致介紹,然后對每個組成部分進行詳細解讀。
問題是圍繞一幅圖像,從中我們想要得到:
邊界框的列表
每個邊界框的標簽
每個標簽和邊界框的概率
Faster R-CNN完整示意圖
輸入的圖像用高度×寬度×深度的張量(多維數組)表示,在傳輸到中間層之前,先經過一個預訓練的CNN,最終生成卷積特征映射。我們將這一映射作為下一部分的特征提取器。
這一技術在遷移學習中還是很常見的,尤其是利用在大規模數據庫上訓練的網絡權重,來訓練小規模數據庫上的分類器。
接著,我們得到了Region Proposal Network(RPN),利用CNN計算出的特征,使用RPN找到既定數量的區域(邊框線),其中可能包含目標對象。
也許用深度學習做目標檢測最難的部分就是生成一個長度可變的邊界框列表。對深度神經網絡進行建模時,最后一個block通常是一個固定大小的張量輸出(除使用循環神經網絡以外)。例如,在圖像分類中,輸出的是一個(N,)的張量,N代表類別的數量,其中的位置i處的每個標量包含該圖像被標位labeli的概率。
在RPN中可以使用anchors解決可變長度的問題:在原始圖像中統一放置固定大小的參考邊界框,與直接檢測物體的位置不同,我們將問題分為兩部分。對每個anchor,我們會想:
這個anchor是否含有相關目標對象?
如何調整這個anchor才能讓它更好地適應相關對象?
聽起來可能有點迷惑,接下來我們將深入探討這個問題。
在原始圖像中得到可能的相關對象及其位置的列表后,問題就更直接了。利用CNN提取的特征和包含相關對象的邊界框,應用RoI pooling,將與相關對象對應的特征提取出一個新的向量。
最后是R-CNN模塊,它利用這些信息來:
將邊界框里的內容分類(或標記成“背景”標簽丟棄它)
調整邊界框的坐標,使其更適合目標對象
雖然描述得比較粗略,但這基本上是Faster R-CNN的工作流程。接下來,我們將詳細介紹每一部分的架構、損失函數以及訓練過程。
基本網絡(Base Network)
就像我們之前提到的,第一步是利用一個為分類任務預先訓練過的CNN(比如ImageNet)和中間層的輸出。對于有機器學習背景的人來說,這聽上去挺簡單的。但是關鍵一點是要理解它是如何工作的,以及為什么會這樣工作。同時還要讓中間層的輸出可視化。
目前沒有公認的最好的網絡架構。最早的R-CNN使用了在ImageNet上預訓練的ZF和VGG,但從那以后,有許多權重不同的網絡。例如,MobileNet是一種小型網絡,優化后高效的網絡體系結構能加快運行速度,它有將近3.3M的參數,而152層的ResNet(對,你沒看錯就是152層)有大約60M參數。最近,像DenseNet這樣的新架構既改善了結果,又減少了參數數量。
VGG
在比較孰優孰劣之前,讓我們先用標準的VGG-16為例來理解他們都是怎樣工作的。
VGG架構
VGG這個名字來源于2014年ImageNet ILSVRC比賽中的一組選手,其中的Karen Simonyan和Andrew Zisserman發表了一篇名為Very Deep Convolutional Networks for Large-Scale Image Recognition的論文。若以現在的標準來看,這已經不是“very deep”的網絡了,但在當時,它比通常使用的網絡層數增加了一倍多,并且開始了“deeper→more capacity→better”的波動(當可以訓練的時候)。
使用VGG分類時,輸入的是224×224×3的張量(即224×224像素的RGB圖像)。由于網絡的最后一個模塊使用完全連接層(FC)而不是卷積,這需要一個固定長度的輸入。通常將最后一個卷積層的輸出平坦化,在使用FC層之前得到第一次命中的張量。
由于我們要使用中間卷積層的輸出,所以輸入的大小不用特別考慮。至少,在這個模塊中不用擔心,因為只使用了卷積層。讓我們繼續詳細介紹,決定到底要使用哪個卷積層。論文中并未指明要使用的圖層,但在實際安裝過程中,你可以看到它們用了conv5/conv5_1的輸出。
每個卷積層都會從之前的信息中生成抽象的東西。第一層圖層通常學習圖像中的邊緣線,第二層找出邊緣內的圖形,以學習更復雜的形狀等。最終我們得到了卷積特征向量,它的空間維度比原始圖像小得多,但是更深。特征映射的寬度和高度由于卷積層之間的池化而降低,同時由于卷積層學習的過濾器數量增多導致映射的深度增加。
圖像到卷積特征映射
在深度上,卷積特征映射已經對圖像的所有信息進行編碼,同時保持其相對于原始圖像編碼的“物體”的位置。例如,如果圖像的左上角有一個紅色正方形,并且卷積層激活了它,那么該紅色正方形的信息仍然位于卷積特征映射的左上角。
VGG vs ResNet
目前,ResNet架構大多已經取代了VGG作為特征提取的基礎網絡,Faster R-CNN的三位合作者(Kaiming He,Shaoqing Ren和Jian Sun)也是ResNet原始論文Deep Residual Learning for Image Recognition的共同作者。
相對于VGG,ResNet的明顯優勢在與它更大,因此它有更大能力去了解需要什么。這對分類任務來說是正確的,同時對目標物體檢測也是如此。
此外,ResNet讓使用殘差網絡和批量歸一化來訓練深度模型變得簡單,這在VGG發布之初并未出現。
Anchors
既然我們有了處理過的圖像,則需要找到proposals,即用于分類的興趣區域(RoI)。上文中提到,anchors是解決可變長度問題的方法,但是沒有詳細講解。
我們的目標是在圖像中找到邊界框,它們呈矩形,有不同的尺寸和長寬比。想像一下,我們事先知道圖像中有兩個對象,若要解決的話,第一個立即想到的方案是訓練一個返回八個值的網絡:xmin、ymin、xmax、ymax元組各兩個,以確定每個目標物體的邊界框位置。這種方法有一些非常基礎的問題。例如,圖像的尺寸和長寬比可能不同,訓練預測原始坐標的良好模型可能會變得非常復雜。另外,模型可能會生成無效的預測:當預測xmin和xmax的值時,我們需要保證xmin<xmax。
最終,事實證明通過學習預測參考框的偏移量,可以更簡單地預測邊界框的位置。我們取xcenter,ycenter,寬度,高度,學習預測Δxcenter、Δycenter、Δwidth、Δheight,這些值可以將參考框調整得符合我們的需要。
Anchors是固定的邊界框,它們遍布整個圖像,具有不同的大小和比例,這些尺寸在第一次預測目標對象位置的時候用作參考。
由于我們是用的是尺寸為convwidth×convheight×convdepth的卷積特征映射,于是可以在convwidth×convheight中的每個點創造一組anchors。即使anchors是基于卷積特征映射,理解這一點也是非常重要的,最終的anchors可以顯示原始圖像。
由于我們只有卷積層和池化層,特征映射的維度在原始圖像中是成比例的。用數學方法表示,即如果圖像是w×h,特征映射就是w/r×h/r,這里的r被稱為subsampling ratio。如果我們把特征映射的每個空間位置定義一個anchor,那么最終的圖像將會是由分散的r像素組成的一群anchors。在VGG中,r=16.
原始圖像的anchor中心
為了更好的選擇anchors,我們通常會定義一組尺寸(例如64px,128px,256px)和一組邊框的寬高比(例如0.5,1,1.5),并且將所有可能的尺寸和比例加以組合。
左:anchors,中:單點的anchor,右:所有anchors
Region Proposal Network
輸入卷積特征映射,RPN在圖像上生成proposals
正如之前所提到的,將所有參考框(anchors)輸入RPN中,輸出一組目標的proposals,每個anchors會有兩個不同的輸出。
第一個輸出是anchor中是目標對象的概率,可稱為“目標性分數”(objectness score)。注意,RPN不關心目標物體的類別,它只能分辨目標與背景。我們將用這個分數過濾掉不佳的預測,為第二階段做準備。第二個輸出是邊界框回歸,它的作用是調整anchors,讓它們更好地圈住目標物體。
在完全卷積的環境中,RPN的安裝十分高效,利用基礎網絡返回的卷積特征映射作為輸入。首先,我們有一個擁有512個通道和3×3大小的核的卷積層,然后利用1×1的核及一個帶有兩平行通道的卷積層,其中它的通道數量取決于每個點的anchors數量。
RPN中卷積的安裝,k是anchors的數量
對于分類層,每個anchor輸出兩個預測:它為背景的分數(不是目標物)以及它為前景的分數(實際的目標物)。
對于回歸函數,或者邊界框的調整層,我們輸出四個預測值:Δxcenter、Δycenter、Δwidth、Δheight,這些會應用到anchors上生成最終的proposals。
利用最終的proposals坐標和它們的“目標性分數”,就能得到目標物體最佳的proposals。
訓練,目標和損失函數
RPN能做出兩種預測:二元分類問題和邊界框回歸調整。
在訓練時,我們將所有的anchors分成兩類。其中交并比(Intersection over Union,IoU)的值大于0.5、與標準目標物體重合的anchors被認為是“前景”(foreground),那些不與目標物體重合、或者IoU的值小于0.1的被認為是“背景”(background)。
然后,我們對anchors隨機采樣256個樣本,同時保證前景和背景anchors的比例不變。
接著,RPN用上述樣本進行計算,利用二元交叉熵計算出分類器的損失函數。然后用樣本中的前景anchors計算回歸函數。在計算回歸函數的目標時,我們用前景的anchor和最近的目標物體計算能將anchor變為目標物體的正確的Δ。
除了用簡單的L1或者L2損失函數糾正回歸函數的錯誤,論文中還建議用Smooth L1損失函數。Smooth L1與L1基本相同,但是當L1的錯誤足夠小(用一確定的值σ表示),它就被認為是接近正確的,損失就會以更快的速度消失。
但是用動態群組(dynamic batches)會有一些困難。即使我們嘗試保持兩種anchors之間比例的平衡,也無法完美地做到這一點。根據圖像中真實目標物體的位置以及anchors的尺寸和比例,有可能最終沒有位于前景的anchors。在這種情況下,我們轉而使用IoU值最大的anchors來確定正確邊框的位置。這與理想情況相差較遠。
后處理
非極大抑制
由于anchors經常重合,因此proposals最終也會在同意目標物體上重疊。為了解決這一問題,我們用簡單的“非極大抑制”(NMS)算法。NMS通過分數和迭代篩選邊界框并生成一個proposals的列表,放棄IoU大于某個特定閾值的proposals,保留分數較高的proposals。
雖然看起來簡單,但要謹慎制定IoU的閾值。定的太低,最終可能會找不到正確的proposals;定的太高,最后可能會留下太多proposals。該值常用的數字是0.6。
Proposal選擇
應用了NMS后,我們留下了前N個proposals。在論文中,N=2000,但是即使把數字換成50也有可能得到相當不錯的結果。
獨立應用程序(Standalone application)
RPN可以單獨使用,無需第二個階段的模型。在只有一類對象的問題中,目標物體的概率可用作最終的類別概率。這是因為在這種情況下,“前景”=“單一類別”,“背景”=“多種類別”。
在機器學習問題中,人臉檢測和文本檢測這種可以從RPN獨立應用程序中受益的案例是非常流行的,但目前仍存在很多挑戰。
僅使用RPN的優點之一是在訓練和預測中的速度都有所提高。由于RPN是一個非常簡單、并且只是用卷積層的網絡,預測時間要比其他分類網絡更快。
興趣區域池化(RoI Pooling)
RPN階段之后,我們得到一堆沒有分類的proposals。接下來要解決的問題是,如何將這些邊界框分到正確的類別中去。
最簡單的方法是將每個proposals裁剪,然后通過預訓練的基礎網絡。接著,使用提取出的特征輸入到一般的分類其中。但是想要處理2000個proposals,這樣的效率未免太低了。
這時,Faster R-CNN可以通過重新使用現有的卷及特征映射解決或者緩解這一問題。這是利用RoI池化對每個proposals進行固定大小的特征提取完成的。R-CNN需要固定尺寸的特征映射,以便將它們分成固定數量的類別。
ROI池化
另外一種更簡單的方法,包括Luminoth的Faster R-CNN也在用的,是用每個proposals來裁剪卷積特征映射,然后用雙線性插值將裁剪后的映射調整為14×14×convdepth的固定大小。裁剪之后,用2×2的最大池得到最終7×7×convdepth的特征映射。
基于區域的卷積神經網絡(R-CNN)
R-CNN是達到Faster R-CNN的最后一個階段。在從圖像中獲取卷積特征映射后,利用它來獲得目標物體的proposals,并最終通過RoI池化為每個proposals提取特征,最后我們需要對這些特征進行分類。R-CNN要模仿CNN分類的最后階段,其中一個完全連接層輸出每個對象可能的類別的分數。
R-CNN有兩個不同的目的:
將proposals分到其中一類,另外還有一個“背景類”,用于刪除錯誤的proposals
根據預測的類別更好地調整proposals的邊界框
在最初的Faster R-CNN論文中,R-CNN將特征映射應用于每個proposal,“壓平”(flatten)后使用ReLU和兩個4096大小的完全連接層將其激活。
然后,它為每個不同的目標物體使用兩個不同的完全連接層:
擁有N+1個單位的完全連接層,整理N是類別的總數,多出來的1表示背景
擁有4N個單位的完全連接層。想進行回歸預測,所以需要對N個可能的類別進行Δxcenter、Δycenter、Δwidth、Δheight四個值的預測
R-CNN的結構
訓練和目標
R-CNN的目標與RPN的目標幾乎相同,但考慮到不同類別,我們計算了proposals和標準邊界框之間的IoU。
那些大于0.5的proposals被認為是正確的邊框,而分數在0.1和0.5之間的proposals被標記為“背景”。與我們在為RPN組裝目標時所做的相反,我們忽略了沒有交集的proposals。這是因為在這個階段,我們假設這里的proposals很好,而且想要解決更難的案例。當然,所有這些可以調整的超參數可以更好地適合目標物的種類。
邊界框回歸的目標試計算proposals與其相應的標準框架之間的偏移量,而且這里僅針對那些基于IoU閾值分配了類別的proposals。
我們隨機抽樣了一個尺寸為64的迷你群組,其中有高達25%的前景proposals,75%的背景。
按照我們對RPNs損失做的那樣,對于全部所選出的proposals,分類器的損失現在是一個多類交叉熵損失;對于那25%的前景proposals,用Smooth L1損失。由于為了邊框回歸的R-CNN完全連接網絡的輸出對每種類別只有一個預測,所以在獲得這種損失時不需小心。在計算損失時,我們只要考慮正確的類別即可。
后處理
與RPN相似,我們最終又得到了一堆已分類的目標對象,在返回他們之前需要進行進一步處理。
為了調整邊框,我們需要考慮哪類是proposals最可能屬于的邊框。同時要忽略那些最有可能是背景的proposals。
在得到最終的目標物體之后,我們用基于分類的NMS刪除北京。這是通過將目標對象按類別進行分組,然后按概率對其進行排序,然后再將NMS應用于每個獨立組。
對于最后的目標物體列表,我們也可以為每個類別設置一個概率閾值和對象數量的限制。
訓練
在原論文中,Faster R-CNN的訓練經歷了多個步驟,每個步驟都是獨立的,在最終進行全面訓練之前合并了所有訓練的權重。從那時起,人們發現進行端到端的聯合訓練結果更好。
把模型結合后,我們可以得到四個不同的損失,兩個用于RPN,兩個用于R-CNN。在RPN和R-CNN上游客訓練的圖層,我們也有可以訓練(微調)或不能訓練的基礎網絡。
基礎網絡的訓練取決于我們想要學習的對象的性質和可用的計算能力。如果我們想要檢測與原始數據集相似的目標對象,那么除了將所有方法都試一遍,也沒什么好方法了。另一方面,訓練基礎網絡是很費時費力的,因為要適應全部的梯度。
四種不同的損失用加權進行組合,這是因為我們可能像給分類器比回歸更多的損失,或者給R-CNN比RPN更多的權重。
除了正則損失外,我么也有歸一化損失。對一些層使用L2正則化,這取決于正在使用的基礎網絡以及是否經過訓練。
我們用隨機梯度下降的動量進行訓練,動量設置為0.9。你可以輕松地訓練更快的R-CNN和其他優化,不會遇到任何大問題。
學習速度開始為0.001,后來經過5萬次迭代后降到0.0001。這通常是最重要的超參數之一。當我們用Luminoth進行訓練時,通常用默認值開始訓練,然后再慢慢調整。
評估
評估過程使用標準的平均精度均值進行判斷(mAP),并將IoU的值設定在特定范圍。mAP是源于信息檢索的一種標準,經常用于計算排名和目標檢測問題中的錯誤。當你漏了某一邊界框、檢測到不存在或者多次檢測到同一物體時,mAP就會進行懲罰。
結論
現在你應該了解R-CNN的工作原理了吧,如果還想深入了解,可以探究一下Luminoth的實現。
Faster R-CNN證明了,在新的深度學習革命開始的時候,可以用同樣的原理來解決復雜的計算機視覺問題。目前正在建立的新模型不僅能用于目標物體檢測,還能用于語義分割、3D物體檢測等等。有的借鑒了RPN,有的借鑒了R-CNN,有的二者皆有。這就是為什么我們要搞清楚他們的工作原理,以解決未來將面對的難題。
-
目標檢測
+關注
關注
0文章
209瀏覽量
15605 -
vgg
+關注
關注
1文章
11瀏覽量
5193
原文標題:目標檢測技術之Faster R-CNN詳解
文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論