说明:该系列博客源码链接为:https://github.com/bilylee/SiamFC-TensorFlow,是实验室同小组的师兄用TensorFlow实现SiameseFC算法的最终公开版本,经过了长时间的打磨,各个模块功能明确,整体可读性和可移植性极好,我相信这对做Tracking的小伙伴来说,是个入门SiameseFC Tracker的特别好的选择。哈哈,觉得代码很棒的小伙伴们可以点个Star哦,也欢迎交流学习和指教。
这篇博客主要的目的就是简单地跑一下实验,让下载的代码能用预训练的模型去测试单个视频,并对结果可视化,从视觉上感受一下这个跟踪算法的效果,至于如何准备训练数据,如何构建自己的模型,以及如何评估自己的模型等,这些问题都将在后面的系列博客中慢慢道来。
1: SiameseFC-TensorFlow环境配置
可参考源码中的说明,这里将截图放在这里,大家自行准备可运行的环境。
2:预训练模型下载转换和测试
可参考源代码中的说明,这里也给个截图,然后主要对一些文件做一些详细一点的注解。内容主要有预训练模型和测试视频的下载,模型转换以及转换前后的模型对比检验,视频的测试和结果的可视化。
核心文件:scripts/download_assets.py
核心功能:下载SiameseFC的matlab版本预训练模型,同时下载用于测试的单个视频。
2.2
核心文件:experiments/SiamFC-3s-color-pretrained.py、SiamFC-3s-gray-pretrained.py
相关文件:scripts/convert_pretrained_model.py,utils/train_utils.py
核心功能:将siameseFC的color和gray模型由matlab格式转换成tensorflow方便读取的格式。
就从最外边的实验封装文件慢慢往里看吧:experiments/SiamFC-3s-color-pretrained.py
模型转换实验文件:scripts/convert_pretrained_model.py
# 这是模型初始化的一个方法,后面的给出具体调用了啥函数 else: logging.info('Restore from last checkpoint: {}'.format(model_path)) sess.run(tf.local_variables_initializer()) saver.restore(sess, model_path) start_step = tf.train.global_step(sess, model.global_step.name) + 1 checkpoint_path = osp.join(train_config['train_dir'], 'model.ckpt') saver.save(sess, checkpoint_path, global_step=start_step) # 保存为.ckpt
这里贴出model.init_fn的内容吧,且先不要深究siamese_model.py里面的其他内容
def setup_embedding_initializer(self): """Sets up the function to restore embedding variables from checkpoint.""" embed_config = self.model_config['embed_config'] if embed_config['embedding_checkpoint_file']: # 上面说过模型转换的时候是有设置matlab文件路径的 # Restore Siamese FC models from .mat model files # 这才是加载.mat model的函数 initialize = load_mat_model(embed_config['embedding_checkpoint_file'], 'convolutional_alexnet/', 'detection/') def restore_fn(sess): # 初始化方式,下面赋值给self.init_fn了 tf.logging.info("Restoring embedding variables from checkpoint file %s", embed_config['embedding_checkpoint_file']) sess.run([initialize]) self.init_fn = restore_fn
所以到这里,我们就真正进入到如何转换.mat为.ckpt文件了:
load_mat_model函数在utils/train_utils.py文件里,这里还是贴一下这个文件里的内容吧。
上面代码中的一些语句的具体含义可以自己利用.mat数据慢慢体会,琢磨一会应该就ok了。
到此为止,我们的模型算是已经转换为.ckpt格式的了,按理说就可以用着个模型直接进行测试评估了,但在此之前,我们往往还需要做的一件事就是确定我们转换得到的.ckpt是没有问题的,进入下一节验证.ckpt没有问题之前把.mat格式的模型截个图看看长什么样,更具体的细节这里就不展开了。
核心功能:输入同一张图片01.jpg,SiameseFC-TensorFlow代码加载.mat和转换后的.ckpt模型时运算得到01.jpg的feature map均和原作者matlab版本代码计算得到的feature map相同(差异及其的微小),如此一来既验证了网络设计没问题,同时也验证了.mat模型转换为.ckpt模型时没有问题。
上面验证代码大体逻辑很清晰,至于模型构建的内容在此可以先跳过,后面再详细讲讲,下面是运行该测试脚本的结果截图,上面是.mat结果,下面是.ckpt结果,可以看到这两个结果是一样的:
核心文件:scripts/run_tracking.py
核心功能:用预训练模型在新的视频上进行测试,视频是上面下载过测KiteSurf。
这份代码涉及到后面的视频测试,这里先只需要会用该脚本就好,你只要会到对应的log 路径下找到你对应视频测试的一些保存结果就好,因为这些结果都是后面可视化的数据,至于保存的数据是什么,保存数据的这个代码在哪个文件里后面自然会涉及到。
好了,你现在已经可以用预训练模型测试你想测试的视频了,接下来为了能更好地分析问题,将你测试的一些结果都进行可视化,在此之前还是瞧瞧咱们测试前后都有哪些数据输入和输出:
输入:解压缩之后的KiteSurf,包括了存在img文件夹中的图像数据和配置文件.cfg和groudtruth_rect.txt文件。
输出:每张图片跟踪到的目标的bbox和scale,以及每张图片的respones响应,还有crop出来的图片,最后呢就是像groundth_rect.txt一样的一个跟踪结果文件track_rect.txt。
核心文件:scripts/show_tracking.py
核心功能:模型测试跟踪,这里也先只贴出文件内容,且先不深究。
运行show_tracking.py脚本你应该就能得到这么一个视频,下面是两个截图,左上角是crop出来的图片,右上角是对应的响应图,下面是视频帧中原始的图片。有了上面的一些可视化结果你就很方便进行下一步的分析了,比如上面两个图片中第一个中的响应比第二个要小很多,从crop的图片来看,很容易分析出人的侧脸且低头并有一定的运动模糊导致最后的响应偏低,对于其他视频也是可以如此分析的。如果你想测试其他的视频分析跟踪效果,可以去下载OTB100,VOT等数据集上的视频进行评估。
3:小结
1:这篇博客看到这里,你可以了解的有:
(1)预训练模型有哪些,如何下载;
(2)如何将.mat格式模型转换为.ckpt格式模型并大致知道模型里面都有哪些参数,如何验证转换是否正确;
(3)在不需要深入了解模型设计、训练、测试和评估的基础上 能够利用已有脚本对单个视频进行测试和可视化分析。
2:这篇博客只谈到了预训练模型的测试问题,那么接下来还会进一步介绍的有:
(1)数据预处理:如果要自己重新训练模型,用什么数据,又该如何进行预处理?
(2)模型设计:SiameseFC模型具体是什么样的?比如说网络结构是怎样的,Loss怎么构建等。
(3)模型训练:如何训练自己的模型?比如说数据怎么加载,怎么设置参数训练等。
(4)模型评估:单个视频测试的具体实现以及如何在OTB数据集上进行评估等。
3:好了,到这了呢基本上第一篇就写完了,代码贴的可能有点多,当然可能有很多疏漏的地方,欢迎指教和交流,我是认为这份代码是相当棒的,尤其是对于做跟踪的小伙伴而言,大家要是也这么觉得,那就点个Star吧,哈哈。