代码问题:SiameseFC

Posted 博闻强记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代码问题:SiameseFC相关的知识,希望对你有一定的参考价值。

【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

 

以上是关于代码问题:SiameseFC的主要内容,如果未能解决你的问题,请参考以下文章

WPF 音量拨号代码教程代码在我的代码中有问题,但在教程代码中没有问题

求SVM多类分类问题的代码,最好是MATLAB的完整代码

unity代码热更后异步代码有问题

关于解释MATLAB代码及相关问题?

低代码开发可以解决那些问题?

关于C++的一段代码问题