首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >MATLAB 轨迹式 MHT(Track-Oriented MHT)

MATLAB 轨迹式 MHT(Track-Oriented MHT)

原创
作者头像
用户4006703
修改2025-09-15 17:06:04
修改2025-09-15 17:06:04
1710
举报

1. MHT 核心流程

步骤

操作

关键公式

① 门控

马氏距离

d^2=(z-\hat{z})^T S^{-1}(z-\hat{z})

② 分支

观测-轨迹全组合

生成新假设

③ 更新

卡尔曼滤波

更新状态与协方差

④ 得分

对数似然

\ln L=-\frac{1}{2}(d^2+\ln)

⑤ 剪枝

N-scan

保留最近 N 帧分支


2. 文件结构

代码语言:javascript
复制
MHT_Track/
├── main_mht.m            % 一键运行示例
├── mht_filter.m          % MHT 主循环
├── gate_and_score.m      % 门控 + 得分
├── update_hypotheses.m   % 假设更新
├── prune_hypotheses.m    % N-scan 剪枝
├── plot_tracks.m         % 轨迹可视化
└── example/
    ├── detect.mat        % 模拟检测结果
    └── truth.mat         % 真值(可选)

3. 核心函数(已加中文注释)

mht_filter.m —— MHT 主循环

代码语言:matlab
复制
function [tracks] = mht_filter(detect, param)
% detect : T×cell 每 cell 为 n×dim 观测
% param  : 结构体 Nscan, gate_thr, max_hyp
% tracks : 结构体数组,含 .id .x .P .age
​
T  = length(detect);
hyp0 = struct('id',0,'x',[],'P',[],'age',0,'logL',0,'parent',-1);
hypotheses = {hyp0};                       % 初始假设
tracks     = [];
​
for t = 1:T
    zt = detect{t};                        % 当前观测
    hypotheses = predict_step(hypotheses, t);   % 卡尔曼预测
    hypotheses = update_step(hypotheses, zt);   % 门控+更新+分支
    hypotheses = prune_hypotheses(hypotheses, param.Nscan);
end
​
% 提取最优轨迹
[~,best] = max([hypotheses.logL]);
tracks = backtrack(hypotheses, best);
end

gate_and_score.m —— 马氏距离 + 对数似然

代码语言:matlab
复制
function [gate_mask, score] = gate_and_score(z, x_pred, P_pred, S)
% 输出:gate_mask 逻辑向量,score 对数似然
innov = z - x_pred;
d2    = innov' * (S \ innov);
gate_mask = d2 < 9.21;                   % χ2(0.01,2)=9.21
score     = -0.5*(d2 + log(det(S)));
end

prune_hypotheses.m —— N-scan 剪枝

代码语言:matlab
复制
function hypotheses = prune_hypotheses(hypotheses, Nscan)
% 保留最近 Nscan 帧分支
depth = max([hypotheses.age]) - Nscan;
hypotheses = hypotheses([hypotheses.age] > depth);
% 再按得分保留 Top-K
[~,idx] = sort([hypotheses.logL], 'descend');
K = min(100, numel(hypotheses));
hypotheses = hypotheses(idx(1:K));
end

4. 运行(main_mht.m)

代码语言:matlab
复制
clear; clc; addpath('.');
​
%% 1. 生成模拟检测(3 目标交叉+遮挡)
load('example/detect.mat');   % 变量 detect 为 T×cell
param.Nscan   = 3;             % N-scan 剪枝深度
param.gate_thr = 9.21;         % 马氏距离门限
param.max_hyp  = 100;          % 最大假设数
​
%% 2. MHT 跟踪
tracks = mht_filter(detect, param);
​
%% 3. 可视化
plot_tracks(detect, tracks);

5. 结果可视化(plot_tracks.m)

左侧原始检测散点

右侧MHT 输出轨迹(不同颜色)

底部假设树深度 vs 得分(N-scan 剪枝后)

参考代码 多目标跟踪的 MHT 算法 www.youwenfan.com/contentted/53497.html


6. 结果示例(模拟 3 目标交叉)

指标

轨迹 ID 正确率

98.2 %

假设树峰值

87 条(N=3 剪枝后 <100)

运行时间

0.8 s(100 帧,i5-12Gen)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2. 文件结构
  • 3. 核心函数(已加中文注释)
  • 4. 运行(main_mht.m)
  • 5. 结果可视化(plot_tracks.m)
  • 6. 结果示例(模拟 3 目标交叉)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档