faster rcnn中rpn的anchor,sliding windows,proposals?

faster rcnn中rpn的anchor,sliding windows,proposals之間的聯繫是什麼?anchor中的scale和ratio(128^2,1:1)是什麼意思?論文中提到一張1000×600的圖片,大概可以得到20k個anchor box(60×40×9),這是怎麼計算的啊?謝謝。


最近也在看這部分內容,將自己的理解和大家分享一下,希望有所幫助。

首先我們需要知道anchor的本質是什麼,本質是SPP(spatial pyramid pooling)思想的逆向。而SPP本身是做什麼的呢,就是將不同尺寸的輸入resize成為相同尺寸的輸出。所以SPP的逆向就是,將相同尺寸的輸出,倒推得到不同尺寸的輸入。

接下來是anchor的窗口尺寸,這個不難理解,三個面積尺寸(128^2,256^2,512^2),然後在每個面積尺寸下,取三種不同的長寬比例(1:1,1:2,2:1).這樣一來,我們得到了一共9種面積尺寸各異的anchor。示意圖如下:

至於這個anchor到底是怎麼用的,這個是理解整個問題的關鍵。

下面是整個faster RCNN結構的示意圖:

利用anchor是從第二列這個位置開始進行處理,這個時候,原始圖片已經經過一系列卷積層和池化層以及relu,得到了這裡的 feature:51x39x256(256是層數)

在這個特徵參數的基礎上,通過一個3x3的滑動窗口,在這個51x39的區域上進行滑動,stride=1,padding=2,這樣一來,滑動得到的就是51x39個3x3的窗口。

對於每個3x3的窗口,作者就計算這個滑動窗口的中心點所對應的原始圖片的中心點。然後作者假定,這個3x3窗口,是從原始圖片上通過SPP池化得到的,而這個池化的區域的面積以及比例,就是一個個的anchor。換句話說,對於每個3x3窗口,作者假定它來自9種不同原始區域的池化,但是這些池化在原始圖片中的中心點,都完全一樣。這個中心點,就是剛才提到的,3x3窗口中心點所對應的原始圖片中的中心點。如此一來,在每個窗口位置,我們都可以根據9個不同長寬比例、不同面積的anchor,逆向推導出它所對應的原始圖片中的一個區域,這個區域的尺寸以及坐標,都是已知的。而這個區域,就是我們想要的 proposal。所以我們通過滑動窗口和anchor,成功得到了 51x39x9 個原始圖片的proposal。接下來,每個proposal我們只輸出6個參數:每個 proposal 和 ground truth 進行比較得到的前景概率和背景概率(2個參數)(對應圖上的 cls_score);由於每個 proposal 和 ground truth 位置及尺寸上的差異,從 proposal 通過平移放縮得到 ground truth 需要的4個平移放縮參數(對應圖上的 bbox_pred)。

所以根據我們剛才的計算,我們一共得到了多少個anchor box呢?

51 x 39 x 9 = 17900

約等於 20 k

bingo!

以上是自己最近幾天看 faster RCNN的理解,如果有不對的地方,希望大神能夠指正,免得誤導更多小白,嘿嘿。


anchor這個問題,我最初也沒弄懂。剛剛看完RBG大神的源碼,終於明白了,來回答一發,如果有不對的地方請大家指出。

以VGG-16改造的faster r-cnn為例。py-faster r-cnn的/model/pascal-voc/VGG16/faster_rcnn_alt_opt/faster_rcnn_test.pt的RPN部分。這部分是在原來的VGG16的conv5_3之後添加的。

1、conv5_3-&>rpn_conv/3*3-&>rpn_relu對應於文中進行n*n的卷積。這裡輸出的維數(output)為512,高H和寬W為輸入的圖像原始大小的1/16。(1,512,H,W)

2、rpn_relu-&>rpn_cls_score-&>rpn_cls_score_reshape-&>rpn_cls_prob-&>rpn_cls_prob_reshape

這裡是預測每個點的前景背景概率。rpn_cls_score實際上就是一個1*1的卷積層而已。

如果有A個anchor,每個anchor都有一個前景概率一個背景概率(2*A),輸出的大小為(1,2*A,H,W)。

