ECCV2016跟踪算法SiameseFC的配置(Fully-Convolutional Siamese Networks for Object Tracking)
文章和代码下载地址:
SiameseFC: Luca Bertinetto, Jack Valmadre, João F. Henriques, Andrea Vedaldi, Philip H.S. Torr. "Fully-Convolutional Siamese Networks for Object Tracking." ECCV workshop (2016). [paper] [project] [github]
预先环境设置:Ubuntu+GPU+MATLAB+CUDA
1、下载程序代码
https://github.com/bertinetto/siamese-fc
2、下载MatConvNet: CNNs for MATLAB
http://www.vlfeat.org/matconvnet/
推荐下载和作者一样的版本v1.0-beta20
3、下载预训练好的网络
http://www.robots.ox.ac.uk/~luca/siamese-fc.html
4、在工程目录下新建external_libs把下载的MatConvNet和预训练好的网络都放进去。
5、 解压matconvnet-1.0-beta20.tar.gz
# tar -zxvf matconvnet-1.0-beta20.tar.gz
6、打开matlab,进入/siamese-fc-master/external_libs/matconvnet-1.0-beta20/matlab路径
7、 编译vl_compilenn
(1)编译CPU版本,直接运行vl_compilenn即可。
(2)编译GPU版本,运行vl_compilenn('enableGpu', true)。
本文需要使用GPU,所以用方法(2)
9、可能遇到错误解决
如果直接就编译成功了可以跳过这一步骤。
遇到错误:error: function “atomicAdd(double *, double)” has already been defined
原因:cuda 8.0 提供了对atomicAdd的定义,但atomicAdd在之前的cuda toolkit中并未出现,因此一些程序重复定义了atomicAdd函数。
解决:把重复定义的函数注释掉或者使用宏定义。
(1)打开/siamese-fc-master/external_libs/matconvnet-1.0-beta20/matlab/src/bits/impl/pooling_gpu.cu更改第163行函数
添加宏定义更改为:
#if !defined(__CUDA_ARCH__) || __CUDA_ARCH__ >= 600
#else
static __device__ double atomicAdd(double* address, double val)
{
unsigned long long int* address_as_ull = (unsigned long long int*)address;
unsigned long long int old = *address_as_ull, assumed;
do {
assumed = old;
old = atomicCAS(address_as_ull, assumed,
__double_as_longlong(val +
__longlong_as_double(assumed)));
} while (assumed != old);
return __longlong_as_double(old);
}
#endif
(2)同理,打开/siamese-fc-master/external_libs/matconvnet-1.0-beta20/matlab/src/bits/impl/bilinearsampler_gpu.cu更改第25行函数。
10、运行vl_compilenn('enableGpu', true)编译成功
11、matlab进入目标/data/users/huangbo/Codes/siamese-fc-master/tracking/,去掉三个.m文件的.example后缀。
12、更改startup.m文件为:
13、更改env_paths_tracking.m为:
14、运行run_tracker('vot15_bag',1);得到跟踪结果