文章和代码下载地址:
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
GitHub - bertinetto/siamese-fc: Arbitrary object tracking at 50-100 FPS with Fully Convolutional Siamese networks.
Home - MatConvNet
推荐下载和作者一样的版本v1.0-beta20
SiameseFC tracker
# tar -zxvf matconvnet-1.0-beta20.tar.gz
(1)编译CPU版本,直接运行vl_compilenn即可。
(2)编译GPU版本,运行vl_compilenn('enableGpu', true)。
本文需要使用GPU,所以用方法(2)
如果直接就编译成功了可以跳过这一步骤。
遇到错误: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行函数。
注意必须使用学校邮箱,edu.cn结尾那种邮箱。
http://www.image-net.org/download-images
(1)选择2015数据集
(2) 选择VID
(3) 选择完整数据集
目的:将数据集变成如下的训练图像对,超出的部分进行RGB均值补充
(1)拷贝文件
1)将/home1/publicData/ImagenetVID/ILSVRC/Data/VID/路径下的val文件夹拷贝到/home1/publicData/ImagenetVID/ILSVRC/Data/VID/train/路径中。
2)将/home1/publicData/ImagenetVID/ILSVRC/Annotations/VID/路径下的val文件夹拷贝到/home1/publicData/ImagenetVID/ILSVRC/Annotations/VID/train/路径中。
(注:原文将train路径下的文件夹重命名为(a)(b)...来减少路径长度,因为此数据集在服务器上是公用的,所以我没有那样做)
(2)生成文件目录
终端运行./video_ids.sh /home1/publicData/ImagenetVID/,注意对照下图中的两个目录更改
(3)matlab运行
per_frame_annotation('/home1/publicData/ImagenetVID/ILSVRC/', 0)
per_frame_annotation('/home1/publicData/ImagenetVID/ILSVRC/', 1)
per_frame_annotation('/home1/publicData/ImagenetVID/ILSVRC/', 2)
per_frame_annotation('/home1/publicData/ImagenetVID/ILSVRC/', 3)
per_frame_annotation('/home1/publicData/ImagenetVID/ILSVRC/', 4)
一共运行5次,注意路径。
It's a long time to wait................
这一步骤的目的是生成一一对应的TXT,下图中的TXT文件都是这四行代码生成的
(4)运行
parse_objects('/home1/publicData/ImagenetVID/ILSVRC/', 0)
parse_objects('/home1/publicData/ImagenetVID/ILSVRC/', 1)
parse_objects('/home1/publicData/ImagenetVID/ILSVRC/', 2)
parse_objects('/home1/publicData/ImagenetVID/ILSVRC/', 3)
parse_objects('/home1/publicData/ImagenetVID/ILSVRC/', 4)
一共运行5次,注意路径。
(5)运行
vid_setup_data('/home1/publicData/ImagenetVID/ILSVRC/')保存imdb_video.mat数据。
(6)复制数据集的目录结构
cd /home1/publicData/ImagenetVID/ILSVRC/ && find . -type d -exec mkdir -p -- /home1/publicData/NewData/{} \;
注意/home1/publicData/ImagenetVID/ILSVRC/为数据集原所在目录,/home1/publicData/NewData/为你新建的目录,这个新建的目录就是存放裁切之后的图像位置。
(7) 运行
imdb_video=load('imdb_video.mat')
save_crops(imdb_video, 1, 4404, '/home1/publicData/ImagenetVID/ILSVRC', '/home1/publicData/NewData')
注意/home1/publicData/ImagenetVID/ILSVRC为数据集原所在目录,/home1/publicData/NewData为上一步骤新建的目录
存放的结果如图:
(8) 打开vid_image_stats.m
在函数首添加路径:
addpath('../external_libs/matconvnet-1.0-beta20/matlab/mex/');
在函数尾部添加:
save('vid_image_stats.mat', '-struct', 'stats', '-v7.3');
运行vid_image_stats(imdb_video, 0.1, '/home1/publicData/NewData/Data/VID/train/')得到vid_image_stats.mat文件。
(1)进入路径/siamese-fc-master/training/,去掉那三个.example后缀。
(2)打开env_paths_training.m更改路径
(3)打开startup.m更改路径,然后运行startup.m
(4)运行run_experiment(imdb_video)开始训练
如果 imdb_video不在工作空间,则需要提前运行imdb_video=load('imdb_video.mat')将数据加载到工作空间。
至此,SiameseFC网络训练步骤结束,等待计算结果就好了。