要點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個方法 一旦超過酒會報這種錯誤 那麼此時就...