『壹』 mac下怎麼編譯fast-rcnn
Caffe剛出來的時候我就一直再用了,前後大概用了RCNN,Fast-RCNN, 目前在等待Faster-rcnn的代碼release! 回答下你的問題,目前我已經基於Fast-rcnn實現了caltech行人檢測資料庫與kitti資料庫的車輛與行人檢測,總的來說效果非常不錯,在訓練速度。
『貳』 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. 這是一組常用參數設置。
『叄』 fasterrcnn用什麼軟體好
用tensorflow配置並運行Faster-RCNN,
配置好筆記本的環境,下載好各個需要用到的庫。
『肆』 fasterrcnn最少要訓練多少次
50次
50個,FasterR-CNN是很多人進行目標檢測領域學習的必經之路。本文將從實戰的角度出發,對FasterR-CNN的結構、損失函數以及令人難以理解的anchor進行詳細說明。本文將結合代碼從以下幾個部分進行解析。
代碼是程序員用開發工具所支持的語言寫出來的源文件,是一組由字元、符號或信號碼元以離散形式表示信息的明確的規則體系。
『伍』 我將fasterrcnn的損失函數由softmaxloss改為sigmoidloss後進行訓練
一般都是你的維數沒設置對,發一下你的prototxt。還有你運行的時候應該有日誌文件產生的吧,你看下日誌文件,裡面應該有 SIGMOID_CROSS_ENTROPY_LOSS 層之前的那一層的輸出特徵圖的維數,能找到的話找到這個也發一下吧。
『陸』 fasterrcnn0.4.0和1.0.0的差異
功能不同。
功能不同,Resnet50_Faster_RCNN網路結構下面兩張圖中,第一張是Resnet50_Faster_RCNN的網路結構流程圖,第二張是詳細展開後的網路卷積模塊。
網路是由若干節點和連接這些節點的鏈路構成的圖,表示諸多對象及其相互聯系。網路有資源共享、快速傳輸信息、提高系統可靠性、易於進行分布式處理和綜合信息服務等特性。
『柒』 如何提高fasterrcnn速度
RCNN:RCNN可以看作是RegionProposal+CNN這一框架的開山之作,在imgenet/voc/mscoco上基本上所有top的方法都是這個框架,可見其影響之大。RCNN的主要缺點是重復計算,後來MSRA的kaiming組的SPPNET做了相應的加速。
Fast-RCNN:RCNN的加速版本,在我看來,這不僅僅是一個加速版本,其優點還包括:
(a) 首先,它提供了在caffe的框架下,如何定義自己的層/參數/結構的範例,這個範例的一個重要的應用是python layer的應用,我在這里支持多label的caffe,有比較好的實現嗎? - 孔濤的回答也提到了。
(2) training and testing end-to-end 這一點很重要,為了達到這一點其定義了ROIPooling層,因為有了這個,使得訓練效果提升不少。
『捌』 超詳細解讀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方式。
『玖』 [圖像演算法]-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個。
參考文獻: