refinedet 論文筆記:
http://www.reibang.com/p/5504f4188d52
? ? ? ?紙上學來終覺淺并扇,繼上次讀完Refinedet論文后嘶窄,理論上理解了其中的原理,后面主要花了些功夫閱讀了源碼障贸,理解整個網絡的數據流程擂错。
? ? ? ?照例先上論文中的架構圖本鸣,在此我對里面做了一些標注
上面是ARM里4個特征圖的Size,左邊為320x320壮莹,右邊為512x512的原圖像輸入
網絡改動的地方翅帜,是在VGG16的"pool5"之后,添加了conv fc6命满,conv fc7涝滴,conv6_1以及conv6_2,還有ODM的[P6, P5, P4, P3], 其中
ARM部分
--conv fc6
通過在"pool5"上做了atrous convolution胶台,kernel_size = 3x3,stride = 3 , channel = 1024,其中stride=3指在map上兩兩相隔3-1=2 個步長歼疮,輸出的大小不變,channel為1024诈唬,見下圖即可明白:
1.應該同樣存在信息損失的情況韩脏,傳統(tǒng)conv如果stride為1,則會有一部分重疊铸磅,而dilation conv極大減少這點
2.主要為了在不損失信息的情況下增大感受野赡矢,而擴大conv的尺寸也可以,但參數會變得更多阅仔,而且conv的增大和感受野的增大是線性吹散,但dilation conv和感受野是指數增長
--conv fc7
在"conv fc6"之后做了kernel_size = 1x1,stride = 1 , channel = 1024的卷積操作,形狀與conv fc6 保持一致
--conv6_1
繼"conv fc7"之后八酒,做了kernel_size = 1x1,stride = 1 , channel = 256的卷積操作空民,size不變,channel為256
--conv6_2
"conv6_1"之后丘跌,kernel_size = 3x3,stride = 2 , channel = 512的卷積操作袭景,也就是說把尺寸縮小一半了,channel變成512
ODM部分
ODM部分主要通過TCB模塊轉換而成闭树,回顧一下TCB的流程:
Input (上方的箭頭)為ARM[conv 4_3耸棒,conv5_3,conv fc7报辱,conv6_2]与殃,輸出分別對應了ODM[P3, P4, P5, P6]
deconv這一步,傳入的實際是[P4 , P5 , P6],
根據網絡的架構圖幅疼,我們不難看出米奸,P6 是 首先生成的,而conv6_2的輸出已經是最高的feature map所以在conv6_2 到 P6 的TCB爽篷,沒有deconv這個操作(如下圖所示)
-- P6
因為是最高層的輸出悴晰,所以沒有deconv操作,自然也就沒Elte sum逐工,實際就是feature map經過3個kernel_size = 3x3,stride =1 , channel = 256铡溪,以及relu的卷積操作,size不變泪喊,channel 為 256
-- P5
與"P6"不同棕硫,TCB 有了deconv的輸入,就是P6袒啼。(P3,P4同理)
"conv fc7" 輸出的feature map 先經過一個 conv-relu和一個 conv 之后哈扮,再和 deconv后的P6 進行eltw_sum操作,而后接了一個relu蚓再,最后就是一個con_relu操作滑肉,從而得到P5
值得一提的是,TCB里的deconv对途,是把size加倍
-- P4 P3
原理一樣赦邻,看P5和 P6 即可明白
有一個細節(jié)就是當conv4_3,conv5_3層在做anchor 的預測亦或者是做TCB操作的時候為了防止反向傳播的剃度過大導致loss輸出nan实檀,這兩層會經過一個L2normlization操作然后分別擴大常量倍數惶洲,scale的值分別為10和8
ARM和ODM的feature map之后,執(zhí)行了類似的卷積操作膳犹。
ARM:1.kernel_size = 3x3, stride = 1 ,channel = num_anchor?4(坐標回歸)
? ? ? ????? 2.kernel_size = 3x3, stride = 1 ,channel = num_anchor?2(判斷前后景)
ODM:1.kernel_size = 3x3, stride = 1 ,channel = num_anchor?4(坐標回歸)
? ? ? ????? 2.kernel_size = 3x3, stride = 1 ,channel = num_anchor?num_cls(分類)
關于anchor
正樣本:選取IOU最大的一個anchor恬吕,以及剩下的IO>0.5的作為所有正樣本
負樣本:
這里開始對論文的理解不太深,不知道是自己理解問題還是作者表達不太清楚须床,現在可以可以總結出:
1.過濾掉所有負置信度>0.99的anchor铐料,換而言之,就是去掉很明顯就能判斷出是背景的anchor豺旬,如果保留了這些钠惩,模型能很快而且輕松的學到把anchor判斷為背景,這樣反而是不好的族阅,學習過程過于簡單而且快篓跛,模型的理解能力會很差。
2.相反坦刀,我們需要的是誤判為物品的anchor愧沟,分數越高蔬咬,證明偏差越大,把這些負樣本送進網絡訓練沐寺,告知模型難以判斷的錯誤林艘,能學習到更復雜的情況和更好的效果,總而言之就是讓模型盡可能學到更多混坞。
3.貌似在2的時候狐援,ARM并沒有把低分的score(誤判的)過濾掉,而是一起送進ODM拔第,最后ODM再結合loss計算把這些過濾掉
總體來說咕村,ARM中先第一次調整anchor的位置、尺度蚊俺,使之為ODM提供修正后的anchor;整體操作方式與RPN類似逛万,在參與預測的feature map每個位置上泳猬,密集采樣 n 個anchors,每個anchor的尺度宇植、長寬比是預定義好的得封,位置也是相對固定的;ARM就相當于RPN操作指郁,為每個anchor預測其相對位置偏置(relative offsets忙上,也即,對anchor原始位置的相對位移)闲坎,并預測每個anchor的objectness二分類得分疫粥,那么最終就得到了 n 個調整后的anchor,當然了腰懂,并不是所有anchor都被判定為包含目標梗逮,ARM就只需要篩選判別為目標的anchor,走下一步ODM的流程绣溜;
得到ARM調整的anchor之后慷彤,利用TCB得到anchor在feature map上新的特征,并在ODM上進一步實施類似SSD的操作怖喻,預測bbox的位置底哗、大小、具體類別等锚沸;操作就跟SSD很像了跋选,ARM、ODM上feature map的尺度一致咒吐,對ARM中每個判定為object的1-stage refined anchor野建,進一步輸出 C 類得分 + 2-stage refined anchor(也即4個坐標offsets)属划,輸出也與SSD保持一致,每個anchor對應C + 4維的輸出候生;
更多細節(jié)的東西以后再更