TLD(Tracking-Learning-Detection)学习笔记(三)

2014年11月10日

  在研究每个部分算法之前,我想先把源代码下载下来编译一下,看下运行的效果,也方便对照着源代码学习算法。在这里先说两点:1.感谢原作者以及各位大牛的开源精神。2.在我的电脑上的运行速度和原作者给出的示例视频相差十万八千里,不过效果还是不错的。

  接下来记录一下从零开始到运行成功过程中遇到的问题和解决方法,希望能为看到这篇文章的朋友提供一些帮助。

源码下载

  该算法原作者是用MATLAB写的代码,不过由于是开源的,已经有一些大牛用C++实现了,在这里提供几个可供下载的版本:

  1.原作者的MATLAB版本:

  https://github.com/zk00006/OpenTLD

  2.arthurv的c++版本:

  https://github.com/arthurv/OpenTLD

  这个是Linux版本,代码很规范,附有结构图。

  3.jmfs的c++版本:

  https://github.com/jmfs/OpenTLD

  与上一个的区别在于这个版本包含了工程文件,可以在Windows下编译运行,还有一点区别在于这个作者用了“videoInput”这个库,用来读取摄像头或者视频文件。本人目前使用的是这个版本的代码。

  还有一些其他版本的代码,在这里就不一一列举了,详见OpenTLD 未完成这篇博文。

路径修改

  编译环境:WIN7 64位+VS2010   依赖库:OpenCV2.4.8+CMAKE3.0

  代码下载下来之后,用VS2013(VS2010)打开TLD.sln。解决方案里包含了这样几个工程:

  除了ALL_BUILD之外,其他工程都需要修改路径。其中run_tld工程编译出的是可执行文件,ZERO-CHECK是为了检查CMAKE路径配置是否正确,其余4个工程编译出的是程序运行时需要的库。

  以tld工程为例:右键工程-属性-常规,这里输出目录生成的.lib文件存放的路径,可以用默认,也可以把前半部分修改为你工程存放的路径。C/C++-常规,这里附加包含目录要添加OpenCV的include目录以及工程的include目录。

  对于run-tld工程,除了前面说的,还有一些不同:右键工程-属性-常规,这里输出目录为可执行文件存放的路径。连接器-常规,这里的附加库目录要填写工程存放路径的lib文件夹以及OpenCV目录的lib文件夹。连接器-输入附加依赖项填加OpenCV的一系列库文件。连接器-调试,这里的生成程序数据库文件,最好和输出目录一样吧。

  至此,所有工程的路径应该都配置好了。其实工程属性里加粗字体的路径都是有可能要改的,大家看情况修改就好,对于有经验的朋友应该不难。

遇到的问题

  接下来右键ALL_BUILD工程-生成,好,不出所料,果然报错了:

  百度了一下,得益于这篇博客,设置了一下,查看详细的输出信息,注意到这里:

  这个CMake路径我是没有设置过的,应该是这里的路径错误。解决办法:右键ZERO_CHECK.vcxproj,用notepad打开,将原cmake.exe路径改为你的cmake.exe路径。重新生成,问题解决。

  不过又遇到了新的问题:

  同样是百度得到的答案:

  接下来又遇到这个问题:

  这个是IDE版本问题,我的电脑装有VS2010和VS2013,这里使用2013版本操作,但是选择2010版本编译,右键工程-属性-常规,平台工具集改为VS2010(v100),错误信息里的1600对应VS2010(v100),1800对应VS2013(v120)。

  好,这下没有错误了,生成成功,可以在之前设置过的输出路径里找到可执行文件。但是运行之后黑框闪了一下,没有做任何事。

  看了一下arthurv的github说明文档,原来是运行的时候需要附加参数:

  这里要注意可执行文件和yml文件、视频文件的路径关系,不要搞错了。

运行效果

  输入正确的参数,程序运行,但是,真的是卡出翔啊!大概两秒钟处理一帧的样子,这样真的能算是“实时”么?!看来原作者的测试机高出我不是一个等级……

  附上两个程序运行时的截图,内存占用大概在50-60MB的样子,Learning时CPU的一个核基本满负荷,单线程果然不给力啊,之后再看一下能否用CUDA优化。

未完待续

  程序的编译部分就写到这里,之后还是要回到算法本身,同时也可以结合代码来学习。