【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