SiamBAN詳細分析,一看就懂!
整體把握
SiamBAN是今年CVPR中效果最好的跟蹤器之一,研究它的原理更加能夠很好的幫助我們掌握目前跟蹤器發展的趨勢。
SIamBAN,按照意思分析是孿生自適應框。“孿生”,說明該跟蹤使用了Siamese網路架構;而“自適應框”,則是該跟蹤器採用了anchor-free的策略,不預先設定anchor框的尺寸,使得框擁有更大強大的自由度。
通過分析論文和程式碼,我認為SiamBAN就是一個優化版的SiamRPN++,最大的創新點在於anchor-free的引用,去掉了預定義的anchor,從而使得模型整體的引數下降,使得速度得到進一步的提升。
對於SiamBAN的原理分析,我準備採用三個方面:網路框架、訓練、跟蹤。
網路框架
與SIamRPN++相似,或者說網路框架基本相同。不過不同點在於SiamBAN中引入了空洞卷積的原理,經過實驗證明,空洞卷積能夠增大感受野,提升跟蹤效能。
SIamBAN的網路框架如下圖所示:
通過上圖,可以發現網路分為兩個分支:搜尋分支和模板分支。
整體的執行原理:
- 將搜尋補丁和模板補丁輸入對應的網路分支,在第4、5個卷積模組中新增空洞卷積,膨脹因子分別設定為2和4。
- 分別取出搜尋分支和模板分支中第3、4、5卷積模組的卷積結果。為了減少計算量,作者只選取了模板分支卷積結果的 7 × 7 7\times7 7×7區域。因為當輸入補丁的尺寸為 127 × 127 127\times127 127×127,輸出的特徵圖的尺寸為 15 × 15 15\times15 15×15,這時候選取[4:11]的區域,完全可以代表模板中選定的物體。
- 將相對應的卷積結果進行互相關操作。比如,搜尋分支第3卷積模組的卷積結果應該與模板分支第3卷積模組的卷積結果進行互相關,其中模板分支的卷積結果作為卷積核。那麼,最後獲得了三份互相關的特徵圖。(上圖顯示)
- 將這三份互相關特徵圖合併為一張。SiamBAN在程式碼中使用的方法是取平均,即一個位置的三個值相加除以三。最後得到了一份互相關特徵圖。
- 實際上,當執行到第4步的時候,就可以發現其實網路執行就可以結束了。但是作者為了能夠減少計算量, 將互相關圖的維度減少到256.(neck)
細節補充
- 骨幹網路選取的ResNet-50。
- 三個互相關特徵圖的尺寸是一樣的。雖然他們是不同層的卷積結果,但是通過控制卷積核大小、padding、dilation、stride完全可以實現輸出的尺寸相同。可以參考下面輸出尺寸的公式:
H n e w = H o l d + 2 × p a d d i n g − d i l a t i o n × ( k e r n e l − 1 ) − 1 s t r i d e H_{new}=\frac{H_{old}+2\times padding-dilation\times (kernel-1)-1}{stride} Hnew=strideHold+2×padding−dilation×(kernel−1)−1
訓練
將搜尋補丁和模板補丁輸入網路後會得到二通道分類得分圖和四通道偏差座標圖。那麼,想要網路得到這樣的輸出就要對網路進行訓練。
分類訓練
正樣本代表分類特徵點為1,負樣本代表分類特徵點取值為0.
所謂分類訓練,指的就是教會網路分辨正樣本和負樣本的能力,在跟蹤過程中正樣本和負樣本的界定為跟蹤目標和其他。那麼界定方法的不同也就成為了區分不同訓練過程的關鍵。可以用下列圖表表示:
之前的SiamRPN中對於正負樣本的界定為特徵圖對應搜尋補丁上anchor與真實框的IOU分數。IOU>0.6的特徵點為正樣本,用1表示;IOU<0.3的特徵點為負樣本,用0表示。又因為樣本的數量太多可能會增加計算負擔,所以只挑選了最多16個正樣本,48個負樣本。特徵圖對應搜尋補丁上的anchor示意圖,如下所示:
右圖的anchor與真實框的IOU決定對應特徵圖上一點的正、負取值。
而對於SiamBAN而言,正負樣本的界定為如下圖所示:
從上圖中可以看到,在搜尋補丁上畫了兩個橢圓
E
1
、
E
2
E_1、E_2
E1、E2。它們以目標中心,分別以(
g
h
2
,
g
w
2
\frac{g_h}{2},\frac{g_w}{2}
2gh,2gw)、(
g
h
4
,
g
w
4
\frac{g_h}{4},\frac{g_w}{4}
4gh,4gw)為半徑,獲得橢圓(
g
w
、
g
h
g_w、g_h
gw、gh代表真實框的寬和高)。表示式為:
E
1
:
(
p
i
−
g
x
c
)
2
(
g
w
2
)
2
+
(
p
j
−
g
y
c
)
2
(
g
h
2
)
2
=
1
E
2
:
(
p
i
−
g
x
c
)
2
(
g
w
4
)
2
+
(
p
j
−
g
y
c
)
2
(
g
h
4
)
2
=
1
E_1:\frac{(p_i-g_{x_c})^2}{(\frac{g_w}{2})^2}+\frac{(p_j-g_{y_c})^2}{(\frac{g_h}{2})^2}=1\\ E_2:\frac{(p_i-g_{x_c})^2}{(\frac{g_w}{4})^2}+\frac{(p_j-g_{y_c})^2}{(\frac{g_h}{4})^2}=1
E1:(2gw)2(pi−gxc)2+(2gh)2(pj−gyc)2=1E2:(4gw)2(pi−gxc)2+(4gh)2(pj−gyc)2=1
規定在橢圓
E
2
E_2
E2內的部分為正樣本,橢圓
E
1
E_1
E1外的部分為負樣本,兩個橢圓之間的部分忽略。
因為在SiamBAN中特徵圖上的點與搜尋補丁上的點的對應關係為:
(
p
i
,
p
j
)
=
[
w
i
m
2
+
(
i
−
w
2
)
×
s
,
h
i
m
2
+
(
j
−
h
2
)
×
s
]
(p_i,p_j)=[\frac{w_{im}}{2}+(i-\frac{w}{2})\times s,\frac{h_{im}}{2}+(j-\frac{h}{2})\times s]
(pi,pj)=[2wim+(i−2w)×s,2him+(j−2h)×s]
其中
(
p
i
,
p
j
)
(p_i,p_j)
(pi,pj)為搜尋補丁上的座標,
w
i
m
、
h
i
m
w_{im}、h_{im}
wim、him為搜尋補丁的寬、高,
w
、
h
w、h
w、h為特徵圖的寬、高,
s
s
s為總步長(所有步長的乘積)。
那麼可以得到特徵圖上的點對映會搜尋補丁。落在搜尋補丁正樣本區域的點取正值,為1;落在負樣本區域的點取負值,為0.示意圖如下:
當正負樣本設定好後,損失函式的選取為通用的交叉熵函式。
迴歸訓練
之前SiamRPN中迴歸訓練遵循的原理為:
g
t
−
a
n
c
h
o
r
=
偏
差
gt-anchor=偏差
gt−anchor=偏差。通過比較預測偏差和實際偏差的損失來不斷逼近真實框。這種方法是基於anchor的迴歸。但是SiamBAN的作者認為人在觀察物體的時候並沒有anchor的存在,於是引入了anchor-free的策略進行迴歸。
在SiamBAN中,作者遵循的原理為:
g
t
−
搜
索
補
丁
的
坐
標
=
偏
差
gt-搜尋補丁的座標=偏差
gt−搜索補丁的坐標=偏差,即特徵圖對應搜尋補丁上每點與真實框四條邊的距離。
當我們通過網路獲得特徵圖對應搜尋補丁上每點與真實框四條邊的預測距離後,利用下面等式:
p
x
1
=
p
i
−
d
l
r
e
g
p
y
1
=
p
j
−
d
t
r
e
g
p
x
2
=
p
i
+
d
r
r
e
g
p
y
2
=
p
i
+
d
b
r
e
g
p_{x_1}=p_i-d_l^{reg}\\ p_{y_1}=p_j-d_t^{reg}\\ p_{x_2}=p_i+d_r^{reg}\\ p_{y_2}=p_i+d_b^{reg}\\
px1=pi−dlregpy1=pj−dtregpx2=pi+drregpy2=pi+dbreg
可以得出特徵圖對應搜尋補丁上每點預測框的左上角和右下角(注意理想情況下每點的預測框應該相同,因為原理中的偏差是每點與真實框的距離,那麼反推回來每點預測的應該都是真實框)。通過將左上角和右下角的轉換,可以得到特徵圖對應搜尋補丁上每點的預測框,進而也能得到預測框與真實框的IOU。利用迴歸損失函式:
1
−
I
O
U
1-IOU
1−IOU可以進行訓練。
跟蹤
- 輸入跟蹤視訊
- 劃定需要跟蹤的目標
- 跟蹤器初始化(第一幀的處理)
- 擷取模板補丁(方法與SiamRPN相同)
- 將模板補丁輸入網路,得到第3、4、5層的卷積結果,並且對卷積結果進行處理(降維和模板特徵圖擷取7x7區域)
- 進行跟蹤
- 擷取搜尋補丁(方法與SiamRPN相同)
- 將搜尋補丁輸入網路,得到第3、4、5層的卷積結果
- 與模板補丁的三個卷積結果進行相關卷積,並且將得到的三個互相關特徵圖進行加權平均,得到分類特徵圖和偏差座標圖。
- 利用上述公式(迴歸訓練中),將得到的偏差座標圖轉換成多個預測框
- 施加平移懲罰和尺度懲罰,從多個預測框中獲得最佳跟蹤框,從而實現跟蹤。
時間有限,如果想看具體的跟蹤過程,請留言告訴我,多的話我就把它寫出來。其實這個跟蹤過程跟SiamRPN差不多,那個看懂了這個自然沒問題。
相關文章
- 一看你就懂,超詳細 java 中的 ClassLoader 詳解Java
- Python爬蟲詳解(一看就懂)Python爬蟲
- 一看就懂的SpringSpring
- 一看就懂,Python 日誌模組詳解及應用Python
- vue中$nextTick詳細講解保證你一看就明白Vue
- 一看就懂的TCP握手和揮手TCP
- 新手一看就懂的執行緒池!執行緒
- 一看就會!超簡單詳細 ChatGPT 註冊與使用攻略ChatGPT
- ChatGPT 怎麼註冊最新詳細教程 新手小白一看就會ChatGPT
- 最全的python自學資源,一看就懂!Python
- 「經營分析報告」怎麼做?這套模板讓領導一看就懂
- 一看就懂之webpack高階配置與優化Web優化
- 一看就懂的Android APP開發入門教程!AndroidAPP
- 一看就懂的交換機基礎知識
- 小姐姐用動畫圖解Git命令,一看就懂!動畫圖解Git
- 如何做出讓玩家“一看就懂,一玩就會”的新手引導
- 一看就懂!【英雄聯盟銳雯】與 Python 詳解設計模式之門面模式Python設計模式
- 再次簡單明瞭總結flex佈局,一看就懂...Flex
- Windows程式通訊之一看就懂的匿名管道通訊Windows
- 保證你一看就懂的C語言指標模型C語言指標模型
- 一看就懂的:MySQL資料頁以及頁分裂機制MySql
- 一看就懂的氣泡排序和【3】步深度優化法排序優化
- 一看就懂的IdentityServer4認證授權設計方案IDEServer
- 一看就懂的python小程式-支援多執行緒聊天例項Python執行緒
- JWT 詳細分析JWT
- Https詳細分析HTTP
- 一看就懂,一寫就懵?搞懂回溯演算法,一口氣刷了20多道題演算法
- 看一遍就懂:MVCC原理詳解MVC
- 一看就懂【來自英雄聯盟蓋倫的怒吼】與 Python 詳解設計模式(二)觀察者模式Python設計模式
- sql學習:終於把sql case語句使用講明白了,一看就懂SQL
- 一看就懂!任務提交的資源判斷在Taier中的實踐AI
- JWT 超詳細分析JWT
- PE頭詳細分析
- 秒懂系列,超詳細Java列舉教程!!!Java
- 一看就懂的MySQL的聚簇索引,以及聚簇索引是如何長高的MySql索引
- CAS-一看就懂了點
- CanOpen報文詳細分析
- PE節表詳細分析