DP-TBD目标跟踪原理

创建于:2024年12月16日

使用 O1 回答 Chat01

问题

% DP-TBD for single target tracking %
%假设过程噪声和量测噪声均为0均值高斯白噪声
% 作者:郭振
% 时间:2014/3/19
%% clear all
clear
clc
close all

%
% rand('state',sum(100clock)); % Shuffle the pack!
% randn('state',sum(100
clock)); % Shuffle the pack!

%% step1 initialization
K=10; %帧数
ss = 5; % state size X=[x,dot_x, y, dot_y, z]
os = 3; % observation size Y=[x ,y ,I]

X=zeros(ss,K); %状态
I=zeros(K); %各帧状态对应的值函数
S=zeros(K); %存储各帧之间的状态转移关系

Nx=100; %径向距离分辨单元
Ny=100; %切向距离分辨单元

DeltaX=200; %设一个分辨单元大小为20
DeltaY=200;

%% simulation condition
T_step=2.5;
F = [1 T_step 0 0 0; 0 1 0 0 0; 0 0 1 T_step 0; 0 0 0 1 0;0 0 0 0 1]; % 目标状态转移矩阵
Q_CV=[T_step^3/3 T_step^2/2 0 0 0 ;T_step^2/2 T_step 0 0 0;... % 过程噪声方差矩阵
0 0 T_step^3/3 T_step^2/2 0;0 0 T_step^2/2 T_step 0; 0 0 0 0 1/T_step];

q_CV=10; % 连续过程噪声的能量谱密度
q_I=10; % 目标回波信号能量变换速度的功率谱密度
Q=Q_CV*diag([q_CV q_CV q_CV q_CV q_I]);
Sigma=Q; %状态为5维时的过程噪声
FFourDim=F(1:4,1:4);
processNoise =sample_gaussian(zeros(length(Q),1),Q,K);% Note ' here! state_noise_samples is: ss-Total_time

Mach=340;

initx = [20000 -1.5Mach 20000 -1.6Mach 20000]';
x(:,1) =initx; % Initial state.
for t=2:K
x(:,t)=F*x(:,t-1)+processNoise(:,t); % For CV Model.
end
% figure(1) %目标运动轨迹
% plot(x(1,:),x(3,:))
%% 产生量测(像素点平面数据)
Theta=1; % 背景噪声方差
BGNosie=BackgroundNoise(Nx,Ny,K,Theta);% 背景噪声

Data_target=zeros(Nx,Ny,K);

SNR=10;
Power_noise_av=1;
Power_target_av=10^(SNR/10)*Power_noise_av; % The average of Target Power.
s=1; % extent of blurring
Lx=1; % x方向上的目标影响力的衰减速度
Ly=1; % y方向上的目标影响力的衰减速度
for t=1:K
IndexX=ceil(x(1,t)/DeltaX);
IndexY=ceil(x(3,t)/DeltaY);

Buf=Power_target_avexp(1irand(1)2pi); %Yiwei' definition
Data_target(IndexX,IndexY,t)=Data_target(IndexX,IndexY,K)+Buf;

% for i=(IndexX-1):(IndexX+1)
% for j=(IndexY-1):(IndexY+1)
% if(0<=i)&(i<=100)&(0<=j)&(j<=100)

             %Salmond's definition

% Buf=DeltaX^2Power_target_av/2/pi/(s)^2...
% exp((-(iDeltaX-x(1,t))^2-(jDeltaY-x(3,t))^2)/2/(s)^2)
% Data_target(i,j,t)=Data_target(i,j,t)+Buf;

             % Yiwei's definition

% Buf=Power_target_avexp(1irand(1)2pi)...
% exp((-(i
DeltaX+0.5-x(1,t))^2Lx/2/DeltaX-(jDeltaY+0.5-x(3,t))^2*Ly/2/DeltaY));
% Data_target(i,j,t)=Data_target(i,j,t)+Buf;
% end
% end
% end
end

DataScan=BGNosie+Data_target; % 目标幅度与背景噪声组成量测的幅相信息,量测的位置位于分辨单元的中心位置
Data_Add=abs(DataScan);
Data_Add=sum(DataScan,3);
% mesh(abs(Data_Add))
%
% figure(2)
% image(abs(Data_Add))
%% step2 recurrence accumulation
% 求使值函数最大的

%% 航迹数据结构

Point.Value=0;
Point.LastPointPosition=[0 0];
Point.LastPointIndex=0;
Point.State=[0 0 0 0];
Point.Intensity=0;
Point.Position=[0 0];
Point.OtherPointSetIndex=0;

Track.Step=0;
Track.Value=0; %航迹的值函数

% CandidateTrack;
% DeclaredTrack;
%% 第一帧数据单独处理

% 选取强度超过一定阈值的单元为航迹头单元
DataScanBuf=abs(DataScan(:,:,1));
DetectThreshold=5; %幅度检测阈值
[MaxBufOne RowIndexBuf]=max(DataScanBuf); % 寻找每一列中最大元素
[MaxBufTwo ColumnIndex]=max(MaxBufOne); % 寻找矩阵中最大元素
RowIndex=RowIndexBuf(ColumnIndex);
Flag=0;
while(MaxBufTwo>DetectThreshold)
%将该航迹头数据保存
Point.Value=0;
Point.LastPointPosition=[0 0];
Point.State=[(RowIndex-0.5)DeltaX -1.5Mach (ColumnIndex-0.5)DeltaY -1.6Mach MaxBufTwo]';

text
Xk=Point.State; IndexX=ceil(Xk(1)/DeltaX); IndexY=ceil(Xk(3)/DeltaY); Point.Position=[IndexX IndexY]; Point.Intensity=DataScan(RowIndex,ColumnIndex,1); Point.OtherPointSetIndex=1; Track.PointSet(1).Point=Point; % 这个变量其实没用 Track.PointSet(1).OtherPointSet(1)=Point; Track.Step=1; if Flag==0 CandidateTrack(1)=Track; Flag=1; else CandidateTrack=[CandidateTrack Track]; end % 下一个航迹头处理 DataScanBuf(RowIndex,ColumnIndex)=0; %将处理过的最大元素值赋0 [MaxBufOne RowIndexBuf]=max(DataScanBuf); % 寻找每一列中最大元素 [MaxBufTwo ColumnIndex]=max(MaxBufOne); % 寻找矩阵中最大元素 RowIndex=RowIndexBuf(ColumnIndex); % MaxBufTwo为最大元素的值

end
%% 从第二帧数据开始迭代贝叶斯处理
for k=2:K
% 目标状态的预测,将预测得到的16个状态值存储在OtherPoint中
%暂时做单目标处理
if (CandidateTrack(1).Step==1)
LastPoint=CandidateTrack(1).PointSet(1).Point;
Xk=LastPoint.State;
[XX] = StatePrediction(F,Xk,T_step);
LastPointValue=LastPoint.Value;
MaxValue=-10000000; %