這裡的reshape只是為了利用softmax層進行概率的計算而已。

3、rpn_relu-&>rpn_bbox_pred

這裡就是預測每個點的boundingbox。同樣的,rpn_bbox_pred也是一個1*1的卷積層而已。輸出大小為(1,4*A,H,W) 。

關鍵在此,這裡輸出的並不是一個boundingbox的左上右下坐標,而是一個修改量(boundingbox regression)。在r-cnn的supplementary material中,給出了下面幾個公式

這裡面的P就是的anchor(高、寬、中心),而裡面的d_{x} d_{y}d_{w}d_{h}是rpn_bbox層輸出的四個值,G就是修改之後的高、寬、中心。

4、(rpn_bbox_pred+rpn_cls_prob_reshape)-&>proposal_layer

這裡的proposal_layer就完成了上述修正,並且進行NMS(非極大抑制)以及概率排序等獲得最終的boundingbox。這樣就完成了在同一個點上獲得不同尺度不同比例的包圍盒。

輸出大小為:(N,4),這裡的 N與NMS以及概率排序閾值有關,得到的就是boundingbox的四個坐標。


anchor就只feature map上一個點,經過五層卷積之後,feature map 的大小時原圖的1/16,也就是說,原圖1000*600,經過卷積後得到的就是60*40的feature map,每個anchor上預測9個框,也就是我們得到60*40*9個propasal。選取不同尺度是因為目標的大小不同,選取不同的aspect是因為物體的形狀各異,為了更好的適應各個形狀


我認為實際上anchor並不算真正的多尺度。既不屬於圖像多尺度,也不屬於特徵多尺度。

Anchor 本質上是對網路輸出值的一個統一 ,讓結果輸出不管box大小都比較近似, 使得網路回歸更容易,從而使得結果更好。

Anchor 無非是作為網路輸出結果的一個係數數,有了這個係數,而得到最終的box。 比如,如果你有個w,h是10 的框, 還有個 w,h是1 的框, anhcor 10 和 anchor 1 會使得這兩個box的網路輸出值比較接近。


感覺樓上的回答並不能解釋為什麼,下面是我的理解。

這篇文章的核心就是通過網路計算region proposal,也就是要通過feature map去擬合每個對象的bounding box的4個參數。

  1. 最直接的辦法是:對於feature map上的每個window,如果裡面有某個真實的對象,那麼就用這個window的feature作為特徵擬合這個對象的bounding box的4個參數。這樣做至少有兩個問題:
    1. 第一個問題:如果window裡面有多個不同大小的對象怎麼辦?這個問題貌似不好解決。
    2. 第二個問題:如何調整scale?假設用L2(文章不是用的L2,但是基本意思一樣),如果是一個大的對象,我們可以允許L2比較大,如果是小對象L2應該比較小才可以。這個問題其實比較好解決,用對象的大小作為分母對L2做歸一化處理即可。
  2. 對上述兩個問題(特別是第一個問題)作者的解決辦法就是Anchor。
    1. 預先定義好不同大小,不同長寬比例的一些box(Anchor)。文中一共定義了9種。每個feature map上的window都對應9個這樣的anchor。
    2. 可以想像,原始圖像上的任意一個對象的bounding box都能在Feature map上找到某個window的某個anchor,使得二者在位置和大小上都能比較好的匹配。
    3. 如果一個window裡面有多個大小不同的對象,那麼就對應於這個window的不同的anchor。這就解決了第一個問題。
    4. 擬合的時候,歐式誤差都用anchor的大小做scaling,從而解決了第二個問題。注意文章中方程(2),裡面在計算box的中心位置的誤差的時候實際上只有w_a和h_a起作用(Anchor的長寬被用來做了scaling),x_a和y_a(Anchor的中心)會被cancel掉,是沒有作用的。在計算box的大小的時候,Anchor的參數沒有任何作用,全都被cancel掉了。


我在另一個答案下的回答。。。https://www.zhihu.com/question/265345106/answer/294410307

無恥的copy過來吧。。

提前聲明:::

文章為中英混合,英語部分均是專業領域內的術語,也是論文中的規範名詞,沒有其他原因,請各位口下留情。

正文

