『壹』 4g顯存能帶的動fasterrcnn嗎
可以。
4G顯存在1080P解析度下運行大部分游戲、辦公、模組基本是夠用的。
顯存的大小和顯卡性能並沒有直接的關禪拆系,顯穗族存4G夠不夠用主要看顯卡本身的直接性能與具體用途,對於能夠完全使用4g顯存的顯卡而言,4G的猜襲弊顯存大小已經足夠。
『貳』 ubuntu 14.04 py-faster rcnn怎麼自己訓練vgg模型
1、cuDNN版本的選擇
py-faster-rcnn建議進行caffe編譯掘察時選用cuDNN(Makefile.config文件中取消對應行的注釋),我的cuda版本是7.5,試驗了官網的cudnn各種版本,除了(cuDNN v3 (September 8, 2015), for CUDA 7.0 and later),都存在編譯caffe時參數不匹配的問題,建議選用該版本。
cuDNN在顯存佔用上比caffe有較好的優化,具體可以查看py-faster-rcnn的仔散謹ReadMe。
2、顯卡計算能力配置
若採用cuDNN後發現念基還是不能運行ZF模型,一般情況是顯卡計算能力配置的問題。
修改 faster-rcnn-root/lib/setup.py,將135行修改為-arch=sm_30或者更低,取決於顯卡的型號。刪除 faster-rcnn-root/lib/nms中的cpu_nms.c和gpu_nms.cpp,刪除faster-rcnn-root/lib/utils中的bbox.c,重新編譯caffe-fast-rcnn(這一步好像也可以不用),即可解決。
3、強制進行cpu運算
若還是計算能力不夠,可以修改faster-rcnn-root/lib/fast_rcnn/nms_wrapper.py,將force_cpu設置為True。
4、運行提示caffe的syntax invalid問題
proto版本問題,修改faster-rcnn-root/caffe-fast-rcnn/python/caffe/proto/caffe_pb2.py,注釋掉所有的syntax='proto2'即可。
『叄』 fasterrcnn為什麼比fastrcnn快
Fast R-CNN和Faster R-CNN都是目標檢測演算法。Fast R-CNN是在RCNN和SPPnet的基礎上提出的,而Faster R-CNN則是在Fast R-CNN的基礎上提出的,使得目標檢測的速度更快,同時保持了較高的檢測精度。
Fast R-CNN之所以比RCNN和SPPnet快,是因為它引入了ROI池化層,將多個候選框中的特徵圖映射到固定大小的特徵圖上,從而使得共培祥享卷積層的特徵提取可以被多個候選框共享,從而減少了重復計算,提局中銷高了計算效率。
Faster R-CNN之所以比Fast R-CNN快,是因為它引入了RPN網路,用來生成候選框,而不是像Fast R-CNN一樣使用選擇性搜索。RPN網路可以共享卷積特徵,並且在訓練時可以端到端地進行優化,從而加速和簡化了目標檢測的流程。
總之,Fast R-CNN和Faster R-CNN都是在RCNN、SPPnet的基礎上不斷優化而來,它們引入了ROI池化層和RPN網路,使得目標檢測的速度和精度都得到了提高。其中,Faster R-CNN比Fast R-CNN快的原因是因為它引入了RPN網路,用來生成候選框並共享卷積特徵。桐游
『肆』 fasterrcnn程序大小
幾百KB到幾十MB之間。
實現一肢拆個基本的Faster R-CNN演算法所需的程序大小可能在幾百KB到幾十MB之間。如果考慮到訓練和測試數據集的大小,以及各賀檔種依賴庫和工具,程序的禪飢亂總大小可能更大。
Faster R-CNN程序指的是實現Faster R-CNN演算法所需的計算機程序,通常使用深度學習框架(如TensorFlow、PyTorch、Caffe等)進行開發和實現。
『伍』 fasterrcnn0.4.0和1.0.0的差異
功能不同。
功能不同,Resnet50_Faster_RCNN網路結構下面兩張圖中,第一張是Resnet50_Faster_RCNN的網路結構流程圖,第二張是詳細展開後的網路卷積模塊。
網路是由若干節點和連接這些節點的鏈路構成的圖,表示諸多對象及其相互聯系。網路有資源共享、快速傳輸信息、提高系統可靠性、易於進行分布式處理和綜合信息服務等特性。
『陸』 faster rcnn zf cpu 訓練多久
Caffe剛出來的時候就一直再用了,前後大概用了RCNN,Fast-RCNN, 目前在等待Faster-rcnn的代碼release! 回答下問題,目前已經基於Fast-rcnn實現了caltech行人檢測資料庫與kitti資料庫的車輛與行人檢測,總的來說效果非常不錯,在訓練速度。
『柒』 超詳細解讀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方式。
『捌』 如何提高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層,因為有了這個,使得訓練效果提升不少。
『玖』 目標檢測演算法的分步介紹(第 1 部分)
英文原文: https://www.analyticsvidhya.com/blog/2018/10/a-step-by-step-introction-to-the-basic-object-detection-algorithms-part-1/
對原文的表達有部分改動
在本文中,我們將更深入地研究可用於目標檢測的各種演算法。我們將從 RCNN 家族的演算法開始,即 RCNN、Fast RCNN 和 Faster RCNN。在本系列即將發布的文章中,我們將介紹更高級的演算法,如 YOLO、SSD 等。
下圖是說明目標檢測演算法如何工作的一個流行示例。圖像中的每個物體,從一個人到一隻風箏,都以一定的精度被定位和識別。
讓我們從最簡單的深度學習方法開始,也是一種廣泛使用的方法,用於檢測圖像中的目標——卷積神經網路( CNN)。CNN 的內部工作原理如下:
我們將圖像傳遞給網路,然後通過各種卷積和池化層處理,發送給全連接層。最後,我們以目標類別的形式獲得輸出。這相當簡單,不是嗎?對於每個輸入圖像,我們得到一個相應的類作為輸出。我們可以使用這種技術來檢測圖像中的各種目標嗎?讓我們看看如何使用 CNN 解決一般的目標檢測問題。
使用這種方法的問題在於圖像中的目標可能具有不同的縱橫比和空間位置。例如,在某些情況下,目標可能覆蓋圖像的大部分,而在某些情況下,目標可能僅覆蓋圖像的一小部分。目標的形狀也可能不同(在現實生活中經常發生)。由於這些因素,我們將需要大量的區域,從而導致大量的計算時間。因此,為了解決這個問題並減少區域數量,我們可以使用基於區域的 CNN,它使用提案法選擇區域。讓我們了解這個基於區域的 CNN 可以為我們做什麼。
與在大量區域上工作不同的是,RCNN 演算法是在圖像中選取一堆框並檢查這些框中是慧團否有任何一個包含任何目標。 RCNN 使用 selective search 從圖像中提取這些框(這些框稱為 regions)。
讓我們首先了解什麼是 selective search 以及它如何識別不同的 regions。基本上四個模式可以構成一個物體:不同的尺度、顏色、紋理和外殼。selective search 識別圖像中的這些模式,並在此基礎上提出各種regions。以下是selective search 工作原理的簡要概述:
舉個例子:
到目前為止,我們已經看到了 RCNN 如何實現目標檢測。但是這種技術有其自身的局限性。由於以下步驟,訓練 RCNN 模型既昂貴又緩陪碰慢:
所有這些過程結合起來使 RCNN 非常慢。對每張新圖像進行預測大約需要 40-50 秒,這實質上使得模型在面對龐大的數據集時變得笨重且幾乎無法構建。
好消息是——我們有另一種目標檢測技術,它修復了我們在 RCNN 中看到的大部分問題。
我們還能做些什麼來減少 RCNN 演算法通常需要的計算時間?我們是否可以每張圖像只運行一次並獲取所有感興趣的區域(包含某個目標的區域)。
RCNN 的蘆碧談作者 Ross Girshick 提出了這個想法,即每張圖像只運行一次 CNN,然後找到一種方法在 2,000 個區域之間共享該計算。在 Fast RCNN 中,我們將輸入圖像提供給 CNN,後者反過來生成卷積特徵圖。使用這些地圖,提取提議的區域。然後我們使用 RoI 池化層將所有提議的區域重塑為固定大小,以便可以將其饋入全連接網路。
讓我們將其分解為簡化概念的步驟:
因此,Fast RCNN 不是使用三個不同的模型(如 RCNN),而是使用單個模型從區域中提取特徵,將它們分成不同的類,並同時返回識別類的邊界框。
為了進一步分解,我將對每個步驟進行可視化。
這就是 Fast RCNN 如何解決 RCNN 的兩個主要問題,1. 將每個圖像的一個而不是 2,000 個區域傳遞給 ConvNet。2. 使用一個而不是三個不同的模型來提取特徵、分類和生成邊界框。
但即使是 Fast RCNN 也存在某些問題。它還使用 selective search 作為尋找感興趣區域的建議方法,這是一個緩慢且耗時的過程。每張圖像檢測目標大約需要 2 秒,這與 RCNN 相比要好得多。但是當我們考慮大型現實生活數據集時,即使是 Fast RCNN 看起來也不那麼快了。
Faster RCNN 是 Fast RCNN 的修改版本。它們之間的主要區別在於 Fast RCNN 使用 selective search 來生成感興趣的區域,而 Faster RCNN 使用 Region Proposal Network ,又名 RPN。 RPN 將圖像特徵圖作為輸入並生成一組目標提議,每個提議的目標以分數作為輸出。
Faster RCNN 方法通常遵循以下步驟:
讓我簡要解釋一下這個區域提議網路(RPN)實際上是如何工作的。
首先,Faster RCNN 從 CNN 獲取特徵圖並將它們傳遞給區域提議網路。 RPN 在這些特徵圖上使用一個滑動窗口,在每個窗口,它生成 k 個不同形狀和大小的 Anchor 框:
Anchor 框是固定大小的邊界框,它們放置在整個圖像中,具有不同的形狀和大小。對於每個 Anchor,RPN 預測兩件事:
我們現在有不同形狀和大小的邊界框,它們被傳遞到 RoI 池化層。在 RPN 步驟之後,有可能存在沒有分配給它們的類別提議。我們可以獲取每個建議並對其進行裁剪,以便每個建議都包含一個目標。這就是 RoI 池化層所做的。它為每個錨點提取固定大小的特徵圖:
然後將這些特徵圖傳遞到具有 softmax 和線性回歸層的全連接層。它最終對目標進行分類並預測已識別目標的邊界框。
到目前為止,我們討論的所有目標檢測演算法都使用區域來識別目標。網路不會一次性查看完整圖像,而是依次關注圖像的各個部分。這會造成兩個並發症:
『拾』 從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)。對於目標檢測,仍處於一個探索和高度發展的階段,還不斷有更優的模型產生。