anchor boxes基本概念與作用:
feature map 上的一個點可以映射回輸入圖片上的一個點,以特征圖上這個點為中心,預先人為設定 k 個 boxes,這些 boxes 就稱為在這個點上生成的 k 個 anchor boxes(所有anchor boxes的中心點坐標是一樣的)。一個 m?nm*nm?n 的特征圖就有 m?n?km*n*km?n?k 個 anchor boxes。
anchor boxes 的作用是將 boxes 傳給 RPN, 讓 RPN 判斷其中哪些 anchor boxes 可能存在目標,并進一步回歸坐標,得到 proposals 輸給后面的網絡。模型回歸的目標是真實 boxes 與 anchor boxes 之間坐標的偏置。將偏置和 anchor boxes 的坐標帶入預先設定的公式中,就得到了最終預測的boxes坐標。
RPN
RPN的本質是 “ 基于滑窗的無類別obejct檢測器 ”。
對于提取候選框最常用的 SelectiveSearch 方法,提取一副圖像大概需要2s的時間,改進的 EdgeBoxes 算法將效率提高到了0.2s,但是這還不夠。候選框提取不一定要在原圖上做,特征圖上同樣可以,低分辨率特征圖意味著更少的計算量,基于這個假設,MSRA的任少卿等人提出RPN(RegionProposal Network, 區域候選網絡),完美解決了這個問題,它的主要功能是生成區域候選(Region Proposal)(可以看做是許多潛在的邊界框,也叫 anchor,它是包含4個坐標的矩形框),如上所示。
RPN簡單來說就是:假設輸入一張圖片,經過前面骨干網絡的一系列的卷積或者池化之后之后,得到一個尺寸 m?nm*nm?n 的特征圖(暫且不說通道),對應將原圖劃分為 m?nm*nm?n 個區域,原圖的每個區域的中心由這個特征圖上的一個像素點坐標表示。通過anchor機制,可以在每個像素點對應原圖的區域生成k個可能存在目標的候選框(稱為anchor box),如上圖所示(k=9)。RPN就是用來判斷每個像素點對應的k個區域是不是包含目標,如果包含(那么先根據輸出的坐標偏置修正box位置)則輸給后面的RCNN做進一步判斷。(意思就是要從mn9個候選框中做篩選,提取proposals)
RPN 的結構如下圖所示,backbone 輸出的特征圖經過一個 3?33 * 33?3 卷積之后分別進入了不同的分支,對應不同的 1?11 * 11?1 卷積。第一個卷積為定位層,輸出 anchor 的4個坐標偏移。第二個卷積為分類層,輸出anchor的前后景概率。
看完了rpn的大致結構,下面來看rpn的詳細過程。主要看一下,rpn是如何生成以及處理anchor的。下圖表示了rpn網絡的詳細結構。
第一步,生成基礎 anchor(base_anchor),基礎 anchor 的數目 = 長寬比的數目 * anchor 的縮放比例數目, 即 anchorsnum=len(ratios)?len(scales)anchors_num = len(ratios) * len(scales)anchorsn?um=len(ratios)?len(scales)。這里,設置了3種長寬比(1:1, 1:2,2:1)和3種縮放尺度(8, 16, 32),因此 anchor_num = 9. 下圖表示了其中一個位置對應的9個尺寸的 anchor。
第二步,根據 base_anchor,對特征圖上的每一個像素,都會以它為中心生成9種不同尺寸的邊界框,所以總共生成 60×40×9=2160060 \times 40 \times 9 = 2160060×40×9=21600 個anchor。需要注意的是,所有生成的 anchor 都是相對于原圖的。
牢記:特征圖上的每個點生成一個Anchors,Anchors 可以理解成9個不同的框(框的屬性是長寬了,再進一步是四個點的坐標)。這個框的數據(框的左上角坐標(x0,y0),右下角坐標(x1,y1))這四個值都是對應于原圖的。下面這個就是原圖,紅色點就是特征圖上的點對應于原圖的位置。每一個位置使用 9 個錨點,每個位置會生成 2×9 個目標分數和 4×9 個坐標分數。顯然,通過一個中心定義9個不同的框,就是為實現多尺度這個想法。當然這樣做獲得檢測框很不準確,后面會做2次 bounding box regression 修正檢測框位置。
第三步,anchor的篩選。首先將定位層輸出的坐標偏移應用到所有生成的 anchor,然后將所有 anchor 按照 前景概率/得分 從高到低進行排序。只取前 pre_nms_num 個 anchor(訓練階段),最后 anchor 通過 nms 篩選得到 post_nms_num(訓練階段)個anchor,也稱作 roi。
下面是卷積的具體過程
a.conv fetaure map 到 intermediate layer 的卷積過程
RPN網絡前面是一個提特征的網絡,比如VGG,Res等,傳給RPN網絡的是一個特征圖,其實也就是一個 tensor,比如用ZF網絡(論文里面用的)
輸入特征圖:13?13?25613*13*25613?13?256
拿到模型的特征,RPN網絡首先加了一個 3?3?256?2563*3*256*2563?3?256?256 步長為 1 的卷積層(可能是為了擴大感受野)
這樣就會得到 11?11?25611*11*25611?11?256 的輸出,前面 11?1111*1111?11 是圖形矩陣,其中每一個點在原圖中都是一個很大的區域,256表示這個區域的特征。
在這個區域內可能有目標,為了能更能逼近目標,我們需要3種尺度,和3種形狀,就是圖中的那9種物體框。假設原圖中有一個物體,那我們通過在原圖上平移框,就總能找到一個顏色框能正好把物體框在里面(真是厲害這想法),而且尺度啊形狀最接近。
那么如何平移的呢?在原圖上你一個像素一個像素平移沒意義啊,難道要重復提取特征?所以平移必須在特征圖上平移,因為特征圖最后總能映射回原圖。11?1111*1111?11 的特征圖區域,在原圖中就表示 11?1111*1111?11 個大黑框,每個大黑框里面又有9個小顏色框,這樣就會產生 11?11?911*11*911?11?9 個不同位置,不同尺度,不同形狀的物體框,基本足夠框出所有物體了。
b.intermediate layer 的256維向量后面對應兩條分支
- cls layer 分支是目標和背景的二分類(classification),因為k等于9,所以通過 1×1×256×181×1×256×181×1×256×18 的卷積核得到 2×9=182×9 = 182×9=18 個分數,分別是目標和背景的評分。
- reg layer分支。如果候選框是目標區域,就去判斷該目標區域的候選框位置在哪,這個時候另一條分支就過 1×1×256×361×1×256×361×1×256×36 的卷積得到 4×94×94×9 個值,每個框包含4個值(x,y,w,h),就是9個候選區域對應的框應該偏移的具體位置Δxcenter,Δycenter,Δwidth,ΔheightΔxcenter,Δycenter,Δwidth,ΔheightΔxcenter,Δycenter,Δwidth,Δheight。如果候選框不是目標區域,就直接將該候選框去除掉,不再進行后續位置信息的判斷操作。這里預測的值都是通過模型不斷訓練得到的。
c. proposals layer
proposals layer 3個輸入:一個是分類器結果 foreground softmax scores,一個是 anchor 回歸 regression:[dx(A),dy(A),dw(A),dh(A)][d_{x}(A),d_{y}(A),d_{w}(A),d_{h}(A)][dx?(A),dy?(A),dw?(A),dh?(A)] ,還有一個是 im-info,包含圖像縮放的信息。proposal layer 步驟:
- 生成 anchors(anchors 的坐標是相對于原圖的坐標),然后利用 [dx(A),dy(A),dw(A),dh(A)][d_{x}(A),d_{y}(A),d_{w}(A),d_{h}(A)][dx?(A),dy?(A),dw?(A),dh?(A)] 對所有的 anchors 做 bbox regression 回歸(這里的 anchors 生成和訓練時完全一致)
- 按照輸入的 foreground softmax scores 由大到小排序 anchors,提取前pre_nms_topN(e.g. 6000) 個anchors,即提取修正位置后的 foreground anchors。
- 判斷fg anchors是否大范圍超過邊界,剔除嚴重超出邊界fg anchors,剔除非常小(width<threshold or height<threshold)的 foreground anchors
- 進行 nms,按照 nms 后的 foreground softmax scores 由大到小排序fg anchors,提取前 post_nms_topN(e.g. 300) 結果作為 proposal 輸出。
總結起來就是:生成anchors -> softmax分類器提取fg anchors -> bbox reg回歸fg anchors -> Proposal Layer生成proposals。
anchors的標定規則
- 如果 Anchor 對應的 refrence box 與 ground truth 的 IoU 值最大,標記為正樣本;
- 如果 Anchor 對應的 refrence box 與 ground truth 的 IoU>0.7,標定為正樣本。事實上,采用第2個規則基本上可以找到足夠的正樣本,但是對于一些極端情況,例如所有的 Anchor 對應的 reference box 與 groud truth 的 IoU 不大于0.7,可以采用第一種規則生成.
- 負樣本標定規則:如果 Anchor 對應的 reference box 與 ground truth 的 IoU<0.3,標記為負樣本。
- 剩下的既不是正樣本也不是負樣本,不用于最終訓練。
- 訓練 RPN 的Loss是有 classification loss(即softmax loss)和 regression loss(即L1 loss)按一定比重組成的。
- 丟棄跨越邊界的 anchor;
Loss
計算 softmax loss 需要的是 anchors 對應的 ground truth 標定結果和預測結果,計算regression loss 需要三組信息:
- 預測框,即 RPN 網絡預測出的 proposal 的中心位置坐標x,y和寬高w,h;
- 錨點 reference box:之前的9個錨點對應9個reference boxes,每一個reference boxes都有一個中心點位置坐標 xa,yax_a,y_axa?,ya? 和寬高 wa,haw_a,h_awa?,ha?;
- ground truth:標定的框也對應一個中心點位置坐標x,y和寬高w,h.因此計算regression loss和總Loss方式如下:
note
- 只有在train時,cls+reg 才能得到強監督信息(來源于ground truth)。即ground truth會告訴 cls+reg 結構,哪些才是真的前景,從而引導cls+reg結構學得正確區分前后景的能力;在 reference 階段,就要靠 cls+reg 自力更生了。
- 在train階段,會輸出約2000個proposal,但只會抽取其中256個proposal來訓練RPN的cls+reg結構;到了reference階段,則直接輸出最高score的300個proposal。此時由于沒有了監督信息,所有RPN并不知道這些 proposal 是否為前景,整個過程只是慣性地推送一波無tag的proposal給后面的Fast R-CNN。
- RPN的運用使得region proposal的額外開銷就只有一個兩層網絡。
- two stage型的檢測算法在 RPN 之后還會進行再一次的分類任務和邊框回歸任務,以進一步提升檢測精度。
- 在 RPN 末端,通過對兩個分支的結果進行匯總,來實現對 anchor 的初步篩除(先剔除越界的 anchor,再根據 cls 結果通過NMS算法去重)和 初步偏移(根據 bbox reg結果),此時輸出的都改頭換面叫 proposal 了。
- RPN之后,proposal 成為 RoI (感興趣區域) ,被輸入 RoIPooling 或 RoIAlign 中進行 size上的歸一化。當然,這些都是 RPN網絡 之后的操作了,嚴格來說并不屬于 RPN 的范圍了。
- 但是如果只在最后一層 feature map 上映射回原圖像,且初始產生的 anchor 被限定了尺寸下限,那么低于最小 anchor 尺寸的小目標雖然被 anchor 圈入,在后面的過程中依然容易被漏檢。
- 但是FPN的出現,大大降低了小目標的漏檢率,使得RPN如虎添翼。
從模型訓練的角度來看,通過使用共享特征交替訓練的方式,達到接近實時的性能,交替訓練方式描述為: 1)根據現有網絡初始化權值w,訓練RPN; 2)用RPN提取訓練集上的候選區域,用候選區域訓練FastRCNN,更新權值w; 3)重復1、2,直到收斂。
參考:
- https://blog.csdn.net/ying86615791/article/details/72788414
- https://www.cnblogs.com/chaofn/p/9310912.html
- ttps://blog.csdn.net/sinat_33486980/article/details/81099093#commentBox