text
LastIndexX=ceil(Xk(1)/DeltaX); LastIndexY=ceil(Xk(3)/DeltaY); for i=1:16 %对16个预测状态进行值函数计算 % 计算该状态的值函数 IndexX=ceil(XX(1,i)/DeltaX); IndexY=ceil(XX(3,i)/DeltaY); Xkk=F*Xk; LogPdfxkk_xk=1/((2*pi)^2*sqrt(det(Sigma)))*exp(-0.5*(XX(:,i)-Xkk)'/Sigma*(XX(:,i)-Xkk)); LogPdfzkk_xkk=1/(sqrt(2*pi))*exp(-(abs(DataScan(IndexX,IndexY,k))-Power_target_av)^2/2); %量测噪声的分布,这里的表示有问题!!!!!!!!!!!! %LogPdfzkk_xkk=LogPdfzkk_xkk1*LogPdfzkk_xkk2; Value=log10(LogPdfxkk_xk)+log10(LogPdfzkk_xkk)+LastPointValue; if(Value>MaxValue) MaxValue=Value; MaxValueIndex=i; MaxIndexX=IndexX; MaxIndexY=IndexY; end Point.Value=Value; Point.LastPointPosition=[LastIndexX LastIndexY]; Point.State=XX(:,i); Point.Intensity=DataScan(IndexX,IndexY,k); Point.Position=[IndexX IndexY]; Point.LastPointIndex=1; Point.OtherPointSetIndex=i; CandidateTrack(1).PointSet(k).OtherPointSet(i)=Point; %将点的信息存储 end % 第k时刻的状态的更新 %i=numel(CandidateTrack.PointSet); %%%????? CandidateTrack(1).PointSet(k).Point= CandidateTrack(1).PointSet(k).OtherPointSet(MaxValueIndex); %将最大值赋予状态,这个变量无用,可以记录当前最大状态 CandidateTrack(1).Step=CandidateTrack(1).Step+1; CandidateTrack(1).Value=MaxValue; %% CandidateTrack.Step>1 else CellFlag=zeros(Nx,Ny); %指示该单元内是否有目标预测状态存在 LastCellStorage=cell(Nx,Ny); % 胞元数组 % PredictionCellStorage=cell(1); PredictionPointNumber=0; OtherPointSetNumber=numel(CandidateTrack(1).PointSet(k-1).OtherPointSet); for m=1:OtherPointSetNumber % 对上一状态OtherPointSet中的点(上限为16个点)进行状态预测 LastPoint=CandidateTrack(1).PointSet(k-1).OtherPointSet(m); %将上一状态点取出 Xk=LastPoint.State; %状态预测 [XX] = StatePrediction(F,Xk,T_step); LastIndexX= LastPoint.Position(1); LastIndexY= LastPoint.Position(2);

% LastIndexX= ceil(Xk(1)/DeltaX);
% LastIndexY= ceil(Xk(3)/DeltaY);
for i=1:16 %对预测的16个状态点进行操作
% XX(2,i)=(XX(1,i)-Xk(1))/T_step; %更新x方向速度
% XX(4,i)=(XX(3,i)-Xk(3))/T_step; %更新y方向速度
%
%对预测的状态进行存储,避免重叠存储
IndexX=ceil(XX(1,i)/DeltaX);
IndexY=ceil(XX(3,i)/DeltaY);
CellFlag(IndexX,IndexY)=CellFlag(IndexX,IndexY)+1; %
if(CellFlag(IndexX,IndexY)==1)
LastCellStorage{IndexX,IndexY}=LastPoint;

text
PredictionPoint.Value=0; PredictionPoint.LastPointPosition=[LastIndexX LastIndexY]; PredictionPoint.State=XX(:,i); PredictionPoint.Intensity=DataScan(IndexX,IndexY,k); PredictionPoint.Position=[IndexX,IndexY]; PredictionPoint.LastPointIndex=m; PredictionPointNumber=PredictionPointNumber+1; PredictionCellStorage(PredictionPointNumber)=PredictionPoint;%只有当CellFlag(IndexX,IndexY)==1时,这个预测的状态点没有存储,这时进行存储 else LastCellStorageBuf=LastCellStorage{IndexX,IndexY}; LastCellStorageBuf=[LastCellStorageBuf LastPoint]; LastCellStorage{IndexX,IndexY}=LastCellStorageBuf; %将上一时刻可能转移到这个状态的状态点存储在胞元数组LastCellStorage中 end end end %% 对预测的状态进行值函数计算 PredictionStateNumber=numel(PredictionCellStorage); MaxCurrentValue=-1000000; for i=1:PredictionStateNumber Point=PredictionCellStorage(i); XX=Point.State; IndexX=ceil(XX(1)/DeltaX); IndexY=ceil(XX(3)/DeltaY); LastPointSet=LastCellStorage{IndexX,IndexY}; %所有上一时刻的子状态点取出 LastPointNumber=numel(LastPointSet); MaxLastToThisValue=-1000000; for j=1:LastPointNumber % 计算该状态转移到预测状态的值函数 LastPoint=LastPointSet(j); Xk=LastPoint.State; LastPointValue=LastPoint.Value; LastIndexX=ceil(Xk(1)/DeltaX); LastIndexY=ceil(Xk(3)/DeltaY); Xkk=F*Xk; LogPdfxkk_xk=1/((2*pi)^2*sqrt(det(Sigma)))*exp(-0.5*(XX-Xkk)'/Sigma*(XX-Xkk)); LogPdfzkk_xkk=1/(sqrt(2*pi))*exp(-(abs(DataScan(IndexX,IndexY,k))-Power_target_av)^2/2); %量测噪声的分布,这里的表示有问题!!!!!!!!!!!! Value=log10(LogPdfxkk_xk)+log10(LogPdfzkk_xkk)+LastPointValue; if(Value>MaxLastToThisValue) MaxLastToThisValue=Value; MaxValueIndex=j; MaxLastIndexX=LastIndexX; MaxLastIndexY=LastIndexY; end end Point.Value=MaxLastToThisValue; Point.LastPointPosition=[MaxLastIndexX MaxLastIndexY]; Point.Intensity=DataScan(IndexX,IndexY,k); Point.Position=[IndexX IndexY]; Point.LastPointIndex=LastPointSet(MaxValueIndex).OtherPointSetIndex; Point.OtherPointSetIndex=i; CandidateTrack(1).PointSet(k).OtherPointSet(i)=Point; %将点的信息存储 if(MaxLastToThisValue>MaxCurrentValue) MaxCurrentValue=MaxLastToThisValue; MaxCurrentIndex=i; end end % 第k时刻的状态的更新 i=numel(CandidateTrack.PointSet); %%% CandidateTrack(1).PointSet(k).Point= CandidateTrack(1).PointSet(k).OtherPointSet(MaxCurrentIndex); %将最大值赋予状态,这个变量无用,可以记录当前最大状态 CandidateTrack(1).Value=MaxCurrentValue; CandidateTrack(1).Step=CandidateTrack(1).Step+1; end

end

aaa=1;
XX=zeros(5,10);
XX(:,1)=CandidateTrack(1).PointSet(K).Point.State;
Index=CandidateTrack(1).PointSet(K).Point.LastPointIndex;
for i=2:K
LastPoint=CandidateTrack(1).PointSet(K-i+1).OtherPointSet(Index);
XX(:,i)=LastPoint.State;
Index=LastPoint.LastPointIndex;
end

figure
plot(x(1,:),x(3,:),'o');
hold on
plot(XX(1,:),XX(3,:),'*');
legend('真实','估计')
grid on

% %量测数据的处理
% DataScanBuf=abs(DataScan(:,:,1));
% DetectThreshold=5; %幅度检测阈值
% [MaxBufOne RowIndexBuf]=max(DataScanBuf); % 寻找每一列中最大元素
% [MaxBufTwo ColumnIndex]=max(MaxBufOne); % 寻找矩阵中最大元素
% RowIndex=RowIndexBuf(ColumnIndex); % MaxBufTwo为最大元素的值
% while(MaxBufTwo>DetectThreshold)
% %将该航迹头数据保存
% Point.Value=0;
% Point.LastPointPosition=[0 0];
% Point.State=[(RowIndex+0.5)DeltaX -1.5Mach (ColumnIndex+0.5)DeltaY -1.6Mach];
% Point.Intensity=DataScan(RowIndex,ColumnIndex,k);
%
%
% CandidateTrack=[CandidateTrack Track];
%
% % 下一个航迹头处理
% DataScanBuf(RowIndex,ColumnIndex)=0; %将处理过的最大元素值赋0
% [MaxBufOne RowIndexBuf]=max(DataScanBuf); % 寻找每一列中最大元素
% [MaxBufTwo ColumnIndex]=max(MaxBufOne); % 寻找矩阵中最大元素
% RowIndex=RowIndexBuf(ColumnIndex); % MaxBufTwo为最大元素的值
%
% end
% %航迹终结处理
%
%
% for k=2:K %
%
% end
%
%
%
% %% step3 end iteration
DPTBD_SingleTarget.m将这段代码中含有的原理,以markdown文档的格式输出出来,抽象为系统的原理,不要代码中的参数细节,包括北京,算法原理,基本流程,原理要有公式,尽可能地包含细节

思考

Thought about target tracking algorithm,持续 一秒

回答

markdown
# 动态规划的单目标Track-Before-Detect (TBD) 原理说明 ## 引言 传统的目标跟踪一般遵循“先检测后跟踪”的范式,即在每个时刻先对数据进行检测,再对检测点进行数据关联和跟踪。然而,当目标在低信噪比(SNR)条件下难以被可靠检测时,“先检测后跟踪”的方法可能效果不佳。Track-Before-Detect (TBD)方法提出了在量测与状态的联合域中通过积累时序信息来实现目标检测和跟踪的思想。动态规划(Dynamic Programming, DP)的TBD算法是一类有效的实现方式。 DP-TBD的核心理念是:在多帧时域内,对可能的目标运动轨迹进行递归求解与积累,通过最大似然或最大后验准则选取最优的目标轨迹,从而实现目标在低信噪比条件下的隐式检测与跟踪。 ## 问题描述与基本假设 我们考虑一个运动目标在二维平面中运动,并且在每个离散时刻进行观测。状态向量可设为: $$ X_k = [x_k, \dot{x}_k, y_k, \dot{y}_k, I_k]^T $$ 这里: - $ x_k, y_k $ 表示目标在二维平面中的位置坐标; - $ \dot{x}_k, \dot{y}_k $ 表示目标的速度分量; - $ I_k $ 表示目标回波信号强度或与目标相关的幅度信息(可理解为状态中的一个扩维,通常用于表示目标能量、信号强度特征等)。 观测(量测)向量可设为: $$ Z_k = [z_{x,k}, z_{y,k}, z_{I,k}]^T $$ 通常包含目标在像素/分辨单元上的能量或幅度量测,以及对应的空间位置索引(例如分辨的网格坐标)。 我们有如下基本假设: 1. **状态转移模型**为线性高斯过程,即: $$ X_k = F X_{k-1} + w_k $$ 其中$w_k \sim \mathcal{N}(0,Q)$为过程噪声。 矩阵$F$为状态转移矩阵,它将上时刻状态映射至本时刻状态。$Q$为过程噪声协方差矩阵。 2. **量测模型**通常可表示为: $$ Z_k = H(X_k) + v_k $$ 其中$v_k \sim \mathcal{N}(0,R)$为量测噪声,$H(\cdot)$为非线性或线性的量测函数(通常情况下与分辨单元索引相关),$R$为量测噪声协方差矩阵。在TBD中,量测可能只是目标回波加上背景高斯白噪声。 3. 目标可能在较低信噪比下出现,单帧上难以可靠检测,需要多帧积累。 ## 动态规划DP-TBD原理 DP-TBD的核心思想是将目标跟踪问题转化为在时空状态格点上的路径优化问题。利用动态规划,可在递归条件下从前向后计算每个时刻下目标可能出现状态的累积似然或后验概率值函数,并在最后通过回溯找到最优路径(即最优航迹)。 ### 状态预测与增广状态空间 在第$k$帧,给定前一帧$k-1$状态点集合,对每个可能状态点利用状态转移方程进行预测得到一组候选状态点: $$ X_k^{(i)} \leftarrow F X_{k-1}^{(j)} + \text{w}_k $$ 这里$i,j$为索引,对上一时刻的多个可能状态点进行全状态空间预测。这些预测状态形成了一个候选状态点集合。 ### 似然函数与评分函数 对每个预测状态点$X_k^{(i)}$,我们利用量测模型计算似然度,通常为: $$ p(Z_k | X_k^{(i)}) \propto \exp\left(-\frac{(Z_k - H(X_k^{(i)}))^T (Z_k - H(X_k^{(i)}))}{2 R}\right) $$ 同时,还需考虑状态转移模型的先验(或前一帧累积信息): $$ p(X_k^{(i)} | X_{k-1}^{(j)}) \propto \exp\left(-\frac{(X_k^{(i)} - F X_{k-1}^{(j)})^T Q^{-1} (X_k^{(i)} - F X_{k-1}^{(j)})}{2}\right) $$ ### 值函数更新(动态规划递推式) DP递推的核心是对所有可能路径的状态转移概率及量测似然进行累积。在对数域中,为避免溢出和数值不稳定,我们采用对数似然值的加和。定义值函数为: $$ V(X_k^{(i)}) = \max_{j} \left[ V(X_{k-1}^{(j)}) + \log p(X_k^{(i)}|X_{k-1}^{(j)}) + \log p(Z_k|X_k^{(i)}) \right] $$ 即在第$k$帧,对于每个候选状态点$X_k^{(i)}$,寻找上一帧状态点集合中使价值函数$V$达到最大值的那个前驱状态点$X_{k-1}^{(j)}$。这里的价值函数$V$可以理解为从起始帧到当前时刻的联合似然(或后验概率)的最大值对数。 ### 回溯与最优航迹生成 当到达最后一帧(或达到预定的处理结束时间)时,我们找到具有最大值函数值的状态点,作为终点。然后根据在DP过程中存储的前驱索引进行回溯,最终得到从初始时刻到终止时刻的最优路径。此路径即为最优的目标航迹估计。 ### 总体流程总结 1. **初始化**:在第一帧上,对全局网格/分辨单元进行评估,将超过一定能量阈值的分辨单元作为潜在目标初始点,初始化值函数。 2. **前向递推**:对每一帧$k$,对上一帧的候选状态点进行状态预测生成新一批候选点集。计算每个新点的似然和转移概率,并更新值函数,保留最大值的前驱信息。 3. **多重候选保持**:为避免陷入局部极值,每帧可保持多个候选点(例如从每个分辨单元中选取多个潜在状态),并在下一帧进行扩展与筛选。 4. **结束与回溯**:在最后一帧结束时,从最大值函数状态点回溯出最优航迹。 ## 数学形式总结 - 状态转移: $$ X_k = F X_{k-1} + w_k,\quad w_k \sim \mathcal{N}(0, Q) $$ - 量测模型: $$ Z_k = H(X_k) + v_k,\quad v_k \sim \mathcal{N}(0, R) $$ - 对数似然更新(值函数更新): $$ V(X_k) = \max_{X_{k-1}} [V(X_{k-1}) + \log p(X_k|X_{k-1}) + \log p(Z_k|X_k)] $$ 其中: $$ \log p(X_k|X_{k-1}) = -\frac{1}{2}(X_k - F X_{k-1})^T Q^{-1} (X_k - F X_{k-1}) + \text{const} $$ $$ \log p(Z_k|X_k) = -\frac{1}{2}(Z_k - H(X_k))^T R^{-1} (Z_k - H(X_k)) + \text{const} $$ 通过递归求解以上更新公式,我们可实现无须单独检测步骤的目标跟踪。同时在低SNR条件下,多个时刻的能量信息在动态规划框架中被有效融合,从而提高检测与跟踪性能。 ## 总结 DP-TBD算法通过在状态空间进行时序递归搜索与值函数优化,将多帧量测数据的信息进行有效的整合,实现单目标在低信噪比条件下的隐式检测与跟踪。其核心是用动态规划的方法在状态-时间格点上寻找最大概率的轨迹路径。由于该算法无需明确的检测门限判断,即可利用多帧数据的时空相关性,大大提高了弱小目标检测和跟踪的性能。

分享这个问答