如何評價rcnn、fast-rcnn和faster-rcnn這一系列方法?

或者相關的檢測方法如OverFeat、SPPNet、SSD和較新的YOLO、R-FCN。


首先膜拜RBG(Ross B. Girshick)大神,不僅學術牛,工程也牛,代碼健壯,文檔詳細,clone下來就能跑。

斷斷續續接觸detection幾個月,將自己所知做個大致梳理,業餘級新手,理解不對的地方還請指正。

傳統的detection主流方法是DPM(Deformable parts models), 在VOC2007上能到43%的mAP,雖然DPM和CNN看起來差別很大,但RBG大神說「Deformable Part Models are Convolutional Neural Networks」(http://arxiv.org/abs/1409.5403)。

CNN流行之後,Szegedy做過將detection問題作為回歸問題的嘗試(Deep Neural Networks for Object Detection),但是效果差強人意,在VOC2007上mAP只有30.5%。

既然回歸方法效果不好,而CNN在分類問題上效果很好,那麼為什麼不把detection問題轉化為分類問題呢?RBG的RCNN使用region proposal(具體用的是Selective Search Koen van de Sande: Segmentation as Selective Search for Object Recognition)來得到有可能得到是object的若干(大概10^3量級)圖像局部區域,然後把這些區域分別輸入到CNN中,得到區域的feature,再在feature上加上分類器,判斷feature對應的區域是屬於具體某類object還是背景。當然,RBG還用了區域對應的feature做了針對boundingbox的回歸,用來修正預測的boundingbox的位置。RCNN在VOC2007上的mAP是58%左右。

RCNN存在著重複計算的問題(proposal的region有幾千個,多數都是互相重疊,重疊部分會被多次重複提取feature),於是RBG借鑒Kaiming He的SPP-net的思路單槍匹馬搞出了Fast-RCNN,跟RCNN最大區別就是Fast-RCNN將proposal的region映射到CNN的最後一層conv layer的feature map上,這樣一張圖片只需要提取一次feature,大大提高了速度,也由於流程的整合以及其他原因,在VOC2007上的mAP也提高到了68%。

探索是無止境的。Fast-RCNN的速度瓶頸在Region proposal上,於是RBG和Kaiming He一幫人將Region proposal也交給CNN來做,提出了Faster-RCNN。Fater-RCNN中的region proposal netwrok實質是一個Fast-RCNN,這個Fast-RCNN輸入的region proposal的是固定的(把一張圖片劃分成n*n個區域,每個區域給出9個不同ratio和scale的proposal),輸出的是對輸入的固定proposal是屬於背景還是前景的判斷和對齊位置的修正(regression)。Region proposal network的輸出再輸入第二個Fast-RCNN做更精細的分類和Boundingbox的位置修正。Fater-RCNN速度更快了,而且用VGG net作為feature extractor時在VOC2007上mAP能到73%。

個人覺得制約RCNN框架內的方法精度提升的瓶頸是將dectection問題轉化成了對圖片局部區域的分類問題後,不能充分利用圖片局部object在整個圖片中的context信息。可能RBG也意識到了這一點,所以他最新的一篇文章YOLO(http://arxiv.org/abs/1506.02640)又回到了regression的方法下,這個方法效果很好,在VOC2007上mAP能到63.4%,而且速度非常快,能達到對視頻的實時處理(油管視頻:https://www.youtube.com/channel/UC7ev3hNVkx4DzZ3LO19oebg),雖然不如Fast-RCNN,但是比傳統的實時方法精度提升了太多,而且我覺得還有提升空間。

感謝有RGB這樣的牛人們不斷推動detection的進步期待YOLO代碼的公布


瀉藥,終於看到符合自己胃口的問題啦!怒答一枚。RCNN和Fast-RCNN簡直是引領了最近兩年目標檢測的潮流!
-------------------------------
提到這兩個工作,不得不提到RBG大神rbg"s home page,該大神在讀博士的時候就因為dpm獲得過pascal voc 的終身成就獎。博士後期間更是不斷發力,RCNN和Fast-RCNN就是他的典型作品。

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層,因為有了這個,使得訓練效果提升不少。
(3) 速度上的提升,因為有了Fast-RCNN,這種基於CNN的 real-time 的目標檢測方法看到了希望,在工程上的實踐也有了可能,後續也出現了諸如Faster-RCNN/YOLO等相關工作。

這個領域的脈絡是:RCNN -&> SPPNET -&> Fast-RCNN -&> Faster-RCNN。關於具體的細節,建議題主還是閱讀相關文獻吧。

這使我看到了目標檢測領域的希望。起碼有這麼一部分人,他們不僅僅是為了幾個百分點的提升,而是切實踏實在做貢獻,相信不久這個領域會有新的工作出來。

以上純屬個人觀點,歡迎批評指正。

參考:
[1] R-CNN: Girshick R, Donahue J, Darrell T, et al. Rich feature hierarchies for accurate object detection and semantic segmentation[C], CVPR, 2014.
[2] SPPNET: He K, Zhang X, Ren S, et al. Spatial pyramid pooling in deep convolutional networks for visual recognition[C], ECCV, 2014.
[3] Fast-RCNN: Girshick R. Fast R-CNN[C]. ICCV, 2015.
[4] Fater-RCNN: Ren S, He K, Girshick R, et al. Faster r-cnn: Towards real-time object detection with region proposal networks[C]. NIPS, 2015.
[5] YOLO: Redmon J, Divvala S, Girshick R, et al. You Only Look Once: Unified, Real-Time Object Detection[J]. arXiv preprint arXiv:1506.02640, 2015.


是這樣的,如果都用一句話來描述

RCNN 解決的是,「為什麼不用CNN做classification呢?」
(但是這個方法相當於過一遍network出bounding box,再過另一個出label,原文寫的很不「elegant」

Fast-RCNN 解決的是,「為什麼不一起輸出bounding box和label呢?」
(但是這個時候用selective search generate regional proposal的時間實在太長了

Faster-RCNN 解決的是,「為什麼還要用selective search呢?」

於是就達到了real-time。開山之作確實是開山之作,但是也是順應了「Deep learning 搞一切vision」這一潮流吧。


在個人知乎專欄里寫了一個系列:

  • RCNN-將CNN引入目標檢測的開山之作
  • SPPNet-引入空間金字塔池化改進RCNN
  • Fast R-CNN
  • Faster R-CNN
  • 圖解YOLO
  • SSD
  • YOLO2

曉雷機器學習筆記


直接畫一張圖吧:不過 YOLO出了第二版了,親測很牛逼!地址:YOLO: Real-Time Object Detection

個人覺得,分析比較Faster Yolo SSD這幾種演算法,有一個問題要先回答,Yolo SSD為什麼快?

最主要的原因還是提proposal(最後輸出將全連接換成全卷積也是一點)。其實總結起來我認為有兩種方式:1.RPN,2. 暴力劃分。RPN的設計相當於是一個sliding window 對最後的特徵圖每一個位置都進行了估計,由此找出anchor上面不同變換的proposal,設計非常經典,代價就是sliding window的代價。相比較 yolo比較暴力 ,直接劃為7*7的網格,估計以網格為中心兩個位置也就是總共98個」proposal「。快的很明顯,精度和格子的大小有關。SSD則是結合:不同layer輸出的輸出的不同尺度的 Feature Map提出來,劃格子,多種尺度的格子,在格子上提「anchor」。結果顯而易見。


還需要說明一個核心: 目前雖然已經有更多的RCNN,但是Faster RCNN當中的RPN仍然是一個經典的設計。下面來說一下RPN:(當然你也可以將YOLO和SSD看作是一種RPN的設計)

在Faster RCNN當中,一張大小為224*224的圖片經過前面的5個卷積層,輸出256張大小為13*13的 特徵圖(你也可以理解為一張13*13*256大小的特徵圖,256表示通道數)。接下來將其輸入到RPN網路,輸出可能存在目標的reign WHk個(其中WH是特徵圖的大小,k是anchor的個數)。

實際上,這個RPN由兩部分構成:一個卷積層,一對全連接層分別輸出分類結果(cls layer)以及 坐標回歸結果(reg layer)。卷積層:stride為1,卷積核大小為3*3,輸出256張特徵圖(這一層實際參數為3*3*256*256)。相當於一個sliding window 探索輸入特徵圖的每一個3*3的區域位置。當這個13*13*256特徵圖輸入到RPN網路以後,通過卷積層得到13*13個 256特徵圖。也就是169個256維的特徵向量,每一個對應一個3*3的區域位置,每一個位置提供9個anchor。於是,對於每一個256維的特徵,經過一對 全連接網路(也可以是1*1的卷積核的卷積網路),一個輸出 前景還是背景的輸出2D;另一個輸出回歸的坐標信息(x,y,w, h,4*9D,但實際上是一個處理過的坐標位置)。於是,在這9個位置附近求到了一個真實的候選位置。


八月十五號更新:所有視頻和slide都已經上傳!!!
廣告一發:今年CVPR『17,我們將組織一個Tutorial, 請到了你們的男神Ross Girshick和Kaiming He,外加Xiaogang Wang和我,將分別給個45分鐘的講座。Ross應該會將這幾個object detection networks的關係理一遍,以及展望一下未來。Kaiming將梳理visual recognition網路結構的發展歷史和未來,Xiaogang會介紹deep learning model在video detection上的應用,我會介紹deeper scene understanding network interpretability 。敬請期待,各位朋友夏威夷見,預祝CVPR『17 submission順利:)

鏈接:CVPR"17 Tutorial: Deep Learning for Objects and Scenes


謝邀。結合ICCV15的Tutorial: Tools for efficient Object Detection說一些樓上沒有提到的東西好了。

RCNN的一個出發點在文章第一句話:features matter。傳統的物體檢測使用hand-engineered的特徵。如HOG特徵可以表示為filter(convolutional)+gating(nonlinear)+pooling+normalization(LRN),很多傳統特徵可以用圖片經過CNN後得到的feature map表示。並且,由於卷積操作具有平移不變形,feature map里不僅包含了物體的what信息,還包含著物體的where信息。因此可以利用CNN特徵來代替傳統特徵,對特徵用SVM得到分類結果,同時可以對特徵作回歸得到更精確的位置。

SPP首先解決傳統的CNN輸入需要圖片長寬固定的問題(這個問題在基於區域的輸入上更為明顯),把原來的「從原圖上截取區域」轉化為「從feature map上截取區域」,有了這個操作,同一張圖片上不同區域的物體檢測可以共享同一個原圖特徵。

然而SPP的區域特徵提取是在卷積層參數固定後才進行的,並且要額外進行SVM分類和區域框回歸。Fast RCNN解決了兩個技術問題:1)如何讓區域的選擇可導(提出ROI Pooling操作,區域特徵選擇像Max Pooling一樣可導),2)如何讓SGD高效(把同一張圖的不同區域放在同一個batch里),並且把原來的區域框回歸作為一個Multitask接在網路里(Smooth L1 norm),這樣除了區域推薦外的全部任務可以在一個網路完成。

Faster RCNN把區域推薦也放在網路里完成(RPN)。這樣整個框架都可以在一個網路里運行。

然而,Faster RCNN的訓練為了保證卷積特徵一致性需要分4步訓練。RBG在Tutorial上表示已有讓區域推薦可導(類似Spatial Transform Network中的sampler操作)的joint training。


因為一些原因看了一周R-CNN,SPPNet,Fast-RCNN和Faster-RCNN。這裡權當是Faster-RCNN的閱讀筆記。
--------------------------
R-CNN:針對區域提取做CNN的object detction。

-----------------
SPPNet:針對不同尺寸輸入圖片,在CNN之後的Feature Map上進行相同維度的區域分割並Pooling,轉化成相同尺度的向量。但是分類用的是SVM。

-------------------------
Fast R-CNN:區域提取轉移到Feature Map之後做,這樣不用對所有的區域進行單獨的CNN Forward步驟。同時最終一起回歸bounding box和類別。

------------------------

1.為什麼做Faster-rcnn

a. SPPnet 和 Fast R-CNN 已經減少了detection步驟的執行時間,只剩下region proposal成為瓶頸

b. 因此提出了 Region Proposal Network(RPN) 用來提取檢測區域,並且和整個檢測網路共享卷積部分的特徵。RPN同時訓練區域的邊界和objectness score(理解為是否可信存在oject)。

c. 最終把RPN和Fast-RCNN合併在一起,用了「attention」 mechanisms(其實就是說共享這事)。在VOC數據集上可以做到每張圖只提300個proposals(Fast-RCNN用selective search是2000個)。


2.繼續闡述現存問題

Fast-RCNN已經做到了Region Proposal在卷積以後,這樣大大減少了卷積作用的次數,全圖的Feature Map提取同樣只是做一次。目前最大的問題就是 Selective Search是耗時的瓶頸(CPU上大概2s一張)。尤其是這個方法沒有應用在GPU上,優化比較難。RPN共享網路,可以做到每張10ms,並且一起在GPU上進行了。


3.具體網路構建

在前面全圖Feature Map的基礎上, RPN又增加了幾個卷積層和FC層。是一種可以END-to-END訓練的FullyConvNet(其實就說單獨訓練RPN自己的這些層)。為了統一RPN和Fast R-CNN的網路,具體實現就是在RPN和Fast-RCNN之間選擇性切換,實際各訓練了兩次。最終結果,即使選擇了VGG里最複雜的網路,仍然可以做到5fps的速度。

實現的時候,前面feature map之前的網路是shareable convolutional layers(VGG有13層,ZF有5層,不同的模型不一樣)。RPN的具體實現就不說了,3x3尺寸的filter,卷積一層,後面幾個FC,假如每個點上proposal k種不同的尺度和比例(論文里定義k=9),輸出就有4*k的尺度信息(位置2維,長寬各一維)和2*k的判斷信息(是否是object)。RPN的一個重大優點在於translation invariant,因為是針對各個點周圍3X3進行獨立卷積的,後面的 RPN整個網路的權重又是共享的。而如果MultiBox方法的話,核心k-means很難保有這種獨立性,畢竟object的位置在圖上都是隨機的。另外現有的Region Proposal方法基本上是構建image pyramid或者是filter pyramid的基礎上,這裡就是真的實現了Single filter,Single scale。


4.LOSS定義和訓練過程

Loss Function定義包括幾個部分,RPN訓練的尺度信息的邊框(bounding box)部分,每個點對應的k個anchors里和ground truth IoU的overlap最大的標記為正,或者與任何IoU的overlap超過0.7也標記為正。每一個ground truth的box可能會標記給多個anchor。如果anchor與IoU的overlap小於0.3將被標記為負。本身傳統方法,IoU在處理bounding的時候,就是所有RP出來的區域類似於先scale到相同尺寸進行預測,共享預測部分的網路的權重,但是在這裡反而是每個feature map點周圍的3X3區域各進行k個不同權重的scale和size的訓練。 RPN訓練用的是每個batch來自單張圖的proposal。但是各個圖佔主要部分的negative samples會產生很大的bias。於是每次每張圖選擇256個隨機的anchors,並且保證postive和negative的anchors比例為1:1。RPN本身的部分高斯隨機初始化而來,共享部分來自ImageNet之前的訓練結果。後面decay,learning rate什麼的就不詳細說了。訓練過程就是固定一部分,訓練一部分,RPN和Fast-RCNN交叉著來,定義了很多種,Caffe里實現的,也不具體說了。


----------------------------------------------------------------------------------------------------

首先膜拜RBG大神,這周以前我是不知道這個人的,之前我一直想用移動機器人帶攝像頭做一些實時object detection的任務,其實自動駕駛上很多人在做了,行人檢測什麼的。但是我對CNN的作用還一直停留在全圖做image classification上。萬萬沒想到,RBG一個人把DPM,以及後來整個object detection的所有任務鏈全部用CNN實現了(也不能說一個人,還有MSRA的幾個華人大牛)。


同時之前我對Caffe的認識也一直停留在C++和命令行介面調用上,今天看了一下py-faster-rcnn的源代碼,簡直對Caffe有了全新的認識(RBG畢竟也參與了Caffe的開發)。希望早日把源代碼搞透,然後試著把Faster-RCNN用在檢測其他特定物體的任務上。(源代碼學習,個人Blog緩慢更新中Faster R-CNN 論文筆記 · Tai Lei Home Page,坑太大,一時半會填不滿)。


玩了蠻久,也答一下。rcnn是經典的物體檢測方法:proposals-&>features-&>claasifiers(svm),但是因為每個proposal都要過一遍cnn,所以速度慢。我試的的時候大概gpu10s一張圖吧。
fast rcnn借鑒了spp net,只把整張圖過一遍cnn,然後在roi layer把proposal對應到feature map上,速度提升非常大
faster rcnn主要是認為selective search只能跑在cpu,不能跑在gpu上,所以提出了rpn來得到proposal。一般selective search會產生2000個proposal,但rpn就幾百個。但是個人經驗faster rcnn 訓練時間長。
小白一枚,希望大神指正。宿舍網sb了,手機打的,將就看吧


其實R-CNN的思路就是我們大家的思路,先做proposal,然後對每個proposal進行分類時利用CNN來分類,我們做某個特定目標的檢測時,也是這個思路;fast R-CNN巧妙之處在於它迴避了R-CNN要對每個proposal都使用一遍CNN,這也是造成速度慢的重要原因,而CNN在此主要用來提特徵,因此fast R-CNN直接對全圖進行卷積,獲得特徵圖,再將proposal的位置映射到feature map中從而得到每個proposal所對應的特徵,由於沒有對原圖的尺寸進行限制,所以又添加了ROI pooling層對feature維數歸一化,再用這些特徵訓練幾個linear SVM做判別;但是這個方法由於也還是需要事先提取proposal,而所有後續的操作也都是基於這些proposal的,所以要求proposal演算法要快而且召回率儘可能高;faster R-CNN針對fast R-CNN的局限又進行了改進,主要就在於proposal上面,faster演算法採用一個全卷積網路用作為region proposal網路,用該網路在feature map上滑動,並在每個位置引入多尺度多長寬比的anchor窗口來捕捉未知尺寸和ratio rate的目標;RPN網路的訓練目標也是一個多任務的目標,同時學習分類和回歸目標的包圍盒;同時,還提出了一個四步的訓練方法,使得RPN網路和fast-RCNN網路能夠共享卷積層,這個四步的方法很巧妙,開始時分別訓練RPN和fast-RCNN網路,然後在第三步,利用精調的方法,使用檢測網路fast-RCNN來初始化RPN網路的訓練,即固定共享的卷積層和其他相同的層參數,只是訓練不同層的參數;第四步,再用RPN來初始化fast-RCNN的訓練,同理也是精調,固定相同層包括共享卷積層的參數,只是訓練不同層的參數,這樣,最終所訓練得到的兩個網路,是共享卷積層參數的。


RCNN:用SS去選框,CNN提特徵,SVM分類。BB盒回歸。
fast: 吐槽上面的stage各自玩各自的,就統一起來(實際上只統一了後面三個步驟),最大的改進在"在訓練過程中,SGD的mini-batch選取是有「層次的」,同一張圖片上的ROI在BP的時候會使用相同的原始圖像。舉個例子,當N=2,R=128的時候,相當於只BP了2張圖像(但實際上是128個ROI),這比傳統的RCNN、SPPnet直接使用128個ROI 要快上64倍。感覺這個改進思路很簡單也很直接,但確實是一種優化,因為本身同一張圖像上的ROI的分類可能是不同的,就不會存在擬合等問題。

Faster: 吐槽SS太慢,丫的,也用CNN給你整進去,這樣就更快了。


從《river flows in you》到《一人我飲酒醉》就是 rcnn 到 fast-rcnn 再到 faster-rcnn。

By @時冰藍


簡明一些的解釋

R-CNN

  • 估計候選位置信息
  • 針對所有候選區域的二維特徵圖,逐一執行CNN推演得到類別信息

Fast R-CNN

  • (重複 R-CNN)估計候選位置信息
  • 基於候選區域的特徵圖生成一維特徵向量,逐一執行FC推演同時得到類別和位置信息

Faster R-CNN

  • 基於所謂的區域選擇網路估計候選區域,
  • (重複Fast R-CNN)基於候選區域的特徵圖生成一維特徵向量,逐一執行FC推演同時得到類別和位置信息

FPN

  • 與其它模型只用單層特徵相比,FPN將高層特徵圖融合至多個低層特徵圖。即提供具有強壯語義的多層特徵圖,進而增強模型對小目標的處理能力。
  • Faster R-CNN 加入 FPN 後,顯著提升了檢測能力。

SSD

  • 不同於其他模型提取候選區域,SSD 使用所謂的錨箱替代區域選擇網路,同時估計目標的類別信息位置信息

評價這一系列方法

觀察 R-CNN -&> Fast R-CNN -&> Faster R-CNN + FPN -&> SSD 的發展過程,由直觀但繁瑣的 R-CNN 逐漸發展至可端到端訓練的 Faster R-CNN 和 SSD,演算法精度的持續上升 或 提高檢測速度的過程中,新演算法彌補了上一種演算法中的顯著弱勢。發展趨勢合情合理,卻又讓人覺得精妙稱讚。作為總結,靜心分析已有演算法,有利於了解研究現狀,站在巨人的肩膀上更會產出優秀的成果。

1. [Fast R-CNN]

2. [Faster R-CNN] Towards Real-Time Object Detection with Region Proposal Networks

3. [FPN] Feature Pyramid Networks for Object Detection

4. [SSD] Single Shot Multibox Detectior


對於輸入圖像,RCNN 方法先用區域生成方法生成 2000 個左右的候選區域,幾乎涵蓋了圖像中物體可能出現所有位置,減少了需要搜索的空間,之後用訓練好的 CNN 模型在這些區域上提取特徵,最後用線性 SVM 進行分類,所使用的 CNN 模型可以根據分類效果進一步調節參數


這些都是近幾年較新且效果顯著的DL演算法,通吃cv的圖像檢測,rcnn是加入了selective search 解決傳統滑動窗口的時間複雜度問題,spp-net就是改進region proposal 的提取,fast rcnn 和faster rcnn 就是進一步希望做到實時性,端到端訓練,包括加入ROI pooling layer和anchor機制,相對來說rcnn系列的這些演算法精度都還可以,YOLO基於回歸,簡單且速度很快,SSD就是綜合faster rcnn 的anchor和YOLO的回歸。


基於深度學習的目標檢測研究進展_深度學習大講堂_傳送門
來發個鏈接


瞄到這題…順道貼個當年的閱讀筆記…飄走~ (為何知乎不支持markdown.....


R-CNN Fast R-CNN Faster R-CNN

# R-CNN Fast R-CNN Faster R-CNN

## R-CNN: Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation

Paper:[http://www.cs.berkeley.edu/~rbg/#girshick2014rcnn](http://www.cs.berkeley.edu/~rbg/#girshick2014rcnn)
Tech report: [http://arxiv.org/pdf/1311.2524v5.pdf](http://arxiv.org/pdf/1311.2524v5.pdf)
Project:[https://github.com/rbgirshick/rcnn](https://github.com/rbgirshick/rcnn)
Slides: [http://www.cs.berkeley.edu/~rbg/slides/rcnn-cvpr14-slides.pdf](http://www.cs.berkeley.edu/~rbg/slides/rcnn-cvpr14-slides.pdf)

Referrence: a [blog](http://zhangliliang.com/2014/07/23/paper-note-rcnn/)

### object detection system

Three modules:
1. Generate region proposals (~2k/image)
2. Compute CNN features
3. Classify regions using linear SVM

### R-CNN at test time

- __Region proposals__
Proposal-method agnostic, many choices:
- **Selective Search** (2k/image "fast mode") [van de Sande, Uijlings et al.] (Used in this work)(Enable a controlled comparison with prior detection work)
- Objectness [Alexe et al.]
- Category independent object proposals [Endres Hoiem]
- CPMC [Carreira Sminchisescu] - segmentation
- BING [Ming et al.] – fast
- MCG [Arbelaez et al.] – high-quality segmentation
- __Feature extraction with CNN__
- Dilate the proposal (At the warped size there are exactly p=16 pixels warped image context around the original box)
- Crop and scale to 227*227(anisotropic)
- Forward propagate in AlexNet (5conv 2fc). Get fc_7 layer features.
- __Classify regions by SVM__
- linear SVM per class
(With the sofmax classifier from fine-tuning mAP decreases from 54% to 51%)
- greedy NMS(non-maximum suppression) per class : rejects a region if it has an intersection-overunion (IoU) overlap with a higher scoring selected region larger than a learned threshold.
- __Object proposal refinement__
- Linear bounding-box regression on CNN features (pool_5 feature: mAP ~4% up)
- (in Appendix C)

### Training R-CNN

- Bounding-box labeled detection data is scarce
- Use supervised pre-training on a data-rich auxiliary task and transfer to detection

- __Supervised pre-training__
Pre-train CNN on ILSVRC2012(1.2 million 1000-way image classification) using image-level annotations only
- __Domain-specific fine-tuing__
Adapt to new task(detection) and new domain(warped proposal)
- random initialize (N+1)-way classification layer (N classes + background)
- Positives: $geq$0.5 IoU overlap with a ground-truth box. Negative: o.w.
- SGD: learning rate: 0.001 (1/10 of original) mini-batch: 32 pos 96 neg
- __Train binary SVM__
- IoU overlap threshold: grid search over {0, 0.1, ... 0.5}
IoU = 0.5 : mAP ~5% down
IoU = 0.0 : mAP ~4% down

## Fast R-CNN

Paper: [http://arxiv.org/pdf/1504.08083v1.pdf](http://arxiv.org/pdf/1504.08083v1.pdf)
Project: [https://github.com/rbgirshick/fast-rcnn](https://github.com/rbgirshick/fast-rcnn)

Referrence: [blog](http://zhangliliang.com/2015/05/17/paper-note-fast-rcnn/)

### Motivation
Drawback of R-CNN and the modification:
1. Training is a multi-stage pipeline. -&> End-to-end joint training.
2. Training is expensive in space and time. -&> Convolutional layer sharing. Classification in memory.
For SVM and regressor training, features are extracted from each warped object proposal in each image and written to disk.(VGG16, 5k VOC07 trainval images : 2.5 GPU days). Hundreds of gigabytes of storage.
3. Test-time detection is slow. -&> Single scale testing, SVD fc layer.
At test-time, features are extracted from each warped proposal in each img. (VGG16: 47s / image).

Contributions:
1. Higher detection quality (mAP) than R-CNN
2. Training is single-stage, using a multi-task loss
3. All network layers can be updated during training
4. No disk storage is required for feature caching

### Fast R-CNN training

- __RoI pooling layer__
- Find the patch in feature map corresponding to the RoI; Get fixed-length feature using SPPnet to feed in fc layer
- A simplified version of the spatial pyramid pooling used in SPPnet, in which "pyramid" has only one level
- Input :
N feature maps (last conv layer H*W*C),
a list of R RoI(tuple [n, r, c, h, w] n: index of a feature map, (r,c): top-left loc) (R $ll$ N)
- Output: max-pooled feature maps(H"*W"*C) (H"$leq$H, W"$leq$W)
- __Use pre-trained Networks__
Tree transformations:(VGG 16)
- last pooling layer -&> RoI pooling layer (H"*W" compatibale to fc layer)
- final fc and softmax layer -&> two sibling layers: fc + (K+1)-softmax and fc + bounding box regressor ($K$ is the number of the classes)
- Modified to take two data inputs: N feature maps and a list of RoI
- __Fine-tuning for detection__
- Back propogation through SPP layer.
- BP through conv: Image-centric sampling. mini-batch sample hierachically: images -&> RoI
Same image shares computation and memory
- Joint optimaize a softmax classifier and bounding-box regressors
- __Multi-task Loss__
- Two sibling output layers:
1. fc + (K+1)-softmax: Discrete probability distribution per RoI $p = (p_0, .., p_K)$
2. fc + bbox regressor: bbox regression offsets $t^k = (t^k_x, t^k_y, t^k_w, t^k_h)$, $t^k$: a scale -invariant translation and log-space height-width shift relative to an object proposal
- Multi-task loss $$L(p, k^*, t, t^*) = L_{cls}(p, k^*) + lambda[k^* geq 1]L_{loc}(t, t^*)$$
where $k^*$ is the true class label
1. $L_{cls}(p, k^*) = -log p_{k^*}$ : standard cross entropy/log loss
2. $L_{loc}$ : $t^* = (t^*_x, t^*_y, t^*_w, t^*_h)$ true bbox regression target $t = (t_x, t_y, t_w, t_h)$ predicted tuple for class $k$ $$L_{loc}(t, t^*) = sum_{i in {x,y,w,h}} ext{smooth}_{L_1}(t_i, t_i^*)$$ $$ ext{smooth}_{L_1}(x) = left{ egin{array}[cc] ext{0.5}x^2 ext{if}|x|&<1\|x| - 0.5 ext{otherwise}end{array} ight.$$ smoothed $L_1$ loss : less sensitive to outliers (R-CNN L2 loss: requires significant tuning of learning rate, prevent exploding gradients)
3. hyper-parameter: $lambda$ (=1) normalize $t^*$ to zero mean and unit variance
- __Mini-batch Sampling__
128: 2 randomly sampled images with 64 PoI sampled from each image
25% positive: IoU &> 0.5
75% background:IoU $in$ [0.1, 0.5)
horizontally flipped with prob = 0.5
- __BP through RoI Pooling Layer__
$displaystyle frac{partial L}{partial x} = sum_{r in R} sum_{yin r}[y ~ ext{polled}~ x] frac{partial L}{partial y}$ (if $x$ was argmax assigned to $y$ during the pool)
- __SGD hyper-parameter__
new fc for softmax is initialized by N(0, 0.01)
new fc for bbox-reg is initilized by N(0. 0.001)
base\_lr: 0.001 weight\_lr: 1 bias\_lr: 2
VOC07 VOC12: 30k-iter -&> lr = 0.0001 10k-iter (larger dataset: momentum term 0.9 weight decay 0.0005)
- __Scale Invariance__
scale invariance object detection : brute-force learning; using image pyramids [followed SPP]

### Fast R-CNN detection

- R ~ 2k, Forward pass, assign detection confidence $Pr ( ext{calss}=k|r) = p_k$, ans NMS
- __Truncated SVD for faster detection__
mAP ~ 0.3% down; speed ~ 30% up
number of RoI for detection is large -&> time spent on fc
$W sim USigma_tV^T$ (U : u*t, Sigma_t: t*t, V: v*t)
Compression : ($Wx+b$) fc -&> ($Sigma_tV^T x$) fc + ($Ux+b$) fc

## Faster R-CNN

Paper: [http://arxiv.org/abs/1506.01497](http://arxiv.org/abs/1506.01497 )
Caffe Project: [https://github.com/ShaoqingRen/caffe](https://github.com/ShaoqingRen/caffe)

Reference: [blog1](http://blog.csdn.net/anxiaoxi45/article/details/46522155) [blog2](http://blog.cvmarcher.com/posts/2015/06/10/Notes-for-Faster-R-CNN-and-YOLO/)

### Region Proposal Networks
RPN input: image of any size, output: rectangular object proposals with objectness score

- __Fully convolutional network__
share computation with Fast R-CNN detection network(share conv layer)
- Slide on n*n conv feature map output by last shared conv layer(ZF 5conv, VGG 13conv)
Sliding window mapped to a lower-dim vector(256-d ZF, 512-d VGG) (n = 3 large recpt field)
Fed into two sibling fc layers(1*1 conv): bbox-reg layer + box-cls layer
- __Translation-Invariant Anchors__
At each sliding window loc, pridict k proposal: 4k outputs for reg layer, 2k outputs for cls layer (binary softmax).
Anchor: centered at sliding window with scale and aspect ratio: ($128^2, 256^2, 512^2$; 1:2, 2:1, 1:1)
For a conv feature map: $W*H*k$ (k=9 anchors) (2+4)*9 output layer
- __Loss function for Learning Region Proposal__
positive label: the anchor has highest IoU with a gt-box or has an IoU&>0.7 with any gt-box
negative label: IoU&<0.3 for all gt-box
Objective function with multi-task loss: Similar to Fast R-CNN. $$L(p_i, t_i) = L_{cls(p_i, p_i^*)} + lambda p_i^* L_{reg}(t_i, t_i^*)$$ where $p_i^*$ is 1 if the anchor is labeled positive, and is 0 if the anchor is negative.
$lambda=10$ bias towards better box location
- Optimization
fcn trained by end-to-end by bp and sgd
image-centric sampling strategy, sample 256 anchors in an image(Pos:neg = 1:1)
new layer initialization ~ N(0, 0.01)
tune ZFnet and conv3_1 and up for VGGnet, lr=0.001 for 60k batches, 0.0001 for 20k on PASCAL
- __Share Convolutional Features for Region Proposal and Objection Detection__
Four-step training algorithm:
1. Train RPN, initialized with ImageNet pre-trained model
2. Train a separate detection network by Fast R-CNN using proposals generated by step-1 RPN, initialized by ImageNet pre-trained model
3. Fix conv layer, fine-tune unique layers to RPN, initialized by detector network in Step2
4. Fix conv layer, fine-tune fc-layers of Fast R-CNN


只知道當時寫作業用的是caffe,並且用了fast cnn的庫。
就感覺fast cnn特徵提取要快不少,當然一次也要提取不少特徵。


僅僅做個補充,最近Yolo V2出了,效果至少mAP上來說非常好:

YOLO: Real-Time Object Detection

關於YOLO V1, Fast(er) RCNN, Region proposal之類的資料,CS231n Lecture 8 - Localization and Detection大概講了下基本思路和各個演算法的優勢和劣勢。


去年寫的yolo詳解 剛post 裡面有一個關於rcnn系列和yolo的對比: http://zhuanlan.zhihu.com/p/25236464


R-CNN需要對每一個proposal 進行卷積,而Fast-RCNN對全圖進行卷積得到feature map ,然後將每一個proposal映射到feturemap上,後經過roi pooling 對feaure 維度進行歸一化,FAster -RCNN 採用RPN wangluo 進行 proposal不用之前的selective search


densebox 有點像 faster rcnn 的另類進化,把proposal 也進化沒了,直接給出。缺點是分類不如原來了。


重要的是有開源的code。
開創性比pff的的dpm和alexnet都差不少。


推薦閱讀:

有誰給解釋一下流形以及流形正則化?
計算機視覺中,目前有哪些經典的目標跟蹤演算法?
經過足夠長的時間, AlphaGo 的棋譜能收斂到一張上嗎?
如何看待圍棋世界冠軍柯潔 0-3 負於 AlphaGo 後落淚?
為什麼現在的CNN模型都是在GoogleNet、VGGNet或者AlexNet上調整的?

TAG:機器學習 | 計算機視覺 | 神經網路 | 深度學習(Deep Learning) |