【SiameseFC】: L Bertinetto, J Valmadre, JF Henriques, et al. Fully-convolutional siamese networks for object tracking.[C] //ECCVW2016.
1. 網絡的通道維數問題
網絡的conv2的核的大小是5*5*48*256,但是conv1的輸出是96通道。同樣的情況發生在conv5,conv5的核的大小是3*3*192*256,但是conv4的輸出是384通道
解釋:推測采用了AlexNet中所用的group技術
按照AlexNet給出的Architecture,conv1的輸出分成2個group(48+48),然后conv2的核分成兩個部分(5*5*48*128和5*5*48*128),這樣conv2的核總共是5*5*48*128+5*5*48*128=5*5*48*256
conv2的輸出相對應與conv1的2個group就是2個128通道,合起來是256通道
相關參考:https://www.zhihu.com/search?type=content&q=imagenet%20group
以及 https://www.zhihu.com/question/52550307/answer/131299064
MatConvNet官方的Manual中也有相關的說明:
2. Tracker的運行結果明顯出錯,即使是跑deer這種很簡單的sequence也出錯。
這是一個很奇怪的現象。分析代碼發現在tracker_eval.m中對responseMap上采樣出錯。
三個尺度進行上采樣,有一個尺度的上采樣后的Map圖形明顯扭曲了
具體是這條代碼:
responseMapsUP(:,:,s) = imresize(responseMaps(:,:,s), p.responseUp, 'bicubic');
因為這里的Map的數據格式都是gpuArray。后來我換到CPU格式就好了。
把上面一條代碼替換成:
responseMaps_cpu=gather(responseMaps(:,:,s));
responseMapsUP_cpu=imresize(responseMaps_cpu, p.responseUp, 'bicubic');
responseMapsUP(:,:,s)=gpuArray(responseMapsUP_cpu);
按理說不應該有這樣的錯誤,不知道是不是和我機器的具體硬件有關。
或者說imresize對GPU格式數據的支持和具體硬件相關?2018.4.30
3.training的時候在vid_create_net.m文件中的add_block和add_block_conv_only函數中需要在info = vl_simplenn_display(net) 這句前加一句net=vl_simplenn_tidy(net);
2019.4.28
4.training的時候報錯
錯誤使用 vl_nnbnorm
The MOMENTS size does not match the DATA depth.
原因是MatConvNet在實現BN層后向傳播時候,計算完梯度后,就把動量清空了,而SiameseFC是孿生的,Layer28和Layer13實際上共享同一個BN層,在計算Layer28層后向傳播梯度后,直接清掉其動量,導出Layer13層無法計算。
所以修改MatConvNet的BatchNorm.m的backward代碼,把obj.moments = []這個給注釋掉即可。
2019.5.5