代碼問題【SiameseFC//ECCVW2016】


【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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM