MDP tracking学习心得

记录最近配置运行的MDP Tracking算法。
运行环境Win10 matlab2018a vs2017 opencv3.4.4
文中所提到的所有文件必须编译通过,可以运行,否则程序无法正常运行,不可以出现警告!
Vs版本与opencv版本必须匹配,不然无法通过编译!

参考了
多目标跟踪 MDP Tracking 代码配置与运行
的工作,并将大家容易出问题的地方进行补充
首先进行准备工作:

1、下载代码,下载数据集:

MDP tracking 算法主页:http://cvgl.stanford.edu/projects/MDP_tracking/
数据集是MOT Challenge比赛的数据集(2D_MOT_2015
数据集页面上需要下载Download里的1.3G数据文件和0.5MB开发套件devkit,
代码地址:https://github.com/yuxng/MDP_Tracking
其参考文献在算法主页中已贴出。

2、配置global.m文件中的数据路径。

Mot_paths配置为目标数据集根目录,将开发套件解压到根目录下。

function opt = globals()

opt.root = pwd;

% path for MOT benchmark
mot_paths = {'D:\2DMOT2015\'};
for i = 1:numel(mot_paths)
    if exist(mot_paths{i}, 'dir')
        opt.mot = mot_paths{i};
        break;
    end
end
......

运行,出现警告缺少devkit文件,需要将motchallenge_devkit文件夹中的motchallenge文件夹复制到数据集根目录下,并将其更名为devkit,消除警告。

3、配置compile.m文件中opencv的文件路径

因为MDP tracking算法的目标检测与追踪部分代码是基于TLD代码生成的,此部分配置可参考TLD代码配置步骤。Windows环境下运行修改参考以下代码:

function compile
    include = ' -IE: MDP_Tracking-master\files\opencv\build\include\ -IE: MDP_Tracking-master\files\opencv\build\include\opencv\ -IE: MDP_Tracking-master\files\opencv\build\include\include\opencv2\ ';  //配置opencv路径
    libpath = 'E: MDP_Tracking-master\files\opencv\build\x64\vc15\lib\';  //配置opencvlib路径
    

    files = dir([libpath '*.lib']);
    
    lib = [];
    for i = 1:length(files),
        lib = [lib ' ' libpath files(i).name];
    end
    //读取opencvlib目录下的所有lib文件
    eval(['mex lk.cpp -O' include lib]);
    mex distance.cpp 
    mex imResampleMex.cpp 
    mex warp.cpp
    //mex 指令编译cpp文件
disp('Compilation finished.');
//编译完成
    

此处需要注意:报错:eval([‘mex lk.cpp -O’ include lib]);
一、可能会出现opencvlib版本与vs版本不对应,就无法编译,我是用的是vs2017对应的就是vc15路径下的lib库。
二、修改lk.cpp文件,将lk.cpp文件开头部分一下注释,
// #ifdef _CHAR16T
// #define CHAR16_T
// #endif

4、运行MOT_cross_validation.m和MOT_test.m

会出现svmtrain函数报错问题,

原因是代码中的svmtrain函数主要使用的是libsvm文件夹下的svmtrain.mexa64文件,但是MATLAB自带了svmtrain函数,在MATLAB中自带函数的优先级高于mex文件,因此没有使用此函数提高的svmtrain函数。
解决方法一:将直接把libsvm路径配置到matlab
解决方法二:重新编译svmtrain.c
一、将Matlab运行目录修改为:/MDP_Tracking-master/3rd_party/libsvm-3.20/matlab/
找到svmtrain.c文件,将其中所有svmtrain改成svmtrain1,并修改函数名svmtrain1.c。打开文件夹中make.m文件,将所有svmtrain替换成svmtrain1,编译,获得新的mex文件(我的运行环境中是获得svmtrain1.mexw64文件)。
二、回到MDP tracking运行根目录下,搜索所有的svmtrain,替换为svmtrain1。

5、再次运行MOT_cross_validation.m,会出现imResample.m报错,提示内存超出。

Error using imResampleMex
Requested 863288426630x139672336465921x139675000218880 (17179869184.0GB) array exceeds maximum array size preference.
这里可能是因为代码原运行环境是32位,而我们使用的是64位。
Ps:字节顺序的差异
字节顺序指的主要是整型变量在内存中的存储方式。在计算机中,数据都是以二进制方式存储的,包括在内存和硬盘中。而计算机又以8位二进制作为一个存储单 元。在32位系统中,一个整型的存储需要四个存储单元。也就是说要把一个32位的整数分割成位四段分别进行存储,而每一段的存储位置就是字节顺序的差异。 为了清楚的表示每段存储的先后位置,我们用16进制来表示一段的值,下表列出了在Unix系统和Windows系统中整数20000在内存中的情况。
十六进制表示
0x00004E20
Windows内存表示
20 4E 00 00
Unix内存表示
00 00 4E 20

解决方案一:其中的imresample.cpp文件中对ns,ms,nch这几个变量的定义为Int整型,需要将其定义改为size_t,使其运行时使用8位,就可以解决。
解决方案二:对compile.m文件中的代码修改如下部分:
……
eval([‘mex -DMX_COMPAT_32 lk.cpp -O’ include lib]);
mex -DMX_COMPAT_32 distance.cpp
mex -DMX_COMPAT_32 imResampleMex.cpp
mex -DMX_COMPAT_32 warp.cpp
……
(我未测试,不过github一些用户可以通过此方法解决)

解决上述问题后,MOT_test.m与MOT_cross_validation.m均可以正常运行。

MOT_cross_validation.m运行结果如下:

mot_cross_validation.m运行结果1
mot_cross_validation.m运行结果二

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值