準備數據集時,需要exemplar圖和search圖(或稱爲instance圖),對應大小爲exemplar_size(比如127)和search_size(比如255)
這種處理有兩種形式
第一種,處理原始數據集階段:(參考https://github.com/STVIR/pysot/blob/master/training_dataset/vid/par_crop.py)
對於原圖x中的目標框[cx, cy, w, h],以目標爲中心, 確定一個稍大的正方形, 邊長爲s_z,計算公式如下:
wc_z = w + context_amount * (w+h)
hc_z = h + context_amount * (w+h)
s_z = np.sqrt(wc_z * hc_z)
context_amount是預設的值,爲0.5
定義scale_z
scale_z = exemplar_size / s_z
計算search圖相當於exemplar圖的pad大小
d_search = (和search_size - exemplar_size) / 2
得到s_x
pad = d_search / scale_z
s_x = s_z + 2 * pad
總結:s_x / s_z = search_size / exemplar_size
接着通過以下步驟裁剪模板圖和搜索圖:
1.使用中心點爲cx, cy邊長爲s_z和s_x的兩個正方形,分別用來crop模板圖exemplar和搜索圖search
crop的時候,如果正方形區域超出原圖邊界,就用像素均值填充
2.最後分別resize到exemplar_size和search_size,
得到exemplar圖imz, 大小爲exemplar_size * exemplar_size
得到search圖imx,大小爲search_size * search_size
如果訓練時不做augmentation,使用第一種就夠了
第二種,在代碼中準備dataset階段:(參考https://github.com/STVIR/pysot/blob/master/pysot/datasets/dataset.py)
對於exemplar圖:
對於原圖(這個原圖就是第一種中的搜索圖imx,大小爲255)中的目標框bbox[cx, cy, w, h],以目標爲中心, 確定一個稍大的正方形, 邊長爲s_z,計算公式如下【和第一種中的計算公式一樣】:
wc_z = w + context_amount * (w+h)
hc_z = h + context_amount * (w+h)
s_z = np.sqrt(wc_z * hc_z)
context_amount是預設的值,爲0.5
定義scale_z
scale_z = exemplar_size / s_z
然後要將目標框的bbox擴展到exemplar的尺度,具體計算如下:
w_new = w*scale_z
h_new = h*scale_z
這樣,到這一步exemplar圖在原圖imx中的稍大點的bbox就是[cx, cy, w_new, h_new]
總結:exemplar_size / s_z == w_new / w
【關鍵】最後對[cx, cy, w_new, h_new]在,原圖imx做augmentation,得到最終bbox爲[cx, cy, exemplar_size, exemplar_size],模板圖imz'爲用該bbox在imx中crop下的區域
對於search圖:
首先在exemplar圖附近幀中隨機選一幀, 所以search圖和exemplar圖的原始bbox可能不一樣
【前面和exemplar圖的處理一樣】,也是根據exemplar_size和s_z計算scale_z,得到[cx, cy, w_new, h_new]
只是在最後對[cx, cy, w_new, h_new]在原圖imx做augmentation的時候,目標大小是search_size,得到的搜索圖imx'是用該bbox在imx中crop下的區域
總結:
1.在第二種中,在代碼的dataset中只需要讀取搜索圖imx
2.兩種方式中的scale_z計算方式一樣,但是用途不一樣