先更正下提問者的描述,yolo本身不含有anchor機制。

首先我們明確一個定義,當前主流的Object Detection框架分為1 stage和2 stage,而2 stage多出來的這個stage就是Regional Proposal過程,明確這一點後,我們繼續講。

Regional Proposal的輸出到底是什麼?

我們首先看一下以Faster R-CNN為代表的2 stage目標檢測方法

圖1

可以看到,圖中有兩個Classification loss和兩個Bounding-box regression loss,有什麼區別呢?

1、Input Image經過CNN特徵提取,首先來到Region Proposal網路。由Regio Proposal Network輸出的Classification,這並不是判定物體在COCO數據集上對應的80類中哪一類,而是輸出一個Binary的值p,可以理解為 pin[0,1] ,人工設定一個threshold=0.5。

RPN網路做的事情就是,如果一個Region的 pgeq0.5 ,則認為這個Region中可能是80個類別中的某一類,具體是哪一類現在還不清楚。到此為止,Network只需要把這些可能含有物體的區域選取出來就可以了,這些被選取出來的Region又叫做ROI (Region of Interests),即感興趣的區域。當然了,RPN同時也會在feature map上框定這些ROI感興趣區域的大致位置,即輸出Bounding-box

----打個比方----

我上午第四節課餓得不行,我就想著中午要吃什麼?附近好多西餐廳和中餐廳,餐廳里菜品有很多。但是我生活費不夠了。。gg。。不太想吃(吃不起)西餐,所以無論西餐廳里有什麼菜品,我都不會考慮;只有路過中餐廳時,我才會進去看看具體吃什麼菜。

----------真是尷尬的栗子----------

So, RPN網路做的事情就是,把一張圖片中,我不感興趣的區域——花花草草、大馬路、天空之類的區域忽視掉,只留下一些我可能感興趣的區域——車輛、行人、水杯、鬧鐘等等,然後我之後只需要關注這些感興趣的區域,進一步確定它到底是車輛、還是行人、還是水杯(分類問題)。。。。

你可能會看到另一對通俗易懂的詞語,前景(車、人、杯)背景(大馬路、天空)

圖2.天空和草地都屬於背景

圖3.天空和馬路也都是背景

啊 好的,到此為止,RPN網路的工作就完成了,即我們現在得到的有:在輸入RPN網路的feature map上,所有可能包含80類物體的Region區域的信息,其他Region(非常多)我們可以直接不考慮了(不用輸入後續網路)。


接下來的工作就很簡單了,假設輸入RPN網路的feature map大小為 64	imes64 ,那麼我們提取的ROI的尺寸一定小於 64	imes64,因為原始圖像某一塊的物體在feature map上也以同樣的比例存在。我們只需要把這些Region從feature map上摳出來,由於每個Region的尺寸可能不一樣,因為原始圖像上物體大小不一樣,所以我們需要將這些摳出來的Region想辦法resize到相同的尺寸,這一步方法很多(Pooling或者Interpolation,一般採用Pooling,因為反向傳播時求導方便)。


假設這些摳出來的ROI Region被我們resize到了 14	imes14 或者 7	imes7 ,那我們接下來將這些Region輸入普通的分類網路,即第一張Faster R-CNN的結構圖中最上面的部分,即可得到整個網路最終的輸出classification,這裡的class(車、人、狗。。)才真正對應了COCO數據集80類中的具體類別。

同時,由於我們之前RPN確定的box
egion坐標比較粗略
,即大概框出了感興趣的區域,所以這裡我們再來一次精確的微調,根據每個box中的具體內容微微調整一下這個box的坐標,即輸出第一張圖中右上方的Bounding-box regression。


整個Faster R-CNN網路就到此結束了,下面總結一下,同時也回答你的問題:

Region Proposal有什麼作用?

1、COCO數據集上總共只有80類物體,如果不進行Region Proposal,即網路最後的classification是對所有anchor框定的Region進行識別分類,會嚴重拖累網路的分類性能,難以收斂。原因在於,存在過多的不包含任何有用的類別(80類之外的,例如各種各樣的天空、草地、水泥牆、玻璃反射等等)的Region輸入分類網路,而這些無用的Region佔了所有Region的很大比例。換句話說,這些Region數量龐大,卻並不能為softmax分類器帶來有用的性能提升(因為無論怎麼預測,其類別都是背景,對於主體的80類沒有貢獻)。

