多目标跟踪 MDP Tracking 代码配置与运行

最近在研究多目标跟踪算法,虽然理论知识和相关概念还没能全部熟悉,但是还是来记录一下最近配置运行的MDP Tracking算法。开始是在MOT Challenge比赛(2D比赛,其数据地址:https://motchallenge.net/data/2D_MOT_2015/)上发现的这个算法,后来在GitHub上看到了开源的代码,说明也比较仔细。在windows上运行测试。


MDP Tracking算法的主页:http://cvgl.stanford.edu/projects/MDP_tracking/

代码地址:https://github.com/yuxng/MDP_Tracking


1、按照说明下载代码,并下载 2D MOT数据并解压;global.m文件中配置数据的路径,运行;

 

2、compile.m文件中配置opencv的路径和库目录;

compile.m文件中:

include = ' -Id:\opencv2.4.10\opencv\build\include\ -Id:\opencv2.4.10\opencv\build\include\opencv\ -Id:\opencv2.4.10\opencv\build\include\opencv2';
lib = ' D:\opencv2.4.10\opencv\build\x64\vc12\lib\*d.lib'

运行编译配置opencv环境,这里可能会因为这句话报错:eval(['mex lk.cpp -O' include lib]); 提示mex文件错误,是由于lk.cpp文件中宏定义方面问题。

 

3、修改lk.cpp文件;

将lk.cpp中开头部分以下地方注释:

//  #ifdef _CHAR16T
//  #define CHAR16_T
//  #endif

修改后compile.m编译通过。

 

4、运行代码。

运行MOT_cross_validation.m与MOT_test.m分别进行验证和测试。这里会出现svmtrain函数的问题,报错如下:



原因是代码中的svmtrain函数主要使用的是libsvm文件夹下的svmtrain.mexa64文件,但是MATLAB自带了svmtrain函数,在MATLAB中自带函数的优先级高于mex文件,因此没有使用此函数提高的svmtrain函数。


如上,svmtrain函数优先使用了MATLAB自带的函数。一般情况下不推荐自己的函数命名与MATLAB自带函数同名,因此,应该修改重新编译。

 

5、重新编译svmtrain.c。

1)在./MDP_Tracking-master/3rd_party/libsvm-3.20/matlab/文件夹中找到svmtrain.c文件,打开,将其中所有svmtrain修改成svmtrain1,并修改函数名为svmtrain1.c。
2)打开同一文件夹下的make.m文件,将其中所有svmtrain替换成svmtrain1,编译,获得新的mex文件(我在windows中运行,因此获得svmtrain1.mexw64文件)
3)替换MDP_Tracking代码中所有的svmtrain成svmtrain1,完成。

在此运行,通过,成功看到结果:


  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 78
    评论
当涉及到马尔科夫决策过程 (MDP) 的代码实现时,MATLAB 是一个非常强大的工具。下面是一个简单的 MDP 实现示例,其中包含状态转移概率、奖励函数和值迭代算法。 ```matlab % MDP参数 num_states = 3; % 状态数量 num_actions = 2; % 动作数量 % 状态转移概率矩阵 T = zeros(num_states, num_actions, num_states); T(1, 1, 2) = 1; % 从状态1执行动作1转移到状态2的概率为1 T(1, 2, 3) = 1; % 从状态1执行动作2转移到状态3的概率为1 T(2, 1, 1) = 0.5; % 从状态2执行动作1转移到状态1的概率为0.5 T(2, 1, 2) = 0.5; % 从状态2执行动作1转移到状态2的概率为0.5 T(2, 2, 3) = 1; % 从状态2执行动作2转移到状态3的概率为1 T(3, 1, 2) = 1; % 从状态3执行动作1转移到状态2的概率为1 T(3, 2, 3) = 1; % 从状态3执行动作2转移到状态3的概率为1 % 奖励函数 R = zeros(num_states, num_actions); R(1, 1) = 10; % 在状态1执行动作1获得奖励10 R(1, 2) = -1; % 在状态1执行动作2获得奖励-1 R(2, 1) = 0; % 在状态2执行动作1获得奖励0 R(2, 2) = 0; % 在状态2执行动作2获得奖励0 R(3, 1) = 0; % 在状态3执行动作1获得奖励0 R(3, 2) = 100; % 在状态3执行动作2获得奖励100 % 值迭代算法 gamma = 0.9; % 折现因子 epsilon = 0.01; % 收敛阈值 V = zeros(num_states, 1); % 初始化值函数 while true V_new = zeros(num_states, 1); for s = 1:num_states max_value = -Inf; for a = 1:num_actions value = R(s, a) + gamma * sum(T(s, a, :) .* V); if value > max_value max_value = value; end end V_new(s) = max_value; end if max(abs(V - V_new)) < epsilon break; end V = V_new; end % 打印值函数 disp("值函数:") disp(V) % 策略提取 policy = zeros(num_states, 1); for s = 1:num_states max_value = -Inf; max_action = -1; for a = 1:num_actions value = R(s, a) + gamma * sum(T(s, a, :) .* V); if value > max_value max_value = value; max_action = a; end end policy(s) = max_action; end % 打印策略 disp("最优策略:") disp(policy) ``` 这个示例中,我们定义了一个包含3个状态和2个动作的 MDP。我们使用值迭代算法来计算最优值函数和最优策略。代码打印出了值函数和最优策略。 请注意,这只是一个简单的示例,并且假设状态和动作是离散的。在实际应用中,可能需要根据具体问题进行相应的修改和调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值