RPN遇到的坑

2021-10-05 21:24:22 字數 3211 閱讀 5034

要點1:在每個滑動視窗的中心(經過3x3卷積得到的點,該卷積層不改變feature map的大小,只是將周圍的資訊融合到中心點上,該中心點的可視野為3x3大小的vgg/zf特徵)**9種不同尺度大小的錨框(anchors)。這裡用的是zf的feature map 是256-d,而vgg的feature map 是512-d。

vgg_kernel =

512#如何實現anysize input

f_map_tile = input(shape=

(none

,none

,512))

#out: 1x1x512

convolution_3x3 = conv2d(

filters=

512,

#vgg 512, zf 256

kernel_size=(3

,3),

padding=

'same'

,

activation=

'relu'

, name=

"3x3"

)(f_map_tile)

#out: 1x1x512

output_deltas = conv2d(

filters=

4* k,

kernel_size=(1

,1),

#1x1卷積的作用?

activation=

"linear"

, kernel_initializer=

"uniform"

, name=

"deltas1"

)(convolution_3x3)

#out: 1x1x36

output_scores = conv2d(

filters=

2* k,

#能否換成1*k?

kernel_size=(1

,1),

activation=

"softmax"

, kernel_initializer=

"uniform"

, name=

"scores1"

)(convolution_3x3)

#out: 1x1x18

model = model(inputs=

[feature_map_tile]

, outputs=

[output_scores, output_deltas]

)

要點2:**乙個框有2種分類(前景和背景),用了2個編碼,使用softmax啟用函式,而我這裡用sigmoid啟用函式,0代表背景,1代表前景。這裡有乙個兩難的選擇,是將整個feature map放入,還是只放入1x1的feature map。這裡要提一下,vgg是有5層池化層,故32倍下取樣。

1、如果放入整個feature map的話,那麼**的是whk個錨框,在這些錨框中,很多是無關錨框(既不是iou>0.7的錨框,又不是<0.3的錨框),這些無關錨框也要餵入網路,但是不參與損失計算。更麻煩的是,我無法控制前景和背景的比例及數量,通過調節iou閾值來控制不是正確的方法,若要實現any size image 輸入,那麼就不能批量訓練了,得一張一張feature map喂。

2、如果只喂一部分feature map的話,我就很方便了,我只需選擇好前景和背景,然後將前景和背景按1:1的比例餵入網路即可,這樣乙個batch可以實現餵入多張影象。我用vgg16得到下取樣32倍的feature map,這已經算是高階特徵了,由feature map 的特徵點產生9個錨框(這9個錨框得保證不能都存在前景和背景框,所以iou閾值控制很重要),喂資料的時候,錨框和特徵點要對應起來。這樣做的話,3x3的卷積層就沒啥作用了,因為1x1的feature map用3x3卷積核卷積的結果還是自己的資訊。通過實驗,這個效果還行,缺點也是有的,因為32倍下取樣了,小物體資訊很容易丟失,小物體很難框到。

這裡就不翻譯了,還是原滋原味的好。

要點3:分類損失很簡單,使用分類交叉(categorical_crossentropy)作為損失函式即可。這裡主要**一下回歸損失。看下圖,回歸網路的輸出不是座標值,而是相對於錨框(anchors)的偏移值,用偏移值更利於網路的收斂,當回歸損失趨近0時,意味著**座標趨近於真實座標。

原文:variables x, xa, and x∗ are for the predicted box, anchor box, and ground-truth box respectively (likewise for y, w, h).

下圖的x=

總共會**大約300個框,我將最好的幾個框挑出來顯示,效果如下:

只看**,不去復現,很難理解**精髓和缺陷,需要兩者結合才有更好的效果,矩陣運算很重要,不會操作矩陣,程式設計寸步難行。最新的例項分割(parsing-rcnn),目標跟蹤(siamrpn++)等演算法都引用了rpn,rpn在faster-rcnn中首次提出,也使得faster-rcnn成為了當時最好的目標檢測演算法之一,但是yolo從v2版本就趕超了faster-rcnn,yolov2提到錨框思想,但最終沒有採納,用了另一種方式替代了它。目前yolo已經發展到v4了,成了工業上預設的目標檢測演算法,可見技術迭代之快。

如有需要,可參考**:

joda time遇到的坑

system.out.println datetime.parse 2015092408 datetimeformat.forpattern yyyymmddhh getmillis system.out.println datetime.parse 2015092408 datetime form...

Spring Websocket 遇到的坑

1 跨域問題 經查閱官方文件springwebsocket 4.1.5版本前預設支援跨域訪問,之後的版本預設不支援跨域,需要設定 setallowedorigins override public void registerwebsockethandlers websockethandlerregi...

打包遇到的坑

android studio 錯誤 com.android.dex.dexindexoverflowexception method id not in 0,0xffff 65536 gradle中引用的包太多 android dex最大索引範圍為65536個方法 一旦超過酒會報這種錯誤 那麼此時就...