**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;