2、大量無用的Region都需要單獨進入分類網路,而分類網路由幾層卷積層和最後一層全連接層組成,參數眾多,十分耗費計算時間,Faster R-CNN本來就不能做到實時,這下更慢了。


最後有個小小的說明,針對不了解Anchor的同學們,我在文中始終在說對於感興趣的區域「框定一個坐標」,這是為了便於理解,其實這樣說是不準確的。

具體就是:我們整張圖像上,所有的框,一開始就由Anchor和網路結構確定了,這些框都有各自初始的坐標(錨點)。所有後續的工作,RPN提取前景和背景,其實就是保留包含前景的框,丟掉包含背景的;包括後續的NMS,也都是丟掉多餘的,並非重新新建一個框

我們網路輸出的兩個Bounding-box regression,都是輸出的坐標偏移量,也就是在初始錨點的基礎上做的偏移修正和縮放,並非輸出一個原圖上的絕對坐標。

yolo有類似rpn的機制,那就是最後輸出時的confidence值,這個值決定了前景和背景。

ssd是將anchor機制融合在了1 stage模型中,原理與本文所述基本一致。

圖4.這張更能體現object detection的state-of-the-art

引用:

圖1.https://arxiv.org/abs/1506.01497

圖2、3、4均為在Google Image中找到原始圖像,我自己做的Object Detection並標註。

(-?_-?)我也不太懂為什麼我馬上期末考,現在還有時間碼字

########雖然不是大V,但是也花了一點時間寫,轉載請註明出處!########


由於ZF和VGG從輸入到最後一層卷積map輸出共縮小了16倍,因此對於1000*600的圖片,最後一個卷積層的map大小約為60*40,對於每個基準點有9個尺度的窗(anchor),故共有60*40*9大約2萬個anchor。可以參考我最近整理的筆記:

Faster-RCNN演算法精讀 - hunterlew的專欄 - 博客頻道 - CSDN.NET


沒看很明白,Anchor是一點逆推回圖像那麼1:1,1:2什麼的,還有Anchor的面積有什麼用?是在哪一步用到的?


第一次答題希望大家多提意見。先講講region proposal network,輸入是CNN的featuremap,輸出是一個矩形集合。這個矩形包括分類結果和置信度怎麼得到呢?那就要根據featuremap,進行估計。文章利用兩個卷積層。分別為n*n回歸和1*1的卷積層進行分類。本文中每個sliding窗口有三個尺度和三個縱橫比的region。這個anchor就是sliding window中間的點的不同的框,proposal就是預測的結果。


首先我們先確定一點就是proposals是候選框的意思,就是RPN的輸出;然後這張圖是整個RPN的流程,其中sliding window,雖然叫sliding window,但是其實真實的操作卻是一次3x3的卷積操作,得到一個256xHxW的特徵圖,也就是HxW個256維向量;而Anchor並不存在於這張圖中,Anchor是在原圖上的,HxW個256維向量,映射回原圖就有HxW個Anchor,然後以每個Anchor為中心「瞎編」一堆框,論文中是9個框;

具體請參考微信公共號:lanren_ai 中的懶人講Faster RCNN,裡面非常詳細~


slide window 是一個滑行窗口,anchor解說是一個錨,其實就是slide window在ZF網路輸出之後的feature map上滑行的中心點,因為5層卷積之後,圖片大小變成原來的1/16,所以為60*40,又因為anchor有3 scales和3 aspect ratios,組合就是9種大小,最後輸出為60*40*9也就是20k anchors


推薦閱讀:

目標檢測SSD相對於YOLO與faster-RCNN做了哪些改進?效果如何呢?
mxnet的並行計算為什麼這麼牛,是什麼原理?
現在tensorflow和mxnet很火,是否還有必要學習scikit-learn等框架?
為什麼在數據量較小的時候CPU計算會快於GPU?
PyTorch 有哪些坑/bug?

TAG:計算機視覺 | 目標檢測 | 深度學習DeepLearning | Caffe深度學習框架 |