目标跟踪算法——DSST(Discriminative Scale Space Tracker)

DSST算法流程:
1,参数初始化:
目标块搜索扩张参数padding = 1;
运动模型输出标签参数out_sigma_factor = 0.0625;
防止模型分母为零参数lambda = 0.01;
模型学习速率learning_rate = 0.0250;
尺度个数nScales = 33;
尺度步长scale_step = 1.02;
尺度模型输出标签参数scale_sigma_factor = 0.25;
尺度模型最大区域scale_model_max_area = 512;

文件路径video_path;
图像文件img_files;
目标位置pos;
目标尺寸target_sz;
初始目标尺寸init_target_sz;
基目标尺寸base_target_sz;

2,目标搜索窗口sz=base_target_sz*(1+padding);

3,计算运动滤波器输出高斯标签
3.1 计算运动参数因子output_sigma = sqrt(prod(base_target_sz)) * output_sigma_factor;
3.2 计算离散自变量矩阵[rs,cs] = ndgrid((1:sz(1)) - floor(sz(1)/2), (1:sz(2)) - floor(sz(2)/2));
3.3 计算离散高斯矩阵y = exp(-0.5 * (((rs.^2 + cs.^2) / output_sigma^2)));
3.4 将矩阵变换到频域yf = single(fft2(y));

4,计算尺度滤波器输出高斯标签
4.1 计算尺度参数因子scale_sigma = nScales/sqrt(33) * scale_sigma_factor;
4.2 计算离散自变量向量ss = (1:nScales) - ceil(nScales/2);
4.3 计算离散高斯向量ys = exp(-0.5 * (ss.^2) / scale_sigma^2);
4.4 将向量变换到频域ysf= single(fft(ys));

5,根据目标搜索窗口建立运动模型余弦窗
cos_window = single(hann(sz(1)) * hann(sz(2))’);

6,根据尺度大小建立尺度模型余弦窗
scale_window = single(hann(nScales));

7.建立尺度因子表
ss = 1:nScales;
scaleFactors=scale_step.^(ceil(nScales/2) - ss);

8,确定缩放模型因子
scale_model_factor = 1;
if prod(init_target_sz) > scale_model_max_area
scale_model_factor = sqrt(scale_model_max_area/prod(init_target_sz));
end
9,计算缩放后的模型尺寸
scale_model_sz = floor(init_target_sz * scale_model_factor);

10,确定当前尺度因子
currentScaleFactor = 1;

11,读取图像im

12,确定最小尺度因子和最大尺度因子
min_scale_factor = scale_step^ceil(log(max(5 ./ sz)) / log(scale_step));
max_scale_factor = scale_step ^ floor(log(min([size(im,1) size(im,2)] ./ base_target_sz)) / log(scale_step));

13.对于第一帧图像
提取运动模型训练图像块xl = get_translation_sample(im, pos, sz, currentScaleFactor, cos_window);
变换到频域xlf = fft2(xl);
计算模型分子new_hf_num = bsxfun(@times, yf, conj(xlf));
计算模型分母new_hf_den = sum(xlf .* conj(xlf), 3);

提取尺度模型训练图像块xs = get_scale_sample(im, pos, base_target_sz, currentScaleFactor * scaleFactors, scale_window, scale_model_sz);
变换到频域xsf = fft(xs,[],2);
计算模型分子new_sf_num = bsxfun(@times, ysf, conj(xsf));
计算模型分母new_sf_den = sum(xsf .* conj(xsf), 1);

14.对于第二帧及以后图像
提取运动模型测试图像块xt = get_translation_sample(im, pos, sz, currentScaleFactor, cos_window);
变换到频域 xtf = fft2(xt);
进行检测,求相关响应response = real(ifft2(sum(hf_num .* xtf, 3) ./ (hf_den + lambda)));
寻找最大响应对应位置[row, col] = find(response == max(response(?), 1);
更新位置pos = pos + round((-sz/2 + [row, col]) * currentScaleFactor);

提取尺度模型测试图像块xs = get_scale_sample(im, pos, base_target_sz, currentScaleFactor * scaleFactors, scale_window, scale_model_sz);
变换到频域xsf = fft(xs,[],2);
进行检测,求相关响应scale_response = real(ifft(sum(sf_num .* xsf, 1) ./ (sf_den + lambda)));
寻求最大响应对应尺度recovered_scale = find(scale_response == max(scale_response(?), 1);
更新尺度currentScaleFactor = currentScaleFactor * scaleFactors(recovered_scale);

15.模型更新
在新的目标位置,新的尺度因子下提取运动模型训练样本xl = get_translation_sample(im, pos, sz, currentScaleFactor, cos_window);
变换到频域xtf = fft2(xl);
计算模型分子new_hf_num = bsxfun(@times, yf, conj(xlf));
计算模型分母new_hf_den = sum(xlf .* conj(xlf), 3);

在新的目标位置,新的尺度因子下提取尺度模型训练样本xs = get_scale_sample(im, pos, base_target_sz, currentScaleFactor * scaleFactors, scale_window, scale_model_sz);
变换到频域 xsf = fft(xs,[],2);
计算模型分子 new_sf_num = bsxfun(@times, ysf, conj(xsf));
计算模型分母 new_sf_den = sum(xsf .* conj(xsf), 1);

根据已经设定的学习速率,对模型进行迭代更新
hf_den = (1 - learning_rate) * hf_den + learning_rate * new_hf_den;
hf_num = (1 - learning_rate) * hf_num + learning_rate * new_hf_num;
sf_den = (1 - learning_rate) * sf_den + learning_rate * new_sf_den;
sf_num = (1 - learning_rate) * sf_num + learning_rate * new_sf_num;

  1. 计算新的目标尺寸
    target_sz = floor(base_target_sz * currentScaleFactor);
  • 7
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值